From mboxrd@z Thu Jan 1 00:00:00 1970 From: Randolph =?ISO-8859-1?Q?Maa=DFen?= Subject: Re: [PATCH v3 4/6] mtd: rawnand: add NVIDIA Tegra NAND Flash controller driver Date: Mon, 04 Jun 2018 19:16:30 +0200 Message-ID: <1528132590.3048.4.camel@gaireg.de> References: <20180531221637.6017-1-stefan@agner.ch> <20180531221637.6017-5-stefan@agner.ch> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180531221637.6017-5-stefan@agner.ch> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+gldm-linux-mtd-36=gmane.org@lists.infradead.org To: Stefan Agner , boris.brezillon@bootlin.com, dwmw2@infradead.org, computersforpeace@gmail.com, marek.vasut@gmail.com, robh+dt@kernel.org, mark.rutland@arm.com, thierry.reding@gmail.com Cc: benjamin.lindqvist@endian.se, pgaikwad@nvidia.com, dev@lynxeye.de, mirza.krak@gmail.com, richard@nod.at, pdeschrijver@nvidia.com, linux-kernel@vger.kernel.org, krzk@kernel.org, jonathanh@nvidia.com, devicetree@vger.kernel.org, linux-mtd@lists.infradead.org, marcel@ziswiler.com, miquel.raynal@bootlin.com, linux-tegra@vger.kernel.org, digetx@gmail.com List-Id: devicetree@vger.kernel.org QW0gRnJlaXRhZywgZGVuIDAxLjA2LjIwMTgsIDAwOjE2ICswMjAwIHNjaHJpZWIgU3RlZmFuIEFn bmVyOgo+IEFkZCBzdXBwb3J0IGZvciB0aGUgTkFORCBmbGFzaCBjb250cm9sbGVyIGZvdW5kIG9u IE5WSURJQQo+IFRlZ3JhIDIgU29Dcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBtYWtl IHVzZSBvZiB0aGUKPiBjb21tYW5kIHF1ZXVlIGZlYXR1cmUuIFJlZ3VsYXIgb3BlcmF0aW9ucy9k YXRhIHRyYW5zZmVycyBhcmUKPiBkb25lIGluIFBJTyBtb2RlLiBQYWdlIHJlYWQvd3JpdGVzIHdp dGggaGFyZHdhcmUgRUNDIG1ha2UKPiB1c2Ugb2YgdGhlIERNQSBmb3IgZGF0YSB0cmFuc2Zlci4K PiAKPiBTaWduZWQtb2ZmLWJ5OiBMdWNhcyBTdGFjaCA8ZGV2QGx5bnhleWUuZGU+Cj4gU2lnbmVk LW9mZi1ieTogU3RlZmFuIEFnbmVyIDxzdGVmYW5AYWduZXIuY2g+Cj4gLS0tCj4gwqBNQUlOVEFJ TkVSU8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoMKg wqA3ICsKPiDCoGRyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWfCoMKgwqDCoMKgwqB8wqDCoMKg wqA2ICsKPiDCoGRyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlwqDCoMKgwqDCoHzCoMKgwqDC oDEgKwo+IMKgZHJpdmVycy9tdGQvbmFuZC9yYXcvdGVncmFfbmFuZC5jIHwgMTE0Mwo+ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrCj4gwqA0IGZpbGVzIGNoYW5nZWQsIDExNTcgaW5zZXJ0 aW9ucygrKQo+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbXRkL25hbmQvcmF3L3RlZ3Jh X25hbmQuYwo+IAo+IGRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCj4gaW5k ZXggNThiOTg2MWNjZjk5Li5jMmU1NTcxYzg1ZDQgMTAwNjQ0Cj4gLS0tIGEvTUFJTlRBSU5FUlMK PiArKysgYi9NQUlOVEFJTkVSUwo+IEBAIC0xMzg0NCw2ICsxMzg0NCwxMyBAQCBNOglMYXhtYW4g RGV3YW5nYW4gPGxkZXdhbmdhbkBudmlkaWEuCj4gY29tPgo+IMKgUzoJU3VwcG9ydGVkCj4gwqBG Oglkcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jCj4gwqAKPiArVEVHUkEgTkFORCBE UklWRVIKPiArTToJU3RlZmFuIEFnbmVyIDxzdGVmYW5AYWduZXIuY2g+Cj4gK006CUx1Y2FzIFN0 YWNoIDxkZXZAbHlueGV5ZS5kZT4KPiArUzoJTWFpbnRhaW5lZAo+ICtGOglEb2N1bWVudGF0aW9u L2RldmljZXRyZWUvYmluZGluZ3MvbXRkL252aWRpYS10ZWdyYTIwLQo+IG5hbmQudHh0Cj4gK0Y6 CWRyaXZlcnMvbXRkL25hbmQvcmF3L3RlZ3JhX25hbmQuYwo+ICsKPiDCoFRFR1JBIFBXTSBEUklW RVIKPiDCoE06CVRoaWVycnkgUmVkaW5nIDx0aGllcnJ5LnJlZGluZ0BnbWFpbC5jb20+Cj4gwqBT OglTdXBwb3J0ZWQKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZwo+ IGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZwo+IGluZGV4IDE5YTJiMjgzZmJiZS4uZTkw OTNmNTIzNzFlIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiAr KysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnCj4gQEAgLTUzNCw0ICs1MzQsMTAgQEAg Y29uZmlnIE1URF9OQU5EX01USwo+IMKgCcKgwqBFbmFibGVzIHN1cHBvcnQgZm9yIE5BTkQgY29u dHJvbGxlciBvbiBNVEsgU29Dcy4KPiDCoAnCoMKgVGhpcyBjb250cm9sbGVyIGlzIGZvdW5kIG9u IG10Mjd4eCwgbXQ4MXh4LCBtdDY1eHggU29Dcy4KPiDCoAo+ICtjb25maWcgTVREX05BTkRfVEVH UkEKPiArCXRyaXN0YXRlICJTdXBwb3J0IGZvciBOQU5EIGNvbnRyb2xsZXIgb24gTlZJRElBIFRl Z3JhIgo+ICsJZGVwZW5kcyBvbiBBUkNIX1RFR1JBIHx8IENPTVBJTEVfVEVTVAo+ICsJaGVscAo+ ICsJwqDCoEVuYWJsZXMgc3VwcG9ydCBmb3IgTkFORCBmbGFzaCBjb250cm9sbGVyIG9uIE5WSURJ QSBUZWdyYQo+IFNvQy4KPiArCj4gwqBlbmRpZiAjIE1URF9OQU5ECj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtl ZmlsZQo+IGluZGV4IDE2NWI3ZWY5ZTlhMS4uZDVhNWY5ODMyYjg4IDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcv TWFrZWZpbGUKPiBAQCAtNTYsNiArNTYsNyBAQCBvYmotJChDT05GSUdfTVREX05BTkRfSElTSTUw NCkJwqDCoMKgwqDCoMKgwqDCoCs9Cj4gaGlzaTUwNF9uYW5kLm8KPiDCoG9iai0kKENPTkZJR19N VERfTkFORF9CUkNNTkFORCkJCSs9IGJyY21uYW5kLwo+IMKgb2JqLSQoQ09ORklHX01URF9OQU5E X1FDT00pCQkrPSBxY29tX25hbmRjLm8KPiDCoG9iai0kKENPTkZJR19NVERfTkFORF9NVEspCQkr PSBtdGtfZWNjLm8gbXRrX25hbmQubwo+ICtvYmotJChDT05GSUdfTVREX05BTkRfVEVHUkEpCQkr PSB0ZWdyYV9uYW5kLm8KPiDCoAo+IMKgbmFuZC1vYmpzIDo9IG5hbmRfYmFzZS5vIG5hbmRfYmJ0 Lm8gbmFuZF90aW1pbmdzLm8gbmFuZF9pZHMubwo+IMKgbmFuZC1vYmpzICs9IG5hbmRfYW1kLm8K PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvdGVncmFfbmFuZC5jCj4gYi9kcml2 ZXJzL210ZC9uYW5kL3Jhdy90ZWdyYV9uYW5kLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGlu ZGV4IDAwMDAwMDAwMDAwMC4uZTk2NjRmMjkzOGEzCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2Ry aXZlcnMvbXRkL25hbmQvcmF3L3RlZ3JhX25hbmQuYwo+IEBAIC0wLDAgKzEsMTE0MyBAQAo+ICsv LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQg KEMpIDIwMTggU3RlZmFuIEFnbmVyIDxzdGVmYW5AYWduZXIuY2g+Cj4gKyAqIENvcHlyaWdodCAo QykgMjAxNC0yMDE1IEx1Y2FzIFN0YWNoIDxkZXZAbHlueGV5ZS5kZT4KPiArICogQ29weXJpZ2h0 IChDKSAyMDEyIEF2aW9uaWMgRGVzaWduIEdtYkgKPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGlu dXgvY2xrLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9kZWxheS5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L2Vyci5oPgo+ICsjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgo+ICsj aW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPgo+ICsj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9u cy5oPgo+ICsjaW5jbHVkZSA8bGludXgvbXRkL3Jhd25hbmQuaD4KPiArI2luY2x1ZGUgPGxpbnV4 L29mLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArI2luY2x1ZGUg PGxpbnV4L3Jlc2V0Lmg+Cj4gKwo+ICsjZGVmaW5lIENNRAkJCQkJMHgwMAo+ICsjZGVmaW5lwqDC oMKgQ01EX0dPCQkJCUJJVCgzMSkKPiArI2RlZmluZcKgwqDCoENNRF9DTEUJCQkJQklUKDMwKQo+ ICsjZGVmaW5lwqDCoMKgQ01EX0FMRQkJCQlCSVQoMjkpCj4gKyNkZWZpbmXCoMKgwqBDTURfUElP CQkJCUJJVCgyOCkKPiArI2RlZmluZcKgwqDCoENNRF9UWAkJCQlCSVQoMjcpCj4gKyNkZWZpbmXC oMKgwqBDTURfUlgJCQkJQklUKDI2KQo+ICsjZGVmaW5lwqDCoMKgQ01EX1NFQ19DTUQJCQkJQklU KDI1KQo+ICsjZGVmaW5lwqDCoMKgQ01EX0FGVF9EQVQJCQkJQklUKDI0KQo+ICsjZGVmaW5lwqDC oMKgQ01EX1RSQU5TX1NJWkUoeCkJCQkoKCh4IC0gMSkgJiAweGYpCj4gPDwgMjApCj4gKyNkZWZp bmXCoMKgwqBDTURfQV9WQUxJRAkJCQlCSVQoMTkpCj4gKyNkZWZpbmXCoMKgwqBDTURfQl9WQUxJ RAkJCQlCSVQoMTgpCj4gKyNkZWZpbmXCoMKgwqBDTURfUkRfU1RBVFVTX0NISwkJCUJJVCgxNykK PiArI2RlZmluZcKgwqDCoENNRF9SQlNZX0NISwkJCQlCSVQoMTYpCj4gKyNkZWZpbmXCoMKgwqBD TURfQ0UoeCkJCQkJQklUKCg4ICsgKCh4KSAmCj4gMHg3KSkpCj4gKyNkZWZpbmXCoMKgwqBDTURf Q0xFX1NJWkUoeCkJCQkoKCh4IC0gMSkgJiAweDMpIDw8Cj4gNCkKPiArI2RlZmluZcKgwqDCoENN RF9BTEVfU0laRSh4KQkJCSgoKHggLSAxKSAmIDB4ZikgPDwKPiAwKQo+ICsKPiArI2RlZmluZSBT VEFUVVMJCQkJCTB4MDQKPiArCj4gKyNkZWZpbmUgSVNSCQkJCQkweDA4Cj4gKyNkZWZpbmXCoMKg wqBJU1JfQ09SUkZBSUxfRVJSCQkJQklUKDI0KQo+ICsjZGVmaW5lwqDCoMKgSVNSX1VORAkJCQlC SVQoNykKPiArI2RlZmluZcKgwqDCoElTUl9PVlIJCQkJQklUKDYpCj4gKyNkZWZpbmXCoMKgwqBJ U1JfQ01EX0RPTkUJCQkJQklUKDUpCj4gKyNkZWZpbmXCoMKgwqBJU1JfRUNDX0VSUgkJCQlCSVQo NCkKPiArCj4gKyNkZWZpbmUgSUVSCQkJCQkweDBjCj4gKyNkZWZpbmXCoMKgwqBJRVJfRVJSX1RS SUdfVkFMKHgpCQkJKCgoeCkgJiAweGYpIDw8Cj4gMTYpCj4gKyNkZWZpbmXCoMKgwqBJRVJfVU5E CQkJCUJJVCg3KQo+ICsjZGVmaW5lwqDCoMKgSUVSX09WUgkJCQlCSVQoNikKPiArI2RlZmluZcKg wqDCoElFUl9DTURfRE9ORQkJCQlCSVQoNSkKPiArI2RlZmluZcKgwqDCoElFUl9FQ0NfRVJSCQkJ CUJJVCg0KQo+ICsjZGVmaW5lwqDCoMKgSUVSX0dJRQkJCQlCSVQoMCkKPiArCj4gKyNkZWZpbmUg Q0ZHCQkJCQkweDEwCj4gKyNkZWZpbmXCoMKgwqBDRkdfSFdfRUNDCQkJCUJJVCgzMSkKPiArI2Rl ZmluZcKgwqDCoENGR19FQ0NfU0VMCQkJCUJJVCgzMCkKPiArI2RlZmluZcKgwqDCoENGR19FUlJf Q09SCQkJCUJJVCgyOSkKPiArI2RlZmluZcKgwqDCoENGR19QSVBFX0VOCQkJCUJJVCgyOCkKPiAr I2RlZmluZcKgwqDCoENGR19UVkFMXzQJCQkJKDAgPDwgMjQpCj4gKyNkZWZpbmXCoMKgwqBDRkdf VFZBTF82CQkJCSgxIDw8IDI0KQo+ICsjZGVmaW5lwqDCoMKgQ0ZHX1RWQUxfOAkJCQkoMiA8PCAy NCkKPiArI2RlZmluZcKgwqDCoENGR19TS0lQX1NQQVJFCQkJQklUKDIzKQo+ICsjZGVmaW5lwqDC oMKgQ0ZHX0JVU19XSURUSF8xNgkJCUJJVCgyMSkKPiArI2RlZmluZcKgwqDCoENGR19DT01fQlNZ CQkJCUJJVCgyMCkKPiArI2RlZmluZcKgwqDCoENGR19QU18yNTYJCQkJKDAgPDwgMTYpCj4gKyNk ZWZpbmXCoMKgwqBDRkdfUFNfNTEyCQkJCSgxIDw8IDE2KQo+ICsjZGVmaW5lwqDCoMKgQ0ZHX1BT XzEwMjQJCQkJKDIgPDwgMTYpCj4gKyNkZWZpbmXCoMKgwqBDRkdfUFNfMjA0OAkJCQkoMyA8PCAx NikKPiArI2RlZmluZcKgwqDCoENGR19QU180MDk2CQkJCSg0IDw8IDE2KQo+ICsjZGVmaW5lwqDC oMKgQ0ZHX1NLSVBfU1BBUkVfU0laRV80CQkJKDAgPDwgMTQpCj4gKyNkZWZpbmXCoMKgwqBDRkdf U0tJUF9TUEFSRV9TSVpFXzgJCQkoMSA8PCAxNCkKPiArI2RlZmluZcKgwqDCoENGR19TS0lQX1NQ QVJFX1NJWkVfMTIJCSgyIDw8IDE0KQo+ICsjZGVmaW5lwqDCoMKgQ0ZHX1NLSVBfU1BBUkVfU0la RV8xNgkJKDMgPDwgMTQpCj4gKyNkZWZpbmXCoMKgwqBDRkdfVEFHX0JZVEVfU0laRSh4KQkJCSgo eCkgJiAweGZmKQo+ICsKPiArI2RlZmluZSBUSU1JTkdfMQkJCQkweDE0Cj4gKyNkZWZpbmXCoMKg wqBUSU1JTkdfVFJQX1JFU1AoeCkJCQkoKCh4KSAmIDB4ZikgPDwKPiAyOCkKPiArI2RlZmluZcKg wqDCoFRJTUlOR19UV0IoeCkJCQkJKCgoeCkgJiAweGYpCj4gPDwgMjQpCj4gKyNkZWZpbmXCoMKg wqBUSU1JTkdfVENSX1RBUl9UUlIoeCkJCQkoKCh4KSAmIDB4ZikKPiA8PCAyMCkKPiArI2RlZmlu ZcKgwqDCoFRJTUlOR19UV0hSKHgpCQkJKCgoeCkgJiAweGYpIDw8IDE2KQo+ICsjZGVmaW5lwqDC oMKgVElNSU5HX1RDUyh4KQkJCQkoKCh4KSAmIDB4MykKPiA8PCAxNCkKPiArI2RlZmluZcKgwqDC oFRJTUlOR19UV0goeCkJCQkJKCgoeCkgJiAweDMpCj4gPDwgMTIpCj4gKyNkZWZpbmXCoMKgwqBU SU1JTkdfVFdQKHgpCQkJCSgoKHgpICYgMHhmKQo+IDw8wqDCoDgpCj4gKyNkZWZpbmXCoMKgwqBU SU1JTkdfVFJIKHgpCQkJCSgoKHgpICYgMHgzKQo+IDw8wqDCoDQpCj4gKyNkZWZpbmXCoMKgwqBU SU1JTkdfVFJQKHgpCQkJCSgoKHgpICYgMHhmKQo+IDw8wqDCoDApCj4gKwo+ICsjZGVmaW5lIFJF U1AJCQkJCTB4MTgKPiArCj4gKyNkZWZpbmUgVElNSU5HXzIJCQkJMHgxYwo+ICsjZGVmaW5lwqDC oMKgVElNSU5HX1RBREwoeCkJCQkoKHgpICYgMHhmKQo+ICsKPiArI2RlZmluZSBDTURfMQkJCQkJ MHgyMAo+ICsjZGVmaW5lIENNRF8yCQkJCQkweDI0Cj4gKyNkZWZpbmUgQUREUl8xCQkJCQkweDI4 Cj4gKyNkZWZpbmUgQUREUl8yCQkJCQkweDJjCj4gKwo+ICsjZGVmaW5lIERNQV9DVFJMCQkJCTB4 MzAKPiArI2RlZmluZcKgwqDCoERNQV9DVFJMX0dPCQkJCUJJVCgzMSkKPiArI2RlZmluZcKgwqDC oERNQV9DVFJMX0lOCQkJCSgwIDw8IDMwKQo+ICsjZGVmaW5lwqDCoMKgRE1BX0NUUkxfT1VUCQkJ CUJJVCgzMCkKPiArI2RlZmluZcKgwqDCoERNQV9DVFJMX1BFUkZfRU4JCQlCSVQoMjkpCj4gKyNk ZWZpbmXCoMKgwqBETUFfQ1RSTF9JRV9ET05FCQkJQklUKDI4KQo+ICsjZGVmaW5lwqDCoMKgRE1B X0NUUkxfUkVVU0UJCQlCSVQoMjcpCj4gKyNkZWZpbmXCoMKgwqBETUFfQ1RSTF9CVVJTVF8xCQkJ KDIgPDwgMjQpCj4gKyNkZWZpbmXCoMKgwqBETUFfQ1RSTF9CVVJTVF80CQkJKDMgPDwgMjQpCj4g KyNkZWZpbmXCoMKgwqBETUFfQ1RSTF9CVVJTVF84CQkJKDQgPDwgMjQpCj4gKyNkZWZpbmXCoMKg wqBETUFfQ1RSTF9CVVJTVF8xNgkJCSg1IDw8IDI0KQo+ICsjZGVmaW5lwqDCoMKgRE1BX0NUUkxf SVNfRE9ORQkJCUJJVCgyMCkKPiArI2RlZmluZcKgwqDCoERNQV9DVFJMX0VOX0EJCQkJQklUKDIp Cj4gKyNkZWZpbmXCoMKgwqBETUFfQ1RSTF9FTl9CCQkJCUJJVCgxKQo+ICsKPiArI2RlZmluZSBE TUFfQ0ZHX0EJCQkJMHgzNAo+ICsjZGVmaW5lIERNQV9DRkdfQgkJCQkweDM4Cj4gKwo+ICsjZGVm aW5lIEZJRk9fQ1RSTAkJCQkweDNjCj4gKyNkZWZpbmXCoMKgwqBGSUZPX0NUUkxfQ0xSX0FMTAkJ CUJJVCgzKQo+ICsKPiArI2RlZmluZSBEQVRBX1BUUgkJCQkweDQwCj4gKyNkZWZpbmUgVEFHX1BU UgkJCQkJMHg0NAo+ICsjZGVmaW5lIEVDQ19QVFIJCQkJCTB4NDgKPiArCj4gKyNkZWZpbmUgREVD X1NUQVRVUwkJCQkweDRjCj4gKyNkZWZpbmXCoMKgwqBERUNfU1RBVFVTX0FfRUNDX0ZBSUwJCQlC SVQoMSkKPiArI2RlZmluZcKgwqDCoERFQ19TVEFUVVNfRVJSX0NPVU5UX01BU0sJCTB4MDBmZjAw MDAKPiArI2RlZmluZcKgwqDCoERFQ19TVEFUVVNfRVJSX0NPVU5UX1NISUZUCQkxNgo+ICsKPiAr I2RlZmluZSBIV1NUQVRVU19DTUQJCQkJMHg1MAo+ICsjZGVmaW5lIEhXU1RBVFVTX01BU0sJCQkJ MHg1NAo+ICsjZGVmaW5lwqDCoMKgSFdTVEFUVVNfUkRTVEFUVVNfTUFTSyh4KQkJKCgoeCkgJiAw eGZmKSA8PAo+IDI0KQo+ICsjZGVmaW5lwqDCoMKgSFdTVEFUVVNfUkRTVEFUVVNfVkFMVUUoeCkJ CSgoKHgpICYgMHhmZikgPDwKPiAxNikKPiArI2RlZmluZcKgwqDCoEhXU1RBVFVTX1JCU1lfTUFT Syh4KQkJCSgoKHgpICYgMHhmZikKPiA8PCA4KQo+ICsjZGVmaW5lwqDCoMKgSFdTVEFUVVNfUkJT WV9WQUxVRSh4KQkJKCgoeCkgJiAweGZmKSA8PCAwKQo+ICsKPiArI2RlZmluZSBCQ0hfQ09ORklH CQkJCTB4Y2MKPiArI2RlZmluZcKgwqDCoEJDSF9FTkFCTEUJCQkJQklUKDApCj4gKyNkZWZpbmXC oMKgwqBCQ0hfVFZBTF80CQkJCSgwIDw8IDQpCj4gKyNkZWZpbmXCoMKgwqBCQ0hfVFZBTF84CQkJ CSgxIDw8IDQpCj4gKyNkZWZpbmXCoMKgwqBCQ0hfVFZBTF8xNAkJCQkoMiA8PCA0KQo+ICsjZGVm aW5lwqDCoMKgQkNIX1RWQUxfMTYJCQkJKDMgPDwgNCkKPiArCj4gKyNkZWZpbmUgREVDX1NUQVRf UkVTVUxUCQkJCTB4ZDAKPiArI2RlZmluZSBERUNfU1RBVF9CVUYJCQkJMHhkNAo+ICsjZGVmaW5l wqDCoMKgREVDX1NUQVRfQlVGX0ZBSUxfU0VDX0ZMQUdfTUFTSwkweGZmMDAwMDAwCj4gKyNkZWZp bmXCoMKgwqBERUNfU1RBVF9CVUZfRkFJTF9TRUNfRkxBR19TSElGVAkyNAo+ICsjZGVmaW5lwqDC oMKgREVDX1NUQVRfQlVGX0NPUlJfU0VDX0ZMQUdfTUFTSwkweDAwZmYwMDAwCj4gKyNkZWZpbmXC oMKgwqBERUNfU1RBVF9CVUZfQ09SUl9TRUNfRkxBR19TSElGVAkxNgo+ICsjZGVmaW5lwqDCoMKg REVDX1NUQVRfQlVGX01BWF9DT1JSX0NOVF9NQVNLCTB4MDAwMDFmMDAKPiArI2RlZmluZcKgwqDC oERFQ19TVEFUX0JVRl9NQVhfQ09SUl9DTlRfU0hJRlQJOAo+ICsKPiArI2RlZmluZSBPRkZTRVQo dmFsLCBvZmYpCQkoKHZhbCkgPCAob2ZmKSA/IDAgOiAodmFsKSAtCj4gKG9mZikpCj4gKwo+ICsj ZGVmaW5lIFNLSVBfU1BBUkVfQllURVMJNAo+ICsjZGVmaW5lIEJJVFNfUEVSX1NURVBfUlMJMTgK PiArI2RlZmluZSBCSVRTX1BFUl9TVEVQX0JDSAkxMwo+ICsKPiArc3RydWN0IHRlZ3JhX25hbmRf Y29udHJvbGxlciB7Cj4gKwlzdHJ1Y3QgbmFuZF9od19jb250cm9sIGNvbnRyb2xsZXI7Cj4gKwl2 b2lkIF9faW9tZW0gKnJlZ3M7Cj4gKwlzdHJ1Y3QgY2xrICpjbGs7Cj4gKwlzdHJ1Y3QgZGV2aWNl ICpkZXY7Cj4gKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21tYW5kX2NvbXBsZXRlOwo+ICsJc3RydWN0 IGNvbXBsZXRpb24gZG1hX2NvbXBsZXRlOwo+ICsJYm9vbCBsYXN0X3JlYWRfZXJyb3I7Cj4gKwlp bnQgY3VyX2NoaXA7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwOwo+ICt9Owo+ICsKPiArc3Ry dWN0IHRlZ3JhX25hbmRfY2hpcCB7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4gKwlzdHJ1 Y3QgZ3Bpb19kZXNjICp3cF9ncGlvOwo+ICsJc3RydWN0IG10ZF9vb2JfcmVnaW9uIHRhZzsKPiAr fTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRlZ3JhX25hbmRfY29udHJvbGxlciAqdG9f dGVncmFfY3RybCgKPiArCQkJCQkJc3RydWN0Cj4gbmFuZF9od19jb250cm9sICpod19jdHJsKQo+ ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGh3X2N0cmwsIHN0cnVjdCB0ZWdyYV9uYW5kX2Nv bnRyb2xsZXIsCj4gY29udHJvbGxlcik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0 IHRlZ3JhX25hbmRfY2hpcCAqdG9fdGVncmFfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwCj4gKmNoaXAp Cj4gK3sKPiArCXJldHVybiBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHRlZ3JhX25hbmRfY2hp cCwgY2hpcCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfbmFuZF9vb2JsYXlvdXRfcnNf ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQKPiBzZWN0aW9uLAo+ICsJCQkJwqDCoMKgwqDC oMKgwqBzdHJ1Y3QgbXRkX29vYl9yZWdpb24KPiAqb29icmVnaW9uKQo+ICt7Cj4gKwlzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsKPiArCWludCBieXRlc19wZXJfc3Rl cCA9IERJVl9ST1VORF9VUChCSVRTX1BFUl9TVEVQX1JTICogY2hpcC0KPiA+ZWNjLnN0cmVuZ3Ro LAo+ICsJCQkJCcKgwqBCSVRTX1BFUl9CWVRFKTsKPiArCj4gKwlpZiAoc2VjdGlvbiA+IDApCj4g KwkJcmV0dXJuIC1FUkFOR0U7Cj4gKwo+ICsJb29icmVnaW9uLT5vZmZzZXQgPSBTS0lQX1NQQVJF X0JZVEVTOwo+ICsJb29icmVnaW9uLT5sZW5ndGggPSByb3VuZF91cChieXRlc19wZXJfc3RlcCAq IGNoaXAtCj4gPmVjYy5zdGVwcywgNCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgdGVncmFfbmFuZF9vb2JsYXlvdXRfcnNfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10 ZCwgaW50Cj4gc2VjdGlvbiwKPiArCQkJCQlzdHJ1Y3QgbXRkX29vYl9yZWdpb24KPiAqb29icmVn aW9uKQo+ICt7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsK PiArCWludCBieXRlc19wZXJfc3RlcCA9IERJVl9ST1VORF9VUChCSVRTX1BFUl9TVEVQX1JTICog Y2hpcC0KPiA+ZWNjLnN0cmVuZ3RoLAo+ICsJCQkJCcKgwqBCSVRTX1BFUl9CWVRFKTsKPiArCj4g KwlpZiAoc2VjdGlvbiA+IDApCj4gKwkJcmV0dXJuIC1FUkFOR0U7Cj4gKwo+ICsJb29icmVnaW9u LT5vZmZzZXQgPSBTS0lQX1NQQVJFX0JZVEVTICsKPiArCQkJwqDCoMKgwqByb3VuZF91cChieXRl c19wZXJfc3RlcCAqIGNoaXAtCj4gPmVjYy5zdGVwcywgNCk7Cj4gKwlvb2JyZWdpb24tPmxlbmd0 aCA9IG10ZC0+b29ic2l6ZSAtIG9vYnJlZ2lvbi0+b2Zmc2V0Owo+ICsKPiArCXJldHVybiAwOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG10ZF9vb2JsYXlvdXRfb3BzIHRlZ3JhX25h bmRfb29iX3JzX29wcyA9IHsKPiArCS5lY2MgPSB0ZWdyYV9uYW5kX29vYmxheW91dF9yc19lY2Ms Cj4gKwkuZnJlZSA9IHRlZ3JhX25hbmRfb29ibGF5b3V0X3JzX2ZyZWUsCj4gK307Cj4gKwo+ICtz dGF0aWMgaW50IHRlZ3JhX25hbmRfb29ibGF5b3V0X2JjaF9lY2Moc3RydWN0IG10ZF9pbmZvICpt dGQsIGludAo+IHNlY3Rpb24sCj4gKwkJCQnCoMKgwqDCoMKgwqDCoHN0cnVjdCBtdGRfb29iX3Jl Z2lvbgo+ICpvb2JyZWdpb24pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRf dG9fbmFuZChtdGQpOwo+ICsJaW50IGJ5dGVzX3Blcl9zdGVwID0gRElWX1JPVU5EX1VQKEJJVFNf UEVSX1NURVBfQkNIICogY2hpcC0KPiA+ZWNjLnN0cmVuZ3RoLAo+ICsJCQkJCcKgwqBCSVRTX1BF Ul9CWVRFKTsKPiArCj4gKwlpZiAoc2VjdGlvbiA+IDApCj4gKwkJcmV0dXJuIC1FUkFOR0U7Cj4g Kwo+ICsJb29icmVnaW9uLT5vZmZzZXQgPSBTS0lQX1NQQVJFX0JZVEVTOwo+ICsJb29icmVnaW9u LT5sZW5ndGggPSByb3VuZF91cChieXRlc19wZXJfc3RlcCAqIGNoaXAtCj4gPmVjYy5zdGVwcywg NCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfbmFuZF9v b2JsYXlvdXRfYmNoX2ZyZWUoc3RydWN0IG10ZF9pbmZvICptdGQsIGludAo+IHNlY3Rpb24sCj4g KwkJCQkJc3RydWN0IG10ZF9vb2JfcmVnaW9uCj4gKm9vYnJlZ2lvbikKPiArewo+ICsJc3RydWN0 IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gKwlpbnQgYnl0ZXNfcGVyX3N0 ZXAgPSBESVZfUk9VTkRfVVAoQklUU19QRVJfU1RFUF9CQ0ggKiBjaGlwLQo+ID5lY2Muc3RyZW5n dGgsCj4gKwkJCQkJwqDCoEJJVFNfUEVSX0JZVEUpOwo+ICsKPiArCWlmIChzZWN0aW9uID4gMCkK PiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwlvb2JyZWdpb24tPm9mZnNldCA9IFNLSVBfU1BB UkVfQllURVMgKwo+ICsJCQnCoMKgwqDCoHJvdW5kX3VwKGJ5dGVzX3Blcl9zdGVwICogY2hpcC0K PiA+ZWNjLnN0ZXBzLCA0KTsKPiArCW9vYnJlZ2lvbi0+bGVuZ3RoID0gbXRkLT5vb2JzaXplIC0g b29icmVnaW9uLT5vZmZzZXQ7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qCj4gKyAq IExheW91dCB3aXRoIHRhZyBieXRlcyBpcwo+ICsgKgo+ICsgKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAtLS0tLS0tLS0t LQo+ICsgKiB8IG1haW4gYXJlYcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqB8IHNraXAgYnl0ZXMgfCB0YWcgYnl0ZXMgfAo+IHBhcml0eSB8IC4uIHwKPiArICog LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCj4gLS0tLS0tLS0tLS0KPiArICoKPiArICogSWYgbm90IHRhZyBieXRlcyBhcmUgd3Jp dHRlbiwgcGFyaXR5IG1vdmVzIHJpZ2h0IGFmdGVyIHNraXAKPiBieXRlcyEKPiArICovCj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgdGVncmFfbmFuZF9vb2JfYmNoX29w cyA9IHsKPiArCS5lY2MgPSB0ZWdyYV9uYW5kX29vYmxheW91dF9iY2hfZWNjLAo+ICsJLmZyZWUg PSB0ZWdyYV9uYW5kX29vYmxheW91dF9iY2hfZnJlZSwKPiArfTsKPiArCj4gK3N0YXRpYyBpcnFy ZXR1cm5fdCB0ZWdyYV9uYW5kX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQo+ICt7Cj4gKwlzdHJ1 Y3QgdGVncmFfbmFuZF9jb250cm9sbGVyICpjdHJsID0gZGF0YTsKPiArCXUzMiBpc3IsIGRtYTsK PiArCj4gKwlpc3IgPSByZWFkbF9yZWxheGVkKGN0cmwtPnJlZ3MgKyBJU1IpOwo+ICsJZG1hID0g cmVhZGxfcmVsYXhlZChjdHJsLT5yZWdzICsgRE1BX0NUUkwpOwo+ICsJZGV2X2RiZyhjdHJsLT5k ZXYsICJpc3IgJTA4eFxuIiwgaXNyKTsKPiArCj4gKwlpZiAoIWlzciAmJiAhKGRtYSAmIERNQV9D VFJMX0lTX0RPTkUpKQo+ICsJCXJldHVybiBJUlFfTk9ORTsKPiArCj4gKwkvKgo+ICsJwqAqIFRo ZSBiaXQgbmFtZSBpcyBzb21ld2hhdCBtaXNzbGVhZGluZzogVGhpcyBpcyBhbHNvIHNldAo+IHdo ZW4KPiArCcKgKiBIVyBFQ0Mgd2FzIHN1Y2Nlc3NmdWwuIFRoZSBkYXRhIHNoZWV0IHN0YXRlczoK PiArCcKgKiBDb3JyZWN0YWJsZSBPUiBVbi1jb3JyZWN0YWJsZSBlcnJvcnMgb2NjdXJyZWQgaW4g dGhlIERNQQo+IHRyYW5zZmVyLi4uCj4gKwnCoCovCj4gKwlpZiAoaXNyICYgSVNSX0NPUlJGQUlM X0VSUikKPiArCQljdHJsLT5sYXN0X3JlYWRfZXJyb3IgPSB0cnVlOwo+ICsKPiArCWlmIChpc3Ig JiBJU1JfQ01EX0RPTkUpCj4gKwkJY29tcGxldGUoJmN0cmwtPmNvbW1hbmRfY29tcGxldGUpOwo+ ICsKPiArCWlmIChpc3IgJiBJU1JfVU5EKQo+ICsJCWRldl9lcnIoY3RybC0+ZGV2LCAiRklGTyB1 bmRlcnJ1blxuIik7Cj4gKwo+ICsJaWYgKGlzciAmIElTUl9PVlIpCj4gKwkJZGV2X2VycihjdHJs LT5kZXYsICJGSUZPIG92ZXJydW5cbiIpOwo+ICsKPiArCS8qIGhhbmRsZSBETUEgaW50ZXJydXB0 cyAqLwo+ICsJaWYgKGRtYSAmIERNQV9DVFJMX0lTX0RPTkUpIHsKPiArCQl3cml0ZWxfcmVsYXhl ZChkbWEsIGN0cmwtPnJlZ3MgKyBETUFfQ1RSTCk7Cj4gKwkJY29tcGxldGUoJmN0cmwtPmRtYV9j b21wbGV0ZSk7Cj4gKwl9Cj4gKwo+ICsJLyogY2xlYXIgaW50ZXJydXB0cyAqLwo+ICsJd3JpdGVs X3JlbGF4ZWQoaXNyLCBjdHJsLT5yZWdzICsgSVNSKTsKPiArCj4gKwlyZXR1cm4gSVJRX0hBTkRM RUQ7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVncmFfbmFuZF9yZWdf bmFtZXNbXSA9IHsKPiArCSJDT01NQU5EIiwKPiArCSJTVEFUVVMiLAo+ICsJIklTUiIsCj4gKwki SUVSIiwKPiArCSJDT05GSUciLAo+ICsJIlRJTUlORyIsCj4gKwlOVUxMLAo+ICsJIlRJTUlORzIi LAo+ICsJIkNNRF9SRUcxIiwKPiArCSJDTURfUkVHMiIsCj4gKwkiQUREUl9SRUcxIiwKPiArCSJB RERSX1JFRzIiLAo+ICsJIkRNQV9NU1RfQ1RSTCIsCj4gKwkiRE1BX0NGR19BIiwKPiArCSJETUFf Q0ZHX0IiLAo+ICsJIkZJRk9fQ1RSTCIsCj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV9u YW5kX2R1bXBfcmVnKHN0cnVjdCB0ZWdyYV9uYW5kX2NvbnRyb2xsZXIgKmN0cmwpCj4gK3sKPiAr CXUzMiByZWc7Cj4gKwlpbnQgaTsKPiArCj4gKwlkZXZfZXJyKGN0cmwtPmRldiwgIlRlZ3JhIE5B TkQgY29udHJvbGxlciByZWdpc3RlciBkdW1wXG4iKTsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJB WV9TSVpFKHRlZ3JhX25hbmRfcmVnX25hbWVzKTsgaSsrKSB7Cj4gKwkJY29uc3QgY2hhciAqcmVn X25hbWUgPSB0ZWdyYV9uYW5kX3JlZ19uYW1lc1tpXTsKPiArCj4gKwkJaWYgKCFyZWdfbmFtZSkK PiArCQkJY29udGludWU7Cj4gKwo+ICsJCXJlZyA9IHJlYWRsX3JlbGF4ZWQoY3RybC0+cmVncyAr IChpICogNCkpOwo+ICsJCWRldl9lcnIoY3RybC0+ZGV2LCAiJXM6IDB4JTA4eFxuIiwgcmVnX25h bWUsIHJlZyk7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfbmFuZF9jbWQoc3Ry dWN0IG5hbmRfY2hpcCAqY2hpcCwKPiArCQkJwqBjb25zdCBzdHJ1Y3QgbmFuZF9zdWJvcCAqc3Vi b3ApCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBuYW5kX29wX2luc3RyICppbnN0cjsKPiArCWNvbnN0 IHN0cnVjdCBuYW5kX29wX2luc3RyICppbnN0cl9kYXRhX2luID0gTlVMTDsKPiArCXN0cnVjdCB0 ZWdyYV9uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSB0b190ZWdyYV9jdHJsKGNoaXAtCj4gPmNvbnRy b2xsZXIpOwo+ICsJdW5zaWduZWQgaW50IG9wX2lkLCBzaXplID0gMCwgb2Zmc2V0ID0gMDsKPiAr CWJvb2wgZmlyc3RfY21kID0gdHJ1ZTsKPiArCXUzMiByZWcsIGNtZCA9IDA7Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCWZvciAob3BfaWQgPSAwOyBvcF9pZCA8IHN1Ym9wLT5uaW5zdHJzOyBvcF9pZCsr KSB7Cj4gKwkJdW5zaWduZWQgaW50IG5hZGRycywgaTsKPiArCQljb25zdCB1OCAqYWRkcnM7Cj4g KwkJdTMyIGFkZHIxID0gMCwgYWRkcjIgPSAwOwo+ICsKPiArCQlpbnN0ciA9ICZzdWJvcC0+aW5z dHJzW29wX2lkXTsKPiArCj4gKwkJc3dpdGNoIChpbnN0ci0+dHlwZSkgewo+ICsJCWNhc2UgTkFO RF9PUF9DTURfSU5TVFI6Cj4gKwkJCWlmIChmaXJzdF9jbWQpIHsKPiArCQkJCWNtZCB8PSBDTURf Q0xFOwo+ICsJCQkJd3JpdGVsX3JlbGF4ZWQoaW5zdHItCj4gPmN0eC5jbWQub3Bjb2RlLAo+ICsJ CQkJCcKgwqDCoMKgwqDCoMKgY3RybC0+cmVncyArIENNRF8xKTsKPiArCQkJfSBlbHNlIHsKPiAr CQkJCWNtZCB8PSBDTURfU0VDX0NNRDsKPiArCQkJCXdyaXRlbF9yZWxheGVkKGluc3RyLQo+ID5j dHguY21kLm9wY29kZSwKPiArCQkJCQnCoMKgwqDCoMKgwqDCoGN0cmwtPnJlZ3MgKyBDTURfMik7 Cj4gKwkJCX0KPiArCQkJZmlyc3RfY21kID0gZmFsc2U7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2Ug TkFORF9PUF9BRERSX0lOU1RSOgo+ICsJCQlvZmZzZXQgPQo+IG5hbmRfc3Vib3BfZ2V0X2FkZHJf c3RhcnRfb2ZmKHN1Ym9wLCBvcF9pZCk7Cj4gKwkJCW5hZGRycyA9IG5hbmRfc3Vib3BfZ2V0X251 bV9hZGRyX2N5YyhzdWJvcCwKPiBvcF9pZCk7Cj4gKwkJCWFkZHJzID0gJmluc3RyLT5jdHguYWRk ci5hZGRyc1tvZmZzZXRdOwo+ICsKPiArCQkJY21kIHw9IENNRF9BTEUgfCBDTURfQUxFX1NJWkUo bmFkZHJzKTsKPiArCQkJZm9yIChpID0gMDsgaSA8IG1pbl90KHVuc2lnbmVkIGludCwgNCwKPiBu YWRkcnMpOyBpKyspCj4gKwkJCQlhZGRyMSB8PSAqYWRkcnMrKyA8PCAoQklUU19QRVJfQllURQo+ ICogaSk7Cj4gKwkJCW5hZGRycyAtPSBpOwo+ICsJCQlmb3IgKGkgPSAwOyBpIDwgbWluX3QodW5z aWduZWQgaW50LCA0LAo+IG5hZGRycyk7IGkrKykKPiArCQkJCWFkZHIyIHw9ICphZGRycysrIDw8 IChCSVRTX1BFUl9CWVRFCj4gKiBpKTsKPiArCQkJd3JpdGVsX3JlbGF4ZWQoYWRkcjEsIGN0cmwt PnJlZ3MgKyBBRERSXzEpOwo+ICsJCQl3cml0ZWxfcmVsYXhlZChhZGRyMiwgY3RybC0+cmVncyAr IEFERFJfMik7Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNlIE5BTkRfT1BfREFUQV9JTl9JTlNU UjoKPiArCQkJc2l6ZSA9IG5hbmRfc3Vib3BfZ2V0X2RhdGFfbGVuKHN1Ym9wLAo+IG9wX2lkKTsK PiArCQkJb2Zmc2V0ID0KPiBuYW5kX3N1Ym9wX2dldF9kYXRhX3N0YXJ0X29mZihzdWJvcCwgb3Bf aWQpOwo+ICsKPiArCQkJY21kIHw9IENNRF9UUkFOU19TSVpFKHNpemUpIHwgQ01EX1BJTyB8Cj4g Q01EX1JYIHwKPiArCQkJCUNNRF9BX1ZBTElEOwo+ICsKPiArCQkJaW5zdHJfZGF0YV9pbiA9IGlu c3RyOwo+ICsJCQlicmVhazsKPiArCj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSOgo+ ICsJCQlzaXplID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsCj4gb3BfaWQpOwo+ICsJ CQlvZmZzZXQgPQo+IG5hbmRfc3Vib3BfZ2V0X2RhdGFfc3RhcnRfb2ZmKHN1Ym9wLCBvcF9pZCk7 Cj4gKwo+ICsJCQljbWQgfD0gQ01EX1RSQU5TX1NJWkUoc2l6ZSkgfCBDTURfUElPIHwKPiBDTURf VFggfAo+ICsJCQkJQ01EX0FfVkFMSUQ7Cj4gKwo+ICsJCQltZW1jcHkoJnJlZywgaW5zdHItPmN0 eC5kYXRhLmJ1Zi5vdXQgKwo+IG9mZnNldCwgc2l6ZSk7Cj4gKwkJCXdyaXRlbF9yZWxheGVkKHJl ZywgY3RybC0+cmVncyArIFJFU1ApOwo+ICsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSBOQU5EX09Q X1dBSVRSRFlfSU5TVFI6Cj4gKwkJCWNtZCB8PSBDTURfUkJTWV9DSEs7Cj4gKwkJCWJyZWFrOwo+ ICsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJY21kIHw9IENNRF9HTyB8IENNRF9DRShjdHJsLT5jdXJf Y2hpcCk7Cj4gKwl3cml0ZWxfcmVsYXhlZChjbWQsIGN0cmwtPnJlZ3MgKyBDTUQpOwo+ICsJcmV0 ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjdHJsLT5jb21tYW5kX2NvbXBsZXRlLAo+ ICsJCQkJCcKgwqBtc2Vjc190b19qaWZmaWVzKDUwMCkpOwo+ICsJaWYgKCFyZXQpIHsKPiArCQlk ZXZfZXJyKGN0cmwtPmRldiwgIkNNRCB0aW1lb3V0XG4iKTsKPiArCQl0ZWdyYV9uYW5kX2R1bXBf cmVnKGN0cmwpOwo+ICsJCXJldHVybiAtRVRJTUVET1VUOwo+ICsJfQo+ICsKPiArCWlmIChpbnN0 cl9kYXRhX2luKSB7Cj4gKwkJcmVnID0gcmVhZGxfcmVsYXhlZChjdHJsLT5yZWdzICsgUkVTUCk7 Cj4gKwkJbWVtY3B5KGluc3RyX2RhdGFfaW4tPmN0eC5kYXRhLmJ1Zi5pbiArIG9mZnNldCwKPiAm cmVnLCBzaXplKTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGNv bnN0IHN0cnVjdCBuYW5kX29wX3BhcnNlciB0ZWdyYV9uYW5kX29wX3BhcnNlciA9Cj4gTkFORF9P UF9QQVJTRVIoCj4gKwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKHRlZ3JhX25hbmRfY21kLAo+ICsJ CU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9Q QVRfQUREUl9FTEVNKHRydWUsIDgpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0 cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpKSwKPiArCU5B TkRfT1BfUEFSU0VSX1BBVFRFUk4odGVncmFfbmFuZF9jbWQsCj4gKwkJTkFORF9PUF9QQVJTRVJf UEFUX0RBVEFfT1VUX0VMRU0oZmFsc2UsIDQpKSwKPiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4o dGVncmFfbmFuZF9jbWQsCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRydWUpLAo+ ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgOCksCj4gKwkJTkFORF9PUF9Q QVJTRVJfUEFUX0NNRF9FTEVNKHRydWUpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZ X0VMRU0odHJ1ZSksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0RBVEFfSU5fRUxFTSh0cnVlLCA0 KSksCj4gKwkpOwo+ICsKPiArc3RhdGljIGludCB0ZWdyYV9uYW5kX2V4ZWNfb3Aoc3RydWN0IG5h bmRfY2hpcCAqY2hpcCwKPiArCQkJwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlv biAqb3AsCj4gKwkJCcKgwqDCoMKgwqBib29sIGNoZWNrX29ubHkpCj4gK3sKPiArCXJldHVybiBu YW5kX29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZ0ZWdyYV9uYW5kX29wX3BhcnNlciwKPiBvcCwK PiArCQkJCcKgwqDCoMKgwqDCoGNoZWNrX29ubHkpOwo+ICt9Cj4gK3N0YXRpYyB2b2lkIHRlZ3Jh X25hbmRfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludAo+IGNoaXBfbnIpCj4g K3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3Ry dWN0IHRlZ3JhX25hbmRfY29udHJvbGxlciAqY3RybCA9IHRvX3RlZ3JhX2N0cmwoY2hpcC0KPiA+ Y29udHJvbGxlcik7Cj4gKwo+ICsJY3RybC0+Y3VyX2NoaXAgPSBjaGlwX25yOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCB0ZWdyYV9uYW5kX2h3X2VjYyhzdHJ1Y3QgdGVncmFfbmFuZF9jb250cm9s bGVyICpjdHJsLAo+ICsJCQnCoMKgwqDCoMKgwqBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBib29s IGVuYWJsZSkKPiArewo+ICsJdTMyIHJlZzsKPiArCj4gKwlzd2l0Y2ggKGNoaXAtPmVjYy5hbGdv KSB7Cj4gKwljYXNlIE5BTkRfRUNDX1JTOgo+ICsJCXJlZyA9IHJlYWRsX3JlbGF4ZWQoY3RybC0+ cmVncyArIENGRyk7Cj4gKwkJaWYgKGVuYWJsZSkKPiArCQkJcmVnIHw9IENGR19IV19FQ0MgfCBD RkdfRVJSX0NPUjsKPiArCQllbHNlCj4gKwkJCXJlZyAmPSB+KENGR19IV19FQ0MgfCBDRkdfRVJS X0NPUik7Cj4gKwkJd3JpdGVsX3JlbGF4ZWQocmVnLCBjdHJsLT5yZWdzICsgQ0ZHKTsKPiArCQli cmVhazsKPiArCWNhc2UgTkFORF9FQ0NfQkNIOgo+ICsJCXJlZyA9IHJlYWRsX3JlbGF4ZWQoY3Ry bC0+cmVncyArIEJDSF9DT05GSUcpOwo+ICsJCWlmIChlbmFibGUpCj4gKwkJCXJlZyB8PSBCQ0hf RU5BQkxFOwo+ICsJCWVsc2UKPiArCQkJcmVnICY9IH5CQ0hfRU5BQkxFOwo+ICsJCXdyaXRlbF9y ZWxheGVkKHJlZywgY3RybC0+cmVncyArIEJDSF9DT05GSUcpOwo+ICsJCWJyZWFrOwo+ICsJZGVm YXVsdDoKPiArCQlkZXZfZXJyKGN0cmwtPmRldiwgIlVuc3VwcG9ydGVkIGhhcmR3YXJlIEVDQwo+ IGFsZ29yaXRobVxuIik7Cj4gKwkJYnJlYWs7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg dGVncmFfbmFuZF9wYWdlX3hmZXIoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdAo+IG5hbmRf Y2hpcCAqY2hpcCwKPiArCQkJCXZvaWQgKmJ1ZiwgaW50IG9vYl9yZXF1aXJlZCwgaW50Cj4gcGFn ZSwKPiArCQkJCWJvb2wgcmVhZCkKPiArewo+ICsJc3RydWN0IHRlZ3JhX25hbmRfY29udHJvbGxl ciAqY3RybCA9IHRvX3RlZ3JhX2N0cmwoY2hpcC0KPiA+Y29udHJvbGxlcik7Cj4gKwlzdHJ1Y3Qg dGVncmFfbmFuZF9jaGlwICpuYW5kID0gdG9fdGVncmFfY2hpcChjaGlwKTsKPiArCWVudW0gZG1h X2RhdGFfZGlyZWN0aW9uIGRpciA9IHJlYWQgPyBETUFfRlJPTV9ERVZJQ0UgOgo+IERNQV9UT19E RVZJQ0U7Cj4gKwlkbWFfYWRkcl90IGRtYV9hZGRyOwo+ICsJdTMyIGNtZCwgZG1hX2N0cmw7Cj4g KwlpbnQgcmV0LCBkbWFfbGVuOwo+ICsKPiArCWlmIChyZWFkKSB7Cj4gKwkJd3JpdGVsX3JlbGF4 ZWQoTkFORF9DTURfUkVBRDAsIGN0cmwtPnJlZ3MgKyBDTURfMSk7Cj4gKwkJd3JpdGVsX3JlbGF4 ZWQoTkFORF9DTURfUkVBRFNUQVJULCBjdHJsLT5yZWdzICsKPiBDTURfMik7Cj4gKwl9IGVsc2Ug ewo+ICsJCXdyaXRlbF9yZWxheGVkKE5BTkRfQ01EX1NFUUlOLCBjdHJsLT5yZWdzICsgQ01EXzEp Owo+ICsJCXdyaXRlbF9yZWxheGVkKE5BTkRfQ01EX1BBR0VQUk9HLCBjdHJsLT5yZWdzICsKPiBD TURfMik7Cj4gKwl9Cj4gKwljbWQgPSBDTURfQ0xFIHwgQ01EX1NFQ19DTUQ7Cj4gKwo+ICsJLyog TG93ZXIgMTYtYml0cyBhcmUgY29sdW1uLCBhbHdheXMgMCAqLwo+ICsJd3JpdGVsX3JlbGF4ZWQo cGFnZSA8PCAxNiwgY3RybC0+cmVncyArIEFERFJfMSk7Cj4gKwo+ICsJaWYgKGNoaXAtPm9wdGlv bnMgJiBOQU5EX1JPV19BRERSXzMpIHsKPiArCQl3cml0ZWxfcmVsYXhlZChwYWdlID4+IDE2LCBj dHJsLT5yZWdzICsgQUREUl8yKTsKPiArCQljbWQgfD0gQ01EX0FMRSB8IENNRF9BTEVfU0laRSg1 KTsKPiArCX0gZWxzZSB7Cj4gKwkJY21kIHw9IENNRF9BTEUgfCBDTURfQUxFX1NJWkUoNCk7Cj4g Kwl9Cj4gKwo+ICsJZG1hX2xlbiA9IG10ZC0+d3JpdGVzaXplICsgKG9vYl9yZXF1aXJlZCA/IG10 ZC0+b29ic2l6ZSA6Cj4gMCk7Cj4gKwlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGN0cmwtPmRl diwgYnVmLCBkbWFfbGVuLCBkaXIpOwo+ICsJcmV0ID0gZG1hX21hcHBpbmdfZXJyb3IoY3RybC0+ ZGV2LCBkbWFfYWRkcik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihjdHJsLT5kZXYsICJk bWEgbWFwcGluZyBlcnJvclxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJ d3JpdGVsX3JlbGF4ZWQobXRkLT53cml0ZXNpemUgLSAxLCBjdHJsLT5yZWdzICsgRE1BX0NGR19B KTsKPiArCXdyaXRlbF9yZWxheGVkKGRtYV9hZGRyLCBjdHJsLT5yZWdzICsgREFUQV9QVFIpOwo+ ICsKPiArCWlmIChvb2JfcmVxdWlyZWQpIHsKPiArCQlkbWFfYWRkcl90IGRtYV9hZGRyX3RhZyA9 IGRtYV9hZGRyICsgbXRkLT53cml0ZXNpemU7Cj4gKwo+ICsJCXdyaXRlbF9yZWxheGVkKG5hbmQt PnRhZy5sZW5ndGggLSAxLCBjdHJsLT5yZWdzICsKPiBETUFfQ0ZHX0IpOwo+ICsJCXdyaXRlbF9y ZWxheGVkKGRtYV9hZGRyX3RhZyArIG5hbmQtPnRhZy5vZmZzZXQsCj4gKwkJCcKgwqDCoMKgwqDC oMKgY3RybC0+cmVncyArIFRBR19QVFIpOwo+ICsJfSBlbHNlIHsKPiArCQl3cml0ZWxfcmVsYXhl ZCgwLCBjdHJsLT5yZWdzICsgRE1BX0NGR19CKTsKPiArCQl3cml0ZWxfcmVsYXhlZCgwLCBjdHJs LT5yZWdzICsgVEFHX1BUUik7Cj4gKwl9Cj4gKwo+ICsJZG1hX2N0cmwgPSBETUFfQ1RSTF9HTyB8 IERNQV9DVFJMX1BFUkZfRU4gfAo+ICsJCcKgwqDCoERNQV9DVFJMX0lFX0RPTkUgfCBETUFfQ1RS TF9JU19ET05FIHwKPiArCQnCoMKgwqBETUFfQ1RSTF9CVVJTVF8xNiB8IERNQV9DVFJMX0VOX0E7 Cj4gKwlpZiAob29iX3JlcXVpcmVkKQo+ICsJCWRtYV9jdHJsIHw9IERNQV9DVFJMX0VOX0I7Cj4g KwlpZiAocmVhZCkKPiArCQlkbWFfY3RybCB8PSBETUFfQ1RSTF9JTiB8IERNQV9DVFJMX1JFVVNF Owo+ICsJZWxzZQo+ICsJCWRtYV9jdHJsIHw9IERNQV9DVFJMX09VVDsKPiArCj4gKwl3cml0ZWxf cmVsYXhlZChkbWFfY3RybCwgY3RybC0+cmVncyArIERNQV9DVFJMKTsKPiArCj4gKwljbWQgfD0g Q01EX0dPIHwgQ01EX1JCU1lfQ0hLIHwgQ01EX1RSQU5TX1NJWkUoOSkgfAo+ICsJwqDCoMKgwqDC oMKgwqBDTURfQ0UoY3RybC0+Y3VyX2NoaXApIHwgQ01EX0FfVkFMSUQ7Cj4gKwlpZiAob29iX3Jl cXVpcmVkKQo+ICsJCWNtZCB8PSBDTURfQl9WQUxJRDsKPiArCWlmIChyZWFkKQo+ICsJCWNtZCB8 PSBDTURfUlg7Cj4gKwllbHNlCj4gKwkJY21kIHw9IENNRF9UWCB8IENNRF9BRlRfREFUOwo+ICsK PiArCXdyaXRlbF9yZWxheGVkKGNtZCwgY3RybC0+cmVncyArIENNRCk7Cj4gKwo+ICsJcmV0ID0g d2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjdHJsLT5jb21tYW5kX2NvbXBsZXRlLAo+ICsJ CQkJCcKgwqBtc2Vjc190b19qaWZmaWVzKDUwMCkpOwo+ICsJaWYgKCFyZXQpIHsKPiArCQlkZXZf ZXJyKGN0cmwtPmRldiwgIkNNRCB0aW1lb3V0XG4iKTsKPiArCQl0ZWdyYV9uYW5kX2R1bXBfcmVn KGN0cmwpOwo+ICsJCXJldCA9IC1FVElNRURPVVQ7Cj4gKwkJZ290byBlcnJfdW5tYXBfZG1hOwo+ ICsJfQo+ICsKPiArCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3RybC0+ZG1h X2NvbXBsZXRlLAo+ICsJCQkJCcKgwqBtc2Vjc190b19qaWZmaWVzKDUwMCkpOwo+ICsJaWYgKCFy ZXQpIHsKPiArCQlkZXZfZXJyKGN0cmwtPmRldiwgIkRNQSB0aW1lb3V0XG4iKTsKPiArCQl0ZWdy YV9uYW5kX2R1bXBfcmVnKGN0cmwpOwo+ICsJCXJldCA9IC1FVElNRURPVVQ7Cj4gKwkJZ290byBl cnJfdW5tYXBfZG1hOwo+ICsJfQo+ICsJcmV0ID0gMDsKPiArCj4gK2Vycl91bm1hcF9kbWE6Cj4g KwlkbWFfdW5tYXBfc2luZ2xlKGN0cmwtPmRldiwgZG1hX2FkZHIsIGRtYV9sZW4sIGRpcik7Cj4g Kwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV9uYW5kX3JlYWRf cGFnZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKPiArCQkJCcKgwqDCoMKgwqDCoHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsCj4gKwkJCQnCoMKgwqDCoMKgwqB1aW50OF90ICpidWYsIGludAo+ IG9vYl9yZXF1aXJlZCwgaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV9uYW5kX2NvbnRy b2xsZXIgKmN0cmwgPSB0b190ZWdyYV9jdHJsKGNoaXAtCj4gPmNvbnRyb2xsZXIpOwo+ICsJdTMy IGRlY19zdGF0LCBtYXhfY29ycl9jbnQ7Cj4gKwl1bnNpZ25lZCBsb25nIGZhaWxfc2VjX2ZsYWc7 Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXRlZ3JhX25hbmRfaHdfZWNjKGN0cmwsIGNoaXAsIHRydWUp Owo+ICsJcmV0ID0gdGVncmFfbmFuZF9wYWdlX3hmZXIobXRkLCBjaGlwLCBidWYsIG9vYl9yZXF1 aXJlZCwKPiBwYWdlLCB0cnVlKTsKPiArCXRlZ3JhX25hbmRfaHdfZWNjKGN0cmwsIGNoaXAsIGZh bHNlKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvKiBObyBjb3JyZWN0 YWJsZSBvciB1bi1jb3JyZWN0YWJsZSBlcnJvcnMsIHBhZ2UgbXVzdCBoYXZlIDAKPiBiaXRmbGlw cyAqLwo+ICsJaWYgKCFjdHJsLT5sYXN0X3JlYWRfZXJyb3IpCj4gKwkJcmV0dXJuIDA7Cj4gKwo+ ICsJLyoKPiArCcKgKiBDb3JyZWN0YWJsZSBvciB1bi1jb3JyZWN0YWJsZSBlcnJvcnMgb2NjdXJy ZWQuIFVzZQo+IERFQ19TVEFUX0JVRgo+ICsJwqAqIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9u IGZvciBhbGwgRUNDIHNlbGVjdGlvbnMuCj4gKwnCoCoKPiArCcKgKiBOb3RlIHRoYXQgc2luY2Ug d2UgZG8gbm90IHVzZSBDb21tYW5kIFF1ZXVlcyBERUNfUkVTVUxUCj4gZG9lcyBub3QKPiArCcKg KiBzdGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdlIGNhbiByZWFkIGZyb20gdGhlCj4gREVDX1NU QVRfQlVGLiBCdXQKPiArCcKgKiBzaW5jZSBDT1JSRkFJTF9FUlIgZGlkIG9jY3VyIGR1cmluZyBw YWdlIHJlYWQgd2UgZG8gaGF2ZQo+IGEgdmFsaWQKPiArCcKgKiByZXN1bHQgaW4gREVDX1NUQVRf QlVGLgo+ICsJwqAqLwo+ICsJY3RybC0+bGFzdF9yZWFkX2Vycm9yID0gZmFsc2U7Cj4gKwlkZWNf c3RhdCA9IHJlYWRsX3JlbGF4ZWQoY3RybC0+cmVncyArIERFQ19TVEFUX0JVRik7Cj4gKwo+ICsJ ZmFpbF9zZWNfZmxhZyA9IChkZWNfc3RhdCAmIERFQ19TVEFUX0JVRl9GQUlMX1NFQ19GTEFHX01B U0spCj4gPj4KPiArCQkJREVDX1NUQVRfQlVGX0ZBSUxfU0VDX0ZMQUdfU0hJRlQ7Cj4gKwo+ICsJ bWF4X2NvcnJfY250ID0gKGRlY19zdGF0ICYgREVDX1NUQVRfQlVGX01BWF9DT1JSX0NOVF9NQVNL KQo+ID4+Cj4gKwkJwqDCoMKgwqDCoMKgwqBERUNfU1RBVF9CVUZfTUFYX0NPUlJfQ05UX1NISUZU Owo+ICsKPiArCWlmIChmYWlsX3NlY19mbGFnKSB7Cj4gKwkJaW50IGJpdCwgbWF4X2JpdGZsaXBz ID0gMDsKPiArCj4gKwkJLyoKPiArCQnCoCogQ2hlY2sgaWYgYWxsIHNlY3RvcnMgaW4gYSBwYWdl IGZhaWxlZC4gSWYgb25seQo+IHNvbWUgZmFpbGVkCj4gKwkJwqAqIGl0cyBkZWZpbml0bHkgbm90 IGFuIGVyYXNlZCBwYWdlIGFuZCB3ZSBjYW4KPiByZXR1cm4gZXJyb3IKPiArCQnCoCogc3RhdHMg cmlnaHQgYXdheS4KPiArCQnCoCoKPiArCQnCoCogRS5nLiBjb250cm9sbGVyIG1pZ2h0IHJldHVy biBmYWlsX3NlY19mbGFnIHdpdGgKPiAweDQsIHdoaWNoCj4gKwkJwqAqIHdvdWxkIG1lYW4gb25s eSB0aGUgdGhpcmQgc2VjdG9yIGZhaWxlZCB0bwo+IGNvcnJlY3QuCj4gKwkJwqAqLwo+ICsJCWlm IChmYWlsX3NlY19mbGFnIF4gR0VOTUFTSyhjaGlwLT5lY2Muc3RlcHMgLSAxLCAwKSkKPiB7Cj4g KwkJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCArPQo+IGh3ZWlnaHQ4KGZhaWxfc2VjX2ZsYWcpOwo+ ICsJCQlyZXR1cm4gbWF4X2NvcnJfY250Owo+ICsJCX0KPiArCj4gKwkJLyoKPiArCQnCoCogQWxs IHNlY3RvcnMgZmFpbGVkIHRvIGNvcnJlY3QsIGJ1dCB0aGUgRUNDIGlzbid0Cj4gc21hcnQKPiAr CQnCoCogZW5vdWdoIHRvIGZpZ3VyZSBvdXQgaWYgYSBwYWdlIGlzIHJlYWxseQo+IGNvbXBsZXRl bHkgZXJhc2VkLgo+ICsJCcKgKiBXZSBjaGVjayB0aGUgcmVhZCBkYXRhIGhlcmUgdG8gZmlndXJl IG91dCBpZiBpdCdzCj4gYQo+ICsJCcKgKiBsZWdpdGltYXRlIEVDQyBlcnJvciBvciBvbmx5IGFu IGVyYXNlZCBwYWdlLgo+ICsJCcKgKi8KPiArCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgJmZhaWxf c2VjX2ZsYWcsIGNoaXAtCj4gPmVjYy5zdGVwcykgewo+ICsJCQl1OCAqZGF0YSA9IGJ1ZiArIChj aGlwLT5lY2Muc2l6ZSAqIGJpdCk7Cj4gKwo+ICsJCQlyZXQgPSBuYW5kX2NoZWNrX2VyYXNlZF9l Y2NfY2h1bmsoZGF0YSwKPiBjaGlwLT5lY2Muc2l6ZSwKPiArCQkJCQkJCcKgwqBOVUxMLCAwLAo+ ICsJCQkJCQkJwqDCoE5VTEwsIDAsCj4gKwkJCQkJCQnCoMKgY2hpcC0KPiA+ZWNjLnN0cmVuZ3Ro KTsKPiArCQkJaWYgKHJldCA8IDApCj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiAr CQkJZWxzZQo+ICsJCQkJbWF4X2JpdGZsaXBzID0gbWF4KHJldCwKPiBtYXhfYml0ZmxpcHMpOwo+ ICsJCX0KPiArCj4gKwkJcmV0dXJuIG1heF90KHVuc2lnbmVkIGludCwgbWF4X2NvcnJfY250LAo+ IG1heF9iaXRmbGlwcyk7Cj4gKwl9IGVsc2Ugewo+ICsJCWludCBjb3JyX3NlY19mbGFnOwo+ICsK PiArCQljb3JyX3NlY19mbGFnID0gKGRlY19zdGF0ICYKPiBERUNfU1RBVF9CVUZfQ09SUl9TRUNf RkxBR19NQVNLKSA+Pgo+ICsJCQkJREVDX1NUQVRfQlVGX0NPUlJfU0VDX0ZMQUdfU0hJRlQ7Cj4g Kwo+ICsJCS8qCj4gKwkJwqAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgcmVnaXN0ZXIgaXMg dGhlIG1heGltdW0KPiBvZgo+ICsJCcKgKiBiaXRmbGlwcyBlbmNvdW50ZXJlZCBpbiBhbnkgb2Yg dGhlIEVDQyByZWdpb25zLgo+IEFzIHRoZXJlIGlzCj4gKwkJwqAqIG5vIHdheSB0byBnZXQgdGhl IG51bWJlciBvZiBiaXRmbGlwcyBpbiBhCj4gc3BlY2lmaWMgcmVnaW9ucwo+ICsJCcKgKiB3ZSBh cmUgbm90IGFibGUgdG8gZGVsaXZlciBjb3JyZWN0IHN0YXRzIGJ1dAo+IGluc3RlYWQKPiArCQnC oCogb3ZlcmVzdGltYXRlIHRoZSBudW1iZXIgb2YgY29ycmVjdGVkIGJpdGZsaXBzIGJ5Cj4gYXNz dW1pbmcKPiArCQnCoCogdGhhdCBhbGwgcmVnaW9ucyB3aGVyZSBlcnJvcnMgaGF2ZSBiZWVuIGNv cnJlY3RlZAo+ICsJCcKgKiBlbmNvdW50ZXJlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYml0Zmxp cHMuCj4gKwkJwqAqLwo+ICsJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSBtYXhfY29ycl9j bnQgKgo+IGh3ZWlnaHQ4KGNvcnJfc2VjX2ZsYWcpOwo+ICsKPiArCQlyZXR1cm4gbWF4X2NvcnJf Y250Owo+ICsJfQo+ICsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV9uYW5kX3dyaXRlX3Bh Z2VfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsCj4gKwkJCQnCoMKgwqDCoMKgwqDCoHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsCj4gKwkJCQnCoMKgwqDCoMKgwqDCoGNvbnN0IHVpbnQ4X3QgKmJ1 ZiwgaW50Cj4gb29iX3JlcXVpcmVkLAo+ICsJCQkJwqDCoMKgwqDCoMKgwqBpbnQgcGFnZSkKPiAr ewo+ICsJc3RydWN0IHRlZ3JhX25hbmRfY29udHJvbGxlciAqY3RybCA9IHRvX3RlZ3JhX2N0cmwo Y2hpcC0KPiA+Y29udHJvbGxlcik7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXRlZ3JhX25hbmRfaHdf ZWNjKGN0cmwsIGNoaXAsIHRydWUpOwo+ICsJcmV0ID0gdGVncmFfbmFuZF9wYWdlX3hmZXIobXRk LCBjaGlwLCAodm9pZCAqKWJ1ZiwKPiBvb2JfcmVxdWlyZWQsIHBhZ2UsCj4gKwkJCQnCoMKgwqBm YWxzZSk7Cj4gKwl0ZWdyYV9uYW5kX2h3X2VjYyhjdHJsLCBjaGlwLCBmYWxzZSk7Cj4gKwo+ICsJ cmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVncmFfbmFuZF9zZXR1cF90aW1p bmcoc3RydWN0IHRlZ3JhX25hbmRfY29udHJvbGxlcgo+ICpjdHJsLAo+ICsJCQkJwqDCoMKgwqBj b25zdCBzdHJ1Y3QgbmFuZF9zZHJfdGltaW5ncwo+ICp0aW1pbmdzKQo+ICt7Cj4gKwkvKgo+ICsJ wqAqIFRoZSBwZXJpb2QgKGFuZCBhbGwgb3RoZXIgdGltaW5ncyBpbiB0aGlzIGZ1bmN0aW9uKSBp cyBpbgo+IHBzLAo+ICsJwqAqIHNvIG5lZWQgdG8gdGFrZSBjYXJlIGhlcmUgdG8gYXZvaWQgaW50 ZWdlciBvdmVyZmxvd3MuCj4gKwnCoCovCj4gKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IGNsa19nZXRf cmF0ZShjdHJsLT5jbGspIC8gMTAwMDAwMDsKPiArCXVuc2lnbmVkIGludCBwZXJpb2QgPSBESVZf Uk9VTkRfVVAoMTAwMDAwMCwgcmF0ZSk7Cj4gKwl1MzIgdmFsLCByZWcgPSAwOwo+ICsKPiArCXZh bCA9IERJVl9ST1VORF9VUChtYXgzKHRpbWluZ3MtPnRBUl9taW4sIHRpbWluZ3MtPnRSUl9taW4s Cj4gKwkJCQl0aW1pbmdzLT50UkNfbWluKSwgcGVyaW9kKTsKPiArCXJlZyB8PSBUSU1JTkdfVENS X1RBUl9UUlIoT0ZGU0VUKHZhbCwgMykpOwo+ICsKPiArCXZhbCA9IERJVl9ST1VORF9VUChtYXgo bWF4KHRpbWluZ3MtPnRDU19taW4sIHRpbWluZ3MtCj4gPnRDSF9taW4pLAo+ICsJCQnCoMKgwqDC oMKgwqDCoG1heCh0aW1pbmdzLT50QUxTX21pbiwgdGltaW5ncy0KPiA+dEFMSF9taW4pKSwKPiAr CQkJwqDCoMKgcGVyaW9kKTsKPiArCXJlZyB8PSBUSU1JTkdfVENTKE9GRlNFVCh2YWwsIDIpKTsK PiArCj4gKwl2YWwgPSBESVZfUk9VTkRfVVAobWF4KHRpbWluZ3MtPnRSUF9taW4sIHRpbWluZ3Mt PnRSRUFfbWF4KQo+ICsgNjAwMCwKPiArCQkJwqDCoMKgcGVyaW9kKTsKPiArCXJlZyB8PSBUSU1J TkdfVFJQKE9GRlNFVCh2YWwsIDEpKSB8Cj4gVElNSU5HX1RSUF9SRVNQKE9GRlNFVCh2YWwsIDEp KTsKPiArCj4gKwlyZWcgfD0gVElNSU5HX1RXQihPRkZTRVQoRElWX1JPVU5EX1VQKHRpbWluZ3Mt PnRXQl9tYXgsCj4gcGVyaW9kKSwgMSkpOwo+ICsJcmVnIHw9IFRJTUlOR19UV0hSKE9GRlNFVChE SVZfUk9VTkRfVVAodGltaW5ncy0+dFdIUl9taW4sCj4gcGVyaW9kKSwgMSkpOwo+ICsJcmVnIHw9 IFRJTUlOR19UV0goT0ZGU0VUKERJVl9ST1VORF9VUCh0aW1pbmdzLT50V0hfbWluLAo+IHBlcmlv ZCksIDEpKTsKPiArCXJlZyB8PSBUSU1JTkdfVFdQKE9GRlNFVChESVZfUk9VTkRfVVAodGltaW5n cy0+dFdQX21pbiwKPiBwZXJpb2QpLCAxKSk7Cj4gKwlyZWcgfD0gVElNSU5HX1RSSChPRkZTRVQo RElWX1JPVU5EX1VQKHRpbWluZ3MtPnRSRUhfbWluLAo+IHBlcmlvZCksIDEpKTsKPiArCj4gKwl3 cml0ZWxfcmVsYXhlZChyZWcsIGN0cmwtPnJlZ3MgKyBUSU1JTkdfMSk7Cj4gKwo+ICsJdmFsID0g RElWX1JPVU5EX1VQKHRpbWluZ3MtPnRBRExfbWluLCBwZXJpb2QpOwo+ICsJcmVnID0gVElNSU5H X1RBREwoT0ZGU0VUKHZhbCwgMykpOwo+ICsKPiArCXdyaXRlbF9yZWxheGVkKHJlZywgY3RybC0+ cmVncyArIFRJTUlOR18yKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV9uYW5kX3NldHVw X2RhdGFfaW50ZXJmYWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQKPiBjc2xpbmUsCj4gKwkJ CQkJwqDCoMKgY29uc3Qgc3RydWN0Cj4gbmFuZF9kYXRhX2ludGVyZmFjZSAqY29uZikKPiArewo+ ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gKwlzdHJ1Y3Qg dGVncmFfbmFuZF9jb250cm9sbGVyICpjdHJsID0gdG9fdGVncmFfY3RybChjaGlwLQo+ID5jb250 cm9sbGVyKTsKPiArCWNvbnN0IHN0cnVjdCBuYW5kX3Nkcl90aW1pbmdzICp0aW1pbmdzOwo+ICsK PiArCXRpbWluZ3MgPSBuYW5kX2dldF9zZHJfdGltaW5ncyhjb25mKTsKPiArCWlmIChJU19FUlIo dGltaW5ncykpCj4gKwkJcmV0dXJuIFBUUl9FUlIodGltaW5ncyk7Cj4gKwo+ICsJaWYgKGNzbGlu ZSA9PSBOQU5EX0RBVEFfSUZBQ0VfQ0hFQ0tfT05MWSkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwl0 ZWdyYV9uYW5kX3NldHVwX3RpbWluZyhjdHJsLCB0aW1pbmdzKTsKPiArCj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArCj4gK2NvbnN0IGludCByc19zdHJlbmd0aF9ib290YWJsZVtdID0geyA0IH07 Cj4gK2NvbnN0IGludCByc19zdHJlbmd0aFtdID0geyA0LCA2LCA4IH07Cj4gK2NvbnN0IGludCBi Y2hfc3RyZW5ndGhfYm9vdGFibGVbXSA9IHsgOCwgMTYgfTsKPiArY29uc3QgaW50IGJjaF9zdHJl bmd0aFtdID0geyA0LCA4LCAxNCwgMTYgfTsKPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfbmFuZF9n ZXRfc3RyZW5ndGgoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgaW50Cj4gKnN0cmVuZ3Ro LAo+ICsJCQkJwqDCoMKgaW50IHN0cmVuZ3RoX2xlbiwgaW50IG9vYnNpemUpCj4gK3sKPiArCWJv b2wgbWF4aW1pemUgPSBjaGlwLT5lY2Mub3B0aW9ucyAmIE5BTkRfRUNDX01BWElNSVpFOwo+ICsJ aW50IGk7Cj4gKwo+ICsJLyoKPiArCcKgKiBMb29wIHRocm91Z2ggYXZhaWxhYmxlIHN0cmVuZ3Ro cy4gQmFja3dhcmRzIGluIGNhc2Ugd2UKPiB0cnkgdG8KPiArCcKgKiBtYXhpbWl6ZSB0aGUgQkNI IHN0cmVuZ3RoLgo+ICsJwqAqLwo+ICsJZm9yIChpID0gMDsgaSA8IHN0cmVuZ3RoX2xlbjsgaSsr KSB7Cj4gKwkJaW50IHN0cmVuZ3RoX3NlbCwgYnl0ZXNfcGVyX3N0ZXAsIGJ5dGVzX3Blcl9wYWdl Owo+ICsKPiArCQlpZiAobWF4aW1pemUpIHsKPiArCQkJc3RyZW5ndGhfc2VsID0gc3RyZW5ndGhb c3RyZW5ndGhfbGVuIC0gaSAtCj4gMV07Cj4gKwkJfSBlbHNlIHsKPiArCQkJc3RyZW5ndGhfc2Vs ID0gc3RyZW5ndGhbaV07Cj4gKwo+ICsJCQlpZiAoc3RyZW5ndGhfc2VsIDwgY2hpcC0+ZWNjX3N0 cmVuZ3RoX2RzKQo+ICsJCQkJY29udGludWU7Cj4gKwkJfQo+ICsKPiArCQlieXRlc19wZXJfc3Rl cCA9IERJVl9ST1VORF9VUChCSVRTX1BFUl9TVEVQX0JDSCAqCj4gc3RyZW5ndGhfc2VsLAo+ICsJ CQkJCcKgwqDCoMKgwqDCoEJJVFNfUEVSX0JZVEUpOwo+ICsJCWJ5dGVzX3Blcl9wYWdlID0gcm91 bmRfdXAoYnl0ZXNfcGVyX3N0ZXAgKiBjaGlwLQo+ID5lY2Muc3RlcHMsIDQpOwo+ICsKPiArCQkv KiBDaGVjayB3aGV0aGVyIHN0cmVuZ3RoIGZpdHMgT09CICovCj4gKwkJaWYgKGJ5dGVzX3Blcl9w YWdlIDwgKG9vYnNpemUgLSBTS0lQX1NQQVJFX0JZVEVTKSkKPiArCQkJcmV0dXJuIHN0cmVuZ3Ro X3NlbDsKPiArCX0KPiArCj4gKwlyZXR1cm4gLUVJTlZBTDsKPiArfQo+ICsKPiArc3RhdGljIGlu dCB0ZWdyYV9uYW5kX3NlbGVjdF9zdHJlbmd0aChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQK PiBvb2JzaXplKQo+ICt7Cj4gKwljb25zdCBpbnQgKnN0cmVuZ3RoOwo+ICsJaW50IHN0cmVuZ3Ro X2xlbjsKPiArCj4gKwlzd2l0Y2ggKGNoaXAtPmVjYy5hbGdvKSB7Cj4gKwljYXNlIE5BTkRfRUND X1JTOgo+ICsJCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9JU19CT09UX01FRElVTSkgewo+ICsJ CQlzdHJlbmd0aCA9IHJzX3N0cmVuZ3RoX2Jvb3RhYmxlOwo+ICsJCQlzdHJlbmd0aF9sZW4gPQo+ IEFSUkFZX1NJWkUocnNfc3RyZW5ndGhfYm9vdGFibGUpOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCXN0 cmVuZ3RoID0gcnNfc3RyZW5ndGg7Cj4gKwkJCXN0cmVuZ3RoX2xlbiA9IEFSUkFZX1NJWkUocnNf c3RyZW5ndGgpOwo+ICsJCX0KPiArCQlicmVhazsKPiArCWNhc2UgTkFORF9FQ0NfQkNIOgo+ICsJ CWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9JU19CT09UX01FRElVTSkgewo+ICsJCQlzdHJlbmd0 aCA9IGJjaF9zdHJlbmd0aF9ib290YWJsZTsKPiArCQkJc3RyZW5ndGhfbGVuID0KPiBBUlJBWV9T SVpFKGJjaF9zdHJlbmd0aF9ib290YWJsZSk7Cj4gKwkJfSBlbHNlIHsKPiArCQkJc3RyZW5ndGgg PSBiY2hfc3RyZW5ndGg7Cj4gKwkJCXN0cmVuZ3RoX2xlbiA9IEFSUkFZX1NJWkUoYmNoX3N0cmVu Z3RoKTsKPiArCQl9Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCXJldHVybiAtRUlOVkFM Owo+ICsJfQo+ICsKPiArCXJldHVybiB0ZWdyYV9uYW5kX2dldF9zdHJlbmd0aChjaGlwLCBzdHJl bmd0aCwgc3RyZW5ndGhfbGVuLAo+IG9vYnNpemUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHRl Z3JhX25hbmRfY2hpcHNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwkJCQnCoHN0cnVjdCB0 ZWdyYV9uYW5kX2NvbnRyb2xsZXIgKmN0cmwpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAq bnAgPSBkZXYtPm9mX25vZGU7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wX25hbmQ7Cj4gKwlp bnQgbmNoaXBzID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKPiArCXN0cnVjdCB0ZWdyYV9uYW5k X2NoaXAgKm5hbmQ7Cj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKPiArCXN0cnVjdCBuYW5kX2No aXAgKmNoaXA7Cj4gKwl1bnNpZ25lZCBsb25nIGNvbmZpZywgYmNoX2NvbmZpZyA9IDA7Cj4gKwlp bnQgYml0c19wZXJfc3RlcDsKPiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKG5jaGlwcyAhPSAxKSB7 Cj4gKwkJZGV2X2VycihkZXYsICJDdXJyZW50bHkgb25seSBvbmUgTkFORCBjaGlwCj4gc3VwcG9y dGVkXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlucF9uYW5kID0gb2Zf Z2V0X25leHRfY2hpbGQobnAsIE5VTEwpOwo+ICsKPiArCW5hbmQgPSBkZXZtX2t6YWxsb2MoZGV2 LCBzaXplb2YoKm5hbmQpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghbmFuZCkKPiArCQlyZXR1cm4g LUVOT01FTTsKPiArCj4gKwluYW5kLT53cF9ncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwo ZGV2LCAid3AiLAo+IEdQSU9EX09VVF9MT1cpOwo+ICsKPiArCWlmIChJU19FUlIobmFuZC0+d3Bf Z3BpbykpIHsKPiArCQlyZXQgPSBQVFJfRVJSKG5hbmQtPndwX2dwaW8pOwo+ICsJCWRldl9lcnIo ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgV1AgR1BJTzogJWRcbiIsCj4gcmV0KTsKPiArCQlyZXR1 cm4gcmV0Owo+ICsJfQo+ICsKPiArCWNoaXAgPSAmbmFuZC0+Y2hpcDsKPiArCWNoaXAtPmNvbnRy b2xsZXIgPSAmY3RybC0+Y29udHJvbGxlcjsKPiArCj4gKwltdGQgPSBuYW5kX3RvX210ZChjaGlw KTsKPiArCj4gKwltdGQtPmRldi5wYXJlbnQgPSBkZXY7Cj4gKwlpZiAoIW10ZC0+bmFtZSkKPiAr CQltdGQtPm5hbWUgPSAidGVncmFfbmFuZCI7Cj4gKwltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7 Cj4gKwo+ICsJbmFuZF9zZXRfZmxhc2hfbm9kZShjaGlwLCBucF9uYW5kKTsKCkhpLAppIGp1c3Qg dHJpZWQgdGhpcyBkcml2ZXIgYW5kIGl0IHdvcmtzIGdyZWF0IHNvIGZhciwgdGhhbmtzLgpJIGp1 c3QgZm91bmQsIHRoYXQgYXNzaWduaW5nIHRoZSBvZiBub2RlIGFmdGVyIHNldHRpbmcgdGhlIG10 ZC0+bmFtZQptYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGFzc2lnbiBhIG5hbWUgdmlhIGRldmljZXRy ZWUgbGFiZWwuIEkgaGF2ZSByZWFkCnRoZSBkaXNjdXNzaW9uIGFib3V0IHRoZSBsYWJlbCBvbiB0 aGlzIGxpc3QsIHNvIEknbSBjdXJpb3VzIGlmIHRoaXMgaXMKaW50ZW50aW9uYWw/IFNldHRpbmcg bXRkLT5uYW1lIGFmdGVyIG5hbmRfc2V0X2ZsYXNoX25vZGUoKSBlbmFibGVzIHRoZQpsYWJlbCBw YXJhbWV0ZXIuCgo+ICsKPiArCWNoaXAtPm9wdGlvbnMgPSBOQU5EX05PX1NVQlBBR0VfV1JJVEUg fAo+IE5BTkRfVVNFX0JPVU5DRV9CVUZGRVI7Cj4gKwljaGlwLT5leGVjX29wID0gdGVncmFfbmFu ZF9leGVjX29wOwo+ICsJY2hpcC0+c2VsZWN0X2NoaXAgPSB0ZWdyYV9uYW5kX3NlbGVjdF9jaGlw Owo+ICsJY2hpcC0+c2V0dXBfZGF0YV9pbnRlcmZhY2UgPQo+IHRlZ3JhX25hbmRfc2V0dXBfZGF0 YV9pbnRlcmZhY2U7Cj4gKwo+ICsJcmV0ID0gbmFuZF9zY2FuX2lkZW50KG10ZCwgMSwgTlVMTCk7 Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaWYgKGNoaXAtPmJidF9vcHRp b25zICYgTkFORF9CQlRfVVNFX0ZMQVNIKQo+ICsJCWNoaXAtPmJidF9vcHRpb25zIHw9IE5BTkRf QkJUX05PX09PQjsKPiArCj4gKwljaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXOwo+ICsJY2hp cC0+ZWNjLnNpemUgPSA1MTI7Cj4gKwljaGlwLT5lY2Muc3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAv IGNoaXAtPmVjYy5zaXplOwo+ICsJaWYgKGNoaXAtPmVjY19zdGVwX2RzICE9IDUxMikgewo+ICsJ CWRldl9lcnIoZGV2LCAiVW5zdXBwb3J0ZWQgc3RlcCBzaXplICVkXG4iLCBjaGlwLQo+ID5lY2Nf c3RlcF9kcyk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJY2hpcC0+ZWNjLnJl YWRfcGFnZSA9IHRlZ3JhX25hbmRfcmVhZF9wYWdlX2h3ZWNjOwo+ICsJY2hpcC0+ZWNjLndyaXRl X3BhZ2UgPSB0ZWdyYV9uYW5kX3dyaXRlX3BhZ2VfaHdlY2M7Cj4gKwo+ICsJY29uZmlnID0gcmVh ZGxfcmVsYXhlZChjdHJsLT5yZWdzICsgQ0ZHKTsKPiArCWNvbmZpZyB8PSBDRkdfUElQRV9FTiB8 IENGR19TS0lQX1NQQVJFIHwKPiBDRkdfU0tJUF9TUEFSRV9TSVpFXzQ7Cj4gKwo+ICsJaWYgKGNo aXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KQo+ICsJCWNvbmZpZyB8PSBDRkdfQlVTX1dJ RFRIXzE2Owo+ICsKPiArCWlmIChjaGlwLT5lY2MuYWxnbyA9PSBOQU5EX0VDQ19VTktOT1dOKSB7 Cj4gKwkJaWYgKG10ZC0+d3JpdGVzaXplIDwgMjA0OCkKPiArCQkJY2hpcC0+ZWNjLmFsZ28gPSBO QU5EX0VDQ19SUzsKPiArCQllbHNlCj4gKwkJCWNoaXAtPmVjYy5hbGdvID0gTkFORF9FQ0NfQkNI Owo+ICsJfQo+ICsKPiArCWlmIChjaGlwLT5lY2MuYWxnbyA9PSBOQU5EX0VDQ19CQ0ggJiYgbXRk LT53cml0ZXNpemUgPCAyMDQ4KQo+IHsKPiArCQlkZXZfZXJyKGRldiwgIkJDSCBzdXBwb3J0ZXMg Mksgb3IgNEsgcGFnZSBzaXplCj4gb25seVxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9 Cj4gKwo+ICsJaWYgKCFjaGlwLT5lY2Muc3RyZW5ndGgpIHsKPiArCQlyZXQgPSB0ZWdyYV9uYW5k X3NlbGVjdF9zdHJlbmd0aChjaGlwLCBtdGQtCj4gPm9vYnNpemUpOwo+ICsJCWlmIChyZXQgPCAw KSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiTm8gdmFsaWQgc3RyZW5naHQgZm91bmQsCj4gbWluaW11 bSAlZFxuIiwKPiArCQkJCWNoaXAtPmVjY19zdHJlbmd0aF9kcyk7Cj4gKwkJCXJldHVybiByZXQ7 Cj4gKwkJfQo+ICsKPiArCQljaGlwLT5lY2Muc3RyZW5ndGggPSByZXQ7Cj4gKwl9Cj4gKwo+ICsJ c3dpdGNoIChjaGlwLT5lY2MuYWxnbykgewo+ICsJY2FzZSBOQU5EX0VDQ19SUzoKPiArCQliaXRz X3Blcl9zdGVwID0gQklUU19QRVJfU1RFUF9SUyAqIGNoaXAtCj4gPmVjYy5zdHJlbmd0aDsKPiAr CQltdGRfc2V0X29vYmxheW91dChtdGQsICZ0ZWdyYV9uYW5kX29vYl9yc19vcHMpOwo+ICsJCXN3 aXRjaCAoY2hpcC0+ZWNjLnN0cmVuZ3RoKSB7Cj4gKwkJY2FzZSA0Ogo+ICsJCQljb25maWcgfD0g Q0ZHX0VDQ19TRUwgfCBDRkdfVFZBTF80Owo+ICsJCQlicmVhazsKPiArCQljYXNlIDY6Cj4gKwkJ CWNvbmZpZyB8PSBDRkdfRUNDX1NFTCB8IENGR19UVkFMXzY7Cj4gKwkJCWJyZWFrOwo+ICsJCWNh c2UgODoKPiArCQkJY29uZmlnIHw9IENGR19FQ0NfU0VMIHwgQ0ZHX1RWQUxfODsKPiArCQkJYnJl YWs7Cj4gKwkJZGVmYXVsdDoKPiArCQkJZGV2X2VycihkZXYsICJFQ0Mgc3RyZW5ndGggJWQgbm90 Cj4gc3VwcG9ydGVkXG4iLAo+ICsJCQkJY2hpcC0+ZWNjLnN0cmVuZ3RoKTsKPiArCQkJcmV0dXJu IC1FSU5WQUw7Cj4gKwkJfQo+ICsJCWJyZWFrOwo+ICsJY2FzZSBOQU5EX0VDQ19CQ0g6Cj4gKwkJ Yml0c19wZXJfc3RlcCA9IEJJVFNfUEVSX1NURVBfQkNIICogY2hpcC0KPiA+ZWNjLnN0cmVuZ3Ro Owo+ICsJCW10ZF9zZXRfb29ibGF5b3V0KG10ZCwgJnRlZ3JhX25hbmRfb29iX2JjaF9vcHMpOwo+ ICsJCXN3aXRjaCAoY2hpcC0+ZWNjLnN0cmVuZ3RoKSB7Cj4gKwkJY2FzZSA0Ogo+ICsJCQliY2hf Y29uZmlnID0gQkNIX1RWQUxfNDsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSA4Ogo+ICsJCQliY2hf Y29uZmlnID0gQkNIX1RWQUxfODsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSAxNDoKPiArCQkJYmNo X2NvbmZpZyA9IEJDSF9UVkFMXzE0Owo+ICsJCQlicmVhazsKPiArCQljYXNlIDE2Ogo+ICsJCQli Y2hfY29uZmlnID0gQkNIX1RWQUxfMTY7Cj4gKwkJCWJyZWFrOwo+ICsJCWRlZmF1bHQ6Cj4gKwkJ CWRldl9lcnIoZGV2LCAiRUNDIHN0cmVuZ3RoICVkIG5vdAo+IHN1cHBvcnRlZFxuIiwKPiArCQkJ CWNoaXAtPmVjYy5zdHJlbmd0aCk7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCX0KPiArCQli cmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJZGV2X2VycihkZXYsICJFQ0MgYWxnb3JpdGhtIG5vdCBz dXBwb3J0ZWRcbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWRldl9pbmZv KGRldiwgIlVzaW5nICVzIHdpdGggc3RyZW5ndGggJWQgcGVyIDUxMiBieXRlCj4gc3RlcFxuIiwK PiArCQkJY2hpcC0+ZWNjLmFsZ28gPT0gTkFORF9FQ0NfQkNIID8gIkJDSCIgOgo+ICJSUyIsCj4g KwkJCWNoaXAtPmVjYy5zdHJlbmd0aCk7Cj4gKwo+ICsJY2hpcC0+ZWNjLmJ5dGVzID0gRElWX1JP VU5EX1VQKGJpdHNfcGVyX3N0ZXAsCj4gQklUU19QRVJfQllURSk7Cj4gKwo+ICsJc3dpdGNoICht dGQtPndyaXRlc2l6ZSkgewo+ICsJY2FzZSAyNTY6Cj4gKwkJY29uZmlnIHw9IENGR19QU18yNTY7 Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDUxMjoKPiArCQljb25maWcgfD0gQ0ZHX1BTXzUxMjsKPiAr CQlicmVhazsKPiArCWNhc2UgMTAyNDoKPiArCQljb25maWcgfD0gQ0ZHX1BTXzEwMjQ7Cj4gKwkJ YnJlYWs7Cj4gKwljYXNlIDIwNDg6Cj4gKwkJY29uZmlnIHw9IENGR19QU18yMDQ4Owo+ICsJCWJy ZWFrOwo+ICsJY2FzZSA0MDk2Ogo+ICsJCWNvbmZpZyB8PSBDRkdfUFNfNDA5NjsKPiArCQlicmVh azsKPiArCWRlZmF1bHQ6Cj4gKwkJZGV2X2VycihkZXYsICJVbnN1cHBvcnRlZCB3cml0ZXNpemUg JWRcbiIsIG10ZC0KPiA+d3JpdGVzaXplKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCX0KPiAr Cj4gKwl3cml0ZWxfcmVsYXhlZChjb25maWcsIGN0cmwtPnJlZ3MgKyBDRkcpOwo+ICsJd3JpdGVs X3JlbGF4ZWQoYmNoX2NvbmZpZywgY3RybC0+cmVncyArIEJDSF9DT05GSUcpOwo+ICsKPiArCXJl dCA9IG5hbmRfc2Nhbl90YWlsKG10ZCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4g Kwo+ICsJbXRkX29vYmxheW91dF9mcmVlKG10ZCwgMCwgJm5hbmQtPnRhZyk7Cj4gKwo+ICsJY29u ZmlnIHw9IENGR19UQUdfQllURV9TSVpFKG5hbmQtPnRhZy5sZW5ndGggLSAxKTsKPiArCXdyaXRl bF9yZWxheGVkKGNvbmZpZywgY3RybC0+cmVncyArIENGRyk7Cj4gKwo+ICsJcmV0ID0gbXRkX2Rl dmljZV9yZWdpc3RlcihtdGQsIE5VTEwsIDApOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIo ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIG10ZCBkZXZpY2U6ICVkXG4iLAo+IHJldCk7Cj4gKwkJ bmFuZF9jbGVhbnVwKGNoaXApOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJY3RybC0+ Y2hpcCA9IGNoaXA7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVn cmFfbmFuZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1 Y3QgcmVzZXRfY29udHJvbCAqcnN0Owo+ICsJc3RydWN0IHRlZ3JhX25hbmRfY29udHJvbGxlciAq Y3RybDsKPiArCXN0cnVjdCByZXNvdXJjZSAqcmVzOwo+ICsJdW5zaWduZWQgbG9uZyByZWc7Cj4g KwlpbnQgaXJxLCBlcnIgPSAwOwo+ICsKPiArCWN0cmwgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRl diwgc2l6ZW9mKCpjdHJsKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWN0cmwpCj4gKwkJcmV0dXJu IC1FTk9NRU07Cj4gKwo+ICsJY3RybC0+ZGV2ID0gJnBkZXYtPmRldjsKPiArCW5hbmRfaHdfY29u dHJvbF9pbml0KCZjdHJsLT5jb250cm9sbGVyKTsKPiArCj4gKwlyZXMgPSBwbGF0Zm9ybV9nZXRf cmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwo+ICsJY3RybC0+cmVncyA9IGRldm1f aW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+ICsJaWYgKElTX0VSUihjdHJsLT5y ZWdzKSkKPiArCQlyZXR1cm4gUFRSX0VSUihjdHJsLT5yZWdzKTsKPiArCj4gKwlyc3QgPSBkZXZt X3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJuYW5kIik7Cj4gKwlpZiAoSVNfRVJSKHJz dCkpCj4gKwkJcmV0dXJuIFBUUl9FUlIocnN0KTsKPiArCj4gKwljdHJsLT5jbGsgPSBkZXZtX2Ns a19nZXQoJnBkZXYtPmRldiwgIm5hbmQiKTsKPiArCWlmIChJU19FUlIoY3RybC0+Y2xrKSkKPiAr CQlyZXR1cm4gUFRSX0VSUihjdHJsLT5jbGspOwo+ICsKPiArCWVyciA9IGNsa19wcmVwYXJlX2Vu YWJsZShjdHJsLT5jbGspOwo+ICsJaWYgKGVycikKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCWVy ciA9IHJlc2V0X2NvbnRyb2xfcmVzZXQocnN0KTsKPiArCWlmIChlcnIpCj4gKwkJZ290byBlcnJf ZGlzYWJsZV9jbGs7Cj4gKwo+ICsJcmVnID0gSFdTVEFUVVNfUkRTVEFUVVNfTUFTSygxKSB8IEhX U1RBVFVTX1JEU1RBVFVTX1ZBTFVFKDApCj4gfAo+ICsJCUhXU1RBVFVTX1JCU1lfTUFTSyhOQU5E X1NUQVRVU19SRUFEWSkgfAo+ICsJCUhXU1RBVFVTX1JCU1lfVkFMVUUoTkFORF9TVEFUVVNfUkVB RFkpOwo+ICsJd3JpdGVsX3JlbGF4ZWQoTkFORF9DTURfU1RBVFVTLCBjdHJsLT5yZWdzICsgSFdT VEFUVVNfQ01EKTsKPiArCXdyaXRlbF9yZWxheGVkKHJlZywgY3RybC0+cmVncyArIEhXU1RBVFVT X01BU0spOwo+ICsKPiArCWluaXRfY29tcGxldGlvbigmY3RybC0+Y29tbWFuZF9jb21wbGV0ZSk7 Cj4gKwlpbml0X2NvbXBsZXRpb24oJmN0cmwtPmRtYV9jb21wbGV0ZSk7Cj4gKwo+ICsJLyogY2xl YXIgaW50ZXJydXB0cyAqLwo+ICsJcmVnID0gcmVhZGxfcmVsYXhlZChjdHJsLT5yZWdzICsgSVNS KTsKPiArCXdyaXRlbF9yZWxheGVkKHJlZywgY3RybC0+cmVncyArIElTUik7Cj4gKwo+ICsJaXJx ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPiArCWVyciA9IGRldm1fcmVxdWVzdF9pcnEo JnBkZXYtPmRldiwgaXJxLCB0ZWdyYV9uYW5kX2lycSwgMCwKPiArCQkJwqDCoMKgwqDCoMKgwqBk ZXZfbmFtZSgmcGRldi0+ZGV2KSwgY3RybCk7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gZXJyX2Rp c2FibGVfY2xrOwo+ICsKPiArCXdyaXRlbF9yZWxheGVkKERNQV9DVFJMX0lTX0RPTkUsIGN0cmwt PnJlZ3MgKyBETUFfQ1RSTCk7Cj4gKwo+ICsJLyogZW5hYmxlIGludGVycnVwdHMgKi8KPiArCXJl ZyA9IElFUl9VTkQgfCBJRVJfT1ZSIHwgSUVSX0NNRF9ET05FIHwgSUVSX0dJRTsKPiArCXdyaXRl bF9yZWxheGVkKHJlZywgY3RybC0+cmVncyArIElFUik7Cj4gKwo+ICsJLyogcmVzZXQgY29uZmln ICovCj4gKwl3cml0ZWxfcmVsYXhlZCgwLCBjdHJsLT5yZWdzICsgQ0ZHKTsKPiArCj4gKwllcnIg PSB0ZWdyYV9uYW5kX2NoaXBzX2luaXQoY3RybC0+ZGV2LCBjdHJsKTsKPiArCWlmIChlcnIpCj4g KwkJZ290byBlcnJfZGlzYWJsZV9jbGs7Cj4gKwo+ICsJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRl diwgY3RybCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtlcnJfZGlzYWJsZV9jbGs6Cj4gKwlj bGtfZGlzYWJsZV91bnByZXBhcmUoY3RybC0+Y2xrKTsKPiArCXJldHVybiBlcnI7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgdGVncmFfbmFuZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKPiArewo+ICsJc3RydWN0IHRlZ3JhX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gcGxh dGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJbmFuZF9yZWxlYXNlKG5hbmRfdG9fbXRk KGN0cmwtPmNoaXApKTsKPiArCj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY3RybC0+Y2xrKTsK PiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZp Y2VfaWQgdGVncmFfbmFuZF9vZl9tYXRjaFtdID0gewo+ICsJeyAuY29tcGF0aWJsZSA9ICJudmlk aWEsdGVncmEyMC1uYW5kIiB9LAo+ICsJeyAvKiBzZW50aW5lbCAqLyB9Cj4gK307Cj4gKwo+ICtz dGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9uYW5kX2RyaXZlciA9IHsKPiArCS5k cml2ZXIgPSB7Cj4gKwkJLm5hbWUgPSAidGVncmEtbmFuZCIsCj4gKwkJLm9mX21hdGNoX3RhYmxl ID0gdGVncmFfbmFuZF9vZl9tYXRjaCwKPiArCX0sCj4gKwkucHJvYmUgPSB0ZWdyYV9uYW5kX3By b2JlLAo+ICsJLnJlbW92ZSA9IHRlZ3JhX25hbmRfcmVtb3ZlLAo+ICt9Owo+ICttb2R1bGVfcGxh dGZvcm1fZHJpdmVyKHRlZ3JhX25hbmRfZHJpdmVyKTsKPiArCj4gK01PRFVMRV9ERVNDUklQVElP TigiTlZJRElBIFRlZ3JhIE5BTkQgZHJpdmVyIik7Cj4gK01PRFVMRV9BVVRIT1IoIlRoaWVycnkg UmVkaW5nIDx0aGllcnJ5LnJlZGluZ0BudmlkaWEuY29tPiIpOwo+ICtNT0RVTEVfQVVUSE9SKCJM dWNhcyBTdGFjaCA8ZGV2QGx5bnhleWUuZGU+Iik7Cj4gK01PRFVMRV9BVVRIT1IoIlN0ZWZhbiBB Z25lciA8c3RlZmFuQGFnbmVyLmNoPiIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4g K01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhX25hbmRfb2ZfbWF0Y2gpOwoKU29ycnkgZm9y IGFueSBub2lzZS9taXN0YWtlLCBJJ20gbmV3IHRvIGtlcm5lbCBkZXZlbG9wbWVudApHcmVldGlu Z3MKUmFuZG9scGggTWFhw59lbgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdApodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW10ZC8K