From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller From: Thierry Reding Message-Id: <20190204135600.GI10412@ulmo> Date: Mon, 4 Feb 2019 14:56:00 +0100 To: Nagarjuna Kristam Cc: balbi@kernel.org, gregkh@linuxfoundation.org, jonathanh@nvidia.com, linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org List-ID: T24gVGh1LCBKYW4gMDMsIDIwMTkgYXQgMDM6MzQ6NThQTSArMDUzMCwgTmFnYXJqdW5hIEtyaXN0 YW0gd3JvdGU6Cj4gVGhpcyBwYXRjaCBhZGRzIFVEQyBkcml2ZXIgZm9yIHRlZ3JhIFhVU0IgMy4w IGRldmljZSBtb2RlIGNvbnRyb2xsZXIuCj4gWFVTQiBkZXZpY2UgbW9kZSBjb250cm9sbGVyIHN1 cHBvcnQgU1MsIEhTIGFuZCBGUyBtb2Rlcwo+IAo+IEJhc2VkIG9uIHdvcmsgYnk6Cj4gICBNYXJr IEt1byA8bWt1b0BudmlkaWEuY29tPgo+ICAgQW5kcmV3IEJyZXN0aWNrZXIgPGFicmVzdGljQGNo cm9taXVtLm9yZz4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBOYWdhcmp1bmEgS3Jpc3RhbSA8bmtyaXN0 YW1AbnZpZGlhLmNvbT4KPiAtLS0KPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAg ICAgfCAgIDExICsKPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZSAgICAgfCAgICAx ICsKPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRjLmMgfCAzODIxICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMzgzMyBpbnNl cnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3Rl Z3JhX3h1ZGMuYwo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25m aWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKPiBpbmRleCAwYTE2Y2JkLi4zMTY2 NWU3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwo+ICsrKyBi L2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwo+IEBAIC00MzksNiArNDM5LDE3IEBAIGNv bmZpZyBVU0JfR0FER0VUX1hJTElOWAo+ICAJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNh bGxlZCAidWRjLXhpbGlueCIgYW5kIGZvcmNlIGFsbAo+ICAJICBnYWRnZXQgZHJpdmVycyB0byBh bHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KPiAgCj4gK2NvbmZpZyBVU0JfVEVHUkFfWFVEQwo+ ICsJdHJpc3RhdGUgIk5WSURJQSBTdXBlcnNwZWVkIFVTQiAzLjAgRGV2aWNlIENvbnRyb2xsZXIi Cj4gKwlkZXBlbmRzIG9uIEFSQ0hfVEVHUkEKPiArCWRlZmF1bHQgbgoKImRlZmF1bHQgbiIgaXMg dGhlIGRlZmF1bHQsIHNvIHlvdSBjYW4gZHJvcCB0aGlzIGxpbmUuCgo+ICsJaGVscAo+ICsJIEVu YWJsZXMgVEVHUkEgVVNCIDMuMCBkZXZpY2UgbW9kZSBjb250cm9sbGVyIGRyaXZlci4KPiArCj4g KwkgU2F5ICJ5IiB0byBsaW5rIHRoZSBkcml2ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxk IGEKPiArCSBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAidGVncmFfeHVkYyIgYW5k IGZvcmNlIGFsbAoKInRlZ3JhLXh1ZGMiLCBzZWUgYmVsb3cuCgo+ICsJIGdhZGdldCBkcml2ZXJz IHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgo+ICsKPiAgc291cmNlICJkcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWciCj4gIAo+ICAjCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRj L01ha2VmaWxlCj4gaW5kZXggODk3ZjY0OC4uMWM1NWM5NiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9N YWtlZmlsZQo+IEBAIC0yNCw2ICsyNCw3IEBAIG9iai0kKENPTkZJR19VU0JfQkNNNjNYWF9VREMp CSs9IGJjbTYzeHhfdWRjLm8KPiAgb2JqLSQoQ09ORklHX1VTQl9GU0xfVVNCMikJKz0gZnNsX3Vz YjJfdWRjLm8KPiAgZnNsX3VzYjJfdWRjLXkJCQk6PSBmc2xfdWRjX2NvcmUubwo+ICBmc2xfdXNi Ml91ZGMtJChDT05GSUdfQVJDSF9NWEMpCSs9IGZzbF9teGNfdWRjLm8KPiArb2JqLSQoQ09ORklH X1VTQl9URUdSQV9YVURDKQkrPSB0ZWdyYV94dWRjLm8KCldlIHR5cGljYWxseSBuYW1lIGRyaXZl cnMgdGVncmEtKiwgaXQnZCBiZSBnb29kIHRvIGZvbGxvdyB0aGF0IGhlcmUgZm9yCmNvbnNpc3Rl bmN5LgoKPiAgb2JqLSQoQ09ORklHX1VTQl9NNjY1OTIpCSs9IG02NjU5Mi11ZGMubwo+ICBvYmot JChDT05GSUdfVVNCX1I4QTY2NTk3KQkrPSByOGE2NjU5Ny11ZGMubwo+ICBvYmotJChDT05GSUdf VVNCX1JFTkVTQVNfVVNCMykJKz0gcmVuZXNhc191c2IzLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3Rl Z3JhX3h1ZGMuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uMTI2YzE4 ZQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3RlZ3JhX3h1 ZGMuYwo+IEBAIC0wLDAgKzEsMzgyMSBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMCsKPiArLyoKPiArICogTlZJRElBIFhVU0IgZGV2aWNlIG1vZGUgY29udHJvbGxlcgo+ ICsgKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCwgTlZJRElBIENPUlBPUkFUSU9OLiAg QWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICogQ29weXJpZ2h0IChjKSAyMDE1LCBHb29nbGUgSW5j Lgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiArI2luY2x1ZGUgPGxpbnV4 L2NvbXBsZXRpb24uaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxs aW51eC9kbWEtbWFwcGluZy5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgo+ICsjaW5j bHVkZSA8bGludXgvZXh0Y29uLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9leHRjb24tcHJvdmlkZXIu aD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW9w b2xsLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29mX2Rl dmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgo+ICsjaW5jbHVkZSA8bGludXgv cGh5L3RlZ3JhL3h1c2IuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgo+ICsjaW5j bHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50 aW1lLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L3Jlc2V0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC91c2IvY2g5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+Cj4g KyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5o PgoKVGhlc2UgZG9uJ3Qgc2VlbSB0byBiZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuIEFsc28sIHBt X3Fvcy5oIGRvZXNuJ3QKc2VlbSB0byBiZSB1c2VkIGhlcmUuCgo+ICsjaW5jbHVkZSA8c29jL3Rl Z3JhL3BtYy5oPgoKSSB0aGluayB0aGlzIG1heSBvbmx5IGJlIHVzZWQgZm9yIHRoZSBsZWdhY3kg dGVncmFfcG93ZXJnYXRlXyooKQpmdW5jdGlvbnMsIGJ1dCB0aG9zZSBzaG91bGQgYmUgb2Jzb2xl dGVkIGJ5IHRoZSB1c2Ugb2YgZ2VuZXJpYyBwb3dlcgpkb21haW5zLgoKPiArCj4gKy8qIFhVU0Jf REVWIHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIFNQQVJBTSAweDAwMAo+ICsjZGVmaW5lICBTUEFS QU1fRVJTVE1BWF9TSElGVCAxNgo+ICsjZGVmaW5lICBTUEFSQU1fRVJTVE1BWF9NQVNLIDB4MWYK PiArI2RlZmluZSBEQiAweDAwNAo+ICsjZGVmaW5lICBEQl9UQVJHRVRfU0hJRlQgOAo+ICsjZGVm aW5lICBEQl9UQVJHRVRfTUFTSyAweGZmCj4gKyNkZWZpbmUgIERCX1NUUkVBTUlEX1NISUZUIDE2 Cj4gKyNkZWZpbmUgIERCX1NUUkVBTUlEX01BU0sgMHhmZmZmCj4gKyNkZWZpbmUgRVJTVFNaIDB4 MDA4Cj4gKyNkZWZpbmUgIEVSU1RTWl9FUlNUWFNaX1NISUZUKHgpICgoeCkgKiAxNikKPiArI2Rl ZmluZSAgRVJTVFNaX0VSU1RYU1pfTUFTSyAweGZmZmYKPiArI2RlZmluZSBFUlNUWEJBTE8oeCkg KDB4MDEwICsgOCAqICh4KSkKPiArI2RlZmluZSBFUlNUWEJBSEkoeCkgKDB4MDE0ICsgOCAqICh4 KSkKPiArI2RlZmluZSBFUkRQTE8gMHgwMjAKPiArI2RlZmluZSAgRVJEUExPX0VIQiBCSVQoMykK PiArI2RlZmluZSBFUkRQSEkgMHgwMjQKPiArI2RlZmluZSBFUkVQTE8gMHgwMjgKPiArI2RlZmlu ZSAgRVJFUExPX0VDUyBCSVQoMCkKPiArI2RlZmluZSAgRVJFUExPX1NFR0kgQklUKDEpCj4gKyNk ZWZpbmUgRVJFUEhJIDB4MDJjCj4gKyNkZWZpbmUgQ1RSTCAweDAzMAo+ICsjZGVmaW5lICBDVFJM X1JVTiBCSVQoMCkKPiArI2RlZmluZSAgQ1RSTF9MU0UgQklUKDEpCj4gKyNkZWZpbmUgIENUUkxf SUUgQklUKDQpCj4gKyNkZWZpbmUgIENUUkxfU01JX0VWVCBCSVQoNSkKPiArI2RlZmluZSAgQ1RS TF9TTUlfRFNFIEJJVCg2KQo+ICsjZGVmaW5lICBDVFJMX0VXRSBCSVQoNykKPiArI2RlZmluZSAg Q1RSTF9ERVZBRERSX1NISUZUIDI0Cj4gKyNkZWZpbmUgIENUUkxfREVWQUREUl9NQVNLIDB4N2YK PiArI2RlZmluZSAgQ1RSTF9FTkFCTEUgQklUKDMxKQo+ICsjZGVmaW5lIFNUIDB4MDM0Cj4gKyNk ZWZpbmUgIFNUX1JDIEJJVCgwKQo+ICsjZGVmaW5lICBTVF9JUCBCSVQoNCkKPiArI2RlZmluZSBS VF9JTU9ECTB4MDM4Cj4gKyNkZWZpbmUgIFJUX0lNT0RfSU1PRElfU0hJRlQgMAo+ICsjZGVmaW5l ICBSVF9JTU9EX0lNT0RJX01BU0sgMHhmZmZmCj4gKyNkZWZpbmUgIFJUX0lNT0RfSU1PRENfU0hJ RlQgMTYKPiArI2RlZmluZSAgUlRfSU1PRF9JTU9EQ19NQVNLIDB4ZmZmZgo+ICsjZGVmaW5lIFBP UlRTQyAweDAzYwo+ICsjZGVmaW5lICBQT1JUU0NfQ0NTIEJJVCgwKQo+ICsjZGVmaW5lICBQT1JU U0NfUEVEIEJJVCgxKQo+ICsjZGVmaW5lICBQT1JUU0NfUFIgQklUKDQpCj4gKyNkZWZpbmUgIFBP UlRTQ19QTFNfU0hJRlQgNQo+ICsjZGVmaW5lICBQT1JUU0NfUExTX01BU0sgMHhmCj4gKyNkZWZp bmUgIFBPUlRTQ19QTFNfVTAgMHgwCj4gKyNkZWZpbmUgIFBPUlRTQ19QTFNfVTIgMHgyCj4gKyNk ZWZpbmUgIFBPUlRTQ19QTFNfVTMgMHgzCj4gKyNkZWZpbmUgIFBPUlRTQ19QTFNfRElTQUJMRUQg MHg0Cj4gKyNkZWZpbmUgIFBPUlRTQ19QTFNfUlhERVRFQ1QgMHg1Cj4gKyNkZWZpbmUgIFBPUlRT Q19QTFNfSU5BQ1RJVkUgMHg2Cj4gKyNkZWZpbmUgIFBPUlRTQ19QTFNfUkVTVU1FIDB4Zgo+ICsj ZGVmaW5lICBQT1JUU0NfUFNfU0hJRlQgMTAKPiArI2RlZmluZSAgUE9SVFNDX1BTX01BU0sgMHhm Cj4gKyNkZWZpbmUgIFBPUlRTQ19QU19VTkRFRklORUQgMHgwCj4gKyNkZWZpbmUgIFBPUlRTQ19Q U19GUyAweDEKPiArI2RlZmluZSAgUE9SVFNDX1BTX0xTIDB4Mgo+ICsjZGVmaW5lICBQT1JUU0Nf UFNfSFMgMHgzCj4gKyNkZWZpbmUgIFBPUlRTQ19QU19TUyAweDQKPiArI2RlZmluZSAgUE9SVFND X0xXUyBCSVQoMTYpCj4gKyNkZWZpbmUgIFBPUlRTQ19DU0MgQklUKDE3KQo+ICsjZGVmaW5lICBQ T1JUU0NfV1JDIEJJVCgxOSkKPiArI2RlZmluZSAgUE9SVFNDX1BSQyBCSVQoMjEpCj4gKyNkZWZp bmUgIFBPUlRTQ19QTEMgQklUKDIyKQo+ICsjZGVmaW5lICBQT1JUU0NfQ0VDIEJJVCgyMykKPiAr I2RlZmluZSAgUE9SVFNDX1dQUiBCSVQoMzApCj4gKyNkZWZpbmUgIFBPUlRTQ19DSEFOR0VfTUFT SyAoUE9SVFNDX0NTQyB8IFBPUlRTQ19XUkMgfCBQT1JUU0NfUFJDIHwgXAo+ICsJCQkgICAgIFBP UlRTQ19QTEMgfCBQT1JUU0NfQ0VDKQo+ICsjZGVmaW5lIEVDUExPIDB4MDQwCj4gKyNkZWZpbmUg RUNQSEkgMHgwNDQKPiArI2RlZmluZSBNRklOREVYIDB4MDQ4Cj4gKyNkZWZpbmUgIE1GSU5ERVhf VUZSQU1FX1NISUZUIDAKPiArI2RlZmluZSAgTUZJTkRFWF9VRlJBTUVfTUFTSyAweDcKPiArI2Rl ZmluZSAgTUZJTkRFWF9GUkFNRV9TSElGVCAzCj4gKyNkZWZpbmUgIE1GSU5ERVhfRlJBTUVfTUFT SyAweDdmZgo+ICsjZGVmaW5lIFBPUlRQTSAweDA0Ywo+ICsjZGVmaW5lICBQT1JUUE1fTDFTX1NI SUZUIDAKPiArI2RlZmluZSAgUE9SVFBNX0wxU19NQVNLIDB4Mwo+ICsjZGVmaW5lICBQT1JUUE1f TDFTX0RST1AgMHgwCj4gKyNkZWZpbmUgIFBPUlRQTV9MMVNfQUNDRVBUIDB4MQo+ICsjZGVmaW5l ICBQT1JUUE1fTDFTX05ZRVQgMHgyCj4gKyNkZWZpbmUgIFBPUlRQTV9MMVNfU1RBTEwgMHgzCj4g KyNkZWZpbmUgIFBPUlRQTV9SV0UgQklUKDMpCj4gKyNkZWZpbmUgIFBPUlRQTV9VMlRJTUVPVVRf U0hJRlQgOAo+ICsjZGVmaW5lICBQT1JUUE1fVTJUSU1FT1VUX01BU0sgMHhmZgo+ICsjZGVmaW5l ICBQT1JUUE1fVTFUSU1FT1VUX1NISUZUIDE2Cj4gKyNkZWZpbmUgIFBPUlRQTV9VMVRJTUVPVVRf TUFTSyAweGZmCj4gKyNkZWZpbmUgIFBPUlRQTV9GTEEgQklUKDI0KQo+ICsjZGVmaW5lICBQT1JU UE1fVkJBIEJJVCgyNSkKPiArI2RlZmluZSAgUE9SVFBNX1dPQyBCSVQoMjYpCj4gKyNkZWZpbmUg IFBPUlRQTV9XT0QgQklUKDI3KQo+ICsjZGVmaW5lICBQT1JUUE1fVTFFIEJJVCgyOCkKPiArI2Rl ZmluZSAgUE9SVFBNX1UyRSBCSVQoMjkpCj4gKyNkZWZpbmUgIFBPUlRQTV9GUldFIEJJVCgzMCkK PiArI2RlZmluZSAgUE9SVFBNX1BOR19DWUEgQklUKDMxKQo+ICsjZGVmaW5lIEVQX0hBTFQgMHgw NTAKPiArI2RlZmluZSBFUF9QQVVTRSAweDA1NAo+ICsjZGVmaW5lIEVQX1JFTE9BRCAweDA1OAo+ ICsjZGVmaW5lIEVQX1NUQ0hHIDB4MDVjCj4gKyNkZWZpbmUgREVWTk9USUZfTE8gMHgwNjQKPiAr I2RlZmluZSAgREVWTk9USUZfTE9fVFJJRyBCSVQoMCkKPiArI2RlZmluZSAgREVWTk9USUZfTE9f VFlQRV9TSElGVCA0Cj4gKyNkZWZpbmUgIERFVk5PVElGX0xPX1RZUEVfTUFTSyAweGYKPiArI2Rl ZmluZSAgREVWTk9USUZfTE9fVFlQRV9GVU5DVElPTl9XQUtFIDB4MQo+ICsjZGVmaW5lIERFVk5P VElGX0hJIDB4MDY4Cj4gKyNkZWZpbmUgUE9SVEhBTFQgMHgwNmMKPiArI2RlZmluZSAgUE9SVEhB TFRfSEFMVF9MVFNTTSBCSVQoMCkKPiArI2RlZmluZSAgUE9SVEhBTFRfSEFMVF9SRUpFQ1QgQklU KDEpCj4gKyNkZWZpbmUgIFBPUlRIQUxUX1NUQ0hHX1JFUSBCSVQoMjApCj4gKyNkZWZpbmUgIFBP UlRIQUxUX1NUQ0hHX0lOVFJfRU4gQklUKDI0KQo+ICsjZGVmaW5lIFBPUlRfVE0JMHgwNzAKPiAr I2RlZmluZSBFUF9USFJFQURfQUNUSVZFIDB4MDc0Cj4gKyNkZWZpbmUgRVBfU1RPUFBFRCAweDA3 OAo+ICsjZGVmaW5lIEhTRlNQSV9DT1VOVDAgMHgxMDAKPiArI2RlZmluZSBIU0ZTUElfQ09VTlQx MyAweDEzNAo+ICsjZGVmaW5lICBIU0ZTUElfQ09VTlQxM19VMl9SRVNVTUVfS19EVVJBVElPTl9T SElGVCAwCj4gKyNkZWZpbmUgIEhTRlNQSV9DT1VOVDEzX1UyX1JFU1VNRV9LX0RVUkFUSU9OX01B U0sgMHgzZmZmZmZmZgo+ICsjZGVmaW5lIEJMQ0cgMHg4NDAKPiArI2RlZmluZSBTU1BYX0NPUkVf Q05UMCAweDYxMAo+ICsjZGVmaW5lICBTU1BYX0NPUkVfQ05UMF9QSU5HX1RCVVJTVF9TSElGVCAw Cj4gKyNkZWZpbmUgIFNTUFhfQ09SRV9DTlQwX1BJTkdfVEJVUlNUX01BU0sgMHhmZgo+ICsjZGVm aW5lIFNTUFhfQ09SRV9DTlQzMCAweDY4OAo+ICsjZGVmaW5lICBTU1BYX0NPUkVfQ05UMzBfTE1Q SVRQX1RJTUVSX1NISUZUIDAKPiArI2RlZmluZSAgU1NQWF9DT1JFX0NOVDMwX0xNUElUUF9USU1F Ul9NQVNLIDB4ZmZmZmYKPiArI2RlZmluZSBTU1BYX0NPUkVfQ05UMzIgMHg2OTAKPiArI2RlZmlu ZSAgU1NQWF9DT1JFX0NOVDMyX1BPTExfVEJVUlNUX01BWF9TSElGVCAwCj4gKyNkZWZpbmUgIFNT UFhfQ09SRV9DTlQzMl9QT0xMX1RCVVJTVF9NQVhfTUFTSyAweGZmCj4gKyNkZWZpbmUgU1NQWF9D T1JFX1BBRENUTDQgMHg3NTAKPiArI2RlZmluZSAgU1NQWF9DT1JFX1BBRENUTDRfUlhEQVRfVkxE X1RJTUVPVVRfVTNfU0hJRlQgMAo+ICsjZGVmaW5lICBTU1BYX0NPUkVfUEFEQ1RMNF9SWERBVF9W TERfVElNRU9VVF9VM19NQVNLIDB4ZmZmZmYKPiArI2RlZmluZSAgQkxDR19ERlBDSSBCSVQoMCkK PiArI2RlZmluZSAgQkxDR19VRlBDSSBCSVQoMSkKPiArI2RlZmluZSAgQkxDR19GRSBCSVQoMikK PiArI2RlZmluZSAgQkxDR19DT1JFUExMX1BXUkROIEJJVCg4KQo+ICsjZGVmaW5lICBCTENHX0lP UExMXzBfUFdSRE4gQklUKDkpCj4gKyNkZWZpbmUgIEJMQ0dfSU9QTExfMV9QV1JETiBCSVQoMTAp Cj4gKyNkZWZpbmUgIEJMQ0dfSU9QTExfMl9QV1JETiBCSVQoMTEpCj4gKyNkZWZpbmUgIEJMQ0df QUxMIDB4MWZmCj4gKyNkZWZpbmUgQ0ZHX0RFVl9TU1BJX1hGRVIgMHg4NTgKPiArI2RlZmluZSAg Q0ZHX0RFVl9TU1BJX1hGRVJfQUNLVElNRU9VVF9TSElGVCAwCj4gKyNkZWZpbmUgIENGR19ERVZf U1NQSV9YRkVSX0FDS1RJTUVPVVRfTUFTSyAweGZmZmZmZmZmCj4gKyNkZWZpbmUgQ0ZHX0RFVl9G RSAweDg1Ywo+ICsjZGVmaW5lICBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU0hJRlQgMAo+ICsjZGVm aW5lICBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfTUFTSyAweDMKPiArI2RlZmluZSAgQ0ZHX0RFVl9G RV9QT1JUUkVHU0VMX1NTX1BJIDEKPiArI2RlZmluZSAgQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX0hT RlNfUEkgMgo+ICsjZGVmaW5lICBDRkdfREVWX0ZFX0lORklOSVRFX1NTX1JFVFJZIEJJVCgyOSkK PiArCj4gKy8qIEZQQ0kgcmVnaXN0ZXJzICovCj4gKyNkZWZpbmUgWFVTQl9ERVZfQ0ZHXzEgMHgw MDQKPiArI2RlZmluZSAgWFVTQl9ERVZfQ0ZHXzFfSU9fU1BBQ0VfRU4gQklUKDApCj4gKyNkZWZp bmUgIFhVU0JfREVWX0NGR18xX01FTU9SWV9TUEFDRV9FTiBCSVQoMSkKPiArI2RlZmluZSAgWFVT Ql9ERVZfQ0ZHXzFfQlVTX01BU1RFUl9FTiBCSVQoMikKPiArI2RlZmluZSBYVVNCX0RFVl9DRkdf NCAweDAxMAo+ICsjZGVmaW5lICBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfU0hJRlQgMTUKPiAr I2RlZmluZSAgWFVTQl9ERVZfQ0ZHXzRfQkFTRV9BRERSX01BU0sgMHgxZmZmZgo+ICsjZGVmaW5l IFhVU0JfREVWX0NGR181IDB4MDE0Cj4gKwo+ICsvKiBJUEZTIHJlZ2lzdGVycyAqLwo+ICsjZGVm aW5lIFhVU0JfREVWX0NPTkZJR1VSQVRJT05fMCAweDE4MAo+ICsjZGVmaW5lICBYVVNCX0RFVl9D T05GSUdVUkFUSU9OXzBfRU5fRlBDSSBCSVQoMCkKPiArI2RlZmluZSBYVVNCX0RFVl9JTlRSX01B U0tfMCAweDE4OAo+ICsjZGVmaW5lICBYVVNCX0RFVl9JTlRSX01BU0tfMF9JUF9JTlRfTUFTSyBC SVQoMTYpCj4gKwo+ICsvKiBEZXZpY2UgSUQgKi8KPiArI2RlZmluZSBYVURDX0RFVklDRV9JRF9U MjEwICAgICAweDBmYWQKPiArCj4gKyNkZWZpbmUgWFVEQ19JU19UMjEwKHQpIFwKPiArCSh0LT5z b2MgPyAodC0+c29jLT5kZXZpY2VfaWQgPT0gWFVEQ19ERVZJQ0VfSURfVDIxMCkgOiBmYWxzZSkK ClBsZWFzZSBhdm9pZCBwcm9ncmFtbWluZyBhZ2FpbnN0IFNvQyB2ZXJzaW9uIG51bWJlcnMgbGlr ZSB0aGlzLiBJbnN0ZWFkLAptYWtlIHRoZSBjb2RlIGNvbmRpdGlvbmFsIG9uIGZlYXR1cmVzLiBG b3IgZXhhbXBsZSwgdGhpcyBzZWVtcyB0byBiZQp1c2VkIGV4Y2x1c2l2ZWx5IHRvIGFjY291bnQg Zm9yIHRoZSBmYWN0IHRoYXQgVGVncmEyMTAgaGFzIHRoZSBJUEZTCmxheWVyIHRoYXQgd2FzIHJl bW92ZWQgaW4gVGVncmExODYuIEluIHRoZSBYVVNCIGRyaXZlclswXSwgd2UgdXNlIGEgZmxhZwpo YXNfaXBmcyBmb3IgdGhpcy4gVGhpcyBtYWtlcyB0aGUgY29kZSBuaWNlciB0byByZWFkIGFuZCBh dm9pZCB0aGUgbmVlZApmb3IgY29tcGxpY2F0ZWQgY29uZGl0aW9uYWxzIGlmIG11bHRpcGxlIGdl bmVyYXRpb25zIGhhdmUgYSBzcGVjaWZpYwpmZWF0dXJlLgoKWzBdIGh0dHA6Ly9wYXRjaHdvcmsu b3psYWJzLm9yZy9wYXRjaC8xMDMxMDIwLwoKPiArCj4gK3N0cnVjdCB0ZWdyYV94dWRjX2VwX2Nv bnRleHQgewo+ICsJX19sZTMyIGluZm8wOwo+ICsJX19sZTMyIGluZm8xOwo+ICsJX19sZTMyIGRl cV9sbzsKPiArCV9fbGUzMiBkZXFfaGk7Cj4gKwlfX2xlMzIgdHhfaW5mbzsKPiArCV9fbGUzMiBy c3ZkWzExXTsKPiArfTsKPiArCj4gKyNkZWZpbmUgRVBfU1RBVEVfRElTQUJMRUQgMAo+ICsjZGVm aW5lIEVQX1NUQVRFX1JVTk5JTkcgMQo+ICsjZGVmaW5lIEVQX1NUQVRFX0hBTFRFRCAyCj4gKyNk ZWZpbmUgRVBfU1RBVEVfU1RPUFBFRCAzCj4gKyNkZWZpbmUgRVBfU1RBVEVfRVJST1IgNAo+ICsK PiArI2RlZmluZSBFUF9UWVBFX0lOVkFMSUQgMAo+ICsjZGVmaW5lIEVQX1RZUEVfSVNPQ0hfT1VU IDEKPiArI2RlZmluZSBFUF9UWVBFX0JVTEtfT1VUIDIKPiArI2RlZmluZSBFUF9UWVBFX0lOVEVS UlVQVF9PVVQgMwo+ICsjZGVmaW5lIEVQX1RZUEVfQ09OVFJPTCA0Cj4gKyNkZWZpbmUgRVBfVFlQ RV9JU0NPSF9JTiA1Cj4gKyNkZWZpbmUgRVBfVFlQRV9CVUxLX0lOIDYKPiArI2RlZmluZSBFUF9U WVBFX0lOVEVSUlVQVF9JTiA3Cj4gKwo+ICsjZGVmaW5lIEJVSUxEX0VQX0NPTlRFWFRfUlcobmFt ZSwgbWVtYmVyLCBzaGlmdCwgbWFzaykJCQlcCj4gK3N0YXRpYyBpbmxpbmUgdTMyIGVwX2N0eF9y ZWFkXyMjbmFtZShzdHJ1Y3QgdGVncmFfeHVkY19lcF9jb250ZXh0ICpjdHgpCVwKPiArewkJCQkJ CQkJCVwKPiArCXJldHVybiAobGUzMl90b19jcHUoY3R4LT5tZW1iZXIpID4+IHNoaWZ0KSAmIG1h c2s7CQlcCj4gK30JCQkJCQkJCQlcCj4gK3N0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCQlcCj4gK2Vw X2N0eF93cml0ZV8jI25hbWUoc3RydWN0IHRlZ3JhX3h1ZGNfZXBfY29udGV4dCAqY3R4LCB1MzIg dmFsKQkJXAo+ICt7CQkJCQkJCQkJXAo+ICsJdTMyIHRtcDsJCQkJCQkJXAo+ICsJCQkJCQkJCQlc Cj4gKwl0bXAgPSBsZTMyX3RvX2NwdShjdHgtPm1lbWJlcikgJiB+KG1hc2sgPDwgc2hpZnQpOwkJ XAo+ICsJdG1wIHw9ICh2YWwgJiBtYXNrKSA8PCBzaGlmdDsJCQkJCVwKPiArCWN0eC0+bWVtYmVy ID0gY3B1X3RvX2xlMzIodG1wKTsJCQkJCVwKPiArfQo+ICsKPiArQlVJTERfRVBfQ09OVEVYVF9S VyhzdGF0ZSwgaW5mbzAsIDAsIDB4NykKPiArQlVJTERfRVBfQ09OVEVYVF9SVyhtdWx0LCBpbmZv MCwgOCwgMHgzKQo+ICtCVUlMRF9FUF9DT05URVhUX1JXKG1heF9wc3RyZWFtcywgaW5mbzAsIDEw LCAweDFmKQo+ICtCVUlMRF9FUF9DT05URVhUX1JXKGxzYSwgaW5mbzAsIDE1LCAweDEpCj4gK0JV SUxEX0VQX0NPTlRFWFRfUlcoaW50ZXJ2YWwsIGluZm8wLCAxNiwgMHhmZikKPiArQlVJTERfRVBf Q09OVEVYVF9SVyhjZXJyLCBpbmZvMSwgMSwgMHgzKQo+ICtCVUlMRF9FUF9DT05URVhUX1JXKHR5 cGUsIGluZm8xLCAzLCAweDcpCj4gK0JVSUxEX0VQX0NPTlRFWFRfUlcoaGlkLCBpbmZvMSwgNywg MHgxKQo+ICtCVUlMRF9FUF9DT05URVhUX1JXKG1heF9idXJzdF9zaXplLCBpbmZvMSwgOCwgMHhm ZikKPiArQlVJTERfRVBfQ09OVEVYVF9SVyhtYXhfcGFja2V0X3NpemUsIGluZm8xLCAxNiwgMHhm ZmZmKQo+ICtCVUlMRF9FUF9DT05URVhUX1JXKGRjcywgZGVxX2xvLCAwLCAweDEpCj4gK0JVSUxE X0VQX0NPTlRFWFRfUlcoZGVxX2xvLCBkZXFfbG8sIDQsIDB4ZmZmZmZmZikKPiArQlVJTERfRVBf Q09OVEVYVF9SVyhkZXFfaGksIGRlcV9oaSwgMCwgMHhmZmZmZmZmZikKPiArQlVJTERfRVBfQ09O VEVYVF9SVyhhdmdfdHJiX2xlbiwgdHhfaW5mbywgMCwgMHhmZmZmKQo+ICtCVUlMRF9FUF9DT05U RVhUX1JXKG1heF9lc2l0X3BheWxvYWQsIHR4X2luZm8sIDE2LCAweGZmZmYpCj4gK0JVSUxEX0VQ X0NPTlRFWFRfUlcoZWR0bGEsIHJzdmRbMF0sIDAsIDB4ZmZmZmZmKQo+ICtCVUlMRF9FUF9DT05U RVhUX1JXKHNlcV9udW0sIHJzdmRbMF0sIDI0LCAweGZmKQo+ICtCVUlMRF9FUF9DT05URVhUX1JX KHBhcnRpYWxfdGQsIHJzdmRbMF0sIDI1LCAweDEpCj4gK0JVSUxEX0VQX0NPTlRFWFRfUlcoY2Vy cmNudCwgcnN2ZFsxXSwgMTgsIDB4MykKPiArQlVJTERfRVBfQ09OVEVYVF9SVyhkYXRhX29mZnNl dCwgcnN2ZFsyXSwgMCwgMHgxZmZmZikKPiArQlVJTERfRVBfQ09OVEVYVF9SVyhudW10cmJzLCBy c3ZkWzJdLCAyMiwgMHgxZikKPiArQlVJTERfRVBfQ09OVEVYVF9SVyhkZXZhZGRyLCByc3ZkWzZd LCAwLCAweDdmKQo+ICsKPiArc3RhdGljIGlubGluZSB1NjQgZXBfY3R4X3JlYWRfZGVxX3B0cihz dHJ1Y3QgdGVncmFfeHVkY19lcF9jb250ZXh0ICpjdHgpCj4gK3sKPiArCXJldHVybiAoKHU2NCll cF9jdHhfcmVhZF9kZXFfaGkoY3R4KSA8PCAzMikgfAo+ICsJCShlcF9jdHhfcmVhZF9kZXFfbG8o Y3R4KSA8PCA0KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkCj4gK2VwX2N0eF93cml0 ZV9kZXFfcHRyKHN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmN0eCwgdTY0IGFkZHIpCj4g K3sKPiArCWVwX2N0eF93cml0ZV9kZXFfbG8oY3R4LCBsb3dlcl8zMl9iaXRzKGFkZHIpID4+IDQp Owo+ICsJZXBfY3R4X3dyaXRlX2RlcV9oaShjdHgsIHVwcGVyXzMyX2JpdHMoYWRkcikpOwo+ICt9 Cj4gKwo+ICtzdHJ1Y3QgdGVncmFfeHVkY190cmIgewo+ICsJX19sZTMyIGRhdGFfbG87Cj4gKwlf X2xlMzIgZGF0YV9oaTsKPiArCV9fbGUzMiBzdGF0dXM7Cj4gKwlfX2xlMzIgY29udHJvbDsKPiAr fTsKPiArCj4gKyNkZWZpbmUgVFJCX1RZUEVfUlNWRCAwCj4gKyNkZWZpbmUgVFJCX1RZUEVfTk9S TUFMIDEKPiArI2RlZmluZSBUUkJfVFlQRV9TRVRVUF9TVEFHRSAyCj4gKyNkZWZpbmUgVFJCX1RZ UEVfREFUQV9TVEFHRSAzCj4gKyNkZWZpbmUgVFJCX1RZUEVfU1RBVFVTX1NUQUdFIDQKPiArI2Rl ZmluZSBUUkJfVFlQRV9JU09DSCA1Cj4gKyNkZWZpbmUgVFJCX1RZUEVfTElOSyA2Cj4gKyNkZWZp bmUgVFJCX1RZUEVfVFJBTlNGRVJfRVZFTlQgMzIKPiArI2RlZmluZSBUUkJfVFlQRV9QT1JUX1NU QVRVU19DSEFOR0VfRVZFTlQgMzQKPiArI2RlZmluZSBUUkJfVFlQRV9TVFJFQU0gNDgKPiArI2Rl ZmluZSBUUkJfVFlQRV9TRVRVUF9QQUNLRVRfRVZFTlQgNjMKPiArCj4gKyNkZWZpbmUgVFJCX0NN UExfQ09ERV9JTlZBTElEIDAKPiArI2RlZmluZSBUUkJfQ01QTF9DT0RFX1NVQ0NFU1MgMQo+ICsj ZGVmaW5lIFRSQl9DTVBMX0NPREVfREFUQV9CVUZGRVJfRVJSIDIKPiArI2RlZmluZSBUUkJfQ01Q TF9DT0RFX0JBQkJMRV9ERVRFQ1RFRF9FUlIgMwo+ICsjZGVmaW5lIFRSQl9DTVBMX0NPREVfVVNC X1RSQU5TX0VSUiA0Cj4gKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9UUkJfRVJSIDUKPiArI2RlZmlu ZSBUUkJfQ01QTF9DT0RFX1NUQUxMIDYKPiArI2RlZmluZSBUUkJfQ01QTF9DT0RFX0lOVkFMSURf U1RSRUFNX1RZUEVfRVJSIDEwCj4gKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9TSE9SVF9QQUNLRVQg MTMKPiArI2RlZmluZSBUUkJfQ01QTF9DT0RFX1JJTkdfVU5ERVJSVU4gMTQKPiArI2RlZmluZSBU UkJfQ01QTF9DT0RFX1JJTkdfT1ZFUlJVTiAxNQo+ICsjZGVmaW5lIFRSQl9DTVBMX0NPREVfRVZF TlRfUklOR19GVUxMX0VSUiAyMQo+ICsjZGVmaW5lIFRSQl9DTVBMX0NPREVfU1RPUFBFRCAyNgo+ ICsjZGVmaW5lIFRSQl9DTVBMX0NPREVfSVNPQ0hfQlVGRkVSX09WRVJSVU4gMzEKPiArI2RlZmlu ZSBUUkJfQ01QTF9DT0RFX1NUUkVBTV9OVU1QX0VSUk9SIDIxOQo+ICsjZGVmaW5lIFRSQl9DTVBM X0NPREVfUFJJTUVfUElQRV9SRUNFSVZFRCAyMjAKPiArI2RlZmluZSBUUkJfQ01QTF9DT0RFX0hP U1RfUkVKRUNURUQgMjIxCj4gKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9DVFJMX0RJUl9FUlIgMjIy Cj4gKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9DVFJMX1NFUU5VTV9FUlIgMjIzCj4gKwo+ICsjZGVm aW5lIEJVSUxEX1RSQl9SVyhuYW1lLCBtZW1iZXIsIHNoaWZ0LCBtYXNrKQkJCQlcCj4gK3N0YXRp YyBpbmxpbmUgdTMyIHRyYl9yZWFkXyMjbmFtZShzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYikJ CVwKPiArewkJCQkJCQkJCVwKPiArCXJldHVybiAobGUzMl90b19jcHUodHJiLT5tZW1iZXIpID4+ IHNoaWZ0KSAmIG1hc2s7CQlcCj4gK30JCQkJCQkJCQlcCj4gK3N0YXRpYyBpbmxpbmUgdm9pZAkJ CQkJCQlcCj4gK3RyYl93cml0ZV8jI25hbWUoc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIsIHUz MiB2YWwpCQkJXAo+ICt7CQkJCQkJCQkJXAo+ICsJdTMyIHRtcDsJCQkJCQkJXAo+ICsJCQkJCQkJ CQlcCj4gKwl0bXAgPSBsZTMyX3RvX2NwdSh0cmItPm1lbWJlcikgJiB+KG1hc2sgPDwgc2hpZnQp OwkJXAo+ICsJdG1wIHw9ICh2YWwgJiBtYXNrKSA8PCBzaGlmdDsJCQkJCVwKPiArCXRyYi0+bWVt YmVyID0gY3B1X3RvX2xlMzIodG1wKTsJCQkJCVwKPiArfQo+ICsKPiArQlVJTERfVFJCX1JXKGRh dGFfbG8sIGRhdGFfbG8sIDAsIDB4ZmZmZmZmZmYpCj4gK0JVSUxEX1RSQl9SVyhkYXRhX2hpLCBk YXRhX2hpLCAwLCAweGZmZmZmZmZmKQo+ICtCVUlMRF9UUkJfUlcoc2VxX251bSwgc3RhdHVzLCAw LCAweGZmZmYpCj4gK0JVSUxEX1RSQl9SVyh0cmFuc2Zlcl9sZW4sIHN0YXR1cywgMCwgMHhmZmZm ZmYpCj4gK0JVSUxEX1RSQl9SVyh0ZF9zaXplLCBzdGF0dXMsIDE3LCAweDFmKQo+ICtCVUlMRF9U UkJfUlcoY21wbF9jb2RlLCBzdGF0dXMsIDI0LCAweGZmKQo+ICtCVUlMRF9UUkJfUlcoY3ljbGUs IGNvbnRyb2wsIDAsIDB4MSkKPiArQlVJTERfVFJCX1JXKHRvZ2dsZV9jeWNsZSwgY29udHJvbCwg MSwgMHgxKQo+ICtCVUlMRF9UUkJfUlcoaXNwLCBjb250cm9sLCAyLCAweDEpCj4gK0JVSUxEX1RS Ql9SVyhjaGFpbiwgY29udHJvbCwgNCwgMHgxKQo+ICtCVUlMRF9UUkJfUlcoaW9jLCBjb250cm9s LCA1LCAweDEpCj4gK0JVSUxEX1RSQl9SVyh0eXBlLCBjb250cm9sLCAxMCwgMHgzZikKPiArQlVJ TERfVFJCX1JXKHN0cmVhbV9pZCwgY29udHJvbCwgMTYsIDB4ZmZmZikKPiArQlVJTERfVFJCX1JX KGVuZHBvaW50X2lkLCBjb250cm9sLCAxNiwgMHgxZikKPiArQlVJTERfVFJCX1JXKHRsYnBjLCBj b250cm9sLCAxNiwgMHhmKQo+ICtCVUlMRF9UUkJfUlcoZGF0YV9zdGFnZV9kaXIsIGNvbnRyb2ws IDE2LCAweDEpCj4gK0JVSUxEX1RSQl9SVyhmcmFtZV9pZCwgY29udHJvbCwgMjAsIDB4N2ZmKQo+ ICtCVUlMRF9UUkJfUlcoc2lhLCBjb250cm9sLCAzMSwgMHgxKQo+ICsKPiArc3RhdGljIGlubGlu ZSB1NjQgdHJiX3JlYWRfZGF0YV9wdHIoc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIpCj4gK3sK PiArCXJldHVybiAoKHU2NCl0cmJfcmVhZF9kYXRhX2hpKHRyYikgPDwgMzIpIHwKPiArCQl0cmJf cmVhZF9kYXRhX2xvKHRyYik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmJfd3Jp dGVfZGF0YV9wdHIoc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIsIHU2NCBhZGRyKQo+ICt7Cj4g Kwl0cmJfd3JpdGVfZGF0YV9sbyh0cmIsIGxvd2VyXzMyX2JpdHMoYWRkcikpOwo+ICsJdHJiX3dy aXRlX2RhdGFfaGkodHJiLCB1cHBlcl8zMl9iaXRzKGFkZHIpKTsKPiArfQo+ICsKPiArc3RydWN0 IHRlZ3JhX3h1ZGNfcmVxdWVzdCB7Cj4gKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgdXNiX3JlcTsKPiAr Cj4gKwlzaXplX3QgYnVmX3F1ZXVlZDsKPiArCXVuc2lnbmVkIGludCB0cmJzX3F1ZXVlZDsKPiAr CXVuc2lnbmVkIGludCB0cmJzX25lZWRlZDsKPiArCWJvb2wgbmVlZF96bHA7Cj4gKwo+ICsJc3Ry dWN0IHRlZ3JhX3h1ZGNfdHJiICpmaXJzdF90cmI7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkY190cmIg Kmxhc3RfdHJiOwo+ICsKPiArCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKPiArfTsKPiArCj4gK3N0 cnVjdCB0ZWdyYV94dWRjX2VwIHsKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjOwo+ICsJc3Ry dWN0IHVzYl9lcCB1c2JfZXA7Cj4gKwl1bnNpZ25lZCBpbnQgaW5kZXg7Cj4gKwljaGFyIG5hbWVb OF07Cj4gKwo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfZXBfY29udGV4dCAqY29udGV4dDsKPiArCj4g KyNkZWZpbmUgWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgNjQKPiArCXN0cnVjdCB0ZWdyYV94dWRj X3RyYiAqdHJhbnNmZXJfcmluZzsKPiArCWRtYV9hZGRyX3QgdHJhbnNmZXJfcmluZ19waHlzOwo+ ICsKPiArCXVuc2lnbmVkIGludCBlbnFfcHRyOwo+ICsJdW5zaWduZWQgaW50IGRlcV9wdHI7Cj4g Kwlib29sIHBjczsKPiArCWJvb2wgcmluZ19mdWxsOwo+ICsJYm9vbCBzdHJlYW1fcmVqZWN0ZWQ7 Cj4gKwo+ICsJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKPiArCWNvbnN0IHN0cnVjdCB1c2JfZW5k cG9pbnRfZGVzY3JpcHRvciAqZGVzYzsKPiArCWNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9k ZXNjcmlwdG9yICpjb21wX2Rlc2M7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgdGVncmFfeHVkY19zZWxf dGltaW5nIHsKPiArCV9fdTggdTFzZWw7Cj4gKwlfX3U4IHUxcGVsOwo+ICsJX19sZTE2IHUyc2Vs Owo+ICsJX19sZTE2IHUycGVsOwo+ICt9Owo+ICsKPiArZW51bSB0ZWdyYV94dWRjX3NldHVwX3N0 YXRlIHsKPiArCVdBSVRfRk9SX1NFVFVQLAo+ICsJREFUQV9TVEFHRV9YRkVSLAo+ICsJREFUQV9T VEFHRV9SRUNWLAo+ICsJU1RBVFVTX1NUQUdFX1hGRVIsCj4gKwlTVEFUVVNfU1RBR0VfUkVDViwK PiArfTsKPiArCj4gK3N0cnVjdCB0ZWdyYV94dWRjX3NldHVwX3BhY2tldCB7Cj4gKwlzdHJ1Y3Qg dXNiX2N0cmxyZXF1ZXN0IGN0cmxfcmVxOwo+ICsJdW5zaWduZWQgaW50IHNlcV9udW07Cj4gK307 Cj4gKwo+ICtzdHJ1Y3QgdGVncmFfeHVkY19zYXZlX3JlZ3Mgewo+ICsJdTMyIGN0cmw7Cj4gKwl1 MzIgcG9ydHBtOwo+ICt9Owo+ICsKPiArc3RydWN0IHRlZ3JhX3h1ZGMgewo+ICsJc3RydWN0IGRl dmljZSAqZGV2Owo+ICsJY29uc3Qgc3RydWN0IHRlZ3JhX3h1ZGNfc29jX2RhdGEgKnNvYzsKPiAr CXN0cnVjdCB0ZWdyYV94dXNiX3BhZGN0bCAqcGFkY3RsOwo+ICsKPiArCXNwaW5sb2NrX3QgbG9j azsKPiArCj4gKwlzdHJ1Y3QgdXNiX2dhZGdldCBnYWRnZXQ7Cj4gKwlzdHJ1Y3QgdXNiX2dhZGdl dF9kcml2ZXIgKmRyaXZlcjsKPiArCj4gKyNkZWZpbmUgWFVEQ19OUl9FVkVOVF9SSU5HUyAyCj4g KyNkZWZpbmUgWFVEQ19FVkVOVF9SSU5HX1NJWkUgNDA5Ngo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNf dHJiICpldmVudF9yaW5nW1hVRENfTlJfRVZFTlRfUklOR1NdOwo+ICsJZG1hX2FkZHJfdCBldmVu dF9yaW5nX3BoeXNbWFVEQ19OUl9FVkVOVF9SSU5HU107Cj4gKwl1bnNpZ25lZCBpbnQgZXZlbnRf cmluZ19pbmRleDsKPiArCXVuc2lnbmVkIGludCBldmVudF9yaW5nX2RlcV9wdHI7Cj4gKwlib29s IGNjczsKPiArCj4gKyNkZWZpbmUgWFVEQ19OUl9FUFMgMzIKPiArCXN0cnVjdCB0ZWdyYV94dWRj X2VwIGVwW1hVRENfTlJfRVBTXTsKPiArCXN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmVw X2NvbnRleHQ7Cj4gKwlkbWFfYWRkcl90IGVwX2NvbnRleHRfcGh5czsKPiArCj4gKwlzdHJ1Y3Qg ZGV2aWNlICpnZW5wZF9kZXZfZGV2aWNlOwo+ICsJc3RydWN0IGRldmljZSAqZ2VucGRfZGV2X3Nz Owo+ICsJc3RydWN0IGRldmljZV9saW5rICpnZW5wZF9kbF9kZXZpY2U7Cj4gKwlzdHJ1Y3QgZGV2 aWNlX2xpbmsgKmdlbnBkX2RsX3NzOwo+ICsKPiArCXN0cnVjdCBkbWFfcG9vbCAqdHJhbnNmZXJf cmluZ19wb29sOwo+ICsKPiArCWJvb2wgcXVldWVkX3NldHVwX3BhY2tldDsKPiArCXN0cnVjdCB0 ZWdyYV94dWRjX3NldHVwX3BhY2tldCBzZXR1cF9wYWNrZXQ7Cj4gKwllbnVtIHRlZ3JhX3h1ZGNf c2V0dXBfc3RhdGUgc2V0dXBfc3RhdGU7Cj4gKwl1MTYgc2V0dXBfc2VxX251bTsKPiArCj4gKwl1 MTYgZGV2X2FkZHI7Cj4gKwl1MTYgaXNvY2hfZGVsYXk7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkY19z ZWxfdGltaW5nIHNlbF90aW1pbmc7Cj4gKwl1OCB0ZXN0X21vZGVfcGF0dGVybjsKPiArCXUxNiBz dGF0dXNfYnVmOwo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqZXAwX3JlcTsKPiArCj4g Kwlib29sIHB1bGx1cDsKPiArCj4gKwl1bnNpZ25lZCBpbnQgbnJfZW5hYmxlZF9lcHM7Cj4gKwl1 bnNpZ25lZCBpbnQgbnJfaXNvY2hfZXBzOwo+ICsKPiArCXVuc2lnbmVkIGludCBkZXZpY2Vfc3Rh dGU7Cj4gKwl1bnNpZ25lZCBpbnQgcmVzdW1lX3N0YXRlOwo+ICsKPiArCWludCBpcnE7Cj4gKwo+ ICsJdm9pZCBfX2lvbWVtICpiYXNlOwo+ICsJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYmFzZTsKPiAr CXZvaWQgX19pb21lbSAqaXBmczsKPiArCXZvaWQgX19pb21lbSAqZnBjaTsKPiArCj4gKwlzdHJ1 Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXM7Cj4gKwo+ICsJc3RydWN0IGNsayAqKmNs a3M7Cj4gKwlpbnQgbnVtX2Nsa3M7Cj4gKwlib29sIGNsa19lbmFibGVkOwoKSSBkb24ndCB0aGlu ayB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgdHJhY2sgdGhpcyBzaW5jZSBjbG9ja3MgYXJlIGFsbApo YW5kbGVkIGluIHN1c3BlbmQvcmVzdW1lIGhvb2tzIHdoaWNoIGFscmVhZHkgaGF2ZSBwcm9wZXIg cmVmZXJlbmNlCmNvdW50aW5nLiBZb3UgbWF5IGFsc28gd2FudCB0byBjb25zaWRlciBtb3Zpbmcg dG8gdGhlIGNsa19idWxrIEFQSQphbmQgYXZvaWQgb3Blbi1jb2RpbmcgdGhlIGxvb3BzLiBudW1f Y2xrcyBzaG91bGQgYWxzbyBiZSB1bnNpZ25lZCwKb3RoZXJ3aXNlIGl0IGNvdWxkIHRlY2huaWNh bGx5IGVuZCB1cCBiZWluZyBuZWdhdGl2ZS4KCj4gKwo+ICsJYm9vbCBkZXZpY2VfbW9kZTsKPiAr CXN0cnVjdCBleHRjb25fZGV2ICpkYXRhX3JvbGVfZXh0Y29uOwo+ICsJc3RydWN0IG5vdGlmaWVy X2Jsb2NrIGRhdGFfcm9sZV9uYjsKPiArCXN0cnVjdCB3b3JrX3N0cnVjdCBkYXRhX3JvbGVfd29y azsKPiArCj4gKwlzdHJ1Y3QgcGh5ICp1c2IzX3BoeTsKPiArCXN0cnVjdCBwaHkgKnV0bWlfcGh5 Owo+ICsKPiArCXN0cnVjdCB0ZWdyYV94dWRjX3NhdmVfcmVncyBzYXZlZF9yZWdzOwo+ICsJYm9v bCBzdXNwZW5kZWQ7Cj4gKwlib29sIHBvd2VyZ2F0ZWQ7Cj4gKwo+ICsJc3RydWN0IGNvbXBsZXRp b24gZGlzY29ubmVjdF9jb21wbGV0ZTsKPiArCj4gKwlib29sIHNlbGZwb3dlcmVkOwo+ICsKPiAr I2RlZmluZSBUT0dHTEVfVkJVU19XQUlUX01TIDEwMAo+ICsJc3RydWN0IGRlbGF5ZWRfd29yayBw bGNfcmVzZXRfd29yazsKPiArCWJvb2wgd2FpdF9jc2M7Cj4gKwo+ICsJc3RydWN0IGRlbGF5ZWRf d29yayBwb3J0X3Jlc2V0X3dhcl93b3JrOwo+ICsJYm9vbCB3YWl0X2Zvcl9zZWNfcHJjOwo+ICt9 Owo+ICsKPiArI2RlZmluZSBYVURDX1RSQl9NQVhfQlVGRkVSX1NJWkUgNjU1MzYKPiArI2RlZmlu ZSBYVURDX01BWF9JU09DSF9FUFMgNAo+ICsjZGVmaW5lIFhVRENfSU5URVJSVVBUX01PREVSQVRJ T05fVVMgMAo+ICsKPiArc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciB0ZWdy YV94dWRjX2VwMF9kZXNjID0gewo+ICsJLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwK PiArCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCj4gKwkuYkVuZHBvaW50QWRk cmVzcyA9IDAsCj4gKwkuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCwK PiArCS53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KDY0KSwKPiArfTsKPiArCj4gK3N0cnVj dCB0ZWdyYV94dWRjX3NvY19kYXRhIHsKCkknZCBqdXN0IGRyb3AgdGhlIF9kYXRhIHN1ZmZpeC4g SXQncyBhIGRhdGEgc3RydWN0dXJlLCBzbyBpdCdzIGltcGxpZWQKdGhhdCBpdCBjb250YWlucyBk YXRhLgoKPiArCXUxNiBkZXZpY2VfaWQ7CgpMaWtlIEkgc2FpZCBhYm92ZSwgbGV0J3MgcmVtb3Zl IHRoaXMgaW4gZmF2b3VyIG9mIGZlYXR1cmUgZmxhZ3MuCgo+ICsJY29uc3QgY2hhciAqIGNvbnN0 ICpzdXBwbHlfbmFtZXM7Cj4gKwl1bnNpZ25lZCBpbnQgbnVtX3N1cHBsaWVzOwo+ICsJYm9vbCB1 MV9lbmFibGU7Cj4gKwlib29sIHUyX2VuYWJsZTsKPiArCWJvb2wgbHBtX2VuYWJsZTsKPiArCWJv b2wgaW52YWxpZF9zZXFfbnVtOwo+ICsJYm9vbCBwbHNfcXVpcms7Cj4gKwlib29sIHBvcnRfcmVz ZXRfcXVpcms7Cj4gK307Cj4gKwo+ICtzdGF0aWMgYm9vbCB1MV9lbmFibGU7Cj4gK21vZHVsZV9w YXJhbSh1MV9lbmFibGUsIGJvb2wsIDA2NDQpOwo+ICsKPiArc3RhdGljIGJvb2wgdTJfZW5hYmxl Owo+ICttb2R1bGVfcGFyYW0odTJfZW5hYmxlLCBib29sLCAwNjQ0KTsKPiArCj4gK3N0YXRpYyBi b29sIGxwbV9lbmFibGU7Cj4gK21vZHVsZV9wYXJhbShscG1fZW5hYmxlLCBib29sLCAwNjQ0KTsK CldoYXQgZG8gdGhlc2UgZG8gYW5kIHdoeSBkbyB3ZSBuZWVkIHRoZW0/IFRoZXkgYWxzbyBzZWVt IHRvIGJlCmR1cGxpY2F0ZXMgb2Ygc29tZSBmaWVsZHMgaW4gdGVncmFfeHVkY19zb2NfZGF0YSwg d2hhdCdzIHVwIHdpdGggdGhhdD8KCj4gK3N0YXRpYyBpbmxpbmUgdTMyIGZwY2lfcmVhZGwoc3Ry dWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHUzMiBhZGRyKQoKTml0OiBJIHByZWZlciB1bnNpemVkIHR5 cGVzIGZvciB2YXJpYWJsZXMgbGlrZSBhZGRyIGhlcmUgdG8gbWFrZSBpdCBtb3JlCm9idmlvdXMg d2hhdCB0aGV5IGFyZS4gdTMyIGlzIHR5cGljYWxseSB1c2VkIGZvciB2YXJpYWJsZXMgdGhhdCBj b250YWluCnJlZ2lzdGVyIHZhbHVlcyBvciBvZmZzZXRzIGluIHN0cnVjdHVyZXMgcmVwcmVzZW50 aW5nIGJpbmFyeSBkYXRhIHdoZXJlCnRoZSBzcGVjaWZpYyBzaXplIG1hdHRlcnMuCgpBbHNvLCBv ZmZzZXQgbWlnaHQgYmUgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIHZhcmlhYmxlLCBnaXZlbiB0aGF0 IHRoaXMgaXMKYW4gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG1hcHBlZCB0byB4dWRj LT5mcGNpLgoKPiArewo+ICsJcmV0dXJuIHJlYWRsKHh1ZGMtPmZwY2kgKyBhZGRyKTsKPiArfQo+ ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGZwY2lfd3JpdGVsKHN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjLCB1MzIgdmFsLCB1MzIgYWRkcikKPiArewo+ICsJd3JpdGVsKHZhbCwgeHVkYy0+ZnBjaSAr IGFkZHIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHUzMiBpcGZzX3JlYWRsKHN0cnVjdCB0 ZWdyYV94dWRjICp4dWRjLCB1MzIgYWRkcikKPiArewo+ICsJcmV0dXJuIHJlYWRsKHh1ZGMtPmlw ZnMgKyBhZGRyKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGlwZnNfd3JpdGVsKHN0 cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1MzIgdmFsLCB1MzIgYWRkcikKPiArewo+ICsJd3JpdGVs KHZhbCwgeHVkYy0+aXBmcyArIGFkZHIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHUzMiB4 dWRjX3JlYWRsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1MzIgYWRkcikKPiArewo+ICsJcmV0 dXJuIHJlYWRsKHh1ZGMtPmJhc2UgKyBhZGRyKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2 b2lkIHh1ZGNfd3JpdGVsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1MzIgdmFsLCB1MzIgYWRk cikKPiArewo+ICsJd3JpdGVsKHZhbCwgeHVkYy0+YmFzZSArIGFkZHIpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW5saW5lIGludCB4dWRjX3JlYWRsX3BvbGwoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMs IHUzMiBhZGRyLCB1MzIgbWFzaywKPiArCQkJCSAgdTMyIHZhbCkKPiArewo+ICsJdTMyIHJlZ3Zh bDsKPiArCj4gKwlyZXR1cm4gcmVhZGxfcG9sbF90aW1lb3V0X2F0b21pYyh4dWRjLT5iYXNlICsg YWRkciwgcmVndmFsLAo+ICsJCQkJCSAocmVndmFsICYgbWFzaykgPT0gdmFsLCAxLCAxMDApOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdyYV94dWRjICp0b194dWRjKHN0cnVj dCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCj4gK3sKPiArCXJldHVybiBjb250YWluZXJfb2YoZ2FkZ2V0 LCBzdHJ1Y3QgdGVncmFfeHVkYywgZ2FkZ2V0KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBz dHJ1Y3QgdGVncmFfeHVkY19lcCAqdG9feHVkY19lcChzdHJ1Y3QgdXNiX2VwICplcCkKPiArewo+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IHRlZ3JhX3h1ZGNfZXAsIHVzYl9lcCk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqdG9f eHVkY19yZXEoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCj4gK3sKPiArCXJldHVybiBjb250YWlu ZXJfb2YocmVxLCBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0LCB1c2JfcmVxKTsKPiArfQo+ICsK PiArc3RhdGljIGlubGluZSB2b2lkIGR1bXBfdHJiKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCBj b25zdCBjaGFyICp0eXBlLAo+ICsJCQkgICAgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIpCj4g K3sKPiArCWRldl9kYmcoeHVkYy0+ZGV2LAo+ICsJCSIlczogJXAsIGxvID0gJSN4LCBoaSA9ICUj eCwgc3RhdHVzID0gJSN4LCBjb250cm9sID0gJSN4XG4iLAo+ICsJCXR5cGUsIHRyYiwgdHJiLT5k YXRhX2xvLCB0cmItPmRhdGFfaGksIHRyYi0+c3RhdHVzLAo+ICsJCXRyYi0+Y29udHJvbCk7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVfb24oc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMpCj4gK3sKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwlpbnQgZXJy Owo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwlpZiAo eHVkYy0+ZGV2aWNlX21vZGUpIHsKPiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5s b2NrLCBmbGFncyk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwoKSSdtIG5vdCBzdXJlIEkgdW5kZXJzdGFuZCB3aGF0IHlv dSdyZSB0cnlpbmcgdG8gYWNoaXZlIGhlcmUuIFRoaXMKbG9ja2luZyBkb2Vzbid0IGJ1eSB5b3Ug YW55dGhpbmcgYXQgYWxsLiBGaXJzdCwgeW91J3JlIG5vdCBwcm90ZWN0aW5nIGEKcmFjZSBjb25k aXRpb24gaGVyZSBzaW5jZSB5b3UncmUgbm90IG1vZGlmeWluZyB4dWRjLT5kZXZpY2VfbW9kZSBp biB0aGUKY3JpdGljYWwgc2VjdGlvbi4KCk9uY2UgeW91IHVubG9jayBoZXJlLCB4dWRjLT5kZXZp Y2VfbW9kZSBjb3VsZCBiZSBtb2RpZmllZCB3aGlsZSB5b3UncmUKZXhlY3V0aW5nIHRoZSByZXN0 IG9mIHRoZSBjb2RlLCBleHBvc2luZyB5b3UgdG8gYSBwb3RlbnRpYWwgcmFjZQpjb25kaXRpb24u IFNvIGVpdGhlciB5b3UgYWxyZWFkeSBoYXZlIHByb3BlciBsb2NraW5nIGluIHBsYWNlIGFuZCBj YW4KZHJvcCB0aGUgbG9ja2luZyBmcm9tIGhlcmUsIG9yIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0 byBrZWVwIHRoZSBsb2NrCnVudGlsIHlvdSBhcmUgaW4gZGV2aWNlIG1vZGUgYW5kIHNldCB4dWRj LT5kZXZpY2VfbW9kZSBsYXRlciBvbi4KCj4gKwo+ICsJcG1fcnVudGltZV9nZXRfc3luYyh4dWRj LT5kZXYpOwo+ICsKPiArCWVyciA9IHBoeV9wb3dlcl9vbih4dWRjLT51dG1pX3BoeSk7Cj4gKwlp ZiAoZXJyIDwgMCkKPiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgInV0bWkgcG93ZXIgb24gZmFpbGVk ICVkXG4iLCBlcnIpOwo+ICsJZXJyID0gcGh5X3Bvd2VyX29uKHh1ZGMtPnVzYjNfcGh5KTsKPiAr CWlmIChlcnIgPCAwKQo+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAidXNiMyBwaHkgcG93ZXIgb24g ZmFpbGVkICVkXG4iLCBlcnIpOwo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2Nr LCBmbGFncyk7Cj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJkZXZpY2UgbW9kZSBvblxuIik7Cgpk ZXZfZGJnKCk/Cgo+ICsJdGVncmFfeHVzYl9wYWRjdGxfc2V0X3ZidXNfb3ZlcnJpZGUoeHVkYy0+ cGFkY3RsKTsKCldoYXQgZXhhY3RseSBkb2VzIHRoYXQgZG8gaGVyZT8gQ291bGQgd2UgYXV0b21h dGljYWxseSBydW4gdGhpcyBhcyBwYXJ0Cm9mIHBoeV9wb3dlcl9vbih4dWRjLT51dG1pX3BoeSk/ IFBlcmhhcHMgd2UgbmVlZCB0byBjb21iaW5lIHRoaXMgd2l0aCBhCnBoeV9jb25maWd1cmUoKSBj YWxsIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQSFkgaW50byBkZXZpY2UKbW9k ZT8gQmFzZWQgb24gdGhlIG1vZGUsIHBoeV9wb3dlcl9vbigpIGNvdWxkIHRoZW4gc2V0IG9yIGNs ZWFyIHRoZSBWQlVTCm92ZXJyaWRlLgoKT3IgSSBzdXBwb3NlIHBoeV9jb25maWd1cmUoKSBpdHNl bGYgY291bGQgc2V0IG9yIGNsZWFyIHRoZSBWQlVTCm92ZXJyaWRlIGlmIHRoZSBzZXF1ZW5jaW5n IGlzIGltcG9ydGFudC4KCj4gKwo+ICsJeHVkYy0+ZGV2aWNlX21vZGUgPSB0cnVlOwo+ICsJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJdGVncmFfcGh5X3h1 c2JfdXRtaV9wYWRfcG93ZXJfb24oeHVkYy0+dXRtaV9waHkpOwoKVGhlIHdheSB0aGlzIGlzIHVz ZWQgSSdtIHdvbmRlcmluZyBpZiB0aGlzIHNob3VsZG4ndCBiZSBwYXJ0IG9mIHRoZQp4dWRjLT51 dG1pX3BoeSAtPnBvd2VyX29uKCkgaW1wbGVtZW50YXRpb24uCgo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCB0ZWdyYV94dWRjX2RldmljZV9tb2RlX29mZihzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykK PiArewo+ICsJYm9vbCBjb25uZWN0ZWQgPSBmYWxzZTsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 Cj4gKwl1MzIgcGxzLCB2YWw7Cj4gKwlpbnQgZXJyOwo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZl KCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwlpZiAoIXh1ZGMtPmRldmljZV9tb2RlKSB7Cj4gKwkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJCXJldHVybjsK PiArCX0KPiArCj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJkZXZpY2UgbW9kZSBvZmZcbiIpOwoK ZGV2X2RiZygpCgo+ICsKPiArCWNvbm5lY3RlZCA9ICEhKHh1ZGNfcmVhZGwoeHVkYywgUE9SVFND KSAmIFBPUlRTQ19DQ1MpOwo+ICsJcmVpbml0X2NvbXBsZXRpb24oJnh1ZGMtPmRpc2Nvbm5lY3Rf Y29tcGxldGUpOwo+ICsKPiArCXRlZ3JhX3h1c2JfcGFkY3RsX2NsZWFyX3ZidXNfb3ZlcnJpZGUo eHVkYy0+cGFkY3RsKTsKPiArCj4gKwlwbHMgPSAoeHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpID4+ IFBPUlRTQ19QTFNfU0hJRlQpICYKPiArCQlQT1JUU0NfUExTX01BU0s7Cj4gKwo+ICsJLyogRGly ZWN0IGxpbmsgdG8gVTAgaWYgZGlzY29ubmVjdGVkIGluIFJFU1VNRSBvciBVMi4gKi8KPiArCWlm ICh4dWRjLT5zb2MtPnBsc19xdWlyayAmJiB4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVE X1NVUEVSICYmCj4gKwkgICAgKHBscyA9PSBQT1JUU0NfUExTX1JFU1VNRSB8fCBwbHMgPT0gUE9S VFNDX1BMU19VMikpIHsKPiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7Cj4gKwkJ dmFsIHw9IFBPUlRQTV9GUldFOwo+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsK PiArCj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpOwo+ICsJCXZhbCAmPSB+KFBP UlRTQ19DSEFOR0VfTUFTSyB8Cj4gKwkJCSAoUE9SVFNDX1BMU19NQVNLIDw8IFBPUlRTQ19QTFNf U0hJRlQpKTsKPiArCQl2YWwgfD0gUE9SVFNDX0xXUyB8IChQT1JUU0NfUExTX1UwIDw8IFBPUlRT Q19QTFNfU0hJRlQpOwo+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFNDKTsKPiArCX0K PiArCj4gKwl4dWRjLT5kZXZpY2VfbW9kZSA9IGZhbHNlOwo+ICsJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwoKVGhlIGxvY2tpbmcgaXMgYWdhaW4gc29tZXdoYXQg d2VpcmQgaGVyZS4gVGVjaG5pY2FsbHkgc29tZW9uZSBlbHNlIGNvdWxkCmp1bXAgcmlnaHQgaW4g YXQgdGhpcyBwb2ludCBhbmQgcmVjb25maWd1cmUgdG8gZGV2aWNlIG1vZGUgYWdhaW4uIFdvdWxk CnRoYXQgbm90IGludGVyZmVyZSB3aXRoIHRoZSBvcGVyYXRpb25zIGJlbG93PwoKPiArCXRlZ3Jh X3BoeV94dXNiX3V0bWlfcGFkX3Bvd2VyX2Rvd24oeHVkYy0+dXRtaV9waHkpOwoKQWdhaW4sIGlm IHNlcXVlbmNpbmcgaXNuJ3QgY3J1Y2lhbCBoZXJlLCBjb3VsZG4ndCB0aGlzIGJlIG1vdmVkIGlu dG8KcGh5X3Bvd2VyX29mZigpPwoKPiArCj4gKwkvKiBXYWl0IGZvciBkaXNjb25uZWN0IGV2ZW50 LiAqLwo+ICsJaWYgKGNvbm5lY3RlZCkKPiArCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ4dWRjLT5k aXNjb25uZWN0X2NvbXBsZXRlKTsKPiArCj4gKwkvKiBNYWtlIHN1cmUgaW50ZXJydXB0IGhhbmRs ZXIgaGFzIGNvbXBsZXRlZCBiZWZvcmUgcG93ZXJnYXRpbmcuICovCj4gKwlzeW5jaHJvbml6ZV9p cnEoeHVkYy0+aXJxKTsKPiArCWVyciA9IHBoeV9wb3dlcl9vZmYoeHVkYy0+dXRtaV9waHkpOwo+ ICsJaWYgKGVyciA8IDApCj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJ1dG1pX3BoeSBwb3dlciBv ZmYgZmFpbGVkICVkXG4iLCBlcnIpOwo+ICsKPiArCWVyciA9IHBoeV9wb3dlcl9vZmYoeHVkYy0+ dXNiM19waHkpOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJ1c2Iz X3BoeSBwb3dlciBvZmYgZmFpbGVkICVkXG4iLCBlcnIpOwo+ICsKPiArCXBtX3J1bnRpbWVfcHV0 KHh1ZGMtPmRldik7Cj4gK30KCkFsc28sIHlvdSBzZWVtIHRvIGJlIHVzaW5nIHBoeV9wb3dlcl9v bigpIGFuZCBwaHlfcG93ZXJfb2ZmKCkKc3ltbWV0cmljYWxseSB3aXRoIHBtX3J1bnRpbWVfZ2V0 KCkgYW5kIHBtX3J1bnRpbWVfcHV0KCksIHNvIEknbQp3b25kZXJpbmcgaWYgcGh5X3Bvd2VyX29u KCkgYW5kIHBoeV9wb3dlcl9vZmYoKSBjYW4ndCBiZSBtb3ZlZCBpbnRvIHRoZQpydW50aW1lIFBN IGNhbGxiYWNrcy4KCj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3VwZGF0ZV9kYXRhX3Jv bGUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4gK3sKPiArCWlmIChleHRjb25fZ2V0X3N0YXRl KHh1ZGMtPmRhdGFfcm9sZV9leHRjb24sIEVYVENPTl9VU0IpKQo+ICsJCXRlZ3JhX3h1ZGNfZGV2 aWNlX21vZGVfb24oeHVkYyk7Cj4gKwllbHNlCj4gKwkJdGVncmFfeHVkY19kZXZpY2VfbW9kZV9v ZmYoeHVkYyk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZGF0YV9yb2xlX3dv cmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGVncmFfeHVkYywKPiArCQkJCQkgICAg ICAgZGF0YV9yb2xlX3dvcmspOwo+ICsKPiArCXRlZ3JhX3h1ZGNfdXBkYXRlX2RhdGFfcm9sZSh4 dWRjKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX2RhdGFfcm9sZV9ub3RpZmll cihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAo+ICsJCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50 LCB2b2lkICp1bnVzZWQpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gY29udGFp bmVyX29mKG5iLCBzdHJ1Y3QgdGVncmFfeHVkYywKPiArCQkJCQkgICAgICAgZGF0YV9yb2xlX25i KTsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1 ZGMtPmxvY2ssIGZsYWdzKTsKPiArCWlmICgheHVkYy0+c3VzcGVuZGVkKQo+ICsJCXNjaGVkdWxl X3dvcmsoJnh1ZGMtPmRhdGFfcm9sZV93b3JrKTsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiArCj4gKwlyZXR1cm4gTk9USUZZX0RPTkU7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcGxjX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3Ry dWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5 ZWRfd29yayh3b3JrKTsKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gY29udGFpbmVyX29m KGR3b3JrLCBzdHJ1Y3QgdGVncmFfeHVkYywKPiArCQkJCQkgICAgICAgcGxjX3Jlc2V0X3dvcmsp Owo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVk Yy0+bG9jaywgZmxhZ3MpOwo+ICsJaWYgKHh1ZGMtPndhaXRfY3NjKSB7Cj4gKwkJdTMyIHBscyA9 ICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BMU19TSElGVCkgJgo+ICsJCQkg IFBPUlRTQ19QTFNfTUFTSzsKPiArCQlpZiAocGxzID09IFBPUlRTQ19QTFNfSU5BQ1RJVkUpIHsK PiArCQkJZGV2X2luZm8oeHVkYy0+ZGV2LCAiUExTID0gSW5hY3RpdmUuIFRvZ2dsZSBWQlVTXG4i KTsKPiArCQkJdGVncmFfeHVzYl9wYWRjdGxfY2xlYXJfdmJ1c19vdmVycmlkZSh4dWRjLT5wYWRj dGwpOwo+ICsJCQl0ZWdyYV94dXNiX3BhZGN0bF9zZXRfdmJ1c19vdmVycmlkZSh4dWRjLT5wYWRj dGwpOwoKSXNuJ3QgdGhpcyB0aGUgc2FtZSBhcyB0aGUgcmVzZXQgcXVpcms/Cgo+ICsJCQl4dWRj LT53YWl0X2NzYyA9IGZhbHNlOwo+ICsJCX0KPiArCX0KPiArCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVncmFfeHVk Y19wb3J0X3Jlc2V0X3dhcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiArewo+ICsJ c3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7Cj4gKwlz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9Cj4gKwkJY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3Qg dGVncmFfeHVkYywgcG9ydF9yZXNldF93YXJfd29yayk7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdz Owo+ICsJdTMyIHBsczsKPiArCWludCByZXQ7Cj4gKwo+ICsJZGV2X2luZm8oeHVkYy0+ZGV2LCAi cG9ydF9yZXNldF93YXJfd29ya1xuIik7CgpkZXZfZGJnKCksIHRob3VnaCB5b3UgbWF5IGFsc28g d2FudCB0byByZXdvcmQgdGhpcyB0byBiZSBtb3JlIHVzZWZ1bC4KCj4gKwlzcGluX2xvY2tfaXJx c2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJaWYgKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24g JiYKPiArCQlleHRjb25fZ2V0X3N0YXRlKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24sIEVYVENPTl9V U0IpICYmCj4gKwkJeHVkYy0+d2FpdF9mb3Jfc2VjX3ByYykgewoKVGhpcyBjb3VsZCB1c2UgYSBs b2NhbCB2YXJpYWJsZSB0byBtYWtlIHRoZSBjb25kaXRpb25hbCBlYXNpZXIgdG8gcmVhZC4KCj4g KwkJcGxzID0gKHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSA+PiBQT1JUU0NfUExTX1NISUZUKSAm Cj4gKwkJCVBPUlRTQ19QTFNfTUFTSzsKPiArCQlkZXZfaW5mbyh4dWRjLT5kZXYsICJwbHMgPSAl eFxuIiwgcGxzKTsKCmRldl9kYmcoKQoKPiArCj4gKwkJaWYgKHBscyA9PSBQT1JUU0NfUExTX0RJ U0FCTEVEKSB7Cj4gKwkJCWRldl9pbmZvKHh1ZGMtPmRldiwgInRvZ2dsZSB2YnVzXG4iKTsKCmRl dl9kYmcoKQoKPiArCQkJLyogUFJDIGRvZXNuJ3QgY29tcGxldGUgaW4gMTAwbXMsIHRvZ2dsZSB0 aGUgdmJ1cyAqLwo+ICsJCQlyZXQgPQo+ICsJCQl0ZWdyYV9waHlfeHVzYl91dG1pX3BvcnRfcmVz ZXRfcXVpcmsoeHVkYy0+dXRtaV9waHkpOwoKV291bGQgcGh5X3Jlc2V0KCkgd29yayBpbiB0aGlz IGNhc2U/IFRoYXQgd291bGQgaGF2ZSB0aGUgbmljZQpzaWRlLWVmZmVjdCBvZiBtYWtpbmcgdGhl IGV4cHJlc3Npb24gc2hvcnQgZW5vdWdoIGZvciBpdCBhbGwgdG8gZml0IG9uCm9uZSBsaW5lLgoK PiArCQkJaWYgKHJldCA9PSAxKQo+ICsJCQkJeHVkYy0+d2FpdF9mb3Jfc2VjX3ByYyA9IDA7Cj4g KwkJfQo+ICsJfQo+ICsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZs YWdzKTsKPiArfQo+ICsKPiArc3RhdGljIGRtYV9hZGRyX3QgdHJiX3ZpcnRfdG9fcGh5cyhzdHJ1 Y3QgdGVncmFfeHVkY19lcCAqZXAsCj4gKwkJCQkgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRy YikKPiArewo+ICsJdW5zaWduZWQgaW50IGluZGV4Owo+ICsJZG1hX2FkZHJfdCBwaHlzOwo+ICsK PiArCWluZGV4ID0gdHJiIC0gZXAtPnRyYW5zZmVyX3Jpbmc7Cj4gKwlpZiAoV0FSTl9PTihpbmRl eCA+PSBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSkpCj4gKwkJcmV0dXJuIDA7CgowIGlzIGEgdmFs aWQgdmFsdWUgZm9yIGEgZG1hX2FkZHJfdC4gVXNlIERNQV9NQVBQSU5HX0VSUk9SLiBPciByZXR1 cm4gYW4KaW50IGFuZCBwYXNzIGRtYV9hZGRyX3QgYXMgcGFyYW1ldGVyLgoKPiArCXBoeXMgPSBl cC0+dHJhbnNmZXJfcmluZ19waHlzICsgaW5kZXggKiBzaXplb2YoKnRyYik7Cj4gKwo+ICsJcmV0 dXJuIHBoeXM7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYl9w aHlzX3RvX3ZpcnQoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAo+ICsJCQkJCSAgICAgICBkbWFf YWRkcl90IGFkZHIpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiOwo+ICsJdW5z aWduZWQgaW50IGluZGV4Owo+ICsKPiArCWluZGV4ID0gKGFkZHIgLSBlcC0+dHJhbnNmZXJfcmlu Z19waHlzKSAvIHNpemVvZigqdHJiKTsKPiArCWlmIChXQVJOX09OKGluZGV4ID49IFhVRENfVFJB TlNGRVJfUklOR19TSVpFKSkKPiArCQlyZXR1cm4gTlVMTDsKPiArCXRyYiA9ICZlcC0+dHJhbnNm ZXJfcmluZ1tpbmRleF07Cj4gKwo+ICsJcmV0dXJuIHRyYjsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgZXBfcmVsb2FkKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgZXApCj4g K3sKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIEJJVChlcCksIEVQX1JFTE9BRCk7Cj4gKwl4dWRjX3Jl YWRsX3BvbGwoeHVkYywgRVBfUkVMT0FELCBCSVQoZXApLCAwKTsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgZXBfcGF1c2Uoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBlcCkK PiArewo+ICsJdTMyIHZhbDsKPiArCj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNF KTsKPiArCWlmICh2YWwgJiBCSVQoZXApKQo+ICsJCXJldHVybjsKPiArCXZhbCB8PSBCSVQoZXAp Owo+ICsJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUF9QQVVTRSk7Cj4gKwo+ICsJeHVkY19yZWFk bF9wb2xsKHh1ZGMsIEVQX1NUQ0hHLCBCSVQoZXApLCBCSVQoZXApKTsKPiArCj4gKwl4dWRjX3dy aXRlbCh4dWRjLCBCSVQoZXApLCBFUF9TVENIRyk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGVw X3VucGF1c2Uoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBlcCkKPiArewo+ ICsJdTMyIHZhbDsKPiArCj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNFKTsKPiAr CWlmICghKHZhbCAmIEJJVChlcCkpKQo+ICsJCXJldHVybjsKPiArCXZhbCAmPSB+QklUKGVwKTsK PiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVBfUEFVU0UpOwo+ICsKPiArCXh1ZGNfcmVhZGxf cG9sbCh4dWRjLCBFUF9TVENIRywgQklUKGVwKSwgQklUKGVwKSk7Cj4gKwo+ICsJeHVkY193cml0 ZWwoeHVkYywgQklUKGVwKSwgRVBfU1RDSEcpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBlcF91 bnBhdXNlX2FsbChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJdTMyIHZhbDsKPiAr Cj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNFKTsKPiArCXh1ZGNfd3JpdGVsKHh1 ZGMsIDAsIEVQX1BBVVNFKTsKPiArCj4gKwl4dWRjX3JlYWRsX3BvbGwoeHVkYywgRVBfU1RDSEcs IHZhbCwgdmFsKTsKPiArCj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVQX1NUQ0hHKTsKPiAr fQo+ICsKPiArc3RhdGljIHZvaWQgZXBfaGFsdChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdW5z aWduZWQgaW50IGVwKQo+ICt7Cj4gKwl1MzIgdmFsOwo+ICsKPiArCXZhbCA9IHh1ZGNfcmVhZGwo eHVkYywgRVBfSEFMVCk7Cj4gKwlpZiAodmFsICYgQklUKGVwKSkKPiArCQlyZXR1cm47Cj4gKwl2 YWwgfD0gQklUKGVwKTsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVBfSEFMVCk7Cj4gKwo+ ICsJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQX1NUQ0hHLCBCSVQoZXApLCBCSVQoZXApKTsKPiAr Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCBCSVQoZXApLCBFUF9TVENIRyk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGVwX3VuaGFsdChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50 IGVwKQo+ICt7Cj4gKwl1MzIgdmFsOwo+ICsKPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBf SEFMVCk7Cj4gKwlpZiAoISh2YWwgJiBCSVQoZXApKSkKPiArCQlyZXR1cm47Cj4gKwl2YWwgJj0g fkJJVChlcCk7Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVQX0hBTFQpOwo+ICsKPiArCXh1 ZGNfcmVhZGxfcG9sbCh4dWRjLCBFUF9TVENIRywgQklUKGVwKSwgQklUKGVwKSk7Cj4gKwo+ICsJ eHVkY193cml0ZWwoeHVkYywgQklUKGVwKSwgRVBfU1RDSEcpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBlcF91bmhhbHRfYWxsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+ICt7Cj4gKwl1MzIg dmFsOwo+ICsKPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCk7Cj4gKwlpZiAoIXZh bCkKPiArCQlyZXR1cm47Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCAwLCBFUF9IQUxUKTsKPiArCj4g Kwl4dWRjX3JlYWRsX3BvbGwoeHVkYywgRVBfU1RDSEcsIHZhbCwgdmFsKTsKPiArCj4gKwl4dWRj X3dyaXRlbCh4dWRjLCB2YWwsIEVQX1NUQ0hHKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZXBf d2FpdF9mb3Jfc3RvcHBlZChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50IGVw KQo+ICt7Cj4gKwl4dWRjX3JlYWRsX3BvbGwoeHVkYywgRVBfU1RPUFBFRCwgQklUKGVwKSwgQklU KGVwKSk7Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCBCSVQoZXApLCBFUF9TVE9QUEVEKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgZXBfd2FpdF9mb3JfaW5hY3RpdmUoc3RydWN0IHRlZ3JhX3h1ZGMg Knh1ZGMsIHVuc2lnbmVkIGludCBlcCkKPiArewo+ICsJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQ X1RIUkVBRF9BQ1RJVkUsIEJJVChlcCksIDApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdy YV94dWRjX3JlcV9kb25lKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwKPiArCQkJCXN0cnVjdCB0 ZWdyYV94dWRjX3JlcXVlc3QgKnJlcSwgaW50IHN0YXR1cykKPiArewo+ICsJc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKPiArCj4gKwlkZXZfZGJnKHh1ZGMtPmRldiwgImNvbXBs ZXRpbmcgcmVxdWVzdCAlcCBvbiBlcCAldSB3aXRoIHN0YXR1cyAlZFxuIiwKPiArCQkgcmVxLCBl cC0+aW5kZXgsIHN0YXR1cyk7Cj4gKwo+ICsJaWYgKGxpa2VseShyZXEtPnVzYl9yZXEuc3RhdHVz ID09IC1FSU5QUk9HUkVTUykpCj4gKwkJcmVxLT51c2JfcmVxLnN0YXR1cyA9IHN0YXR1czsKPiAr Cj4gKwlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwo+ICsKPiArCWlmICh1c2JfZW5kcG9pbnRf eGZlcl9jb250cm9sKGVwLT5kZXNjKSkgewo+ICsJCXVzYl9nYWRnZXRfdW5tYXBfcmVxdWVzdCgm eHVkYy0+Z2FkZ2V0LCAmcmVxLT51c2JfcmVxLAo+ICsJCQkJCSAoeHVkYy0+c2V0dXBfc3RhdGUg PT0KPiArCQkJCQkgIERBVEFfU1RBR0VfWEZFUikpOwo+ICsJfSBlbHNlIHsKPiArCQl1c2JfZ2Fk Z2V0X3VubWFwX3JlcXVlc3QoJnh1ZGMtPmdhZGdldCwgJnJlcS0+dXNiX3JlcSwKPiArCQkJCQkg dXNiX2VuZHBvaW50X2Rpcl9pbihlcC0+ZGVzYykpOwo+ICsJfQo+ICsKPiArCXNwaW5fdW5sb2Nr KCZ4dWRjLT5sb2NrKTsKPiArCXVzYl9nYWRnZXRfZ2l2ZWJhY2tfcmVxdWVzdCgmZXAtPnVzYl9l cCwgJnJlcS0+dXNiX3JlcSk7Cj4gKwlzcGluX2xvY2soJnh1ZGMtPmxvY2spOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2VwX251a2Uoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVw LCBpbnQgc3RhdHVzKQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXE7Cj4g Kwo+ICsJd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7Cj4gKwkJcmVxID0gbGlzdF9m aXJzdF9lbnRyeSgmZXAtPnF1ZXVlLCBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0LAo+ICsJCQkJ ICAgICAgIGxpc3QpOwo+ICsJCXRlZ3JhX3h1ZGNfcmVxX2RvbmUoZXAsIHJlcSwgc3RhdHVzKTsK PiArCX0KPiArfQo+ICsKPiArc3RhdGljIHVuc2lnbmVkIGludCBlcF9hdmFpbGFibGVfdHJicyhz dHJ1Y3QgdGVncmFfeHVkY19lcCAqZXApCj4gK3sKPiArCWlmIChlcC0+cmluZ19mdWxsKQo+ICsJ CXJldHVybiAwOwo+ICsJaWYgKGVwLT5kZXFfcHRyID4gZXAtPmVucV9wdHIpCj4gKwkJcmV0dXJu IGVwLT5kZXFfcHRyIC0gZXAtPmVucV9wdHIgLSAxOwo+ICsJcmV0dXJuIFhVRENfVFJBTlNGRVJf UklOR19TSVpFIC0gKGVwLT5lbnFfcHRyIC0gZXAtPmRlcV9wdHIpIC0gMjsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgdGVncmFfeHVkY19xdWV1ZV9vbmVfdHJiKHN0cnVjdCB0ZWdyYV94dWRjX2Vw ICplcCwKPiArCQkJCSAgICAgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxLAo+ICsJCQkJ ICAgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYiwKPiArCQkJCSAgICAgYm9vbCBpb2MpCj4g K3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZXAtPnh1ZGM7Cj4gKwlkbWFfYWRkcl90 IGJ1Zl9hZGRyOwo+ICsJc2l6ZV90IGxlbjsKPiArCj4gKwlsZW4gPSBtaW5fdChzaXplX3QsIFhV RENfVFJCX01BWF9CVUZGRVJfU0laRSwgcmVxLT51c2JfcmVxLmxlbmd0aCAtCj4gKwkJICAgIHJl cS0+YnVmX3F1ZXVlZCk7Cj4gKwlpZiAobGVuID4gMCkKPiArCQlidWZfYWRkciA9IHJlcS0+dXNi X3JlcS5kbWEgKyByZXEtPmJ1Zl9xdWV1ZWQ7Cj4gKwllbHNlCj4gKwkJYnVmX2FkZHIgPSAwOwo+ ICsKPiArCXRyYl93cml0ZV9kYXRhX3B0cih0cmIsIGJ1Zl9hZGRyKTsKPiArCj4gKwl0cmJfd3Jp dGVfdHJhbnNmZXJfbGVuKHRyYiwgbGVuKTsKPiArCXRyYl93cml0ZV90ZF9zaXplKHRyYiwgcmVx LT50cmJzX25lZWRlZCAtIHJlcS0+dHJic19xdWV1ZWQgLSAxKTsKPiArCj4gKwlpZiAocmVxLT50 cmJzX3F1ZXVlZCA9PSByZXEtPnRyYnNfbmVlZGVkIC0gMSB8fAo+ICsJCShyZXEtPm5lZWRfemxw ICYmIHJlcS0+dHJic19xdWV1ZWQgPT0gcmVxLT50cmJzX25lZWRlZCAtIDIpKQo+ICsJCXRyYl93 cml0ZV9jaGFpbih0cmIsIDApOwo+ICsJZWxzZQo+ICsJCXRyYl93cml0ZV9jaGFpbih0cmIsIDEp Owo+ICsJdHJiX3dyaXRlX2lvYyh0cmIsIGlvYyk7Cj4gKwo+ICsJaWYgKHVzYl9lbmRwb2ludF9k aXJfb3V0KGVwLT5kZXNjKSB8fAo+ICsJICAgICh1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGVw LT5kZXNjKSAmJgo+ICsJICAgICAoeHVkYy0+c2V0dXBfc3RhdGUgPT0gREFUQV9TVEFHRV9SRUNW KSkpCj4gKwkJdHJiX3dyaXRlX2lzcCh0cmIsIDEpOwo+ICsJZWxzZQo+ICsJCXRyYl93cml0ZV9p c3AodHJiLCAwKTsKPiArCj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVz YykpIHsKPiArCQlpZiAoeHVkYy0+c2V0dXBfc3RhdGUgPT0gREFUQV9TVEFHRV9YRkVSIHx8Cj4g KwkJICAgIHh1ZGMtPnNldHVwX3N0YXRlID09IERBVEFfU1RBR0VfUkVDVikKPiArCQkJdHJiX3dy aXRlX3R5cGUodHJiLCBUUkJfVFlQRV9EQVRBX1NUQUdFKTsKPiArCQllbHNlCj4gKwkJCXRyYl93 cml0ZV90eXBlKHRyYiwgVFJCX1RZUEVfU1RBVFVTX1NUQUdFKTsKPiArCQlpZiAoeHVkYy0+c2V0 dXBfc3RhdGUgPT0gREFUQV9TVEFHRV9YRkVSIHx8Cj4gKwkJICAgIHh1ZGMtPnNldHVwX3N0YXRl ID09IFNUQVRVU19TVEFHRV9YRkVSKQo+ICsJCQl0cmJfd3JpdGVfZGF0YV9zdGFnZV9kaXIodHJi LCAxKTsKPiArCQllbHNlCj4gKwkJCXRyYl93cml0ZV9kYXRhX3N0YWdlX2Rpcih0cmIsIDApOwo+ ICsJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwLT5kZXNjKSkgewo+ICsJCXRy Yl93cml0ZV90eXBlKHRyYiwgVFJCX1RZUEVfSVNPQ0gpOwo+ICsJCXRyYl93cml0ZV9zaWEodHJi LCAxKTsKPiArCQl0cmJfd3JpdGVfZnJhbWVfaWQodHJiLCAwKTsKPiArCQl0cmJfd3JpdGVfdGxi cGModHJiLCAwKTsKPiArCX0gZWxzZSBpZiAodXNiX3NzX21heF9zdHJlYW1zKGVwLT5jb21wX2Rl c2MpKSB7Cj4gKwkJdHJiX3dyaXRlX3R5cGUodHJiLCBUUkJfVFlQRV9TVFJFQU0pOwo+ICsJCXRy Yl93cml0ZV9zdHJlYW1faWQodHJiLCByZXEtPnVzYl9yZXEuc3RyZWFtX2lkKTsKPiArCX0gZWxz ZSB7Cj4gKwkJdHJiX3dyaXRlX3R5cGUodHJiLCBUUkJfVFlQRV9OT1JNQUwpOwo+ICsJCXRyYl93 cml0ZV9zdHJlYW1faWQodHJiLCAwKTsKPiArCX0KPiArCj4gKwl0cmJfd3JpdGVfY3ljbGUodHJi LCBlcC0+cGNzKTsKPiArCj4gKwlyZXEtPnRyYnNfcXVldWVkKys7Cj4gKwlyZXEtPmJ1Zl9xdWV1 ZWQgKz0gbGVuOwo+ICsKPiArCWR1bXBfdHJiKHh1ZGMsICJUUkFOU0ZFUiIsIHRyYik7Cj4gK30K PiArCj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVncmFfeHVkY19xdWV1ZV90cmJzKHN0cnVjdCB0 ZWdyYV94dWRjX2VwICplcCwKPiArCQkJCQkgIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJl cSkKPiArewo+ICsJdW5zaWduZWQgaW50IGksIGNvdW50LCBhdmFpbGFibGU7Cj4gKwlib29sIHdh aXRfdGQgPSBmYWxzZTsKPiArCj4gKwlhdmFpbGFibGUgPSBlcF9hdmFpbGFibGVfdHJicyhlcCk7 Cj4gKwljb3VudCA9IHJlcS0+dHJic19uZWVkZWQgLSByZXEtPnRyYnNfcXVldWVkOwo+ICsJaWYg KGF2YWlsYWJsZSA8IGNvdW50KSB7Cj4gKwkJY291bnQgPSBhdmFpbGFibGU7Cj4gKwkJZXAtPnJp bmdfZnVsbCA9IHRydWU7Cj4gKwl9Cj4gKwo+ICsJLyoKPiArCSAqIFRvIGdlbmVyYXRlIHplcm8t bGVuZ3RoIHBhY2tldCBvbiBVU0IgYnVzLCBTVyBuZWVkcyBzY2hlZHVsZSBhCj4gKwkgKiBzdGFu ZGFsb25lIHplcm8tbGVuZ3RoIFRELiBBY2NvcmRpbmcgdG8gSFcncyBiZWhhdmlvciwgU1cgbmVl ZHMKPiArCSAqIHRvIHNjaGVkdWxlIFREcyBpbiBkaWZmZXJlbnQgd2F5cyBmb3IgZGlmZmVyZW50 IGVuZHBvaW50IHR5cGVzLgo+ICsJICoKPiArCSAqIEZvciBjb250cm9sIGVuZHBvaW50Ogo+ICsJ ICogLSBEYXRhIHN0YWdlIFREIChJT0MgPSAxLCBDSCA9IDApCj4gKwkgKiAtIFJpbmcgZG9vcmJl bGwgYW5kIHdhaXQgdHJhbnNmZXIgZXZlbnQKPiArCSAqIC0gRGF0YSBzdGFnZSBURCBmb3IgWkxQ IChJT0MgPSAxLCBDSCA9IDApCj4gKwkgKiAtIFJpbmcgZG9vcmJlbGwKPiArCSAqCj4gKwkgKiBG b3IgYnVsayBhbmQgaW50ZXJydXB0IGVuZHBvaW50czoKPiArCSAqIC0gTm9ybWFsIHRyYW5zZmVy IFREIChJT0MgPSAwLCBDSCA9IDApCj4gKwkgKiAtIE5vcm1hbCB0cmFuc2ZlciBURCBmb3IgWkxQ IChJT0MgPSAxLCBDSCA9IDApCj4gKwkgKiAtIFJpbmcgZG9vcmJlbGwKPiArCSAqLwo+ICsKPiAr CWlmIChyZXEtPm5lZWRfemxwICYmIHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZXAtPmRlc2Mp ICYmIGNvdW50ID4gMSkKPiArCQl3YWl0X3RkID0gdHJ1ZTsKPiArCj4gKwlpZiAoIXJlcS0+Zmly c3RfdHJiKQo+ICsJCXJlcS0+Zmlyc3RfdHJiID0gJmVwLT50cmFuc2Zlcl9yaW5nW2VwLT5lbnFf cHRyXTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewo+ICsJCXN0cnVjdCB0 ZWdyYV94dWRjX3RyYiAqdHJiID0gJmVwLT50cmFuc2Zlcl9yaW5nW2VwLT5lbnFfcHRyXTsKPiAr CQlib29sIGlvYyA9IGZhbHNlOwo+ICsKPiArCQlpZiAoKGkgPT0gY291bnQgLSAxKSB8fCAod2Fp dF90ZCAmJiBpID09IGNvdW50IC0gMikpCj4gKwkJCWlvYyA9IHRydWU7Cj4gKwo+ICsJCXRlZ3Jh X3h1ZGNfcXVldWVfb25lX3RyYihlcCwgcmVxLCB0cmIsIGlvYyk7Cj4gKwkJcmVxLT5sYXN0X3Ry YiA9IHRyYjsKPiArCj4gKwkJZXAtPmVucV9wdHIrKzsKPiArCQlpZiAoZXAtPmVucV9wdHIgPT0g WFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgLSAxKSB7Cj4gKwkJCXRyYiA9ICZlcC0+dHJhbnNmZXJf cmluZ1tlcC0+ZW5xX3B0cl07Cj4gKwkJCXRyYl93cml0ZV9jeWNsZSh0cmIsIGVwLT5wY3MpOwo+ ICsJCQllcC0+cGNzID0gIWVwLT5wY3M7Cj4gKwkJCWVwLT5lbnFfcHRyID0gMDsKPiArCQl9Cj4g Kwo+ICsJCWlmIChpb2MpCj4gKwkJCWJyZWFrOwo+ICsJfQo+ICsKPiArCXJldHVybiBjb3VudDsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19lcF9yaW5nX2Rvb3JiZWxsKHN0cnVj dCB0ZWdyYV94dWRjX2VwICplcCkKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBl cC0+eHVkYzsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkp Cj4gKwkJcmV0dXJuOwo+ICsKPiArCXZhbCA9IGVwLT5pbmRleCA8PCBEQl9UQVJHRVRfU0hJRlQ7 Cj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykpIHsKPiArCQl2YWwg fD0geHVkYy0+c2V0dXBfc2VxX251bSA8PCBEQl9TVFJFQU1JRF9TSElGVDsKPiArCX0gZWxzZSBp ZiAodXNiX3NzX21heF9zdHJlYW1zKGVwLT5jb21wX2Rlc2MpID4gMCkgewo+ICsJCXN0cnVjdCB0 ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKPiArCj4gKwkJLyogRG9uJ3QgcmluZyBkb29yYmVsbCBp ZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlamVjdGVkLiAqLwo+ICsJCWlmIChlcC0+c3RyZWFtX3Jl amVjdGVkKQo+ICsJCQlyZXR1cm47Cj4gKwkJcmVxID0gbGlzdF9maXJzdF9lbnRyeSgmZXAtPnF1 ZXVlLCBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0LAo+ICsJCQkJICAgICAgIGxpc3QpOwo+ICsJ CXZhbCB8PSByZXEtPnVzYl9yZXEuc3RyZWFtX2lkIDw8IERCX1NUUkVBTUlEX1NISUZUOwo+ICsJ fQo+ICsJZGV2X2RiZyh4dWRjLT5kZXYsICJyaW5nIGRvb3JiZWxsOiAlI3hcbiIsIHZhbCk7Cj4g Kwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIERCKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVn cmFfeHVkY19lcF9raWNrX3F1ZXVlKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCkKPiArewo+ICsJ c3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwo+ICsJYm9vbCB0cmJzX3F1ZXVlZCA9IGZh bHNlOwo+ICsKPiArCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmZXAtPnF1ZXVlLCBsaXN0KSB7 Cj4gKwkJaWYgKGVwLT5yaW5nX2Z1bGwpCj4gKwkJCWJyZWFrOwo+ICsJCWlmICh0ZWdyYV94dWRj X3F1ZXVlX3RyYnMoZXAsIHJlcSkgPiAwKQo+ICsJCQl0cmJzX3F1ZXVlZCA9IHRydWU7Cj4gKwl9 Cj4gKwo+ICsJaWYgKHRyYnNfcXVldWVkKQo+ICsJCXRlZ3JhX3h1ZGNfZXBfcmluZ19kb29yYmVs bChlcCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQKPiArX190ZWdyYV94dWRjX2VwX3F1ZXVlKHN0 cnVjdCB0ZWdyYV94dWRjX2VwICplcCwgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxKQo+ ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOwo+ICsJaW50IGVycjsK PiArCj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykgJiYgIWxpc3Rf ZW1wdHkoJmVwLT5xdWV1ZSkpIHsKPiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImNvbnRyb2wgZXAg aGFzIHBlbmRpbmcgdHJhbnNmZXJzXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiAr Cj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykpIHsKPiArCQllcnIg PSB1c2JfZ2FkZ2V0X21hcF9yZXF1ZXN0KCZ4dWRjLT5nYWRnZXQsICZyZXEtPnVzYl9yZXEsCj4g KwkJCQkJICAgICAoeHVkYy0+c2V0dXBfc3RhdGUgPT0KPiArCQkJCQkgICAgICBEQVRBX1NUQUdF X1hGRVIpKTsKPiArCX0gZWxzZSB7Cj4gKwkJZXJyID0gdXNiX2dhZGdldF9tYXBfcmVxdWVzdCgm eHVkYy0+Z2FkZ2V0LCAmcmVxLT51c2JfcmVxLAo+ICsJCQkJCSAgICAgdXNiX2VuZHBvaW50X2Rp cl9pbihlcC0+ZGVzYykpOwo+ICsJfQo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlkZXZfZXJyKHh1 ZGMtPmRldiwgImZhaWxlZCB0byBtYXAgcmVxdWVzdDogJWRcbiIsIGVycik7Cj4gKwkJcmV0dXJu IGVycjsKPiArCX0KPiArCj4gKwlyZXEtPmZpcnN0X3RyYiA9IE5VTEw7Cj4gKwlyZXEtPmxhc3Rf dHJiID0gTlVMTDsKPiArCXJlcS0+YnVmX3F1ZXVlZCA9IDA7Cj4gKwlyZXEtPnRyYnNfcXVldWVk ID0gMDsKPiArCXJlcS0+bmVlZF96bHAgPSBmYWxzZTsKPiArCXJlcS0+dHJic19uZWVkZWQgPSBE SVZfUk9VTkRfVVAocmVxLT51c2JfcmVxLmxlbmd0aCwKPiArCQkJCQlYVURDX1RSQl9NQVhfQlVG RkVSX1NJWkUpOwo+ICsJaWYgKHJlcS0+dXNiX3JlcS5sZW5ndGggPT0gMCkKPiArCQlyZXEtPnRy YnNfbmVlZGVkKys7Cj4gKwlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXAtPmRlc2MpICYm Cj4gKwkgICAgcmVxLT51c2JfcmVxLnplcm8gJiYgKHJlcS0+dXNiX3JlcS5sZW5ndGggIT0gMCkg JiYKPiArCSAgICAoKHJlcS0+dXNiX3JlcS5sZW5ndGggJSBlcC0+dXNiX2VwLm1heHBhY2tldCkg PT0gMCkpIHsKPiArCQlyZXEtPnRyYnNfbmVlZGVkKys7Cj4gKwkJcmVxLT5uZWVkX3pscCA9IHRy dWU7Cj4gKwl9Cj4gKwo+ICsJcmVxLT51c2JfcmVxLnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKPiAr CXJlcS0+dXNiX3JlcS5hY3R1YWwgPSAwOwo+ICsKPiArCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlz dCwgJmVwLT5xdWV1ZSk7Cj4gKwo+ICsJdGVncmFfeHVkY19lcF9raWNrX3F1ZXVlKGVwKTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICt0ZWdyYV94dWRjX2VwX3F1 ZXVlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxLAo+ ICsJCSAgICBnZnBfdCBnZnApCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJl cTsKPiArCXN0cnVjdCB0ZWdyYV94dWRjX2VwICplcDsKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKCF1 c2JfZXAgfHwgIXVzYl9yZXEpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwllcCA9IHRvX3h1ZGNf ZXAodXNiX2VwKTsKPiArCXJlcSA9IHRvX3h1ZGNfcmVxKHVzYl9yZXEpOwo+ICsJeHVkYyA9IGVw LT54dWRjOwo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4g KwlpZiAoeHVkYy0+cG93ZXJnYXRlZCB8fCAhZXAtPmRlc2MpIHsKCkRvZXMgdGhpcyBldmVuIGhh cHBlbj8gU2hvdWxkbid0IHdlIG1ha2Ugc3VyZSB0aGF0IHRoaXMgY2FuIG5ldmVyIGJlCmNhbGxl ZCB3aGVuIHBvd2VyZ2F0ZWQ/Cgo+ICsJCXJldCA9IC1FU0hVVERPV047Cj4gKwkJZ290byB1bmxv Y2s7Cj4gKwl9Cj4gKwlyZXQgPSBfX3RlZ3JhX3h1ZGNfZXBfcXVldWUoZXAsIHJlcSk7Cj4gK3Vu bG9jazoKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiAr Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBzcXVlZXplX3RyYW5zZmVy X3Jpbmcoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAo+ICsJCQkJICBzdHJ1Y3QgdGVncmFfeHVk Y19yZXF1ZXN0ICpyZXEpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiID0gcmVx LT5maXJzdF90cmI7Cj4gKwlib29sIHBjc19lbnEgPSB0cmJfcmVhZF9jeWNsZSh0cmIpOwo+ICsJ Ym9vbCBwY3M7Cj4gKwo+ICsKCkdyYXR1aXRvdXMgYmxhbmsgbGluZS4KCj4gKwkvKgo+ICsJICog Q2xlYXIgb3V0IGFsbCB0aGUgVFJCcyBwYXJ0IG9mIG9yIGFmdGVyIHRoZSBjYW5jZWxsZWQgcmVx dWVzdCwKPiArCSAqIGFuZCBtdXN0IGNvcnJlY3QgdHJiIGN5Y2xlIGJpdCB0byB0aGUgbGFzdCB1 bi1lbnF1ZXVlZCBzdGF0ZS4KPiArCSAqLwo+ICsJd2hpbGUgKHRyYiAhPSAmZXAtPnRyYW5zZmVy X3JpbmdbZXAtPmVucV9wdHJdKSB7Cj4gKwkJcGNzID0gdHJiX3JlYWRfY3ljbGUodHJiKTsKPiAr CQltZW1zZXQodHJiLCAwLCBzaXplb2YoKnRyYikpOwo+ICsJCXRyYl93cml0ZV9jeWNsZSh0cmIs ICFwY3MpOwo+ICsJCXRyYisrOwo+ICsKPiArCQlpZiAodHJiX3JlYWRfdHlwZSh0cmIpID09IFRS Ql9UWVBFX0xJTkspCj4gKwkJCXRyYiA9IGVwLT50cmFuc2Zlcl9yaW5nOwo+ICsJfQo+ICsKPiAr CS8qIFJlcXVlc3RzIHdpbGwgYmUgcmUtcXVldWVkIGF0IHRoZSBzdGFydCBvZiB0aGUgY2FuY2Vs bGVkIHJlcXVlc3QuICovCj4gKwllcC0+ZW5xX3B0ciA9IHJlcS0+Zmlyc3RfdHJiIC0gZXAtPnRy YW5zZmVyX3Jpbmc7Cj4gKwkvKgo+ICsJICogUmV0cmlldmUgdGhlIGNvcnJlY3QgY3ljbGUgYml0 IHN0YXRlIGZyb20gdGhlIGZpcnN0IHRyYiBvZgo+ICsJICogdGhlIGNhbmNlbGxlZCByZXF1ZXN0 Lgo+ICsJICovCj4gKwllcC0+cGNzID0gcGNzX2VucTsKPiArCWVwLT5yaW5nX2Z1bGwgPSBmYWxz ZTsKPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUocmVxLCAmZXAtPnF1ZXVlLCBsaXN0 KSB7Cj4gKwkJcmVxLT51c2JfcmVxLnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKPiArCQlyZXEtPnVz Yl9yZXEuYWN0dWFsID0gMDsKPiArCj4gKwkJcmVxLT5maXJzdF90cmIgPSBOVUxMOwo+ICsJCXJl cS0+bGFzdF90cmIgPSBOVUxMOwo+ICsJCXJlcS0+YnVmX3F1ZXVlZCA9IDA7Cj4gKwkJcmVxLT50 cmJzX3F1ZXVlZCA9IDA7Cj4gKwl9Cj4gK30KPiArCj4gKy8qCj4gKyAqIERldGVybWluZSBpZiB0 aGUgZ2l2ZW4gVFJCIGlzIGluIHRoZSByYW5nZSBbZmlyc3QgdHJiLCBsYXN0IHRyYl0gZm9yIHRo ZQo+ICsgKiBnaXZlbiByZXF1ZXN0Lgo+ICsgKi8KPiArc3RhdGljIGJvb2wgdHJiX2luX3JlcXVl c3Qoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAo+ICsJCQkgICBzdHJ1Y3QgdGVncmFfeHVkY19y ZXF1ZXN0ICpyZXEsCj4gKwkJCSAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQo+ICt7Cj4g KwlkZXZfZGJnKGVwLT54dWRjLT5kZXYsICIlczogcmVxdWVzdCAlcCAtPiAlcDsgdHJiICVwXG4i LCBfX2Z1bmNfXywKPiArCQlyZXEtPmZpcnN0X3RyYiwgcmVxLT5sYXN0X3RyYiwgdHJiKTsKPiAr Cj4gKwlpZiAodHJiID49IHJlcS0+Zmlyc3RfdHJiICYmICh0cmIgPD0gcmVxLT5sYXN0X3RyYiB8 fAo+ICsJCQkJICAgICAgcmVxLT5sYXN0X3RyYiA8IHJlcS0+Zmlyc3RfdHJiKSkKPiArCQlyZXR1 cm4gdHJ1ZTsKPiArCWlmICh0cmIgPCByZXEtPmZpcnN0X3RyYiAmJiB0cmIgPD0gcmVxLT5sYXN0 X3RyYiAmJgo+ICsJICAgIHJlcS0+bGFzdF90cmIgPCByZXEtPmZpcnN0X3RyYikKPiArCQlyZXR1 cm4gdHJ1ZTsKPiArCXJldHVybiBmYWxzZTsKPiArfQo+ICsKPiArLyoKPiArICogRGV0ZXJtaW5l IGlmIHRoZSBnaXZlbiBUUkIgaXMgaW4gdGhlIHJhbmdlIFtFUCBlbnF1ZXVlIHBvaW50ZXIsIGZp cnN0IFRSQikKPiArICogZm9yIHRoZSBnaXZlbiBlbmRwb2ludCBhbmQgcmVxdWVzdC4KPiArICov Cj4gK3N0YXRpYyBib29sIHRyYl9iZWZvcmVfcmVxdWVzdChzdHJ1Y3QgdGVncmFfeHVkY19lcCAq ZXAsCj4gKwkJCSAgICAgICBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXEsCj4gKwkJCSAg ICAgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYikKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1 ZGNfdHJiICplbnFfdHJiID0gJmVwLT50cmFuc2Zlcl9yaW5nW2VwLT5lbnFfcHRyXTsKPiArCj4g KwlkZXZfZGJnKGVwLT54dWRjLT5kZXYsICIlczogcmVxdWVzdCAlcCAtPiAlcDsgZW5xIHB0cjog JXA7IHRyYiAlcFxuIiwKPiArCQlfX2Z1bmNfXywgcmVxLT5maXJzdF90cmIsIHJlcS0+bGFzdF90 cmIsIGVucV90cmIsIHRyYik7Cj4gKwo+ICsJaWYgKHRyYiA8IHJlcS0+Zmlyc3RfdHJiICYmIChl bnFfdHJiIDw9IHRyYiB8fAo+ICsJCQkJICAgICByZXEtPmZpcnN0X3RyYiA8IGVucV90cmIpKQo+ ICsJCXJldHVybiB0cnVlOwo+ICsJaWYgKHRyYiA+IHJlcS0+Zmlyc3RfdHJiICYmIHJlcS0+Zmly c3RfdHJiIDwgZW5xX3RyYiAmJiBlbnFfdHJiIDw9IHRyYikKPiArCQlyZXR1cm4gdHJ1ZTsKPiAr CXJldHVybiBmYWxzZTsKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICtfX3RlZ3JhX3h1ZGNfZXBf ZGVxdWV1ZShzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCj4gKwkJCXN0cnVjdCB0ZWdyYV94dWRj X3JlcXVlc3QgKnJlcSkKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVk YzsKPiArCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnI7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVk Y190cmIgKmRlcV90cmI7Cj4gKwlib29sIGJ1c3ksIGtpY2tfcXVldWUgPSBmYWxzZTsKPiArCWlu dCByZXQgPSAwOwo+ICsKPiArCS8qIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBpcyBhY3R1YWxseSBx dWV1ZWQgdG8gdGhpcyBlbmRwb2ludC4gKi8KPiArCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmVw LT5xdWV1ZSwgbGlzdCkgewo+ICsJCWlmIChyID09IHJlcSkKPiArCQkJYnJlYWs7Cj4gKwl9Cj4g KwlpZiAociAhPSByZXEpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJLyogUmVxdWVzdCBo YXNuJ3QgYmVlbiBxdWV1ZWQgaW4gdGhlIHRyYW5zZmVyIHJpbmcgeWV0LiAqLwo+ICsJaWYgKCFy ZXEtPnRyYnNfcXVldWVkKSB7Cj4gKwkJdGVncmFfeHVkY19yZXFfZG9uZShlcCwgcmVxLCAtRUNP Tk5SRVNFVCk7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJLyogSGFsdCBETUEgZm9yIHRo aXMgZW5kcGlvbnQuICovCj4gKwlpZiAoZXBfY3R4X3JlYWRfc3RhdGUoZXAtPmNvbnRleHQpID09 IEVQX1NUQVRFX1JVTk5JTkcpIHsKPiArCQllcF9wYXVzZSh4dWRjLCBlcC0+aW5kZXgpOwo+ICsJ CWVwX3dhaXRfZm9yX2luYWN0aXZlKHh1ZGMsIGVwLT5pbmRleCk7Cj4gKwl9Cj4gKwo+ICsJZGVx X3RyYiA9IHRyYl9waHlzX3RvX3ZpcnQoZXAsIGVwX2N0eF9yZWFkX2RlcV9wdHIoZXAtPmNvbnRl eHQpKTsKPiArCS8qIElzIHRoZSBoYXJkd2FyZSBwcm9jZXNzaW5nIHRoZSBUUkIgYXQgdGhlIGRl cXVldWUgcG9pbnRlcj8gKi8KPiArCWJ1c3kgPSAodHJiX3JlYWRfY3ljbGUoZGVxX3RyYikgPT0g ZXBfY3R4X3JlYWRfZGNzKGVwLT5jb250ZXh0KSk7Cj4gKwo+ICsJaWYgKHRyYl9pbl9yZXF1ZXN0 KGVwLCByZXEsIGRlcV90cmIpICYmIGJ1c3kpIHsKPiArCQkvKgo+ICsJCSAqIFJlcXVlc3QgaGFz IGJlZW4gcGFydGlhbGx5IGNvbXBsZXRlZCBvciBpdCBoYXNuJ3QKPiArCQkgKiBzdGFydGVkIHBy b2Nlc3NpbmcgeWV0Lgo+ICsJCSAqLwo+ICsJCWRtYV9hZGRyX3QgZGVxX3B0cjsKPiArCj4gKwkJ c3F1ZWV6ZV90cmFuc2Zlcl9yaW5nKGVwLCByZXEpOwo+ICsKPiArCQlyZXEtPnVzYl9yZXEuYWN0 dWFsID0gZXBfY3R4X3JlYWRfZWR0bGEoZXAtPmNvbnRleHQpOwo+ICsJCXRlZ3JhX3h1ZGNfcmVx X2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOwo+ICsJCWtpY2tfcXVldWUgPSB0cnVlOwo+ICsK PiArCQkvKiBFRFRMQSBpcyA+IDA6IHJlcXVlc3QgaGFzIGJlZW4gcGFydGlhbGx5IGNvbXBsZXRl ZCAqLwo+ICsJCWlmIChyZXEtPnVzYl9yZXEuYWN0dWFsID4gMCkgewo+ICsJCQkvKgo+ICsJCQkg KiBBYm9ydCB0aGUgcGVuZGluZyB0cmFuc2ZlciBhbmQgdXBkYXRlIHRoZSBkZXF1ZXVlCj4gKwkJ CSAqIHBvaW50ZXIKPiArCQkJICovCj4gKwkJCWVwX2N0eF93cml0ZV9lZHRsYShlcC0+Y29udGV4 dCwgMCk7Cj4gKwkJCWVwX2N0eF93cml0ZV9wYXJ0aWFsX3RkKGVwLT5jb250ZXh0LCAwKTsKPiAr CQkJZXBfY3R4X3dyaXRlX2RhdGFfb2Zmc2V0KGVwLT5jb250ZXh0LCAwKTsKPiArCj4gKwkJCWRl cV9wdHIgPSB0cmJfdmlydF90b19waHlzKGVwLAo+ICsJCQkJCSZlcC0+dHJhbnNmZXJfcmluZ1tl cC0+ZW5xX3B0cl0pOwo+ICsJCQllcF9jdHhfd3JpdGVfZGVxX3B0cihlcC0+Y29udGV4dCwgZGVx X3B0cik7Cj4gKwkJCWVwX2N0eF93cml0ZV9kY3MoZXAtPmNvbnRleHQsIGVwLT5wY3MpOwo+ICsK PiArCQkJZXBfcmVsb2FkKHh1ZGMsIGVwLT5pbmRleCk7Cj4gKwkJfQo+ICsJfSBlbHNlIGlmICh0 cmJfYmVmb3JlX3JlcXVlc3QoZXAsIHJlcSwgZGVxX3RyYikgJiYgYnVzeSkgewo+ICsJCS8qIFJl cXVlc3QgaGFzbid0IHN0YXJ0ZWQgcHJvY2Vzc2luZyB5ZXQuICovCj4gKwkJc3F1ZWV6ZV90cmFu c2Zlcl9yaW5nKGVwLCByZXEpOwo+ICsKPiArCQl0ZWdyYV94dWRjX3JlcV9kb25lKGVwLCByZXEs IC1FQ09OTlJFU0VUKTsKPiArCQlraWNrX3F1ZXVlID0gdHJ1ZTsKPiArCX0gZWxzZSB7Cj4gKwkJ LyoKPiArCQkgKiBSZXF1ZXN0IGhhcyBjb21wbGV0ZWQsIGJ1dCB3ZSBoYXZlbid0IHByb2Nlc3Nl ZCB0aGUKPiArCQkgKiBjb21wbGV0aW9uIGV2ZW50IHlldC4KPiArCQkgKi8KPiArCQl0ZWdyYV94 dWRjX3JlcV9kb25lKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKPiArCQlyZXQgPSAtRUlOVkFMOwo+ ICsJfQo+ICsKPiArCS8qIFJlc3VtZSB0aGUgZW5kcG9pbnQuICovCj4gKwllcF91bnBhdXNlKHh1 ZGMsIGVwLT5pbmRleCk7Cj4gKwo+ICsJaWYgKGtpY2tfcXVldWUpCj4gKwkJdGVncmFfeHVkY19l cF9raWNrX3F1ZXVlKGVwKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50Cj4gK3RlZ3JhX3h1ZGNfZXBfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIHN0cnVj dCB1c2JfcmVxdWVzdCAqdXNiX3JlcSkKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVz dCAqcmVxOwo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwOwo+ICsJc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGM7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsJaW50IHJldDsKPiArCj4gKwlp ZiAoIXVzYl9lcCB8fCAhdXNiX3JlcSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCWVwID0gdG9f eHVkY19lcCh1c2JfZXApOwo+ICsJcmVxID0gdG9feHVkY19yZXEodXNiX3JlcSk7Cj4gKwl4dWRj ID0gZXAtPnh1ZGM7Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdz KTsKPiArCWlmICh4dWRjLT5wb3dlcmdhdGVkIHx8ICFlcC0+ZGVzYykgewo+ICsJCXJldCA9IC1F U0hVVERPV047Cj4gKwkJZ290byB1bmxvY2s7Cj4gKwl9Cj4gKwlyZXQgPSBfX3RlZ3JhX3h1ZGNf ZXBfZGVxdWV1ZShlcCwgcmVxKTsKPiArdW5sb2NrOgo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgX190ZWdyYV94dWRjX2VwX3NldF9oYWx0KHN0cnVjdCB0ZWdyYV94dWRjX2VwICpl cCwgYm9vbCBoYWx0KQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRj Owo+ICsKPiArCWlmICghZXAtPmRlc2MpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJaWYg KHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXAtPmRlc2MpKSB7Cj4gKwkJZGV2X2Vycih4dWRjLT5k ZXYsICJjYW4ndCBoYWx0IGlzY29oIGVwXG4iKTsKCkVQIGlzIGFuIGFiYnJldmlhdGlvbiwgc28g c2hvdWxkIGJlIGFsbC1jYXBzLiBBbHNvLCAiaXNjb2giIC0+ICJpc29jLiI/Cgo+ICsJCXJldHVy biAtRU5PVFNVUFA7Cj4gKwl9Cj4gKwo+ICsJaWYgKCEhKHh1ZGNfcmVhZGwoeHVkYywgRVBfSEFM VCkgJiBCSVQoZXAtPmluZGV4KSkgPT0gaGFsdCkgewo+ICsJCWRldl9kYmcoeHVkYy0+ZGV2LCAi ZXAgJXUgYWxyZWFkeSAlc1xuIiwgZXAtPmluZGV4LAo+ICsJCQloYWx0ID8gImhhbHRlZCIgOiAi bm90IGhhbHRlZCIpOwoKVGhpcyBpcyBwZXJoYXBzIG5vdCBhcyBpbXBvcnRhbnQgYXMgZm9yIGVy cm9yIG1lc3NhZ2VzLCBidXQgbWF5YmUgd29ydGgKY2FwaXRhbGl6aW5nIEVQIGhlcmUgYXMgd2Vs bCBmb3IgY29uc2lzdGVuY3kuIFRoaXMgbWF5IHNvdW5kIGxpa2Ugbml0LQpwaWNraW5nLCBidXQg SSBmaW5kIGl0IHZlcnkgY29uZnVzaW5nIHRvIGRlYnVnIGJ5IHJlYWRpbmcgZXJyb3IgYW5kCmRl YnVnIG1lc3NhZ2VzIGlmIHRoZXkgY2FwaXRhbGl6ZSBvciBzcGVsbCB0aGUgc2FtZSB3b3JkcyBk aWZmZXJlbnRseS4KCj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJaWYgKGhhbHQpIHsKPiAr CQllcF9oYWx0KHh1ZGMsIGVwLT5pbmRleCk7Cj4gKwl9IGVsc2Ugewo+ICsJCWVwX2N0eF93cml0 ZV9zdGF0ZShlcC0+Y29udGV4dCwgRVBfU1RBVEVfRElTQUJMRUQpOwo+ICsKPiArCQllcF9yZWxv YWQoeHVkYywgZXAtPmluZGV4KTsKPiArCj4gKwkJZXBfY3R4X3dyaXRlX3N0YXRlKGVwLT5jb250 ZXh0LCBFUF9TVEFURV9SVU5OSU5HKTsKPiArCQllcF9jdHhfd3JpdGVfc2VxX251bShlcC0+Y29u dGV4dCwgMCk7Cj4gKwo+ICsJCWVwX3JlbG9hZCh4dWRjLCBlcC0+aW5kZXgpOwo+ICsJCWVwX3Vu cGF1c2UoeHVkYywgZXAtPmluZGV4KTsKPiArCQllcF91bmhhbHQoeHVkYywgZXAtPmluZGV4KTsK PiArCj4gKwkJdGVncmFfeHVkY19lcF9yaW5nX2Rvb3JiZWxsKGVwKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX2VwX3NldF9oYWx0KHN0 cnVjdCB1c2JfZXAgKnVzYl9lcCwgaW50IHZhbHVlKQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVk Y19lcCAqZXA7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYzsKPiArCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWlmICghdXNiX2VwKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCWVwID0gdG9feHVkY19lcCh1c2JfZXApOwo+ICsJeHVkYyA9IGVwLT54dWRj Owo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwlpZiAo eHVkYy0+cG93ZXJnYXRlZCkgewo+ICsJCXJldCA9IC1FU0hVVERPV047Cj4gKwkJZ290byB1bmxv Y2s7Cj4gKwl9Cj4gKwlpZiAodmFsdWUgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcC0+ZGVzYykg JiYKPiArCSAgICAhbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgewo+ICsJCWRldl9lcnIoeHVkYy0+ ZGV2LCAiY2FuJ3QgaGFsdCBlcCB3aXRoIHJlcXVlc3RzIHBlbmRpbmdcbiIpOwo+ICsJCXJldCA9 IC1FQUdBSU47Cj4gKwkJZ290byB1bmxvY2s7Cj4gKwl9Cj4gKwlyZXQgPSBfX3RlZ3JhX3h1ZGNf ZXBfc2V0X2hhbHQoZXAsIHZhbHVlKTsKPiArdW5sb2NrOgo+ICsJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZXBfY29udGV4dF9zZXR1cChzdHJ1Y3QgdGVncmFfeHVk Y19lcCAqZXApCj4gK3sKPiArCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAq ZGVzYyA9IGVwLT5kZXNjOwo+ICsJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0 b3IgKmNvbXBfZGVzYyA9IGVwLT5jb21wX2Rlc2M7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVk YyA9IGVwLT54dWRjOwo+ICsJdTE2IG1heHBhY2tldCwgbWF4YnVyc3QgPSAwLCBlc2l0ID0gMDsK PiArCXUzMiB2YWw7Cj4gKwo+ICsJbWF4cGFja2V0ID0gdXNiX2VuZHBvaW50X21heHAoZGVzYykg JiAweDdmZjsKPiArCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7 Cj4gKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGRlc2MpKQo+ICsJCQltYXhidXJz dCA9IGNvbXBfZGVzYy0+Yk1heEJ1cnN0Owo+ICsJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQo ZGVzYykgfHwgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkKPiArCQkJZXNpdCA9IGxlMTZf dG9fY3B1KGNvbXBfZGVzYy0+d0J5dGVzUGVySW50ZXJ2YWwpOwo+ICsJfSBlbHNlIGlmICgoeHVk Yy0+Z2FkZ2V0LnNwZWVkIDwgVVNCX1NQRUVEX1NVUEVSKSAmJgo+ICsJCSAgICh1c2JfZW5kcG9p bnRfeGZlcl9pbnQoZGVzYykgfHwKPiArCQkgICAgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNj KSkpIHsKPiArCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7Cj4g KwkJCW1heGJ1cnN0ID0gKHVzYl9lbmRwb2ludF9tYXhwKGRlc2MpID4+IDExKSAmIDB4MzsKPiAr CQkJaWYgKG1heGJ1cnN0ID09IDB4Mykgewo+ICsJCQkJZGV2X3dhcm4oeHVkYy0+ZGV2LAo+ICsJ CQkJCSAiaW52YWxpZCBlbmRwb2ludCBtYXhidXJzdFxuIik7Cj4gKwkJCQltYXhidXJzdCA9IDB4 MjsKPiArCQkJfQo+ICsJCX0KPiArCQllc2l0ID0gbWF4cGFja2V0ICogKG1heGJ1cnN0ICsgMSk7 Cj4gKwl9Cj4gKwo+ICsJbWVtc2V0KGVwLT5jb250ZXh0LCAwLCBzaXplb2YoKmVwLT5jb250ZXh0 KSk7Cj4gKwo+ICsJZXBfY3R4X3dyaXRlX3N0YXRlKGVwLT5jb250ZXh0LCBFUF9TVEFURV9SVU5O SU5HKTsKPiArCWVwX2N0eF93cml0ZV9pbnRlcnZhbChlcC0+Y29udGV4dCwgZGVzYy0+YkludGVy dmFsKTsKPiArCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7Cj4g KwkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVzYykpIHsKPiArCQkJZXBfY3R4X3dyaXRl X211bHQoZXAtPmNvbnRleHQsCj4gKwkJCQkJICBjb21wX2Rlc2MtPmJtQXR0cmlidXRlcyAmIDB4 Myk7Cj4gKwkJfQo+ICsJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGRlc2MpKSB7Cj4gKwkJ CWVwX2N0eF93cml0ZV9tYXhfcHN0cmVhbXMoZXAtPmNvbnRleHQsCj4gKwkJCQkJCSAgY29tcF9k ZXNjLT5ibUF0dHJpYnV0ZXMgJgo+ICsJCQkJCQkgIDB4MWYpOwo+ICsJCQllcF9jdHhfd3JpdGVf bHNhKGVwLT5jb250ZXh0LCAxKTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKCF1c2JfZW5kcG9p bnRfeGZlcl9jb250cm9sKGRlc2MpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGRlc2MpKQo+ICsJ CXZhbCA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2MpOwo+ICsJZWxzZQo+ICsJCXZhbCA9IHVzYl9l bmRwb2ludF90eXBlKGRlc2MpICsgRVBfVFlQRV9DT05UUk9MOwo+ICsJZXBfY3R4X3dyaXRlX3R5 cGUoZXAtPmNvbnRleHQsIHZhbCk7Cj4gKwllcF9jdHhfd3JpdGVfY2VycihlcC0+Y29udGV4dCwg MHgzKTsKPiArCWVwX2N0eF93cml0ZV9tYXhfcGFja2V0X3NpemUoZXAtPmNvbnRleHQsIG1heHBh Y2tldCk7Cj4gKwllcF9jdHhfd3JpdGVfbWF4X2J1cnN0X3NpemUoZXAtPmNvbnRleHQsIG1heGJ1 cnN0KTsKPiArCj4gKwllcF9jdHhfd3JpdGVfZGVxX3B0cihlcC0+Y29udGV4dCwgZXAtPnRyYW5z ZmVyX3JpbmdfcGh5cyk7Cj4gKwllcF9jdHhfd3JpdGVfZGNzKGVwLT5jb250ZXh0LCBlcC0+cGNz KTsKPiArCj4gKwkvKiBTZWxlY3QgYSByZWFzb25hYmxlIGF2ZXJhZ2UgVFJCIGxlbmd0aCBiYXNl ZCBvbiBlbmRwb2ludCB0eXBlLiAqLwo+ICsJc3dpdGNoICh1c2JfZW5kcG9pbnRfdHlwZShkZXNj KSkgewo+ICsJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgo+ICsJCXZhbCA9IDg7Cj4g KwkJYnJlYWs7Cj4gKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKPiArCQl2YWwgPSAxMDI0 Owo+ICsJCWJyZWFrOwo+ICsJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgo+ICsJY2FzZSBV U0JfRU5EUE9JTlRfWEZFUl9JU09DOgo+ICsJZGVmYXVsdDoKPiArCQl2YWwgPSAzMDcyOwo+ICsJ CWJyZWFrOwo+ICsJfQo+ICsJZXBfY3R4X3dyaXRlX2F2Z190cmJfbGVuKGVwLT5jb250ZXh0LCB2 YWwpOwo+ICsJZXBfY3R4X3dyaXRlX21heF9lc2l0X3BheWxvYWQoZXAtPmNvbnRleHQsIGVzaXQp Owo+ICsKPiArCWVwX2N0eF93cml0ZV9jZXJyY250KGVwLT5jb250ZXh0LCAweDMpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBzZXR1cF9saW5rX3RyYihzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAs Cj4gKwkJCSAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQo+ICt7Cj4gKwl0cmJfd3JpdGVf ZGF0YV9wdHIodHJiLCBlcC0+dHJhbnNmZXJfcmluZ19waHlzKTsKPiArCXRyYl93cml0ZV90eXBl KHRyYiwgVFJCX1RZUEVfTElOSyk7Cj4gKwl0cmJfd3JpdGVfdG9nZ2xlX2N5Y2xlKHRyYiwgMSk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX190ZWdyYV94dWRjX2VwX2Rpc2FibGUoc3RydWN0IHRl Z3JhX3h1ZGNfZXAgKmVwKQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54 dWRjOwo+ICsKPiArCWlmIChlcF9jdHhfcmVhZF9zdGF0ZShlcC0+Y29udGV4dCkgPT0gRVBfU1RB VEVfRElTQUJMRUQpIHsKPiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImVuZHBvaW50ICV1IGFscmVh ZHkgZGlzYWJsZWRcbiIsCj4gKwkJCWVwLT5pbmRleCk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4g Kwl9Cj4gKwllcF9jdHhfd3JpdGVfc3RhdGUoZXAtPmNvbnRleHQsIEVQX1NUQVRFX0RJU0FCTEVE KTsKPiArCj4gKwllcF9yZWxvYWQoeHVkYywgZXAtPmluZGV4KTsKPiArCj4gKwl0ZWdyYV94dWRj X2VwX251a2UoZXAsIC1FU0hVVERPV04pOwo+ICsKPiArCXh1ZGMtPm5yX2VuYWJsZWRfZXBzLS07 Cj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcC0+ZGVzYykpCj4gKwkJeHVkYy0+bnJf aXNvY2hfZXBzLS07Cj4gKwo+ICsJZXAtPmRlc2MgPSBOVUxMOwo+ICsJZXAtPmNvbXBfZGVzYyA9 IE5VTEw7Cj4gKwo+ICsJbWVtc2V0KGVwLT5jb250ZXh0LCAwLCBzaXplb2YoKmVwLT5jb250ZXh0 KSk7Cj4gKwo+ICsJZXBfdW5wYXVzZSh4dWRjLCBlcC0+aW5kZXgpOwo+ICsJZXBfdW5oYWx0KHh1 ZGMsIGVwLT5pbmRleCk7Cj4gKwlpZiAoeHVkY19yZWFkbCh4dWRjLCBFUF9TVE9QUEVEKSAmIEJJ VChlcC0+aW5kZXgpKQo+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIEJJVChlcC0+aW5kZXgpLCBFUF9T VE9QUEVEKTsKPiArCj4gKwkvKgo+ICsJICogSWYgdGhpcyBpcyB0aGUgbGFzdCBlbmRwb2ludCBk aXNhYmxlZCBpbiBhIGRlLWNvbmZpZ3VyZSByZXF1ZXN0LAo+ICsJICogc3dpdGNoIGJhY2sgdG8g YWRkcmVzcyBzdGF0ZS4KPiArCSAqLwo+ICsJaWYgKCh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNC X1NUQVRFX0NPTkZJR1VSRUQpICYmCj4gKwkgICAgKHh1ZGMtPm5yX2VuYWJsZWRfZXBzID09IDEp KSB7Cj4gKwkJdTMyIHZhbDsKPiArCj4gKwkJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRF X0FERFJFU1M7Cj4gKwkJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ ZGV2aWNlX3N0YXRlKTsKPiArCj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDVFJMKTsKPiAr CQl2YWwgJj0gfkNUUkxfUlVOOwo+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQ1RSTCk7Cj4g Kwl9Cj4gKwo+ICsJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZXAgJXUgZGlzYWJsZWRcbiIsIGVwLT5p bmRleCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVk Y19lcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCkKPiArewo+ICsJc3RydWN0IHRlZ3Jh X3h1ZGNfZXAgKmVwOwo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7Cj4gKwl1bnNpZ25lZCBs b25nIGZsYWdzOwo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIXVzYl9lcCkKPiArCQlyZXR1cm4g LUVJTlZBTDsKPiArCj4gKwllcCA9IHRvX3h1ZGNfZXAodXNiX2VwKTsKPiArCXh1ZGMgPSBlcC0+ eHVkYzsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJ aWYgKHh1ZGMtPnBvd2VyZ2F0ZWQpIHsKPiArCQlyZXQgPSAtRVNIVVRET1dOOwo+ICsJCWdvdG8g dW5sb2NrOwo+ICsJfQo+ICsJcmV0ID0gX190ZWdyYV94dWRjX2VwX2Rpc2FibGUoZXApOwo+ICt1 bmxvY2s6Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4g Kwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX3RlZ3JhX3h1ZGNfZXBf ZW5hYmxlKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwKPiArCQkJCSAgY29uc3Qgc3RydWN0IHVz Yl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYyA9IGVwLT54dWRjOwo+ICsJdW5zaWduZWQgaW50IGk7Cj4gKwl1MzIgdmFsOwo+ICsKPiAr CWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSICYmCj4gKwkJIXVzYl9l bmRwb2ludF94ZmVyX2NvbnRyb2woZGVzYykgJiYgIWVwLT51c2JfZXAuY29tcF9kZXNjKQo+ICsJ CXJldHVybiAtRUlOVkFMOwo+ICsKPiArCS8qIERpc2FibGUgdGhlIEVQIGlmIGl0IGlzIG5vdCBk aXNhYmxlZCAqLwo+ICsJaWYgKGVwX2N0eF9yZWFkX3N0YXRlKGVwLT5jb250ZXh0KSAhPSBFUF9T VEFURV9ESVNBQkxFRCkKPiArCQlfX3RlZ3JhX3h1ZGNfZXBfZGlzYWJsZShlcCk7Cj4gKwo+ICsJ ZXAtPmRlc2MgPSBkZXNjOwo+ICsJZXAtPmNvbXBfZGVzYyA9IGVwLT51c2JfZXAuY29tcF9kZXNj Owo+ICsKPiArCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlc2MpKSB7Cj4gKwkJaWYgKHh1 ZGMtPm5yX2lzb2NoX2VwcyA+IFhVRENfTUFYX0lTT0NIX0VQUykgewo+ICsJCQlkZXZfZXJyKHh1 ZGMtPmRldiwgInRvbyBtYW55IGlzb2NoIGVuZHBvaW50c1xuIik7Cj4gKwkJCXJldHVybiAtRUJV U1k7Cj4gKwkJfQo+ICsJCXh1ZGMtPm5yX2lzb2NoX2VwcysrOwo+ICsJfQo+ICsKPiArCW1lbXNl dChlcC0+dHJhbnNmZXJfcmluZywgMCwgWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgKgo+ICsJICAg ICAgIHNpemVvZigqZXAtPnRyYW5zZmVyX3JpbmcpKTsKPiArCXNldHVwX2xpbmtfdHJiKGVwLCAm ZXAtPnRyYW5zZmVyX3JpbmdbWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgLSAxXSk7Cj4gKwo+ICsJ ZXAtPmVucV9wdHIgPSAwOwo+ICsJZXAtPmRlcV9wdHIgPSAwOwo+ICsJZXAtPnBjcyA9IHRydWU7 Cj4gKwllcC0+cmluZ19mdWxsID0gZmFsc2U7Cj4gKwl4dWRjLT5ucl9lbmFibGVkX2VwcysrOwo+ ICsKPiArCXRlZ3JhX3h1ZGNfZXBfY29udGV4dF9zZXR1cChlcCk7Cj4gKwo+ICsJLyoKPiArCSAq IE5vIG5lZWQgdG8gcmVsb2FkIGFuZCB1bi1oYWx0IEVQMC4gIFRoaXMgd2lsbCBiZSBkb25lIGF1 dG9tYXRpY2FsbHkKPiArCSAqIG9uY2UgYSB2YWxpZCBTRVRVUCBwYWNrZXQgaXMgcmVjZWl2ZWQu Cj4gKwkgKi8KPiArCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGRlc2MpKQo+ICsJCWdv dG8gb3V0Owo+ICsKPiArCS8qCj4gKwkgKiBUcmFuc2l0aW9uIHRvIGNvbmZpZ3VyZWQgc3RhdGUg b25jZSB0aGUgZmlyc3Qgbm9uLWNvbnRyb2wKPiArCSAqIGVuZHBvaW50IGlzIGVuYWJsZWQuCj4g KwkgKi8KPiArCWlmICh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0FERFJFU1MpIHsK PiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOwo+ICsJCXZhbCB8PSBDVFJMX1JVTjsK PiArCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENUUkwpOwo+ICsKPiArCQl4dWRjLT5kZXZpY2Vf c3RhdGUgPSBVU0JfU1RBVEVfQ09ORklHVVJFRDsKPiArCQl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgm eHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOwo+ICsJfQo+ICsKPiArCWlmICh1c2Jf ZW5kcG9pbnRfeGZlcl9pc29jKGRlc2MpKSB7Cj4gKwkJLyoKPiArCQkgKiBQYXVzZSBhbGwgYnVs ayBlbmRwb2ludHMgd2hlbiBlbmFibGluZyBhbiBpc29jaCBlbmRwb2ludAo+ICsJCSAqIHRvIGVu c3VyZSB0aGUgaXNvY2ggZW5kcG9pbnQgaXMgYWxsb2NhdGVkIGVub3VnaCBiYW5kd2lkdGguCj4g KwkJICovCj4gKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVkYy0+ZXApOyBpKyspIHsK PiArCQkJaWYgKHh1ZGMtPmVwW2ldLmRlc2MgJiYKPiArCQkJICAgIHVzYl9lbmRwb2ludF94ZmVy X2J1bGsoeHVkYy0+ZXBbaV0uZGVzYykpCj4gKwkJCQllcF9wYXVzZSh4dWRjLCBpKTsKPiArCQl9 Cj4gKwl9Cj4gKwo+ICsJZXBfcmVsb2FkKHh1ZGMsIGVwLT5pbmRleCk7Cj4gKwllcF91bnBhdXNl KHh1ZGMsIGVwLT5pbmRleCk7Cj4gKwllcF91bmhhbHQoeHVkYywgZXAtPmluZGV4KTsKPiArCj4g KwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkgewo+ICsJCWZvciAoaSA9IDA7IGkg PCBBUlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsrKSB7Cj4gKwkJCWlmICh4dWRjLT5lcFtpXS5kZXNj ICYmCj4gKwkJCSAgICB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKHh1ZGMtPmVwW2ldLmRlc2MpKQo+ ICsJCQkJZXBfdW5wYXVzZSh4dWRjLCBpKTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICtvdXQ6Cj4gKwlk ZXZfaW5mbyh4dWRjLT5kZXYsICJlcCAldSAodHlwZTogJWQsIGRpcjogJXMpIGVuYWJsZWRcbiIs IGVwLT5pbmRleCwKPiArCQkgdXNiX2VuZHBvaW50X3R5cGUoZXAtPmRlc2MpLAo+ICsJCSB1c2Jf ZW5kcG9pbnRfZGlyX2luKGVwLT5kZXNjKSA/ICJpbiIgOiAib3V0Iik7CgpkZXZfZGJnKCkKCj4g Kwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcF9lbmFi bGUoc3RydWN0IHVzYl9lcCAqdXNiX2VwLAo+ICsJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2lu dF9kZXNjcmlwdG9yICpkZXNjKQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXA7Cj4g KwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYzsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwlp bnQgcmV0Owo+ICsKPiArCWlmICAoIXVzYl9lcCB8fCAhZGVzYyB8fCAoZGVzYy0+YkRlc2NyaXB0 b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJ ZXAgPSB0b194dWRjX2VwKHVzYl9lcCk7Cj4gKwl4dWRjID0gZXAtPnh1ZGM7Cj4gKwo+ICsJc3Bp bl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiArCWlmICh4dWRjLT5wb3dlcmdh dGVkKSB7Cj4gKwkJcmV0ID0gLUVTSFVURE9XTjsKPiArCQlnb3RvIHVubG9jazsKPiArCX0KPiAr CXJldCA9IF9fdGVncmFfeHVkY19lcF9lbmFibGUoZXAsIGRlc2MpOwo+ICt1bmxvY2s6Cj4gKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJcmV0dXJu IHJldDsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCj4gK3RlZ3JhX3h1 ZGNfZXBfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIGdmcF90IGdmcCkKPiAr ewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwo+ICsKPiArCXJlcSA9IGt6YWxs b2Moc2l6ZW9mKCpyZXEpLCBnZnApOwo+ICsJaWYgKCFyZXEpCj4gKwkJcmV0dXJuIE5VTEw7Cj4g Kwo+ICsJSU5JVF9MSVNUX0hFQUQoJnJlcS0+bGlzdCk7Cj4gKwo+ICsJcmV0dXJuICZyZXEtPnVz Yl9yZXE7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZXBfZnJlZV9yZXF1ZXN0 KHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwKPiArCQkJCSAgICAgICBzdHJ1Y3QgdXNiX3JlcXVlc3Qg KnVzYl9yZXEpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcSA9IHRvX3h1 ZGNfcmVxKHVzYl9yZXEpOwo+ICsKPiArCWtmcmVlKHJlcSk7Cj4gK30KPiArCj4gK3N0YXRpYyBz dHJ1Y3QgdXNiX2VwX29wcyB0ZWdyYV94dWRjX2VwX29wcyA9IHsKPiArCS5lbmFibGUgPSB0ZWdy YV94dWRjX2VwX2VuYWJsZSwKPiArCS5kaXNhYmxlID0gdGVncmFfeHVkY19lcF9kaXNhYmxlLAo+ ICsJLmFsbG9jX3JlcXVlc3QgPSB0ZWdyYV94dWRjX2VwX2FsbG9jX3JlcXVlc3QsCj4gKwkuZnJl ZV9yZXF1ZXN0ID0gdGVncmFfeHVkY19lcF9mcmVlX3JlcXVlc3QsCj4gKwkucXVldWUgPSB0ZWdy YV94dWRjX2VwX3F1ZXVlLAo+ICsJLmRlcXVldWUgPSB0ZWdyYV94dWRjX2VwX2RlcXVldWUsCj4g Kwkuc2V0X2hhbHQgPSB0ZWdyYV94dWRjX2VwX3NldF9oYWx0LAo+ICt9Owo+ICsKPiArc3RhdGlj IGludCB0ZWdyYV94dWRjX2VwMF9lbmFibGUoc3RydWN0IHVzYl9lcCAqdXNiX2VwLAo+ICsJCQkJ IGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKPiArewo+ICsJcmV0 dXJuIC1FSU5WQUw7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfZGlzYWJs ZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCj4gK3sKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgc3RydWN0IHVzYl9lcF9vcHMgdGVncmFfeHVkY19lcDBfb3BzID0gewo+ICsJ LmVuYWJsZSA9IHRlZ3JhX3h1ZGNfZXAwX2VuYWJsZSwKPiArCS5kaXNhYmxlID0gdGVncmFfeHVk Y19lcDBfZGlzYWJsZSwKPiArCS5hbGxvY19yZXF1ZXN0ID0gdGVncmFfeHVkY19lcF9hbGxvY19y ZXF1ZXN0LAo+ICsJLmZyZWVfcmVxdWVzdCA9IHRlZ3JhX3h1ZGNfZXBfZnJlZV9yZXF1ZXN0LAo+ ICsJLnF1ZXVlID0gdGVncmFfeHVkY19lcF9xdWV1ZSwKPiArCS5kZXF1ZXVlID0gdGVncmFfeHVk Y19lcF9kZXF1ZXVlLAo+ICsJLnNldF9oYWx0ID0gdGVncmFfeHVkY19lcF9zZXRfaGFsdCwKPiAr fTsKCldoYXQgbWFrZXMgRVAwIHNwZWNpYWw/Cgo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRj X2dhZGdldF9nZXRfZnJhbWUoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKPiArewo+ICsJc3Ry dWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSB0b194dWRjKGdhZGdldCk7Cj4gKwl1bnNpZ25lZCBsb25n IGZsYWdzOwo+ICsJaW50IHJldDsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9j aywgZmxhZ3MpOwo+ICsJaWYgKHh1ZGMtPnBvd2VyZ2F0ZWQpIHsKPiArCQlyZXQgPSAtRVNIVVRE T1dOOwo+ICsJCWdvdG8gdW5sb2NrOwo+ICsJfQo+ICsJcmV0ID0gKHh1ZGNfcmVhZGwoeHVkYywg TUZJTkRFWCkgPj4gTUZJTkRFWF9GUkFNRV9TSElGVCkgJgo+ICsJCU1GSU5ERVhfRlJBTUVfTUFT SzsKPiArdW5sb2NrOgo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxh Z3MpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1 ZGNfcmVzdW1lX2RldmljZV9zdGF0ZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJ dW5zaWduZWQgaW50IGk7Cj4gKwl1MzIgdmFsOwo+ICsKPiArCWVwX3VucGF1c2VfYWxsKHh1ZGMp Owo+ICsKPiArCS8qIERpcmVjdCBsaW5rIHRvIFUwLiAqLwo+ICsJdmFsID0geHVkY19yZWFkbCh4 dWRjLCBQT1JUU0MpOwo+ICsJaWYgKCgodmFsID4+IFBPUlRTQ19QTFNfU0hJRlQpICYgUE9SVFND X1BMU19NQVNLKSAhPSBQT1JUU0NfUExTX1UwKSB7Cj4gKwkJdmFsICY9IH4oUE9SVFNDX0NIQU5H RV9NQVNLIHwKPiArCQkJIChQT1JUU0NfUExTX01BU0sgPDwgUE9SVFNDX1BMU19TSElGVCkpOwo+ ICsJCXZhbCB8PSBQT1JUU0NfTFdTIHwgKFBPUlRTQ19QTFNfVTAgPDwgUE9SVFNDX1BMU19TSElG VCk7Cj4gKwkJeHVkY193cml0ZWwoeHVkYywgdmFsLCBQT1JUU0MpOwo+ICsJfQo+ICsKPiArCWlm ICh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgewo+ICsJCXh1ZGMt PmRldmljZV9zdGF0ZSA9IHh1ZGMtPnJlc3VtZV9zdGF0ZTsKPiArCQl1c2JfZ2FkZ2V0X3NldF9z dGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOwo+ICsJCXh1ZGMtPnJlc3Vt ZV9zdGF0ZSA9IDA7Cj4gKwl9Cj4gKwo+ICsJLyoKPiArCSAqIERvb3JiZWxscyBtYXkgYmUgZHJv cHBlZCBpZiB0aGV5IGFyZSBzZW50IHRvbyBzb29uICg8IH4yMDBucykKPiArCSAqIGFmdGVyIHVu cGF1c2luZyB0aGUgZW5kcG9pbnQuICBXYWl0IGZvciA1MDBucyBqdXN0IHRvIGJlIHNhZmUuCj4g KwkgKi8KPiArCW5kZWxheSg1MDApOwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVk Yy0+ZXApOyBpKyspCj4gKwkJdGVncmFfeHVkY19lcF9yaW5nX2Rvb3JiZWxsKCZ4dWRjLT5lcFtp XSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19nYWRnZXRfd2FrZXVwKHN0cnVj dCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0g dG9feHVkYyhnYWRnZXQpOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCWludCByZXQgPSAw Owo+ICsJdTMyIHZhbDsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxh Z3MpOwo+ICsJaWYgKHh1ZGMtPnBvd2VyZ2F0ZWQpIHsKPiArCQlyZXQgPSAtRVNIVVRET1dOOwo+ ICsJCWdvdG8gdW5sb2NrOwo+ICsJfQo+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0p Owo+ICsJZGV2X2RiZyh4dWRjLT5kZXYsICIlczogUE9SVFBNPSUjeCwgc3BlZWQ9JXhcbiIsIF9f ZnVuY19fLAo+ICsJCQl2YWwsIGdhZGdldC0+c3BlZWQpOwo+ICsJaWYgKCgoeHVkYy0+Z2FkZ2V0 LnNwZWVkIDw9IFVTQl9TUEVFRF9ISUdIKSAmJgo+ICsJICAgICAodmFsICYgUE9SVFBNX1JXRSkp IHx8Cj4gKwkgICAgKCh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSAmJgo+ ICsJICAgICAodmFsICYgUE9SVFBNX0ZSV0UpKSkgewo+ICsJCXRlZ3JhX3h1ZGNfcmVzdW1lX2Rl dmljZV9zdGF0ZSh4dWRjKTsKPiArCj4gKwkJLyogU2VuZCBEZXZpY2UgTm90aWZpY2F0aW9uIHBh Y2tldC4gKi8KPiArCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikg ewo+ICsJCQl2YWwgPSAoREVWTk9USUZfTE9fVFlQRV9GVU5DVElPTl9XQUtFIDw8Cj4gKwkJCSAg ICAgICBERVZOT1RJRl9MT19UWVBFX1NISUZUKSB8IERFVk5PVElGX0xPX1RSSUc7Cj4gKwkJCXh1 ZGNfd3JpdGVsKHh1ZGMsIDAsIERFVk5PVElGX0hJKTsKPiArCQkJeHVkY193cml0ZWwoeHVkYywg dmFsLCBERVZOT1RJRl9MTyk7Cj4gKwkJfQo+ICsJfQo+ICt1bmxvY2s6Cj4gKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiAr fQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX2dhZGdldF9wdWxsdXAoc3RydWN0IHVzYl9n YWRnZXQgKmdhZGdldCwgaW50IGlzX29uKQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVk YyA9IHRvX3h1ZGMoZ2FkZ2V0KTsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwl1MzIgdmFs Owo+ICsKPiArCXBtX3J1bnRpbWVfZ2V0X3N5bmMoeHVkYy0+ZGV2KTsKPiArCXNwaW5fbG9ja19p cnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwlpZiAoaXNfb24gIT0geHVkYy0+cHVsbHVw KSB7Cj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDVFJMKTsKPiArCQlpZiAoaXNfb24pCj4g KwkJCXZhbCB8PSBDVFJMX0VOQUJMRTsKPiArCQllbHNlCj4gKwkJCXZhbCAmPSB+Q1RSTF9FTkFC TEU7Cj4gKwkJeHVkY193cml0ZWwoeHVkYywgdmFsLCBDVFJMKTsKPiArCX0KPiArCXh1ZGMtPnB1 bGx1cCA9IGlzX29uOwo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxh Z3MpOwo+ICsJcG1fcnVudGltZV9wdXQoeHVkYy0+ZGV2KTsKPiArCj4gKwlyZXR1cm4gMDsKPiAr fQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX2dhZGdldF9zdGFydChzdHJ1Y3QgdXNiX2dh ZGdldCAqZ2FkZ2V0LAo+ICsJCQkJICAgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIp Cj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gdG9feHVkYyhnYWRnZXQpOwo+ICsJ dW5zaWduZWQgbG9uZyBmbGFnczsKPiArCXUzMiB2YWw7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWlm ICghZHJpdmVyKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWRldl9kYmcoeHVkYy0+ZGV2 LCAiJXNcbiIsIF9fZnVuY19fKTsKClRoZXNlIGRvbid0IHNlZW0gdG8gYmUgZ2VuZXJhbGx5IHVz ZWZ1bCBkZWJ1ZyBtZXNzYWdlcy4gVGhlIHNhbWUKZnVuY3Rpb25hbGl0eSBjYW4gYmUgZW5hYmxl ZCB1c2luZyB0aGUgZnVuY3Rpb24gdHJhY2VyLgoKPiArCj4gKwlwbV9ydW50aW1lX2dldF9zeW5j KHh1ZGMtPmRldik7Cj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ ICsJaWYgKHh1ZGMtPmRyaXZlcikgewo+ICsJCXJldCA9IC1FQlVTWTsKPiArCQlnb3RvIHVubG9j azsKPiArCX0KPiArCj4gKwl4dWRjLT5zZXR1cF9zdGF0ZSA9IFdBSVRfRk9SX1NFVFVQOwo+ICsJ eHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0RFRkFVTFQ7Cj4gKwl1c2JfZ2FkZ2V0X3Nl dF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOwo+ICsKPiArCXJldCA9 IF9fdGVncmFfeHVkY19lcF9lbmFibGUoJnh1ZGMtPmVwWzBdLCAmdGVncmFfeHVkY19lcDBfZGVz Yyk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlnb3RvIHVubG9jazsKPiArCj4gKwl2YWwgPSB4dWRj X3JlYWRsKHh1ZGMsIENUUkwpOwo+ICsJdmFsIHw9IENUUkxfSUUgfCBDVFJMX0xTRTsKPiArCXh1 ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQ1RSTCk7Cj4gKwo+ICsJdmFsID0geHVkY19yZWFkbCh4dWRj LCBQT1JUSEFMVCk7Cj4gKwl2YWwgfD0gUE9SVEhBTFRfU1RDSEdfSU5UUl9FTjsKPiArCXh1ZGNf d3JpdGVsKHh1ZGMsIHZhbCwgUE9SVEhBTFQpOwo+ICsKPiArCWlmICh4dWRjLT5wdWxsdXApIHsK PiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOwo+ICsJCXZhbCB8PSBDVFJMX0VOQUJM RTsKPiArCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENUUkwpOwo+ICsJfQo+ICsKPiArCXh1ZGMt PmRyaXZlciA9IGRyaXZlcjsKPiArdW5sb2NrOgo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm eHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJcG1fcnVudGltZV9wdXQoeHVkYy0+ZGV2KTsKPiArCWRl dl9kYmcoeHVkYy0+ZGV2LCAiJXMgZG9uZVxuIiwgX19mdW5jX18pOwoKU2FtZSBoZXJlLgoKPiAr CXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19nYWRnZXRfc3Rv cChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwl1MzIg dmFsOwo+ICsKPiArCXBtX3J1bnRpbWVfZ2V0X3N5bmMoeHVkYy0+ZGV2KTsKPiArCXNwaW5fbG9j a19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMs IENUUkwpOwo+ICsJdmFsICY9IH4oQ1RSTF9JRSB8IENUUkxfRU5BQkxFKTsKPiArCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgQ1RSTCk7Cj4gKwo+ICsJX190ZWdyYV94dWRjX2VwX2Rpc2FibGUoJnh1 ZGMtPmVwWzBdKTsKPiArCj4gKwl4dWRjLT5kcml2ZXIgPSBOVUxMOwo+ICsJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJcG1fcnVudGltZV9wdXQoeHVkYy0+ ZGV2KTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRj X3NldF9zZWxmcG93ZXJlZChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgaXNfb24pCj4g K3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gdG9feHVkYyhnYWRnZXQpOwo+ICsKPiAr CWRldl9kYmcoeHVkYy0+ZGV2LCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgaXNfb24pOwo+ICsJeHVk Yy0+c2VsZnBvd2VyZWQgPSAhIWlzX29uOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtz dGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfb3BzIHRlZ3JhX3h1ZGNfZ2FkZ2V0X29wcyA9IHsKPiAr CS5nZXRfZnJhbWUgPSB0ZWdyYV94dWRjX2dhZGdldF9nZXRfZnJhbWUsCj4gKwkud2FrZXVwID0g dGVncmFfeHVkY19nYWRnZXRfd2FrZXVwLAo+ICsJLnB1bGx1cCA9IHRlZ3JhX3h1ZGNfZ2FkZ2V0 X3B1bGx1cCwKPiArCS51ZGNfc3RhcnQgPSB0ZWdyYV94dWRjX2dhZGdldF9zdGFydCwKPiArCS51 ZGNfc3RvcCA9IHRlZ3JhX3h1ZGNfZ2FkZ2V0X3N0b3AsCj4gKwkuc2V0X3NlbGZwb3dlcmVkID0g dGVncmFfeHVkY19zZXRfc2VsZnBvd2VyZWQsCj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCBub19v cF9jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCj4g K3sKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICt0ZWdyYV94dWRjX2VwMF9xdWV1ZV9zdGF0dXMo c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCj4gKwkJdm9pZCAoKmNtcGwpKHN0cnVjdCB1c2JfZXAg Kiwgc3RydWN0IHVzYl9yZXF1ZXN0ICopKQo+ICt7Cj4gKwl4dWRjLT5lcDBfcmVxLT51c2JfcmVx LmJ1ZiA9IE5VTEw7Cj4gKwl4dWRjLT5lcDBfcmVxLT51c2JfcmVxLmRtYSA9IDA7Cj4gKwl4dWRj LT5lcDBfcmVxLT51c2JfcmVxLmxlbmd0aCA9IDA7Cj4gKwl4dWRjLT5lcDBfcmVxLT51c2JfcmVx LmNvbXBsZXRlID0gY21wbDsKPiArCXh1ZGMtPmVwMF9yZXEtPnVzYl9yZXEuY29udGV4dCA9IHh1 ZGM7Cj4gKwo+ICsJcmV0dXJuIF9fdGVncmFfeHVkY19lcF9xdWV1ZSgmeHVkYy0+ZXBbMF0sIHh1 ZGMtPmVwMF9yZXEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50Cj4gK3RlZ3JhX3h1ZGNfZXAwX3F1 ZXVlX2RhdGEoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwK PiArCQl2b2lkICgqY21wbCkoc3RydWN0IHVzYl9lcCAqLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKikp Cj4gK3sKPiArCXh1ZGMtPmVwMF9yZXEtPnVzYl9yZXEuYnVmID0gYnVmOwo+ICsJeHVkYy0+ZXAw X3JlcS0+dXNiX3JlcS5sZW5ndGggPSBsZW47Cj4gKwl4dWRjLT5lcDBfcmVxLT51c2JfcmVxLmNv bXBsZXRlID0gY21wbDsKPiArCXh1ZGMtPmVwMF9yZXEtPnVzYl9yZXEuY29udGV4dCA9IHh1ZGM7 Cj4gKwo+ICsJcmV0dXJuIF9fdGVncmFfeHVkY19lcF9xdWV1ZSgmeHVkYy0+ZXBbMF0sIHh1ZGMt PmVwMF9yZXEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2VwMF9yZXFfZG9u ZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJc3dpdGNoICh4dWRjLT5zZXR1cF9z dGF0ZSkgewo+ICsJY2FzZSBEQVRBX1NUQUdFX1hGRVI6Cj4gKwkJeHVkYy0+c2V0dXBfc3RhdGUg PSBTVEFUVVNfU1RBR0VfUkVDVjsKPiArCQl0ZWdyYV94dWRjX2VwMF9xdWV1ZV9zdGF0dXMoeHVk Yywgbm9fb3BfY29tcGxldGUpOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBEQVRBX1NUQUdFX1JFQ1Y6 Cj4gKwkJeHVkYy0+c2V0dXBfc3RhdGUgPSBTVEFUVVNfU1RBR0VfWEZFUjsKPiArCQl0ZWdyYV94 dWRjX2VwMF9xdWV1ZV9zdGF0dXMoeHVkYywgbm9fb3BfY29tcGxldGUpOwo+ICsJCWJyZWFrOwo+ ICsJZGVmYXVsdDoKPiArCQl4dWRjLT5zZXR1cF9zdGF0ZSA9IFdBSVRfRk9SX1NFVFVQOwo+ICsJ CWJyZWFrOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX2RlbGVn YXRlX3JlcShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKPiArCQkJCSAgICAgICBzdHJ1Y3QgdXNi X2N0cmxyZXF1ZXN0ICpjdHJsKQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXNwaW5fdW5sb2Nr KCZ4dWRjLT5sb2NrKTsKPiArCXJldCA9IHh1ZGMtPmRyaXZlci0+c2V0dXAoJnh1ZGMtPmdhZGdl dCwgY3RybCk7Cj4gKwlzcGluX2xvY2soJnh1ZGMtPmxvY2spOwo+ICsKPiArCXJldHVybiByZXQ7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHNldF9mZWF0dXJlX2NvbXBsZXRlKHN0cnVjdCB1c2Jf ZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMgPSByZXEtPmNvbnRleHQ7Cj4gKwo+ICsJaWYgKHh1ZGMtPnRlc3RfbW9kZV9wYXR0 ZXJuKSB7Cj4gKwkJeHVkY193cml0ZWwoeHVkYywgeHVkYy0+dGVzdF9tb2RlX3BhdHRlcm4sIFBP UlRfVE0pOwo+ICsJCXh1ZGMtPnRlc3RfbW9kZV9wYXR0ZXJuID0gMDsKPiArCX0KPiArfQo+ICsK PiArc3RhdGljIGludCB0ZWdyYV94dWRjX2VwMF9zZXRfZmVhdHVyZShzdHJ1Y3QgdGVncmFfeHVk YyAqeHVkYywKPiArCQkJCSAgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCj4gK3sK PiArCWJvb2wgc2V0ID0gKGN0cmwtPmJSZXF1ZXN0ID09IFVTQl9SRVFfU0VUX0ZFQVRVUkUpOwo+ ICsJdTMyIGZlYXR1cmUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOwo+ICsJdTMyIGluZGV4 ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKPiArCXUzMiB2YWwsIGVwOwo+ICsJaW50IHJl dDsKPiArCj4gKwlpZiAobGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCkgIT0gMCkKPiArCQlyZXR1 cm4gLUVJTlZBTDsKPiArCj4gKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJ UF9NQVNLKSB7Cj4gKwljYXNlIFVTQl9SRUNJUF9ERVZJQ0U6Cj4gKwkJc3dpdGNoIChmZWF0dXJl KSB7Cj4gKwkJY2FzZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVA6Cj4gKwkJCWlmICgoeHVkYy0+ Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikgfHwKPiArCQkJICAgICh4dWRjLT5kZXZp Y2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0RFRkFVTFQpKQo+ICsJCQkJcmV0dXJuIC1FSU5WQUw7Cj4g Kwo+ICsJCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7Cj4gKwkJCWlmIChzZXQpCj4g KwkJCQl2YWwgfD0gUE9SVFBNX1JXRTsKPiArCQkJZWxzZQo+ICsJCQkJdmFsICY9IH5QT1JUUE1f UldFOwo+ICsJCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRQTSk7Cj4gKwkJCWJyZWFrOwo+ ICsJCWNhc2UgVVNCX0RFVklDRV9VMV9FTkFCTEU6Cj4gKwkJY2FzZSBVU0JfREVWSUNFX1UyX0VO QUJMRToKPiArCQkJaWYgKCh4dWRjLT5kZXZpY2Vfc3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VS RUQpIHx8Cj4gKwkJCSAgICAoeHVkYy0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVFRF9TVVBFUikp Cj4gKwkJCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwkJCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywg UE9SVFBNKTsKPiArCQkJaWYgKChmZWF0dXJlID09IFVTQl9ERVZJQ0VfVTFfRU5BQkxFKSAmJiB1 MV9lbmFibGUpIHsKPiArCQkJCWlmIChzZXQpCj4gKwkJCQkJdmFsIHw9IFBPUlRQTV9VMUU7Cj4g KwkJCQllbHNlCj4gKwkJCQkJdmFsICY9IH5QT1JUUE1fVTFFOwo+ICsJCQl9Cj4gKwkJCWlmICgo ZmVhdHVyZSA9PSBVU0JfREVWSUNFX1UyX0VOQUJMRSkgJiYgdTJfZW5hYmxlKSB7Cj4gKwkJCQlp ZiAoc2V0KQo+ICsJCQkJCXZhbCB8PSBQT1JUUE1fVTJFOwo+ICsJCQkJZWxzZQo+ICsJCQkJCXZh bCAmPSB+UE9SVFBNX1UyRTsKPiArCQkJfQo+ICsJCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBP UlRQTSk7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgVVNCX0RFVklDRV9URVNUX01PREU6Cj4gKwkJ CWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCj4gKwkJCQlyZXR1cm4g LUVJTlZBTDsKPiArCQkJaWYgKCFzZXQpCj4gKwkJCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwkJ CXh1ZGMtPnRlc3RfbW9kZV9wYXR0ZXJuID0gaW5kZXggPj4gODsKPiArCQkJYnJlYWs7Cj4gKwkJ ZGVmYXVsdDoKPiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gKwkJfQo+ICsKPiArCQlicmVhazsKPiAr CWNhc2UgVVNCX1JFQ0lQX0lOVEVSRkFDRToKPiArCQlpZiAoeHVkYy0+ZGV2aWNlX3N0YXRlICE9 IFVTQl9TVEFURV9DT05GSUdVUkVEKQo+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwkJc3dp dGNoIChmZWF0dXJlKSB7Cj4gKwkJY2FzZSBVU0JfSU5UUkZfRlVOQ19TVVNQRU5EOgo+ICsJCQlp ZiAoc2V0KSB7Cj4gKwkJCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7Cj4gKwkJCQlp ZiAoaW5kZXggJiBVU0JfSU5UUkZfRlVOQ19TVVNQRU5EX1JXKQo+ICsJCQkJCXZhbCB8PSBQT1JU UE1fRlJXRTsKPiArCQkJCWVsc2UKPiArCQkJCQl2YWwgJj0gflBPUlRQTV9GUldFOwo+ICsJCQkJ eHVkY193cml0ZWwoeHVkYywgdmFsLCBQT1JUUE0pOwo+ICsJCQl9Cj4gKwkJCXJldHVybiB0ZWdy YV94dWRjX2VwMF9kZWxlZ2F0ZV9yZXEoeHVkYywgY3RybCk7Cj4gKwkJZGVmYXVsdDoKPiArCQkJ cmV0dXJuIC1FSU5WQUw7Cj4gKwkJfQo+ICsKPiArCQlicmVhazsKPiArCWNhc2UgVVNCX1JFQ0lQ X0VORFBPSU5UOgo+ICsJCWVwID0gKGluZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKSAq IDIgKwo+ICsJCQkoKGluZGV4ICYgVVNCX0RJUl9JTikgPyAxIDogMCk7Cj4gKwo+ICsJCWlmICgo eHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9ERUZBVUxUKSB8fAo+ICsJCSAgICAoKHh1 ZGMtPmRldmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfQUREUkVTUykgJiYKPiArCQkgICAgIChpbmRl eCAhPSAwKSkpCj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCQlyZXQgPSBfX3RlZ3JhX3h1 ZGNfZXBfc2V0X2hhbHQoJnh1ZGMtPmVwW2VwXSwgc2V0KTsKPiArCQlpZiAocmV0IDwgMCkKPiAr CQkJcmV0dXJuIHJldDsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHRlZ3JhX3h1ZGNfZXAwX3F1ZXVlX3N0YXR1cyh4dWRj LCBzZXRfZmVhdHVyZV9jb21wbGV0ZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVk Y19lcDBfZ2V0X3N0YXR1cyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKPiArCQkJCSAgICAgc3Ry dWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfZXBf Y29udGV4dCAqZXBfY3R4Owo+ICsJdTMyIHZhbCwgZXAsIGluZGV4ID0gbGUxNl90b19jcHUoY3Ry bC0+d0luZGV4KTsKPiArCXUxNiBzdGF0dXMgPSAwOwo+ICsKPiArCWlmICghKGN0cmwtPmJSZXF1 ZXN0VHlwZSAmIFVTQl9ESVJfSU4pKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWlmICgo bGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKSAhPSAwKSB8fAo+ICsJICAgIChsZTE2X3RvX2NwdShj dHJsLT53TGVuZ3RoKSAhPSAyKSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlzd2l0Y2gg KGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSB7Cj4gKwljYXNlIFVTQl9SRUNJ UF9ERVZJQ0U6Cj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOwo+ICsKPiArCQlp ZiAoeHVkYy0+c2VsZnBvd2VyZWQpCj4gKwkJCXN0YXR1cyB8PSBCSVQoVVNCX0RFVklDRV9TRUxG X1BPV0VSRUQpOwo+ICsKPiArCQlpZiAoKHh1ZGMtPmdhZGdldC5zcGVlZCA8IFVTQl9TUEVFRF9T VVBFUikgJiYKPiArCQkgICAgKHZhbCAmIFBPUlRQTV9SV0UpKQo+ICsJCQlzdGF0dXMgfD0gQklU KFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCk7Cj4gKwo+ICsJCWlmICh4dWRjLT5nYWRnZXQuc3Bl ZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7Cj4gKwkJCWlmICh2YWwgJiBQT1JUUE1fVTFFKQo+ICsJ CQkJc3RhdHVzIHw9IEJJVChVU0JfREVWX1NUQVRfVTFfRU5BQkxFRCk7Cj4gKwkJCWlmICh2YWwg JiBQT1JUUE1fVTJFKQo+ICsJCQkJc3RhdHVzIHw9IEJJVChVU0JfREVWX1NUQVRfVTJfRU5BQkxF RCk7Cj4gKwkJfQo+ICsJCWJyZWFrOwo+ICsJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgo+ICsJ CWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7Cj4gKwkJCXN0YXR1 cyB8PSBVU0JfSU5UUkZfU1RBVF9GVU5DX1JXX0NBUDsKPiArCQkJdmFsID0geHVkY19yZWFkbCh4 dWRjLCBQT1JUUE0pOwo+ICsJCQlpZiAodmFsICYgUE9SVFBNX0ZSV0UpCj4gKwkJCQlzdGF0dXMg fD0gVVNCX0lOVFJGX1NUQVRfRlVOQ19SVzsKPiArCQl9Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIFVT Ql9SRUNJUF9FTkRQT0lOVDoKPiArCQllcCA9IChpbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJf TUFTSykgKiAyICsKPiArCQkJKChpbmRleCAmIFVTQl9ESVJfSU4pID8gMSA6IDApOwo+ICsJCWVw X2N0eCA9ICZ4dWRjLT5lcF9jb250ZXh0W2VwXTsKPiArCj4gKwkJaWYgKCh4dWRjLT5kZXZpY2Vf c3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpICYmCj4gKwkJICAgICgoeHVkYy0+ZGV2aWNl X3N0YXRlICE9IFVTQl9TVEFURV9BRERSRVNTKSB8fCAoZXAgIT0gMCkpKQo+ICsJCQlyZXR1cm4g LUVJTlZBTDsKPiArCj4gKwkJaWYgKGVwX2N0eF9yZWFkX3N0YXRlKGVwX2N0eCkgPT0gRVBfU1RB VEVfRElTQUJMRUQpCj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCQlpZiAoeHVkY19yZWFk bCh4dWRjLCBFUF9IQUxUKSAmIEJJVChlcCkpCj4gKwkJCXN0YXR1cyB8PSBCSVQoVVNCX0VORFBP SU5UX0hBTFQpOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlyZXR1cm4gLUVJTlZBTDsK PiArCX0KPiArCj4gKwl4dWRjLT5zdGF0dXNfYnVmID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKPiAr CXJldHVybiB0ZWdyYV94dWRjX2VwMF9xdWV1ZV9kYXRhKHh1ZGMsICZ4dWRjLT5zdGF0dXNfYnVm LAo+ICsJCQkJCSBzaXplb2YoeHVkYy0+c3RhdHVzX2J1ZiksCj4gKwkJCQkJIG5vX29wX2NvbXBs ZXRlKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgc2V0X3NlbF9jb21wbGV0ZShzdHJ1Y3QgdXNi X2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCj4gK3sKPiArCS8qIE5vdGhpbmcgdG8g ZG8gd2l0aCBTRUwgdmFsdWVzICovCj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19l cDBfc2V0X3NlbChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKPiArCQkJCSAgc3RydWN0IHVzYl9j dHJscmVxdWVzdCAqY3RybCkKPiArewo+ICsJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSAoVVNC X0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFIHwKPiArCQkJCSAgICAgVVNCX1RZUEVfU1RBTkRB UkQpKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWlmICh4dWRjLT5kZXZpY2Vfc3RhdGUg PT0gVVNCX1NUQVRFX0RFRkFVTFQpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJaWYgKChs ZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpICE9IDApIHx8Cj4gKwkgICAgKGxlMTZfdG9fY3B1KGN0 cmwtPndWYWx1ZSkgIT0gMCkgfHwKPiArCSAgICAobGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCkg IT0gNikpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJcmV0dXJuIHRlZ3JhX3h1ZGNfZXAw X3F1ZXVlX2RhdGEoeHVkYywgJnh1ZGMtPnNlbF90aW1pbmcsCj4gKwkJCQkJIHNpemVvZih4dWRj LT5zZWxfdGltaW5nKSwKPiArCQkJCQkgc2V0X3NlbF9jb21wbGV0ZSk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIHNldF9pc29jaF9kZWxheV9jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3Ry dWN0IHVzYl9yZXF1ZXN0ICpyZXEpCj4gK3sKPiArCS8qIE5vdGhpbmcgdG8gZG8gd2l0aCBpc29j aCBkZWxheSAqLwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX3NldF9pc29j aF9kZWxheShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKPiArCQkJCQkgIHN0cnVjdCB1c2JfY3Ry bHJlcXVlc3QgKmN0cmwpCj4gK3sKPiArCXUzMiBkZWxheSA9IGxlMTZfdG9fY3B1KGN0cmwtPndW YWx1ZSk7Cj4gKwo+ICsJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSAoVVNCX0RJUl9PVVQgfCBV U0JfUkVDSVBfREVWSUNFIHwKPiArCQkJCSAgIFVTQl9UWVBFX1NUQU5EQVJEKSkKPiArCQlyZXR1 cm4gLUVJTlZBTDsKPiArCj4gKwlpZiAoKGRlbGF5ID4gNjU1MzUpIHx8IChsZTE2X3RvX2NwdShj dHJsLT53SW5kZXgpICE9IDApIHx8Cj4gKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgp ICE9IDApKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXh1ZGMtPmlzb2NoX2RlbGF5ID0g ZGVsYXk7Cj4gKwo+ICsJcmV0dXJuIHRlZ3JhX3h1ZGNfZXAwX3F1ZXVlX3N0YXR1cyh4dWRjLCBz ZXRfaXNvY2hfZGVsYXlfY29tcGxldGUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBzZXRfYWRk cmVzc19jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEp Cj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gcmVxLT5jb250ZXh0Owo+ICsKPiAr CWlmICgoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9ERUZBVUxUKSAmJgo+ICsJICAg ICh4dWRjLT5kZXZfYWRkciAhPSAwKSkgewo+ICsJCXh1ZGMtPmRldmljZV9zdGF0ZSA9IFVTQl9T VEFURV9BRERSRVNTOwo+ICsJCXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1 ZGMtPmRldmljZV9zdGF0ZSk7Cj4gKwl9IGVsc2UgaWYgKCh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0g VVNCX1NUQVRFX0FERFJFU1MpICYmCj4gKwkJICAgKHh1ZGMtPmRldl9hZGRyID09IDApKSB7Cj4g KwkJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0RFRkFVTFQ7Cj4gKwkJdXNiX2dhZGdl dF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ZGV2aWNlX3N0YXRlKTsKPiArCX0KPiAr fQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX2VwMF9zZXRfYWRkcmVzcyhzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYywKPiArCQkJCSAgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwp Cj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjX2VwICplcDAgPSAmeHVkYy0+ZXBbMF07Cj4gKwl1 MzIgdmFsLCBhZGRyID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKPiArCj4gKwlpZiAoY3Ry bC0+YlJlcXVlc3RUeXBlICE9IChVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UgfAo+ICsJ CQkJICAgICBVU0JfVFlQRV9TVEFOREFSRCkpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJ aWYgKChhZGRyID4gMTI3KSB8fCAobGUxNl90b19jcHUoY3RybC0+d0luZGV4KSAhPSAwKSB8fAo+ ICsJICAgIChsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKSAhPSAwKSkKPiArCQlyZXR1cm4gLUVJ TlZBTDsKPiArCj4gKwlpZiAoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9DT05GSUdV UkVEKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWRldl9kYmcoeHVkYy0+ZGV2LCAic2V0 IGFkZHJlc3M6ICV1XG4iLCBhZGRyKTsKPiArCj4gKwl4dWRjLT5kZXZfYWRkciA9IGFkZHI7Cj4g Kwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOwo+ICsJdmFsICY9IH4oQ1RSTF9ERVZBRERS X01BU0sgPDwgQ1RSTF9ERVZBRERSX1NISUZUKTsKPiArCXZhbCB8PSBhZGRyIDw8IENUUkxfREVW QUREUl9TSElGVDsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQ1RSTCk7Cj4gKwo+ICsJZXBf Y3R4X3dyaXRlX2RldmFkZHIoZXAwLT5jb250ZXh0LCBhZGRyKTsKPiArCj4gKwlyZXR1cm4gdGVn cmFfeHVkY19lcDBfcXVldWVfc3RhdHVzKHh1ZGMsIHNldF9hZGRyZXNzX2NvbXBsZXRlKTsKPiAr fQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX2VwMF9zdGFuZGFyZF9yZXEoc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMsCj4gKwkJCQkgICAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJs KQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXN3aXRjaCAoY3RybC0+YlJlcXVlc3QpIHsKPiAr CWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgo+ICsJCWRldl9kYmcoeHVkYy0+ZGV2LCAiVVNCX1JF UV9HRVRfU1RBVFVTXG4iKTsKPiArCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9nZXRfc3RhdHVzKHh1 ZGMsIGN0cmwpOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBVU0JfUkVRX1NFVF9BRERSRVNTOgo+ICsJ CWRldl9kYmcoeHVkYy0+ZGV2LCAiVVNCX1JFUV9TRVRfQUREUkVTU1xuIik7Cj4gKwkJcmV0ID0g dGVncmFfeHVkY19lcDBfc2V0X2FkZHJlc3MoeHVkYywgY3RybCk7Cj4gKwkJYnJlYWs7Cj4gKwlj YXNlIFVTQl9SRVFfU0VUX1NFTDoKPiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVTQl9SRVFfU0VU X1NFTFxuIik7Cj4gKwkJcmV0ID0gdGVncmFfeHVkY19lcDBfc2V0X3NlbCh4dWRjLCBjdHJsKTsK PiArCQlicmVhazsKPiArCWNhc2UgVVNCX1JFUV9TRVRfSVNPQ0hfREVMQVk6Cj4gKwkJZGV2X2Ri Zyh4dWRjLT5kZXYsICJVU0JfUkVRX1NFVF9JU09DSF9ERUxBWVxuIik7Cj4gKwkJcmV0ID0gdGVn cmFfeHVkY19lcDBfc2V0X2lzb2NoX2RlbGF5KHh1ZGMsIGN0cmwpOwo+ICsJCWJyZWFrOwo+ICsJ Y2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6Cj4gKwljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6 Cj4gKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJVU0JfUkVRX0NMRUFSL1NFVF9GRUFUVVJFXG4iKTsK PiArCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9zZXRfZmVhdHVyZSh4dWRjLCBjdHJsKTsKPiArCQli cmVhazsKPiArCWNhc2UgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjoKPiArCQlkZXZfZGJnKHh1 ZGMtPmRldiwgIlVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT05cbiIpOwo+ICsJCS8qCj4gKwkJICog SW4gdGhlb3J5IHdlIG5lZWQgdG8gY2xlYXIgUlVOIGJpdCBiZWZvcmUgc3RhdHVzIHN0YWdlIG9m Cj4gKwkJICogZGVjb25maWcgcmVxdWVzdCBzZW50LCBidXQgdGhpcyBzZWVtcyB0byBiZSBjYXVz aW5nIHByb2JsZW1zLgo+ICsJCSAqIENsZWFyIFJVTiBvbmNlIGFsbCBlbmRwb2ludHMgYXJlIGRp c2FibGVkIGluc3RlYWQuCj4gKwkJICovCj4gKwlkZWZhdWx0Ogo+ICsJCXJldCA9IHRlZ3JhX3h1 ZGNfZXAwX2RlbGVnYXRlX3JlcSh4dWRjLCBjdHJsKTsKPiArCQlicmVhazsKPiArCX0KPiArCj4g KwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2hhbmRsZV9l cDBfc2V0dXBfcGFja2V0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAo+ICsJCQkJCSAgICAgICBz dHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsLAo+ICsJCQkJCSAgICAgICB1MTYgc2VxX251bSkK PiArewo+ICsJaW50IHJldDsKPiArCj4gKwl4dWRjLT5zZXR1cF9zZXFfbnVtID0gc2VxX251bTsK PiArCj4gKwkvKiBFbnN1cmUgRVAwIGlzIHVuaGFsdGVkLiAqLwo+ICsJZXBfdW5oYWx0KHh1ZGMs IDApOwo+ICsKPiArCS8qCj4gKwkgKiBPbiBUZWdyYTIxMCwgc2V0dXAgcGFja2V0cyB3aXRoIHNl cXVlbmNlIG51bWJlcnMgMHhmZmZlIG9yIDB4ZmZmZgo+ICsJICogYXJlIGludmFsaWQuICBIYWx0 IEVQMCB1bnRpbCB3ZSBnZXQgYSB2YWxpZCBwYWNrZXQuCj4gKwkgKi8KPiArCWlmICh4dWRjLT5z b2MtPmludmFsaWRfc2VxX251bSAmJgo+ICsJICAgIChzZXFfbnVtID09IDB4ZmZmZSB8fCBzZXFf bnVtID09IDB4ZmZmZikpIHsKPiArCQlkZXZfd2Fybih4dWRjLT5kZXYsICJpbnZhbGlkIHNlcXVl bmNlIG51bWJlciBkZXRlY3RlZFxuIik7Cj4gKwkJZXBfaGFsdCh4dWRjLCAwKTsKPiArCQlyZXR1 cm47Cj4gKwl9Cj4gKwo+ICsJaWYgKGN0cmwtPndMZW5ndGgpCj4gKwkJeHVkYy0+c2V0dXBfc3Rh dGUgPSAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPwo+ICsJCQlEQVRBX1NUQUdF X1hGRVIgOiAgREFUQV9TVEFHRV9SRUNWOwo+ICsJZWxzZQo+ICsJCXh1ZGMtPnNldHVwX3N0YXRl ID0gU1RBVFVTX1NUQUdFX1hGRVI7Cj4gKwo+ICsJaWYgKChjdHJsLT5iUmVxdWVzdFR5cGUgJiBV U0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9TVEFOREFSRCkKPiArCQlyZXQgPSB0ZWdyYV94dWRj X2VwMF9zdGFuZGFyZF9yZXEoeHVkYywgY3RybCk7Cj4gKwllbHNlCj4gKwkJcmV0ID0gdGVncmFf eHVkY19lcDBfZGVsZWdhdGVfcmVxKHh1ZGMsIGN0cmwpOwo+ICsKPiArCWlmIChyZXQgPCAwKSB7 Cj4gKwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAic2V0dXAgcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLCBy ZXQpOwo+ICsJCXh1ZGMtPnNldHVwX3N0YXRlID0gV0FJVF9GT1JfU0VUVVA7Cj4gKwkJZXBfaGFs dCh4dWRjLCAwKTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19oYW5k bGVfZXAwX2V2ZW50KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAo+ICsJCQkJCXN0cnVjdCB0ZWdy YV94dWRjX3RyYiAqZXZlbnQpCj4gK3sKPiArCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwg PSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKWV2ZW50Owo+ICsJdTE2IHNlcV9udW0gPSB0cmJf cmVhZF9zZXFfbnVtKGV2ZW50KTsKPiArCj4gKwlpZiAoeHVkYy0+c2V0dXBfc3RhdGUgIT0gV0FJ VF9GT1JfU0VUVVApIHsKPiArCQkvKgo+ICsJCSAqIFRoZSBjb250cm9sbGVyIGlzIGluIHRoZSBw cm9jZXNzIG9mIGhhbmRsaW5nIGFub3RoZXIKPiArCQkgKiBzZXR1cCByZXF1ZXN0LiAgUXVldWUg c3Vic2VxdWVudCByZXF1ZXN0cyBhbmQgaGFuZGxlCj4gKwkJICogdGhlIGxhc3Qgb25lIG9uY2Ug dGhlIGNvbnRyb2xsZXIgcmVwb3J0cyBhIHNlcXVlbmNlCj4gKwkJICogbnVtYmVyIGVycm9yLgo+ ICsJCSAqLwo+ICsJCW1lbWNweSgmeHVkYy0+c2V0dXBfcGFja2V0LmN0cmxfcmVxLCBjdHJsLCBz aXplb2YoKmN0cmwpKTsKPiArCQl4dWRjLT5zZXR1cF9wYWNrZXQuc2VxX251bSA9IHNlcV9udW07 Cj4gKwkJeHVkYy0+cXVldWVkX3NldHVwX3BhY2tldCA9IHRydWU7Cj4gKwl9IGVsc2Ugewo+ICsJ CXRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9zZXR1cF9wYWNrZXQoeHVkYywgY3RybCwgc2VxX251bSk7 Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICoKPiAr dHJiX3RvX3JlcXVlc3Qoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLCBzdHJ1Y3QgdGVncmFfeHVk Y190cmIgKnRyYikKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwo+ICsK PiArCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmZXAtPnF1ZXVlLCBsaXN0KSB7Cj4gKwkJaWYg KCFyZXEtPnRyYnNfcXVldWVkKQo+ICsJCQlicmVhazsKPiArCj4gKwkJaWYgKHRyYl9pbl9yZXF1 ZXN0KGVwLCByZXEsIHRyYikpCj4gKwkJCXJldHVybiByZXE7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJu IE5VTEw7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaGFuZGxlX3RyYW5zZmVy X2NvbXBsZXRpb24oc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCj4gKwkJCQkJCSAgc3RydWN0IHRl Z3JhX3h1ZGNfZXAgKmVwLAo+ICsJCQkJCQkgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnQp Cj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKPiArCXN0cnVjdCB0ZWdy YV94dWRjX3RyYiAqdHJiOwo+ICsJYm9vbCBzaG9ydF9wYWNrZXQ7Cj4gKwo+ICsJc2hvcnRfcGFj a2V0ID0gKHRyYl9yZWFkX2NtcGxfY29kZShldmVudCkgPT0KPiArCQkJVFJCX0NNUExfQ09ERV9T SE9SVF9QQUNLRVQpOwo+ICsKPiArCXRyYiA9IHRyYl9waHlzX3RvX3ZpcnQoZXAsIHRyYl9yZWFk X2RhdGFfcHRyKGV2ZW50KSk7Cj4gKwlyZXEgPSB0cmJfdG9fcmVxdWVzdChlcCwgdHJiKTsKPiAr CS8qCj4gKwkgKiBURHMgYXJlIGNvbXBsZXRlIG9uIHNob3J0IHBhY2tldCBvciB3aGVuIHRoZSBj b21wbGV0ZWQgVFJCIGlzIHRoZQo+ICsJICogbGFzdCBUUkIgaW4gdGhlIFREICh0aGUgQ0hBSU4g Yml0IGlzIHVuc2V0KS4KPiArCSAqLwo+ICsJaWYgKHJlcSAmJiAoc2hvcnRfcGFja2V0IHx8ICgh dHJiX3JlYWRfY2hhaW4odHJiKSAmJgo+ICsJCShyZXEtPnRyYnNfbmVlZGVkID09IHJlcS0+dHJi c19xdWV1ZWQpKSkpIHsKPiArCQlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKmxhc3QgPSByZXEtPmxh c3RfdHJiOwo+ICsJCXVuc2lnbmVkIGludCByZXNpZHVhbDsKPiArCj4gKwkJcmVzaWR1YWwgPSB0 cmJfcmVhZF90cmFuc2Zlcl9sZW4oZXZlbnQpOwo+ICsJCXJlcS0+dXNiX3JlcS5hY3R1YWwgPSBy ZXEtPnVzYl9yZXEubGVuZ3RoIC0gcmVzaWR1YWw7Cj4gKwo+ICsJCWRldl9kYmcoeHVkYy0+ZGV2 LCAiYnl0ZXMgdHJhbnNmZXJyZWQgJXUgLyAldVxuIiwKPiArCQkJcmVxLT51c2JfcmVxLmFjdHVh bCwgcmVxLT51c2JfcmVxLmxlbmd0aCk7Cj4gKwo+ICsJCXRlZ3JhX3h1ZGNfcmVxX2RvbmUoZXAs IHJlcSwgMCk7Cj4gKwo+ICsJCWlmIChlcC0+ZGVzYyAmJiB1c2JfZW5kcG9pbnRfeGZlcl9jb250 cm9sKGVwLT5kZXNjKSkKPiArCQkJdGVncmFfeHVkY19lcDBfcmVxX2RvbmUoeHVkYyk7Cj4gKwo+ ICsJCS8qCj4gKwkJICogQWR2YW5jZSB0aGUgZGVxdWV1ZSBwb2ludGVyIHBhc3QgdGhlIGVuZCBv ZiB0aGUgY3VycmVudCBURAo+ICsJCSAqIG9uIHNob3J0IHBhY2tldCBjb21wbGV0aW9uLgo+ICsJ CSAqLwo+ICsJCWlmIChzaG9ydF9wYWNrZXQpIHsKPiArCQkJZXAtPmRlcV9wdHIgPSAobGFzdCAt IGVwLT50cmFuc2Zlcl9yaW5nKSArIDE7Cj4gKwkJCWlmIChlcC0+ZGVxX3B0ciA9PSBYVURDX1RS QU5TRkVSX1JJTkdfU0laRSAtIDEpCj4gKwkJCQllcC0+ZGVxX3B0ciA9IDA7Cj4gKwkJfQo+ICsJ fSBlbHNlIGlmICghcmVxKSB7Cj4gKwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAidHJhbnNmZXIgZXZl bnQgb24gZGVxdWV1ZWQgcmVxdWVzdFxuIik7Cj4gKwl9Cj4gKwo+ICsJaWYgKGVwLT5kZXNjKQo+ ICsJCXRlZ3JhX3h1ZGNfZXBfa2lja19xdWV1ZShlcCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IHRlZ3JhX3h1ZGNfaGFuZGxlX3RyYW5zZmVyX2V2ZW50KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRj LAo+ICsJCQkJCSAgICAgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICpldmVudCkKPiArewo+ICsJdW5z aWduZWQgaW50IGVwX2luZGV4ID0gdHJiX3JlYWRfZW5kcG9pbnRfaWQoZXZlbnQpOwo+ICsJc3Ry dWN0IHRlZ3JhX3h1ZGNfZXAgKmVwID0gJnh1ZGMtPmVwW2VwX2luZGV4XTsKPiArCXN0cnVjdCB0 ZWdyYV94dWRjX3RyYiAqdHJiOwo+ICsJdTE2IGNvbXBfY29kZTsKPiArCj4gKwlpZiAoZXBfY3R4 X3JlYWRfc3RhdGUoZXAtPmNvbnRleHQpID09IEVQX1NUQVRFX0RJU0FCTEVEKSB7Cj4gKwkJZGV2 X3dhcm4oeHVkYy0+ZGV2LCAidHJhbnNmZXIgZXZlbnQgb24gZGlzYWJsZWQgZXAgJXVcbiIsCj4g KwkJCSBlcF9pbmRleCk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCS8qIFVwZGF0ZSB0cmFu c2ZlciByaW5nIGRlcXVldWUgcG9pbnRlci4gKi8KPiArCXRyYiA9IHRyYl9waHlzX3RvX3ZpcnQo ZXAsIHRyYl9yZWFkX2RhdGFfcHRyKGV2ZW50KSk7Cj4gKwllcC0+ZGVxX3B0ciA9ICh0cmIgLSBl cC0+dHJhbnNmZXJfcmluZykgKyAxOwo+ICsJaWYgKGVwLT5kZXFfcHRyID09IFhVRENfVFJBTlNG RVJfUklOR19TSVpFIC0gMSkKPiArCQllcC0+ZGVxX3B0ciA9IDA7Cj4gKwllcC0+cmluZ19mdWxs ID0gZmFsc2U7Cj4gKwo+ICsJY29tcF9jb2RlID0gdHJiX3JlYWRfY21wbF9jb2RlKGV2ZW50KTsK PiArCXN3aXRjaCAoY29tcF9jb2RlKSB7Cj4gKwljYXNlIFRSQl9DTVBMX0NPREVfU1VDQ0VTUzoK PiArCWNhc2UgVFJCX0NNUExfQ09ERV9TSE9SVF9QQUNLRVQ6Cj4gKwkJdGVncmFfeHVkY19oYW5k bGVfdHJhbnNmZXJfY29tcGxldGlvbih4dWRjLCBlcCwgZXZlbnQpOwo+ICsJCWJyZWFrOwo+ICsJ Y2FzZSBUUkJfQ01QTF9DT0RFX0hPU1RfUkVKRUNURUQ6Cj4gKwkJZGV2X2luZm8oeHVkYy0+ZGV2 LCAic3RyZWFtIHJlamVjdGVkIG9uIGVwICV1XG4iLCBlcF9pbmRleCk7Cj4gKwo+ICsJCWVwLT5z dHJlYW1fcmVqZWN0ZWQgPSB0cnVlOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBUUkJfQ01QTF9DT0RF X1BSSU1FX1BJUEVfUkVDRUlWRUQ6Cj4gKwkJZGV2X2luZm8oeHVkYy0+ZGV2LCAicHJpbWUgcGlw ZSByZWNlaXZlZCBvbiBlcCAldVxuIiwgZXBfaW5kZXgpOwo+ICsKPiArCQlpZiAoZXAtPnN0cmVh bV9yZWplY3RlZCkgewo+ICsJCQllcC0+c3RyZWFtX3JlamVjdGVkID0gZmFsc2U7Cj4gKwkJCS8q Cj4gKwkJCSAqIEFuIEVQIGlzIHN0b3BwZWQgd2hlbiBhIHN0cmVhbSBpcyByZWplY3RlZC4gIFdh aXQKPiArCQkJICogZm9yIHRoZSBFUCB0byByZXBvcnQgdGhhdCBpdCBpcyBzdG9wcGVkIGFuZCB0 aGVuCj4gKwkJCSAqIHVuLXN0b3AgaXQuCj4gKwkJCSAqLwo+ICsJCQllcF93YWl0X2Zvcl9zdG9w cGVkKHh1ZGMsIGVwX2luZGV4KTsKPiArCQl9Cj4gKwkJdGVncmFfeHVkY19lcF9yaW5nX2Rvb3Ji ZWxsKGVwKTsKPiArCQlicmVhazsKPiArCWNhc2UgVFJCX0NNUExfQ09ERV9CQUJCTEVfREVURUNU RURfRVJSOgo+ICsJCS8qCj4gKwkJICogV2FpdCBmb3IgdGhlIEVQIHRvIGJlIHN0b3BwZWQgc28g dGhlIGNvbnRyb2xsZXIgc3RvcHMKPiArCQkgKiBwcm9jZXNzaW5nIGRvb3JiZWxscy4KPiArCQkg Ki8KPiArCQllcF93YWl0X2Zvcl9zdG9wcGVkKHh1ZGMsIGVwX2luZGV4KTsKPiArCWNhc2UgVFJC X0NNUExfQ09ERV9TVFJFQU1fTlVNUF9FUlJPUjoKPiArCWNhc2UgVFJCX0NNUExfQ09ERV9DVFJM X0RJUl9FUlI6Cj4gKwljYXNlIFRSQl9DTVBMX0NPREVfSU5WQUxJRF9TVFJFQU1fVFlQRV9FUlI6 Cj4gKwljYXNlIFRSQl9DTVBMX0NPREVfUklOR19VTkRFUlJVTjoKPiArCWNhc2UgVFJCX0NNUExf Q09ERV9SSU5HX09WRVJSVU46Cj4gKwljYXNlIFRSQl9DTVBMX0NPREVfSVNPQ0hfQlVGRkVSX09W RVJSVU46Cj4gKwljYXNlIFRSQl9DTVBMX0NPREVfVVNCX1RSQU5TX0VSUjoKPiArCWNhc2UgVFJC X0NNUExfQ09ERV9UUkJfRVJSOgo+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiY29tcGxldGlvbiBl cnJvciAlI3ggb24gZXAgJXVcbiIsCj4gKwkJCWNvbXBfY29kZSwgZXBfaW5kZXgpOwo+ICsKPiAr CQllcF9oYWx0KHh1ZGMsIGVwX2luZGV4KTsKPiArCQlicmVhazsKPiArCWNhc2UgVFJCX0NNUExf Q09ERV9DVFJMX1NFUU5VTV9FUlI6Cj4gKwkJZGV2X2luZm8oeHVkYy0+ZGV2LCAic2VxdWVuY2Ug bnVtYmVyIGVycm9yXG4iKTsKPiArCj4gKwkJLyoKPiArCQkgKiBLaWxsIGFueSBxdWV1ZWQgY29u dHJvbCByZXF1ZXN0IGFuZCBza2lwIHRvIHRoZSBsYXN0Cj4gKwkJICogc2V0dXAgcGFja2V0IHdl IHJlY2VpdmVkLgo+ICsJCSAqLwo+ICsJCXRlZ3JhX3h1ZGNfZXBfbnVrZShlcCwgLUVJTlZBTCk7 Cj4gKwkJeHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKPiArCQlpZiAoIXh1ZGMt PnF1ZXVlZF9zZXR1cF9wYWNrZXQpCj4gKwkJCWJyZWFrOwo+ICsKPiArCQl0ZWdyYV94dWRjX2hh bmRsZV9lcDBfc2V0dXBfcGFja2V0KHh1ZGMsCj4gKwkJCQkJCSAgICZ4dWRjLT5zZXR1cF9wYWNr ZXQuY3RybF9yZXEsCj4gKwkJCQkJCSAgIHh1ZGMtPnNldHVwX3BhY2tldC5zZXFfbnVtKTsKPiAr CQl4dWRjLT5xdWV1ZWRfc2V0dXBfcGFja2V0ID0gZmFsc2U7Cj4gKwkJYnJlYWs7Cj4gKwljYXNl IFRSQl9DTVBMX0NPREVfU1RPUFBFRDoKPiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgInN0b3AgY29t cGxldGlvbiBjb2RlIG9uIGVwICV1XG4iLAo+ICsJCQllcF9pbmRleCk7Cj4gKwo+ICsJCS8qIERp c2Nvbm5lY3RlZC4gKi8KPiArCQl0ZWdyYV94dWRjX2VwX251a2UoZXAsIC1FQ09OTlJFRlVTRUQp Owo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgImNvbXBs ZXRpb24gZXZlbnQgJSN4IG9uIGVwICV1XG4iLAo+ICsJCQljb21wX2NvZGUsIGVwX2luZGV4KTsK PiArCQlicmVhazsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19yZXNl dChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfZXAg KmVwMCA9ICZ4dWRjLT5lcFswXTsKPiArCWRtYV9hZGRyX3QgZGVxX3B0cjsKPiArCXVuc2lnbmVk IGludCBpOwo+ICsKPiArCXh1ZGMtPnNldHVwX3N0YXRlID0gV0FJVF9GT1JfU0VUVVA7Cj4gKwl4 dWRjLT5kZXZpY2Vfc3RhdGUgPSBVU0JfU1RBVEVfREVGQVVMVDsKPiArCXVzYl9nYWRnZXRfc2V0 X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0ZSk7Cj4gKwo+ICsJZXBfdW5w YXVzZV9hbGwoeHVkYyk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVkYy0+ ZXApOyBpKyspCj4gKwkJdGVncmFfeHVkY19lcF9udWtlKCZ4dWRjLT5lcFtpXSwgLUVTSFVURE9X Tik7Cj4gKwo+ICsJLyoKPiArCSAqIFJlc2V0IHNlcXVlbmNlIG51bWJlciBhbmQgZGVxdWV1ZSBw b2ludGVyIHRvIGZsdXNoIHRoZSB0cmFuc2Zlcgo+ICsJICogcmluZy4KPiArCSAqLwo+ICsJZXAw LT5kZXFfcHRyID0gZXAwLT5lbnFfcHRyOwo+ICsJZXAwLT5yaW5nX2Z1bGwgPSBmYWxzZTsKPiAr Cj4gKwl4dWRjLT5zZXR1cF9zZXFfbnVtID0gMDsKPiArCXh1ZGMtPnF1ZXVlZF9zZXR1cF9wYWNr ZXQgPSBmYWxzZTsKPiArCj4gKwllcF9jdHhfd3JpdGVfc2VxX251bShlcDAtPmNvbnRleHQsIHh1 ZGMtPnNldHVwX3NlcV9udW0pOwo+ICsKPiArCWRlcV9wdHIgPSB0cmJfdmlydF90b19waHlzKGVw MCwgJmVwMC0+dHJhbnNmZXJfcmluZ1tlcDAtPmRlcV9wdHJdKTsKPiArCWVwX2N0eF93cml0ZV9k ZXFfcHRyKGVwMC0+Y29udGV4dCwgZGVxX3B0cik7Cj4gKwllcF9jdHhfd3JpdGVfZGNzKGVwMC0+ Y29udGV4dCwgZXAwLT5wY3MpOwo+ICsKPiArCWVwX3VuaGFsdF9hbGwoeHVkYyk7Cj4gKwllcF9y ZWxvYWQoeHVkYywgMCk7Cj4gKwllcF91bnBhdXNlKHh1ZGMsIDApOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfY29ubmVjdChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykK PiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwMCA9ICZ4dWRjLT5lcFswXTsKPiArCXUx NiBtYXhwYWNrZXQ7Cj4gKwl1MzIgdmFsOwo+ICsKPiArCXZhbCA9ICh4dWRjX3JlYWRsKHh1ZGMs IFBPUlRTQykgPj4gUE9SVFNDX1BTX1NISUZUKSAmIFBPUlRTQ19QU19NQVNLOwo+ICsJc3dpdGNo ICh2YWwpIHsKPiArCWNhc2UgUE9SVFNDX1BTX0xTOgo+ICsJCXh1ZGMtPmdhZGdldC5zcGVlZCA9 IFVTQl9TUEVFRF9MT1c7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIFBPUlRTQ19QU19GUzoKPiArCQl4 dWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKPiArCQlicmVhazsKPiArCWNhc2Ug UE9SVFNDX1BTX0hTOgo+ICsJCXh1ZGMtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9ISUdIOwo+ ICsJCWJyZWFrOwo+ICsJY2FzZSBQT1JUU0NfUFNfU1M6Cj4gKwkJeHVkYy0+Z2FkZ2V0LnNwZWVk ID0gVVNCX1NQRUVEX1NVUEVSOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQl4dWRjLT5n YWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKPiArCQlicmVhazsKPiArCX0KPiArCj4g Kwl4dWRjLT5kZXZpY2Vfc3RhdGUgPSBVU0JfU1RBVEVfREVGQVVMVDsKPiArCXVzYl9nYWRnZXRf c2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0ZSk7Cj4gKwo+ICsJeHVk Yy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKPiArCj4gKwlpZiAoeHVkYy0+Z2FkZ2V0 LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKPiArCQltYXhwYWNrZXQgPSA1MTI7Cj4gKwllbHNl Cj4gKwkJbWF4cGFja2V0ID0gNjQ7Cj4gKwllcF9jdHhfd3JpdGVfbWF4X3BhY2tldF9zaXplKGVw MC0+Y29udGV4dCwgbWF4cGFja2V0KTsKPiArCXRlZ3JhX3h1ZGNfZXAwX2Rlc2Mud01heFBhY2tl dFNpemUgPSBjcHVfdG9fbGUxNihtYXhwYWNrZXQpOwo+ICsJdXNiX2VwX3NldF9tYXhwYWNrZXRf bGltaXQoJmVwMC0+dXNiX2VwLCBtYXhwYWNrZXQpOwo+ICsKPiArCWlmICghdTFfZW5hYmxlKSB7 Cj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOwo+ICsJCXZhbCAmPSB+KFBPUlRQ TV9VMVRJTUVPVVRfTUFTSyA8PCBQT1JUUE1fVTFUSU1FT1VUX1NISUZUKTsKPiArCQl4dWRjX3dy aXRlbCh4dWRjLCB2YWwsIFBPUlRQTSk7Cj4gKwl9Cj4gKwlpZiAoIXUyX2VuYWJsZSkgewo+ICsJ CXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFBNKTsKPiArCQl2YWwgJj0gfihQT1JUUE1fVTJU SU1FT1VUX01BU0sgPDwgUE9SVFBNX1UyVElNRU9VVF9TSElGVCk7Cj4gKwkJeHVkY193cml0ZWwo eHVkYywgdmFsLCBQT1JUUE0pOwo+ICsJfQo+ICsJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA8PSBV U0JfU1BFRURfSElHSCkgewo+ICsJCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFBNKTsKPiAr CQl2YWwgJj0gfihQT1JUUE1fTDFTX01BU0sgPDwgUE9SVFBNX0wxU19TSElGVCk7Cj4gKwkJaWYg KGxwbV9lbmFibGUpCj4gKwkJCXZhbCB8PSBQT1JUUE1fTDFTX0FDQ0VQVCA8PCBQT1JUUE1fTDFT X1NISUZUOwo+ICsJCWVsc2UKPiArCQkJdmFsIHw9IFBPUlRQTV9MMVNfTllFVCA8PCBQT1JUUE1f TDFTX1NISUZUOwo+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKPiArCX0KPiAr Cj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFNUKTsKPiArCWlmICh2YWwgJiBTVF9SQykKPiAr CQl4dWRjX3dyaXRlbCh4dWRjLCBTVF9SQywgU1QpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0 ZWdyYV94dWRjX3BvcnRfZGlzY29ubmVjdChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ ICsJdGVncmFfeHVkY19yZXNldCh4dWRjKTsKPiArCWlmICh4dWRjLT5kcml2ZXIgJiYgeHVkYy0+ ZHJpdmVyLT5kaXNjb25uZWN0KSB7Cj4gKwkJc3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOwo+ICsJ CXh1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdCgmeHVkYy0+Z2FkZ2V0KTsKPiArCQlzcGluX2xvY2so Jnh1ZGMtPmxvY2spOwo+ICsJfQo+ICsKPiArCXh1ZGMtPmRldmljZV9zdGF0ZSA9IFVTQl9TVEFU RV9OT1RBVFRBQ0hFRDsKPiArCXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1 ZGMtPmRldmljZV9zdGF0ZSk7Cj4gKwo+ICsJY29tcGxldGUoJnh1ZGMtPmRpc2Nvbm5lY3RfY29t cGxldGUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfcmVzZXQoc3Ry dWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4gK3sKPiArCXRlZ3JhX3h1ZGNfcmVzZXQoeHVkYyk7Cj4g KwlpZiAoeHVkYy0+ZHJpdmVyKSB7Cj4gKwkJc3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOwo+ICsJ CXVzYl9nYWRnZXRfdWRjX3Jlc2V0KCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRyaXZlcik7Cj4gKwkJ c3Bpbl9sb2NrKCZ4dWRjLT5sb2NrKTsKPiArCX0KPiArCXRlZ3JhX3h1ZGNfcG9ydF9jb25uZWN0 KHh1ZGMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfc3VzcGVuZChz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJZGV2X2RiZyh4dWRjLT5kZXYsICJwb3J0 IHN1c3BlbmRcbiIpOwo+ICsJeHVkYy0+cmVzdW1lX3N0YXRlID0geHVkYy0+ZGV2aWNlX3N0YXRl Owo+ICsJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX1NVU1BFTkRFRDsKPiArCXVzYl9n YWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0ZSk7Cj4gKwlp ZiAoeHVkYy0+ZHJpdmVyLT5zdXNwZW5kKSB7Cj4gKwkJc3Bpbl91bmxvY2soJnh1ZGMtPmxvY2sp Owo+ICsJCXh1ZGMtPmRyaXZlci0+c3VzcGVuZCgmeHVkYy0+Z2FkZ2V0KTsKPiArCQlzcGluX2xv Y2soJnh1ZGMtPmxvY2spOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRj X3BvcnRfcmVzdW1lKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+ICt7Cj4gKwlkZXZfZGJnKHh1 ZGMtPmRldiwgInBvcnQgcmVzdW1lXG4iKTsKPiArCXRlZ3JhX3h1ZGNfcmVzdW1lX2RldmljZV9z dGF0ZSh4dWRjKTsKPiArCWlmICh4dWRjLT5kcml2ZXItPnJlc3VtZSkgewo+ICsJCXNwaW5fdW5s b2NrKCZ4dWRjLT5sb2NrKTsKPiArCQl4dWRjLT5kcml2ZXItPnJlc3VtZSgmeHVkYy0+Z2FkZ2V0 KTsKPiArCQlzcGluX2xvY2soJnh1ZGMtPmxvY2spOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMg aW5saW5lIHZvaWQgY2xlYXJfcG9ydF9jaGFuZ2Uoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHUz MiBmbGFnKQo+ICt7Cj4gKwl1MzIgdmFsOwo+ICsKPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywg UE9SVFNDKTsKPiArCXZhbCAmPSB+UE9SVFNDX0NIQU5HRV9NQVNLOwo+ICsJdmFsIHw9IGZsYWc7 Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRTQyk7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIF9fdGVncmFfeHVkY19oYW5kbGVfcG9ydF9zdGF0dXMoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMpCj4gK3sKPiArCXUzMiBwb3J0c2MsIHBvcnRoYWx0Owo+ICsKPiArCXBvcnRoYWx0ID0geHVk Y19yZWFkbCh4dWRjLCBQT1JUSEFMVCk7Cj4gKwlpZiAoKHBvcnRoYWx0ICYgUE9SVEhBTFRfU1RD SEdfUkVRKSAmJgo+ICsJICAgIChwb3J0aGFsdCAmIFBPUlRIQUxUX0hBTFRfTFRTU00pKSB7Cj4g KwkJZGV2X2RiZyh4dWRjLT5kZXYsICJTVENIR19SRVEsIFBPUlRIQUxUID0gJSN4XG4iLCBwb3J0 aGFsdCk7Cj4gKwkJcG9ydGhhbHQgJj0gflBPUlRIQUxUX0hBTFRfTFRTU007Cj4gKwkJeHVkY193 cml0ZWwoeHVkYywgcG9ydGhhbHQsIFBPUlRIQUxUKTsKPiArCX0KPiArCj4gKwlwb3J0c2MgPSB4 dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7Cj4gKwlpZiAoKHBvcnRzYyAmIFBPUlRTQ19QUkMpICYm IChwb3J0c2MgJiBQT1JUU0NfUFIpKSB7Cj4gKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJQUkMsIFBS LCBQT1JUU0MgPSAlI3hcbiIsIHBvcnRzYyk7Cj4gKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywg UE9SVFNDX1BSQyB8IFBPUlRTQ19QRUQpOwo+ICsjZGVmaW5lIFRPR0dMRV9WQlVTX1dBSVRfTVMg MTAwCj4gKwkJaWYgKHh1ZGMtPnNvYy0+cG9ydF9yZXNldF9xdWlyaykgewo+ICsJCQlzY2hlZHVs ZV9kZWxheWVkX3dvcmsoJnh1ZGMtPnBvcnRfcmVzZXRfd2FyX3dvcmssCj4gKwkJCQltc2Vjc190 b19qaWZmaWVzKFRPR0dMRV9WQlVTX1dBSVRfTVMpKTsKPiArCQkJeHVkYy0+d2FpdF9mb3Jfc2Vj X3ByYyA9IDE7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWlmICgocG9ydHNjICYgUE9SVFNDX1BSQykg JiYgIShwb3J0c2MgJiBQT1JUU0NfUFIpKSB7Cj4gKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJQUkMs IE5vdCBQUiwgUE9SVFNDID0gJSN4XG4iLCBwb3J0c2MpOwo+ICsJCWNsZWFyX3BvcnRfY2hhbmdl KHh1ZGMsIFBPUlRTQ19QUkMgfCBQT1JUU0NfUEVEKTsKPiArCQl0ZWdyYV94dWRjX3BvcnRfcmVz ZXQoeHVkYyk7Cj4gKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmeHVkYy0+cG9ydF9yZXNldF93YXJf d29yayk7Cj4gKwkJeHVkYy0+d2FpdF9mb3Jfc2VjX3ByYyA9IDA7Cj4gKwl9Cj4gKwo+ICsJcG9y dHNjID0geHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpOwo+ICsJaWYgKHBvcnRzYyAmIFBPUlRTQ19X UkMpIHsKPiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgIldSQywgUE9SVFNDID0gJSN4XG4iLCBwb3J0 c2MpOwo+ICsJCWNsZWFyX3BvcnRfY2hhbmdlKHh1ZGMsIFBPUlRTQ19XUkMgfCBQT1JUU0NfUEVE KTsKPiArCQlpZiAoISh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgJiBQT1JUU0NfV1BSKSkKPiAr CQkJdGVncmFfeHVkY19wb3J0X3Jlc2V0KHh1ZGMpOwo+ICsJfQo+ICsKPiArCXBvcnRzYyA9IHh1 ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKPiArCWlmIChwb3J0c2MgJiBQT1JUU0NfQ1NDKSB7Cj4g KwkJZGV2X2RiZyh4dWRjLT5kZXYsICJDU0MsIFBPUlRTQyA9ICUjeFxuIiwgcG9ydHNjKTsKPiAr CQljbGVhcl9wb3J0X2NoYW5nZSh4dWRjLCBQT1JUU0NfQ1NDKTsKPiArCQlpZiAocG9ydHNjICYg UE9SVFNDX0NDUykKPiArCQkJdGVncmFfeHVkY19wb3J0X2Nvbm5lY3QoeHVkYyk7Cj4gKwkJZWxz ZQo+ICsJCQl0ZWdyYV94dWRjX3BvcnRfZGlzY29ubmVjdCh4dWRjKTsKPiArCQlpZiAoeHVkYy0+ d2FpdF9jc2MpIHsKPiArCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmeHVkYy0+cGxjX3Jlc2V0X3dv cmspOwo+ICsJCQl4dWRjLT53YWl0X2NzYyA9IGZhbHNlOwo+ICsJCX0KPiArCX0KPiArCj4gKwlw b3J0c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7Cj4gKwlpZiAocG9ydHNjICYgUE9SVFND X1BMQykgewo+ICsJCXUzMiBwbHMgPSAocG9ydHNjID4+IFBPUlRTQ19QTFNfU0hJRlQpICYgUE9S VFNDX1BMU19NQVNLOwo+ICsKPiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlBMQywgUE9SVFNDID0g JSN4XG4iLCBwb3J0c2MpOwo+ICsJCWNsZWFyX3BvcnRfY2hhbmdlKHh1ZGMsIFBPUlRTQ19QTEMp Owo+ICsJCXN3aXRjaCAocGxzKSB7Cj4gKwkJY2FzZSBQT1JUU0NfUExTX1UzOgo+ICsJCQl0ZWdy YV94dWRjX3BvcnRfc3VzcGVuZCh4dWRjKTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSBQT1JUU0Nf UExTX1UwOgo+ICsJCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkIDwgVVNCX1NQRUVEX1NVUEVSKQo+ ICsJCQkJdGVncmFfeHVkY19wb3J0X3Jlc3VtZSh4dWRjKTsKPiArCQkJYnJlYWs7Cj4gKwkJY2Fz ZSBQT1JUU0NfUExTX1JFU1VNRToKPiArCQkJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0Jf U1BFRURfU1VQRVIpCj4gKwkJCQl0ZWdyYV94dWRjX3BvcnRfcmVzdW1lKHh1ZGMpOwo+ICsJCQli cmVhazsKPiArCQljYXNlIFBPUlRTQ19QTFNfSU5BQ1RJVkU6Cj4gKwkJCXNjaGVkdWxlX2RlbGF5 ZWRfd29yaygmeHVkYy0+cGxjX3Jlc2V0X3dvcmssCj4gKwkJCQkJbXNlY3NfdG9famlmZmllcyhU T0dHTEVfVkJVU19XQUlUX01TKSk7Cj4gKwkJCXh1ZGMtPndhaXRfY3NjID0gdHJ1ZTsKPiArCQkJ YnJlYWs7Cj4gKwkJZGVmYXVsdDoKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWlm IChwb3J0c2MgJiBQT1JUU0NfQ0VDKSB7Cj4gKwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAiQ0VDLCBQ T1JUU0MgPSAlI3hcbiIsIHBvcnRzYyk7Cj4gKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9S VFNDX0NFQyk7Cj4gKwl9Cj4gKwo+ICsJZGV2X2RiZyh4dWRjLT5kZXYsICJQT1JUU0MgPSAlI3hc biIsIHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfaGFuZGxlX3BvcnRfc3RhdHVzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+ICt7 Cj4gKwl3aGlsZSAoKHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSAmIFBPUlRTQ19DSEFOR0VfTUFT SykgfHwKPiArCSAgICAgICAoeHVkY19yZWFkbCh4dWRjLCBQT1JUSEFMVCkgJiBQT1JUSEFMVF9T VENIR19SRVEpKQo+ICsJCV9fdGVncmFfeHVkY19oYW5kbGVfcG9ydF9zdGF0dXMoeHVkYyk7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaGFuZGxlX2V2ZW50KHN0cnVjdCB0ZWdy YV94dWRjICp4dWRjLAo+ICsJCQkJICAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnQpCj4g K3sKPiArCXUzMiB0eXBlID0gdHJiX3JlYWRfdHlwZShldmVudCk7Cj4gKwo+ICsJZHVtcF90cmIo eHVkYywgIkVWRU5UIiwgZXZlbnQpOwo+ICsKPiArCXN3aXRjaCAodHlwZSkgewo+ICsJY2FzZSBU UkJfVFlQRV9QT1JUX1NUQVRVU19DSEFOR0VfRVZFTlQ6Cj4gKwkJdGVncmFfeHVkY19oYW5kbGVf cG9ydF9zdGF0dXMoeHVkYyk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIFRSQl9UWVBFX1RSQU5TRkVS X0VWRU5UOgo+ICsJCXRlZ3JhX3h1ZGNfaGFuZGxlX3RyYW5zZmVyX2V2ZW50KHh1ZGMsIGV2ZW50 KTsKPiArCQlicmVhazsKPiArCWNhc2UgVFJCX1RZUEVfU0VUVVBfUEFDS0VUX0VWRU5UOgo+ICsJ CXRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9ldmVudCh4dWRjLCBldmVudCk7Cj4gKwkJYnJlYWs7Cj4g KwlkZWZhdWx0Ogo+ICsJCWRldl9pbmZvKHh1ZGMtPmRldiwgIlVucmVjb2duaXplZCBUUkIgdHlw ZSA9ICUjeFxuIiwgdHlwZSk7Cj4gKwkJYnJlYWs7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIHRlZ3JhX3h1ZGNfcHJvY2Vzc19ldmVudF9yaW5nKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRj KQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKmV2ZW50Owo+ICsJZG1hX2FkZHJfdCBl cmRwOwo+ICsKPiArCXdoaWxlICh0cnVlKSB7Cj4gKwkJZXZlbnQgPSB4dWRjLT5ldmVudF9yaW5n W3h1ZGMtPmV2ZW50X3JpbmdfaW5kZXhdICsKPiArCQkJeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRy Owo+ICsKPiArCQlpZiAodHJiX3JlYWRfY3ljbGUoZXZlbnQpICE9IHh1ZGMtPmNjcykKPiArCQkJ YnJlYWs7Cj4gKwo+ICsJCXRlZ3JhX3h1ZGNfaGFuZGxlX2V2ZW50KHh1ZGMsIGV2ZW50KTsKPiAr Cj4gKwkJeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRyKys7Cj4gKwkJaWYgKHh1ZGMtPmV2ZW50X3Jp bmdfZGVxX3B0ciA9PSBYVURDX0VWRU5UX1JJTkdfU0laRSkgewo+ICsJCQl4dWRjLT5ldmVudF9y aW5nX2RlcV9wdHIgPSAwOwo+ICsJCQl4dWRjLT5ldmVudF9yaW5nX2luZGV4Kys7Cj4gKwkJfQo+ ICsJCWlmICh4dWRjLT5ldmVudF9yaW5nX2luZGV4ID09IFhVRENfTlJfRVZFTlRfUklOR1MpIHsK PiArCQkJeHVkYy0+ZXZlbnRfcmluZ19pbmRleCA9IDA7Cj4gKwkJCXh1ZGMtPmNjcyA9ICF4dWRj LT5jY3M7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWVyZHAgPSB4dWRjLT5ldmVudF9yaW5nX3BoeXNb eHVkYy0+ZXZlbnRfcmluZ19pbmRleF0gKwo+ICsJCXh1ZGMtPmV2ZW50X3JpbmdfZGVxX3B0ciAq IHNpemVvZigqZXZlbnQpOwo+ICsJeHVkY193cml0ZWwoeHVkYywgdXBwZXJfMzJfYml0cyhlcmRw KSwgRVJEUEhJKTsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIGxvd2VyXzMyX2JpdHMoZXJkcCkgfCBF UkRQTE9fRUhCLCBFUkRQTE8pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgdGVncmFf eHVkY19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMg Knh1ZGMgPSBkYXRhOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCXUzMiB2YWw7Cj4gKwo+ ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTVCk7Cj4gKwlpZiAoISh2YWwgJiBTVF9JUCkpCj4g KwkJcmV0dXJuIElSUV9OT05FOwo+ICsJeHVkY193cml0ZWwoeHVkYywgU1RfSVAsIFNUKTsKPiAr Cj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJdGVncmFfeHVk Y19wcm9jZXNzX2V2ZW50X3JpbmcoeHVkYyk7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfYWxsb2NfZXAoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMs IHVuc2lnbmVkIGludCBpbmRleCkKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwID0g Jnh1ZGMtPmVwW2luZGV4XTsKPiArCj4gKwllcC0+eHVkYyA9IHh1ZGM7Cj4gKwllcC0+aW5kZXgg PSBpbmRleDsKPiArCWVwLT5jb250ZXh0ID0gJnh1ZGMtPmVwX2NvbnRleHRbaW5kZXhdOwo+ICsJ SU5JVF9MSVNUX0hFQUQoJmVwLT5xdWV1ZSk7Cj4gKwo+ICsJLyoKPiArCSAqIEVQMSB3b3VsZCBi ZSB0aGUgaW5wdXQgZW5kcG9pbnQgY29ycmVzcG9uZGluZyB0byBFUDAsIGJ1dCBzaW5jZQo+ICsJ ICogRVAwIGlzIGJpLWRpcmVjdGlvbmFsLCBFUDEgaXMgdW51c2VkLgo+ICsJICovCj4gKwlpZiAo aW5kZXggPT0gMSkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwllcC0+dHJhbnNmZXJfcmluZyA9IGRt YV9wb29sX2FsbG9jKHh1ZGMtPnRyYW5zZmVyX3JpbmdfcG9vbCwKPiArCQkJCQkgICBHRlBfS0VS TkVMLAo+ICsJCQkJCSAgICZlcC0+dHJhbnNmZXJfcmluZ19waHlzKTsKPiArCWlmICghZXAtPnRy YW5zZmVyX3JpbmcpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJaWYgKGluZGV4KSB7Cj4g KwkJc25wcmludGYoZXAtPm5hbWUsIHNpemVvZihlcC0+bmFtZSksICJlcCV1JXMiLCBpbmRleCAv IDIsCj4gKwkJCSAoaW5kZXggJSAyID09IDApID8gIm91dCIgOiAiaW4iKTsKPiArCQllcC0+dXNi X2VwLm5hbWUgPSBlcC0+bmFtZTsKPiArCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmZXAt PnVzYl9lcCwgMTAyNCk7Cj4gKwkJZXAtPnVzYl9lcC5tYXhfc3RyZWFtcyA9IDE2Owo+ICsJCWVw LT51c2JfZXAub3BzID0gJnRlZ3JhX3h1ZGNfZXBfb3BzOwo+ICsJCWVwLT51c2JfZXAuY2Fwcy50 eXBlX2J1bGsgPSB0cnVlOwo+ICsJCWVwLT51c2JfZXAuY2Fwcy50eXBlX2ludCA9IHRydWU7Cj4g KwkJaWYgKGluZGV4ICYgMSkKPiArCQkJZXAtPnVzYl9lcC5jYXBzLmRpcl9pbiA9IHRydWU7Cj4g KwkJZWxzZQo+ICsJCQllcC0+dXNiX2VwLmNhcHMuZGlyX291dCA9IHRydWU7Cj4gKwkJbGlzdF9h ZGRfdGFpbCgmZXAtPnVzYl9lcC5lcF9saXN0LCAmeHVkYy0+Z2FkZ2V0LmVwX2xpc3QpOwo+ICsJ fSBlbHNlIHsKPiArCQlzdHJjcHkoZXAtPm5hbWUsICJlcDAiKTsKPiArCQllcC0+dXNiX2VwLm5h bWUgPSBlcC0+bmFtZTsKPiArCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmZXAtPnVzYl9l cCwgNjQpOwo+ICsJCWVwLT51c2JfZXAub3BzID0gJnRlZ3JhX3h1ZGNfZXAwX29wczsKPiArCQll cC0+dXNiX2VwLmNhcHMudHlwZV9jb250cm9sID0gdHJ1ZTsKPiArCQllcC0+dXNiX2VwLmNhcHMu ZGlyX2luID0gdHJ1ZTsKPiArCQllcC0+dXNiX2VwLmNhcHMuZGlyX291dCA9IHRydWU7Cj4gKwl9 Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZnJl ZV9lcChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50IGluZGV4KQo+ICt7Cj4g KwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAgPSAmeHVkYy0+ZXBbaW5kZXhdOwo+ICsKPiArCS8q Cj4gKwkgKiBFUDEgd291bGQgYmUgdGhlIGlucHV0IGVuZHBvaW50IGNvcnJlc3BvbmRpbmcgdG8g RVAwLCBidXQgc2luY2UKPiArCSAqIEVQMCBpcyBiaS1kaXJlY3Rpb25hbCwgRVAxIGlzIHVudXNl ZC4KPiArCSAqLwo+ICsJaWYgKGluZGV4ID09IDEpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWRtYV9w b29sX2ZyZWUoeHVkYy0+dHJhbnNmZXJfcmluZ19wb29sLCBlcC0+dHJhbnNmZXJfcmluZywKPiAr CQkgICAgICBlcC0+dHJhbnNmZXJfcmluZ19waHlzKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0 ZWdyYV94dWRjX2FsbG9jX2VwcyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJc3Ry dWN0IHVzYl9yZXF1ZXN0ICpyZXE7Cj4gKwl1bnNpZ25lZCBpbnQgaTsKPiArCWludCBlcnI7Cj4g Kwo+ICsJeHVkYy0+ZXBfY29udGV4dCA9Cj4gKwkJZG1hX3phbGxvY19jb2hlcmVudCh4dWRjLT5k ZXYsIFhVRENfTlJfRVBTICoKPiArCQkJCSAgICBzaXplb2YoKnh1ZGMtPmVwX2NvbnRleHQpLAo+ ICsJCQkJICAgICZ4dWRjLT5lcF9jb250ZXh0X3BoeXMsIEdGUF9LRVJORUwpOwo+ICsJaWYgKCF4 dWRjLT5lcF9jb250ZXh0KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCXh1ZGMtPnRyYW5z ZmVyX3JpbmdfcG9vbCA9Cj4gKwkJZG1hbV9wb29sX2NyZWF0ZShkZXZfbmFtZSh4dWRjLT5kZXYp LCB4dWRjLT5kZXYsCj4gKwkJCQkgWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgKgo+ICsJCQkJIHNp emVvZihzdHJ1Y3QgdGVncmFfeHVkY190cmIpLAo+ICsJCQkJIHNpemVvZihzdHJ1Y3QgdGVncmFf eHVkY190cmIpLCAwKTsKPiArCWlmICgheHVkYy0+dHJhbnNmZXJfcmluZ19wb29sKSB7Cj4gKwkJ ZXJyID0gLUVOT01FTTsKPiArCQlnb3RvIGZyZWVfZXBfY29udGV4dDsKPiArCX0KPiArCj4gKwlJ TklUX0xJU1RfSEVBRCgmeHVkYy0+Z2FkZ2V0LmVwX2xpc3QpOwo+ICsJZm9yIChpID0gMDsgaSA8 IEFSUkFZX1NJWkUoeHVkYy0+ZXApOyBpKyspIHsKPiArCQllcnIgPSB0ZWdyYV94dWRjX2FsbG9j X2VwKHh1ZGMsIGkpOwo+ICsJCWlmIChlcnIgPCAwKQo+ICsJCQlnb3RvIGZyZWVfZXBzOwo+ICsJ fQo+ICsKPiArCXJlcSA9IHRlZ3JhX3h1ZGNfZXBfYWxsb2NfcmVxdWVzdCgmeHVkYy0+ZXBbMF0u dXNiX2VwLCBHRlBfS0VSTkVMKTsKPiArCWlmICghcmVxKSB7Cj4gKwkJZXJyID0gLUVOT01FTTsK PiArCQlnb3RvIGZyZWVfZXBzOwo+ICsJfQo+ICsJeHVkYy0+ZXAwX3JlcSA9IHRvX3h1ZGNfcmVx KHJlcSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtmcmVlX2VwczoKPiArCWZvciAoOyBpID4g MDsgaS0tKQo+ICsJCXRlZ3JhX3h1ZGNfZnJlZV9lcCh4dWRjLCBpIC0gMSk7Cj4gK2ZyZWVfZXBf Y29udGV4dDoKPiArCWRtYV9mcmVlX2NvaGVyZW50KHh1ZGMtPmRldiwgWFVEQ19OUl9FUFMgKiBz aXplb2YoKnh1ZGMtPmVwX2NvbnRleHQpLAo+ICsJCQkgIHh1ZGMtPmVwX2NvbnRleHQsIHh1ZGMt PmVwX2NvbnRleHRfcGh5cyk7Cj4gKwlyZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCB0ZWdyYV94dWRjX2luaXRfZXBzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+ICt7Cj4gKwl4 dWRjX3dyaXRlbCh4dWRjLCBsb3dlcl8zMl9iaXRzKHh1ZGMtPmVwX2NvbnRleHRfcGh5cyksIEVD UExPKTsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHVwcGVyXzMyX2JpdHMoeHVkYy0+ZXBfY29udGV4 dF9waHlzKSwgRUNQSEkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2ZyZWVf ZXBzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgaTsKPiAr Cj4gKwl0ZWdyYV94dWRjX2VwX2ZyZWVfcmVxdWVzdCgmeHVkYy0+ZXBbMF0udXNiX2VwLAo+ICsJ CQkJICAgJnh1ZGMtPmVwMF9yZXEtPnVzYl9yZXEpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsrKQo+ICsJCXRlZ3JhX3h1ZGNfZnJlZV9lcCh4dWRjLCBp KTsKPiArCj4gKwlkbWFfZnJlZV9jb2hlcmVudCh4dWRjLT5kZXYsIFhVRENfTlJfRVBTICogc2l6 ZW9mKCp4dWRjLT5lcF9jb250ZXh0KSwKPiArCQkJICB4dWRjLT5lcF9jb250ZXh0LCB4dWRjLT5l cF9jb250ZXh0X3BoeXMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfYWxsb2Nf ZXZlbnRfcmluZyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJdW5zaWduZWQgaW50 IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVkYy0+ZXZlbnRfcmluZyk7 IGkrKykgewo+ICsJCXh1ZGMtPmV2ZW50X3JpbmdbaV0gPQo+ICsJCQlkbWFfYWxsb2NfY29oZXJl bnQoeHVkYy0+ZGV2LCBYVURDX0VWRU5UX1JJTkdfU0laRSAqCj4gKwkJCQkJICAgc2l6ZW9mKCp4 dWRjLT5ldmVudF9yaW5nW2ldKSwKPiArCQkJCQkgICAmeHVkYy0+ZXZlbnRfcmluZ19waHlzW2ld LAo+ICsJCQkJCSAgIEdGUF9LRVJORUwpOwo+ICsJCWlmICgheHVkYy0+ZXZlbnRfcmluZ1tpXSkK PiArCQkJZ290byBmcmVlX2RtYTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2ZyZWVf ZG1hOgo+ICsJZm9yICg7IGkgPiAwOyBpLS0pIHsKPiArCQlkbWFfZnJlZV9jb2hlcmVudCh4dWRj LT5kZXYsIFhVRENfRVZFTlRfUklOR19TSVpFICoKPiArCQkJCSAgc2l6ZW9mKCp4dWRjLT5ldmVu dF9yaW5nW2kgLSAxXSksCj4gKwkJCQkgIHh1ZGMtPmV2ZW50X3JpbmdbaSAtIDFdLAo+ICsJCQkJ ICB4dWRjLT5ldmVudF9yaW5nX3BoeXNbaSAtIDFdKTsKPiArCX0KPiArCXJldHVybiAtRU5PTUVN Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2luaXRfZXZlbnRfcmluZyhzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJdW5zaWduZWQgaW50IGk7Cj4gKwl1MzIgdmFs Owo+ICsKPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1BBUkFNKTsKPiArCXZhbCAmPSB+KFNQ QVJBTV9FUlNUTUFYX01BU0sgPDwgU1BBUkFNX0VSU1RNQVhfU0hJRlQpOwo+ICsJdmFsIHw9IFhV RENfTlJfRVZFTlRfUklOR1MgPDwgU1BBUkFNX0VSU1RNQVhfU0hJRlQ7Cj4gKwl4dWRjX3dyaXRl bCh4dWRjLCB2YWwsIFNQQVJBTSk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUo eHVkYy0+ZXZlbnRfcmluZyk7IGkrKykgewo+ICsJCW1lbXNldCh4dWRjLT5ldmVudF9yaW5nW2ld LCAwLCBYVURDX0VWRU5UX1JJTkdfU0laRSAqCj4gKwkJICAgICAgIHNpemVvZigqeHVkYy0+ZXZl bnRfcmluZ1tpXSkpOwo+ICsKPiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVSU1RTWik7Cj4g KwkJdmFsICY9IH4oRVJTVFNaX0VSU1RYU1pfTUFTSyA8PCBFUlNUU1pfRVJTVFhTWl9TSElGVChp KSk7Cj4gKwkJdmFsIHw9IFhVRENfRVZFTlRfUklOR19TSVpFIDw8IEVSU1RTWl9FUlNUWFNaX1NI SUZUKGkpOwo+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVJTVFNaKTsKPiArCj4gKwkJeHVk Y193cml0ZWwoeHVkYywgbG93ZXJfMzJfYml0cyh4dWRjLT5ldmVudF9yaW5nX3BoeXNbaV0pLAo+ ICsJCQkgICAgRVJTVFhCQUxPKGkpKTsKPiArCQl4dWRjX3dyaXRlbCh4dWRjLCB1cHBlcl8zMl9i aXRzKHh1ZGMtPmV2ZW50X3JpbmdfcGh5c1tpXSksCj4gKwkJCSAgICBFUlNUWEJBSEkoaSkpOwo+ ICsJfQo+ICsKPiArCXZhbCA9IGxvd2VyXzMyX2JpdHMoeHVkYy0+ZXZlbnRfcmluZ19waHlzWzBd KTsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVJEUExPKTsKPiArCXZhbCB8PSBFUkVQTE9f RUNTOwo+ICsJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUkVQTE8pOwo+ICsKPiArCXZhbCA9IHVw cGVyXzMyX2JpdHMoeHVkYy0+ZXZlbnRfcmluZ19waHlzWzBdKTsKPiArCXh1ZGNfd3JpdGVsKHh1 ZGMsIHZhbCwgRVJEUEhJKTsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVJFUEhJKTsKPiAr Cj4gKwl4dWRjLT5jY3MgPSB0cnVlOwo+ICsJeHVkYy0+ZXZlbnRfcmluZ19pbmRleCA9IDA7Cj4g Kwl4dWRjLT5ldmVudF9yaW5nX2RlcV9wdHIgPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0 ZWdyYV94dWRjX2ZyZWVfZXZlbnRfcmluZyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ ICsJdW5zaWduZWQgaW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVk Yy0+ZXZlbnRfcmluZyk7IGkrKykgewo+ICsJCWRtYV9mcmVlX2NvaGVyZW50KHh1ZGMtPmRldiwg WFVEQ19FVkVOVF9SSU5HX1NJWkUgKgo+ICsJCQkJICBzaXplb2YoKnh1ZGMtPmV2ZW50X3Jpbmdb aV0pLAo+ICsJCQkJICB4dWRjLT5ldmVudF9yaW5nW2ldLAo+ICsJCQkJICB4dWRjLT5ldmVudF9y aW5nX3BoeXNbaV0pOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2Zw Y2lfaXBmc19pbml0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+ICt7Cj4gKwl1MzIgdmFsOwo+ ICsKPiArCWlmIChYVURDX0lTX1QyMTAoeHVkYykpIHsKPiArCQl2YWwgPSBpcGZzX3JlYWRsKHh1 ZGMsIFhVU0JfREVWX0NPTkZJR1VSQVRJT05fMCk7Cj4gKwkJdmFsIHw9IFhVU0JfREVWX0NPTkZJ R1VSQVRJT05fMF9FTl9GUENJOwo+ICsJCWlwZnNfd3JpdGVsKHh1ZGMsIHZhbCwgWFVTQl9ERVZf Q09ORklHVVJBVElPTl8wKTsKPiArCQl1ZGVsYXkoMTApOwo+ICsJfQo+ICsKPiArCS8qIEVuYWJs ZSBidXMgbWFzdGVyICovCj4gKwl2YWwgPSBYVVNCX0RFVl9DRkdfMV9JT19TUEFDRV9FTiB8IFhV U0JfREVWX0NGR18xX01FTU9SWV9TUEFDRV9FTiB8Cj4gKwkJWFVTQl9ERVZfQ0ZHXzFfQlVTX01B U1RFUl9FTjsKPiArCWZwY2lfd3JpdGVsKHh1ZGMsIHZhbCwgWFVTQl9ERVZfQ0ZHXzEpOwo+ICsK PiArCS8qIFByb2dyYW0gQkFSMCBzcGFjZSAqLwo+ICsJdmFsID0gZnBjaV9yZWFkbCh4dWRjLCBY VVNCX0RFVl9DRkdfNCk7Cj4gKwl2YWwgJj0gfihYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfTUFT SyA8PAo+ICsJCSBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfU0hJRlQpOwo+ICsJdmFsIHw9IHh1 ZGMtPnBoeXNfYmFzZSAmIChYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfTUFTSyA8PAo+ICsJCQkJ ICBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfU0hJRlQpOwo+ICsJZnBjaV93cml0ZWwoeHVkYywg dmFsLCBYVVNCX0RFVl9DRkdfNCk7Cj4gKwlmcGNpX3dyaXRlbCh4dWRjLCB1cHBlcl8zMl9iaXRz KHh1ZGMtPnBoeXNfYmFzZSksIFhVU0JfREVWX0NGR181KTsKPiArCXVzbGVlcF9yYW5nZSgxMDAs IDIwMCk7Cj4gKwo+ICsJaWYgKFhVRENfSVNfVDIxMCh4dWRjKSkgewo+ICsJCS8qIEVuYWJsZSBp bnRlcnJ1cHQgYXNzZXJ0aW9uICovCj4gKwkJdmFsID0gaXBmc19yZWFkbCh4dWRjLCBYVVNCX0RF Vl9JTlRSX01BU0tfMCk7Cj4gKwkJdmFsIHw9IFhVU0JfREVWX0lOVFJfTUFTS18wX0lQX0lOVF9N QVNLOwo+ICsJCWlwZnNfd3JpdGVsKHh1ZGMsIHZhbCwgWFVTQl9ERVZfSU5UUl9NQVNLXzApOwo+ ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2RldmljZV9wYXJhbXNfaW5p dChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJdTMyIHZhbCwgaW1vZDsKPiArCj4g KwlpZiAoWFVEQ19JU19UMjEwKHh1ZGMpKSB7Cj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBC TENHKTsKPiArCQl2YWwgfD0gQkxDR19BTEw7Cj4gKwkJdmFsICY9IH4oQkxDR19ERlBDSSB8IEJM Q0dfVUZQQ0kgfCBCTENHX0ZFIHwKPiArCQkJCUJMQ0dfQ09SRVBMTF9QV1JETik7Cj4gKwkJdmFs IHw9IEJMQ0dfSU9QTExfMF9QV1JETjsKPiArCQl2YWwgfD0gQkxDR19JT1BMTF8xX1BXUkROOwo+ ICsJCXZhbCB8PSBCTENHX0lPUExMXzJfUFdSRE47Cj4gKwkJeHVkY193cml0ZWwoeHVkYywgdmFs LCBCTENHKTsKPiArCX0KPiArCj4gKwkvKiBTZXQgYSByZWFzb25hYmxlIFUzIGV4aXQgdGltZXIg dmFsdWUuICovCj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFNTUFhfQ09SRV9QQURDVEw0KTsK PiArCXZhbCAmPSB+KFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9USU1FT1VUX1UzX01BU0sg PDwKPiArCQkgU1NQWF9DT1JFX1BBRENUTDRfUlhEQVRfVkxEX1RJTUVPVVRfVTNfU0hJRlQpOwo+ ICsJdmFsIHw9IDB4NWRjMCA8PCBTU1BYX0NPUkVfUEFEQ1RMNF9SWERBVF9WTERfVElNRU9VVF9V M19TSElGVDsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1NQWF9DT1JFX1BBRENUTDQpOwo+ ICsKPiArCS8qIERlZmF1bHQgcGluZyBMRlBTIHRCdXJzdCBpcyB0b28gbGFyZ2UuICovCj4gKwl2 YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFNTUFhfQ09SRV9DTlQwKTsKPiArCXZhbCAmPSB+KFNTUFhf Q09SRV9DTlQwX1BJTkdfVEJVUlNUX01BU0sgPDwKPiArCQkgU1NQWF9DT1JFX0NOVDBfUElOR19U QlVSU1RfU0hJRlQpOwo+ICsJdmFsIHw9IDB4YSA8PCBTU1BYX0NPUkVfQ05UMF9QSU5HX1RCVVJT VF9TSElGVDsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1NQWF9DT1JFX0NOVDApOwo+ICsK PiArCS8qIERlZmF1bHQgdFBvcnRDb25maWd1cmF0aW9uIHRpbWVvdXQgaXMgdG9vIHNtYWxsLiAq Lwo+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTU1BYX0NPUkVfQ05UMzApOwo+ICsJdmFsICY9 IH4oU1NQWF9DT1JFX0NOVDMwX0xNUElUUF9USU1FUl9NQVNLIDw8Cj4gKwkJIFNTUFhfQ09SRV9D TlQzMF9MTVBJVFBfVElNRVJfU0hJRlQpOwo+ICsJdmFsIHw9IDB4OTc4IDw8IFNTUFhfQ09SRV9D TlQzMF9MTVBJVFBfVElNRVJfU0hJRlQ7Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFNTUFhf Q09SRV9DTlQzMCk7Cj4gKwo+ICsJaWYgKGxwbV9lbmFibGUpIHsKPiArCQkvKiBTZXQgTDEgcmVz dW1lIGR1cmF0aW9uIHRvIDk1IHVzLiAqLwo+ICsJCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgSFNG U1BJX0NPVU5UMTMpOwo+ICsJCXZhbCAmPSB+KEhTRlNQSV9DT1VOVDEzX1UyX1JFU1VNRV9LX0RV UkFUSU9OX01BU0sgPDwKPiArCQkJCUhTRlNQSV9DT1VOVDEzX1UyX1JFU1VNRV9LX0RVUkFUSU9O X1NISUZUKTsKPiArCQl2YWwgfD0gMHgyYzg4IDw8IEhTRlNQSV9DT1VOVDEzX1UyX1JFU1VNRV9L X0RVUkFUSU9OX1NISUZUOwo+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgSFNGU1BJX0NPVU5U MTMpOwo+ICsJfQo+ICsKPiArCS8qCj4gKwkgKiBDb21wbGlhY25lIHN1aXRlIGFwcGVhcnMgdG8g YmUgdmlvbGF0aW5nIHBvbGxpbmcgTEZQUyB0QnVyc3QgbWF4Cj4gKwkgKiBvZiAxLjR1cy4gIFNl bmQgMS40NXVzIGluc3RlYWQuCj4gKwkgKi8KPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1NQ WF9DT1JFX0NOVDMyKTsKPiArCXZhbCAmPSB+KFNTUFhfQ09SRV9DTlQzMl9QT0xMX1RCVVJTVF9N QVhfTUFTSyA8PAo+ICsJCSBTU1BYX0NPUkVfQ05UMzJfUE9MTF9UQlVSU1RfTUFYX1NISUZUKTsK PiArCXZhbCB8PSAweGIwIDw8IFNTUFhfQ09SRV9DTlQzMl9QT0xMX1RCVVJTVF9NQVhfU0hJRlQ7 Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFNTUFhfQ09SRV9DTlQzMik7Cj4gKwo+ICsJLyog RGlyZWN0IEhTL0ZTIHBvcnQgaW5zdGFuY2UgdG8gUnhEZXRlY3QuICovCj4gKwl2YWwgPSB4dWRj X3JlYWRsKHh1ZGMsIENGR19ERVZfRkUpOwo+ICsJdmFsICY9IH4oQ0ZHX0RFVl9GRV9QT1JUUkVH U0VMX01BU0sgPDwgQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX1NISUZUKTsKPiArCXZhbCB8PSBDRkdf REVWX0ZFX1BPUlRSRUdTRUxfSFNGU19QSSA8PCBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU0hJRlQ7 Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENGR19ERVZfRkUpOwo+ICsKPiArCXZhbCA9IHh1 ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKPiArCXZhbCAmPSB+KFBPUlRTQ19DSEFOR0VfTUFTSyB8 IChQT1JUU0NfUExTX01BU0sgPDwgUE9SVFNDX1BMU19TSElGVCkpOwo+ICsJdmFsIHw9IFBPUlRT Q19MV1MgfCAoUE9SVFNDX1BMU19SWERFVEVDVCA8PCBQT1JUU0NfUExTX1NISUZUKTsKPiArCXh1 ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFNDKTsKPiArCj4gKwkvKiBEaXJlY3QgU1MgcG9ydCBp bnN0YW5jZSB0byBSeERldGVjdC4gKi8KPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ0ZHX0RF Vl9GRSk7Cj4gKwl2YWwgJj0gfihDRkdfREVWX0ZFX1BPUlRSRUdTRUxfTUFTSyA8PCBDRkdfREVW X0ZFX1BPUlRSRUdTRUxfU0hJRlQpOwo+ICsJdmFsIHw9IENGR19ERVZfRkVfUE9SVFJFR1NFTF9T U19QSSA8PCBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU0hJRlQ7Cj4gKwl4dWRjX3dyaXRlbCh4dWRj LCB2YWwsIENGR19ERVZfRkUpOwo+ICsKPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFND KTsKPiArCXZhbCAmPSB+KFBPUlRTQ19DSEFOR0VfTUFTSyB8IChQT1JUU0NfUExTX01BU0sgPDwg UE9SVFNDX1BMU19TSElGVCkpOwo+ICsJdmFsIHw9IFBPUlRTQ19MV1MgfCAoUE9SVFNDX1BMU19S WERFVEVDVCA8PCBQT1JUU0NfUExTX1NISUZUKTsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwg UE9SVFNDKTsKPiArCj4gKwkvKiBSZXN0b3JlIHBvcnQgaW5zdGFuY2UuICovCj4gKwl2YWwgPSB4 dWRjX3JlYWRsKHh1ZGMsIENGR19ERVZfRkUpOwo+ICsJdmFsICY9IH4oQ0ZHX0RFVl9GRV9QT1JU UkVHU0VMX01BU0sgPDwgQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX1NISUZUKTsKPiArCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgQ0ZHX0RFVl9GRSk7Cj4gKwo+ICsJLyoKPiArCSAqIEVuYWJsZSBJTkZJ TklURV9TU19SRVRSWSB0byBwcmV2ZW50IGRldmljZSBmcm9tIGVudGVyaW5nCj4gKwkgKiBEaXNh YmxlZC5FcnJvciB3aGVuIGF0dGFjaGVkIHRvIGJ1Z2d5IFN1cGVyU3BlZWQgaHVicy4KPiArCSAq Lwo+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDRkdfREVWX0ZFKTsKPiArCXZhbCB8PSBDRkdf REVWX0ZFX0lORklOSVRFX1NTX1JFVFJZOwo+ICsJeHVkY193cml0ZWwoeHVkYywgdmFsLCBDRkdf REVWX0ZFKTsKPiArCj4gKwkvKiBTZXQgaW50ZXJydXB0IG1vZGVyYXRpb24uICovCj4gKwlpbW9k ID0gWFVEQ19JTlRFUlJVUFRfTU9ERVJBVElPTl9VUyAqIDQ7Cj4gKwl2YWwgPSB4dWRjX3JlYWRs KHh1ZGMsIFJUX0lNT0QpOwo+ICsJdmFsICY9IH4oKFJUX0lNT0RfSU1PRElfTUFTSyA8PCBSVF9J TU9EX0lNT0RJX1NISUZUKSB8Cj4gKwkJIChSVF9JTU9EX0lNT0RDX01BU0sgPDwgUlRfSU1PRF9J TU9EQ19TSElGVCkpOwo+ICsJdmFsIHw9IChpbW9kIDw8IFJUX0lNT0RfSU1PRElfU0hJRlQpIHwg KGltb2QgPDwgUlRfSU1PRF9JTU9EQ19TSElGVCk7Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWws IFJUX0lNT0QpOwo+ICsKPiArCS8qIGluY3JlYXNlIFNTUEkgdHJhbnNhY3Rpb24gdGltZW91dCBm cm9tIDMydXMgdG8gNTEydXMgKi8KPiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ0ZHX0RFVl9T U1BJX1hGRVIpOwo+ICsJdmFsICY9IH4oQ0ZHX0RFVl9TU1BJX1hGRVJfQUNLVElNRU9VVF9NQVNL IDw8Cj4gKwkJQ0ZHX0RFVl9TU1BJX1hGRVJfQUNLVElNRU9VVF9TSElGVCk7Cj4gKwl2YWwgfD0g KDB4ZjAwMCAmIENGR19ERVZfU1NQSV9YRkVSX0FDS1RJTUVPVVRfTUFTSykgPDwKPiArCQlDRkdf REVWX1NTUElfWEZFUl9BQ0tUSU1FT1VUX1NISUZUOwo+ICsJeHVkY193cml0ZWwoeHVkYywgdmFs LCBDRkdfREVWX1NTUElfWEZFUik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19w aHlfaW5pdChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJaW50IGVycjsKPiArCj4g KwllcnIgPSBwaHlfaW5pdCh4dWRjLT51dG1pX3BoeSk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQly ZXR1cm4gZXJyOwo+ICsJZXJyID0gcGh5X2luaXQoeHVkYy0+dXNiM19waHkpOwo+ICsJaWYgKGVy ciA8IDApCj4gKwkJZ290byBleGl0X3V0bWlfcGh5Owo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtleGl0 X3V0bWlfcGh5Ogo+ICsJcGh5X2V4aXQoeHVkYy0+dXRtaV9waHkpOwo+ICsJcmV0dXJuIGVycjsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19waHlfZXhpdChzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYykKPiArewo+ICsJcGh5X2V4aXQoeHVkYy0+dXNiM19waHkpOwo+ICsJcGh5X2V4 aXQoeHVkYy0+dXRtaV9waHkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfY2xr X2luaXQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRl diA9IHh1ZGMtPmRldjsKPiArCWludCByZXQgPSAwOwo+ICsJdW5zaWduZWQgaW50IGk7Cj4gKwo+ ICsJeHVkYy0+bnVtX2Nsa3MgPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhkZXYtPm9mX25v ZGUsICJjbG9ja3MiLAo+ICsJCQkJCQkgICAgIiNjbG9jay1jZWxscyIpOwo+ICsJaWYgKHh1ZGMt Pm51bV9jbGtzIDw9IDApCj4gKwkJcmV0dXJuIC1FSU5WQUw7CgpUaGUgZGV2aWNlIHRyZWUgYmlu ZGluZ3Mgc2hvdWxkIGNvbnRhaW5zIGFuIGV4cGxpY2l0IGxpc3Qgb2YgY2xvY2tzCnJlcXVpcmVk IGFuZCB0aGlzIGZ1bmN0aW9uIHNob3VsZCB1c2UgdGhlbS4gU2VlIGFsc28gdGhlIGNsa19idWxr XyooKQpBUEkgdG8gYXZvaWQgb3Blbi1jb2RpbmcgbW9zdCBvZiB0aGUgYmVsb3cuCgo+ICsKPiAr CXh1ZGMtPmNsa3MgPSBkZXZtX2tjYWxsb2MoZGV2LCB4dWRjLT5udW1fY2xrcywgc2l6ZW9mKCp4 dWRjLT5jbGtzKSwKPiArCQkJCSAgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXh1ZGMtPmNsa3MpCj4g KwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHh1ZGMtPm51bV9jbGtz OyBpKyspIHsKPiArCQl4dWRjLT5jbGtzW2ldID0gb2ZfY2xrX2dldChkZXYtPm9mX25vZGUsIGkp Owo+ICsJCWlmIChJU19FUlIoeHVkYy0+Y2xrc1tpXSkpIHsKPiArCQkJcmV0ID0gUFRSX0VSUih4 dWRjLT5jbGtzW2ldKTsKPiArCQkJZ290byBlcnJvcjsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gKwo+ICtlcnJvcjoKPiArCXdoaWxlIChpLS0pCj4gKwkJY2xrX3B1dCh4dWRjLT5j bGtzW2ldKTsKPiArCXh1ZGMtPm51bV9jbGtzID0gMDsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2Nsa19kZWluaXQoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMpCj4gK3sKPiArCXVuc2lnbmVkIGludCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkg PCB4dWRjLT5udW1fY2xrczsgaSsrKQo+ICsJCWNsa19wdXQoeHVkYy0+Y2xrc1tpXSk7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19jbGtfZW5hYmxlKHN0cnVjdCB0ZWdyYV94dWRj ICp4dWRjKQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgaTsKPiArCWludCByZXQgPSAwOwo+ICsKPiAr CWlmICh4dWRjLT5jbGtfZW5hYmxlZCkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlmb3IgKGkgPSAw OyBpIDwgeHVkYy0+bnVtX2Nsa3M7IGkrKykgewo+ICsJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJs ZSh4dWRjLT5jbGtzW2ldKTsKPiArCQlpZiAocmV0KQo+ICsJCQlnb3RvIGVycm9yOwo+ICsJfQo+ ICsKPiArCXh1ZGMtPmNsa19lbmFibGVkID0gdHJ1ZTsKPiArCj4gKwlyZXR1cm4gMDsKPiArCj4g K2Vycm9yOgo+ICsJd2hpbGUgKGktLSkKPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUoeHVkYy0+ Y2xrc1tpXSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdGVn cmFfeHVkY19jbGtfZGlzYWJsZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJdW5z aWduZWQgaW50IGk7Cj4gKwo+ICsJaWYgKCF4dWRjLT5jbGtfZW5hYmxlZCkKPiArCQlyZXR1cm47 Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHh1ZGMtPm51bV9jbGtzOyBpKyspCj4gKwkJY2xrX2Rp c2FibGVfdW5wcmVwYXJlKHh1ZGMtPmNsa3NbaV0pOwo+ICsKPiArCXh1ZGMtPmNsa19lbmFibGVk ID0gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVncmEyMTBf eHVkY19zdXBwbHlfbmFtZXNbXSA9IHsKPiArCSJodmRkX3VzYiIsCj4gKwkiYXZkZGlvX3VzYiIs Cj4gKwkiYXZkZF9wbGxfdXRtaXAiLAoKXyAtPiAtIGluIHRoZSBhYm92ZS4KCj4gK307Cj4gKwo+ ICtzdGF0aWMgc3RydWN0IHRlZ3JhX3h1ZGNfc29jX2RhdGEgdGVncmEyMTBfeHVkY19zb2NfZGF0 YSA9IHsKPiArCS5kZXZpY2VfaWQgPSBYVURDX0RFVklDRV9JRF9UMjEwLAo+ICsJLnN1cHBseV9u YW1lcyA9IHRlZ3JhMjEwX3h1ZGNfc3VwcGx5X25hbWVzLAo+ICsJLm51bV9zdXBwbGllcyA9IEFS UkFZX1NJWkUodGVncmEyMTBfeHVkY19zdXBwbHlfbmFtZXMpLAo+ICsJLnUxX2VuYWJsZSA9IGZh bHNlLAo+ICsJLnUyX2VuYWJsZSA9IHRydWUsCj4gKwkubHBtX2VuYWJsZSA9IGZhbHNlLAo+ICsJ LmludmFsaWRfc2VxX251bSA9IHRydWUsCj4gKwkucGxzX3F1aXJrID0gdHJ1ZSwKPiArCS5wb3J0 X3Jlc2V0X3F1aXJrID0gdHJ1ZSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2Zf ZGV2aWNlX2lkIHRlZ3JhX3h1ZGNfb2ZfbWF0Y2hbXSA9IHsKPiArCXsKPiArCQkuY29tcGF0aWJs ZSA9ICJudmlkaWEsdGVncmEyMTAteHVkYyIsCj4gKwkJLmRhdGEgPSAmdGVncmEyMTBfeHVkY19z b2NfZGF0YQo+ICsJfSwKPiArCXsgfQo+ICt9Owo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0 ZWdyYV94dWRjX29mX21hdGNoKTsKPiArCj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcG93ZXJk b21haW5fcmVtb3ZlKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+ICt7Cj4gKwlpZiAoeHVkYy0+ Z2VucGRfZGxfc3MpCj4gKwkJZGV2aWNlX2xpbmtfZGVsKHh1ZGMtPmdlbnBkX2RsX3NzKTsKPiAr CWlmICh4dWRjLT5nZW5wZF9kbF9kZXZpY2UpCj4gKwkJZGV2aWNlX2xpbmtfZGVsKHh1ZGMtPmdl bnBkX2RsX2RldmljZSk7Cj4gKwlpZiAoeHVkYy0+Z2VucGRfZGV2X3NzKQo+ICsJCWRldl9wbV9k b21haW5fZGV0YWNoKHh1ZGMtPmdlbnBkX2Rldl9zcywgdHJ1ZSk7Cj4gKwlpZiAoeHVkYy0+Z2Vu cGRfZGV2X2RldmljZSkKPiArCQlkZXZfcG1fZG9tYWluX2RldGFjaCh4dWRjLT5nZW5wZF9kZXZf ZGV2aWNlLCB0cnVlKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX3Bvd2VyZG9t YWluX2luaXQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2Ug KmRldiA9IHh1ZGMtPmRldjsKPiArCWludCBlcnI7Cj4gKwo+ICsJeHVkYy0+Z2VucGRfZGV2X2Rl dmljZSA9IGRldl9wbV9kb21haW5fYXR0YWNoX2J5X25hbWUoZGV2LAo+ICsJCQkJCQkJCSJ4dXNi X2RldmljZSIpOwoKSSB0aG91Z2h0IHRoaXMgd2FzIGRvY3VtZW50ZWQgYXMgInh1c2JfZGV2IiBp biB0aGUgYmluZGluZ3M/Cgo+ICsJaWYgKElTX0VSUih4dWRjLT5nZW5wZF9kZXZfZGV2aWNlKSkg ewo+ICsJCWVyciA9IFBUUl9FUlIoeHVkYy0+Z2VucGRfZGV2X2RldmljZSk7Cj4gKwkJZGV2X2Vy cihkZXYsICJmYWlsZWQgdG8gZ2V0IGRldmljZSBwbS1kb21haW46ICVkXG4iLCBlcnIpOwo+ICsJ CXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJeHVkYy0+Z2VucGRfZGV2X3NzID0gZGV2X3BtX2Rv bWFpbl9hdHRhY2hfYnlfbmFtZShkZXYsICJ4dXNiX3NzIik7Cj4gKwlpZiAoSVNfRVJSKHh1ZGMt PmdlbnBkX2Rldl9zcykpIHsKPiArCQllcnIgPSBQVFJfRVJSKHh1ZGMtPmdlbnBkX2Rldl9zcyk7 Cj4gKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHN1cGVyc3BlZWQgcG0tZG9tYWluOiAl ZFxuIiwgZXJyKTsKPiArCQlyZXR1cm4gZXJyOwo+ICsJfQo+ICsKPiArCXh1ZGMtPmdlbnBkX2Rs X2RldmljZSA9IGRldmljZV9saW5rX2FkZChkZXYsIHh1ZGMtPmdlbnBkX2Rldl9kZXZpY2UsCj4g KwkJCQkJICAgICAgIERMX0ZMQUdfUE1fUlVOVElNRSB8Cj4gKwkJCQkJICAgICAgIERMX0ZMQUdf U1RBVEVMRVNTKTsKPiArCWlmICgheHVkYy0+Z2VucGRfZGxfZGV2aWNlKSB7Cj4gKwkJZGV2X2Vy cihkZXYsICJhZGRpbmcgdXNiIGRldmljZSBkZXZpY2UgbGluayBmYWlsZWQhXG4iKTsKPiArCQly ZXR1cm4gLUVOT0RFVjsKPiArCX0KPiArCj4gKwl4dWRjLT5nZW5wZF9kbF9zcyA9IGRldmljZV9s aW5rX2FkZChkZXYsIHh1ZGMtPmdlbnBkX2Rldl9zcywKPiArCQkJCQkgICAgIERMX0ZMQUdfUE1f UlVOVElNRSB8Cj4gKwkJCQkJICAgICBETF9GTEFHX1NUQVRFTEVTUyk7Cj4gKwlpZiAoIXh1ZGMt PmdlbnBkX2RsX3NzKSB7Cj4gKwkJZGV2X2VycihkZXYsICJhZGRpbmcgc3VwZXJzcGVlZCBkZXZp Y2UgbGluayBmYWlsZWQhXG4iKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCX0KPiArCj4gKwly ZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg Km1hdGNoOwo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7Cj4gKwlzdHJ1Y3QgcmVzb3VyY2Ug KnJlczsKPiArCXVuc2lnbmVkIGludCBpOwo+ICsJaW50IGVycjsKPiArCj4gKwl4dWRjID0gZGV2 bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqeHVkYyksIEdGUF9BVE9NSUMpOwo+ICsJaWYg KCF4dWRjKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJeHVkYy0+ZGV2ID0gJnBkZXYtPmRldjsK PiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHh1ZGMpOwo+ICsKPiArCW1hdGNoID0gb2Zf bWF0Y2hfZGV2aWNlKHRlZ3JhX3h1ZGNfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwo+ICsJaWYgKCFt YXRjaCkKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCXh1ZGMtPnNvYyA9IG1hdGNoLT5kYXRhOwoK b2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCk/IElmIHlvdSBkbyB0aGF0IHlvIGNhbiBhbHNvIG1v dmUgdGhlCnRlZ3JhX3h1ZGNfb2ZfbWF0Y2ggdGFibGUgc29tZXdoZXJlIGJlbG93IGFuZCBkb24n dCBuZWVkIHRvICJwcmVkZWNsYXJlIgppdC4KCj4gKwo+ICsJLyogc2V0IG1vZHVsZSBwYXJhbWV0 ZXIgZGVmYXVsdCB2YWx1ZXMgZnJvbSBzb2MgZGF0YSAqLwo+ICsJdTFfZW5hYmxlID0geHVkYy0+ c29jLT51MV9lbmFibGU7Cj4gKwl1Ml9lbmFibGUgPSB4dWRjLT5zb2MtPnUyX2VuYWJsZTsKPiAr CWxwbV9lbmFibGUgPSB4dWRjLT5zb2MtPmxwbV9lbmFibGU7Cj4gKwo+ICsJcmVzID0gcGxhdGZv cm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPiArCWlmICghcmVzKSB7 Cj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZSAwXG4i KTsKPiArCQlyZXR1cm4gLUVOWElPOwo+ICsJfQoKTm8gbmVlZCBmb3IgdGhpcyBleHBsaWNpdCBl cnJvciBjaGVjaywgZGV2bV9pb3JlbWFwX3Jlc291cmNlKCkgZG9lcyB0aGF0CmFscmVhZHkuCgo+ ICsJeHVkYy0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+ ICsJaWYgKElTX0VSUih4dWRjLT5iYXNlKSkKPiArCQlyZXR1cm4gUFRSX0VSUih4dWRjLT5iYXNl KTsKPiArCXh1ZGMtPnBoeXNfYmFzZSA9IHJlcy0+c3RhcnQ7Cj4gKwo+ICsJcmVzID0gcGxhdGZv cm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKPiArCWlmICghcmVzKSB7 Cj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZSAxXG4i KTsKPiArCQlyZXR1cm4gLUVOWElPOwo+ICsJfQoKU2FtZSBoZXJlLgoKPiArCXh1ZGMtPmZwY2kg PSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKPiArCWlmIChJU19FUlIo eHVkYy0+ZnBjaSkpCj4gKwkJcmV0dXJuIFBUUl9FUlIoeHVkYy0+ZnBjaSk7Cj4gKwo+ICsJaWYg KFhVRENfSVNfVDIxMCh4dWRjKSkgewo+ICsJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShw ZGV2LCBJT1JFU09VUkNFX01FTSwgMik7Cj4gKwkJaWYgKCFyZXMpIHsKPiArCQkJZGV2X2Vycih4 dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZSAyXG4iKTsKPiArCQkJcmV0dXJu IC1FTlhJTzsKPiArCQl9CgpBbmQgaGVyZS4KCj4gKwkJeHVkYy0+aXBmcyA9IGRldm1faW9yZW1h cF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+ICsJCWlmIChJU19FUlIoeHVkYy0+aXBmcykp Cj4gKwkJCXJldHVybiBQVFJfRVJSKHh1ZGMtPmlwZnMpOwo+ICsJfQo+ICsKPiArCXh1ZGMtPmly cSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Cj4gKwlpZiAoeHVkYy0+aXJxIDwgMCkgewo+ ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2UgMDogJWRc biIsCj4gKwkJCQl4dWRjLT5pcnEpOwoKaXJxIC0+IElSUSwgYW5kIEkgd291bGQgcHJvYmFibHkg bGVhdmUgb3V0ICJyZXNvdXJjZSAwIiwgYmVjYXVzZSB0aGVyZSdzCm9ubHkgb25lIElSUSBoZXJl LgoKPiArCQlyZXR1cm4geHVkYy0+aXJxOwo+ICsJfQo+ICsJZXJyID0gZGV2bV9yZXF1ZXN0X2ly cSgmcGRldi0+ZGV2LCB4dWRjLT5pcnEsIHRlZ3JhX3h1ZGNfaXJxLCAwLAo+ICsJCQkgICAgICAg ZGV2X25hbWUoJnBkZXYtPmRldiksIHh1ZGMpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlkZXZf ZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0byBjbGFpbSBpcnEgJWRcbiIsIGVycik7CgpJIGZpbmQg dGhlc2Uga2luZHMgb2YgZXJyb3IgbWVzc2FnZXMgY29uZnVzaW5nLiBUbyBtZSB0aGlzIHJlYWRz IGFzOgoKCSJmYWlsZWQgdG8gY2xhaW0gSVJRICNkXG4iLCBlcnIKCndoZXJlYXMgaW4gcmVhbGl0 eSB0aGlzIG1lYW5zOgoKCSJmYWlsZWQgdG8gY2xhaW0gc29tZSBJUlEgd2l0aCBlcnJvciAlZFxu IiwgZXJyCgpTbyBJJ2QgcmV3cml0ZSB0aGlzIGVycm9yIG1lc3NhZ2UgYXM6CgoJImZhaWxlZCB0 byBjbGFpbSBJUlEjJXU6ICVkXG4iLCB4dWRjLT5pcnEsIGVycgoKdGhhdCdzIGNvbnNpc3RlbnQg d2l0aCB5b3VyIG90aGVyIGVycm9yIG1lc3NhZ2VzIGFib3ZlLgoKPiArCQlyZXR1cm4gZXJyOwo+ ICsJfQo+ICsKPiArCWVyciA9IHRlZ3JhX3h1ZGNfY2xrX2luaXQoeHVkYyk7Cj4gKwlpZiAoZXJy IDwgMCkgewo+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgY2xvY2tzICVk XG4iLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJeHVkYy0+c3VwcGxpZXMg PSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsCj4gKwkJ CQkgICAgICBzaXplb2YoKnh1ZGMtPnN1cHBsaWVzKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXh1 ZGMtPnN1cHBsaWVzKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJZm9yIChpID0gMDsgaSA8IHh1 ZGMtPnNvYy0+bnVtX3N1cHBsaWVzOyBpKyspCj4gKwkJeHVkYy0+c3VwcGxpZXNbaV0uc3VwcGx5 ID0geHVkYy0+c29jLT5zdXBwbHlfbmFtZXNbaV07Cj4gKwllcnIgPSBkZXZtX3JlZ3VsYXRvcl9i dWxrX2dldCgmcGRldi0+ZGV2LCB4dWRjLT5zb2MtPm51bV9zdXBwbGllcywKPiArCQkJCSAgICAg IHh1ZGMtPnN1cHBsaWVzKTsKPiArCWlmIChlcnIpIHsKPiArCQlkZXZfZXJyKHh1ZGMtPmRldiwg ImZhaWxlZCB0byByZXF1ZXN0IHJlZ3VsYXRvcnMgJWRcbiIsIGVycik7Cj4gKwkJcmV0dXJuIGVy cjsKPiArCX0KPiArCj4gKwl4dWRjLT5wYWRjdGwgPSB0ZWdyYV94dXNiX3BhZGN0bF9nZXQoJnBk ZXYtPmRldik7Cj4gKwlpZiAoSVNfRVJSKHh1ZGMtPnBhZGN0bCkpCj4gKwkJcmV0dXJuIFBUUl9F UlIoeHVkYy0+cGFkY3RsKTsKCkl0IHNlZW1zIGxpa2Ugd2Ugb25seSBuZWVkIHRoaXMgZm9yIHRo ZSBWQlVTIG92ZXJyaWRlIGZ1bmN0aW9uYWxpdHkuIElmCndlIGNhbiBnZXQgcmlkIG9mIHRoYXQg YnkgaW5jb3Jwb3JhdGluZyBpdCBpbnRvIHBoeSBBUEkgZnVuY3Rpb25zLCB3ZQpjb3VsZCByZW1v dmUgdGhlIG5lZWQgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIGl0IGhlcmUuCgo+ICsKPiArCWVyciA9 IHJlZ3VsYXRvcl9idWxrX2VuYWJsZSh4dWRjLT5zb2MtPm51bV9zdXBwbGllcywgeHVkYy0+c3Vw cGxpZXMpOwo+ICsJaWYgKGVycikgewo+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRv IGVuYWJsZSByZWd1bGF0b3JzICVkXG4iLCBlcnIpOwo+ICsJCWdvdG8gcHV0X3BhZGN0bDsKPiAr CX0KPiArCj4gKwl4dWRjLT51c2IzX3BoeSA9IGRldm1fcGh5X29wdGlvbmFsX2dldCgmcGRldi0+ ZGV2LCAidXNiMyIpOwo+ICsJaWYgKElTX0VSUih4dWRjLT51c2IzX3BoeSkpIHsKPiArCQllcnIg PSBQVFJfRVJSKHh1ZGMtPnVzYjNfcGh5KTsKPiArCQlpZiAoZXJyID09IC1FUFJPQkVfREVGRVIp Cj4gKwkJCWRldl9pbmZvKHh1ZGMtPmRldiwgInVzYjMgcGh5IGlzIG5vdCBhdmFpbGFibGUgeWV0 XG4iKTsKCkRvbid0IHByaW50IGFuIGVycm9yIG9uIEVQUk9CRV9ERUZFUiwgeW91J2xsIGp1c3Qg bWFrZSB0aGUgYm9vdCBsb2cgdmVyeQpub2lzeS4KCj4gKwkJZWxzZQo+ICsJCQlkZXZfZXJyKHh1 ZGMtPmRldiwgImZhaWxlZCB0byBnZXQgdXNiMyBwaHkgJWRcbiIsIGVycik7CgpTYW1lIGNvbW1l bnQgcmVnYXJkaW5nIGVycm9yIG1lc3NhZ2VzIGFzIGZvciBwbGF0Zm9ybV9nZXRfaXJxKCkgZXJy b3IKaGFuZGxpbmcuCgo+ICsJCWdvdG8gZGlzYWJsZV9yZWd1bGF0b3I7Cj4gKwl9Cj4gKwl4dWRj LT51dG1pX3BoeSA9IGRldm1fcGh5X29wdGlvbmFsX2dldCgmcGRldi0+ZGV2LCAidXNiMiIpOwo+ ICsJaWYgKElTX0VSUih4dWRjLT51dG1pX3BoeSkpIHsKPiArCQllcnIgPSBQVFJfRVJSKHh1ZGMt PnV0bWlfcGh5KTsKPiArCQlpZiAoZXJyID09IC1FUFJPQkVfREVGRVIpCj4gKwkJCWRldl9pbmZv KHh1ZGMtPmRldiwgInVzYjIgcGh5IGlzIG5vdCBhdmFpbGFibGUgeWV0XG4iKTsKPiArCQllbHNl Cj4gKwkJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIGdldCB1c2IyIHBoeSAlZFxuIiwg ZXJyKTsKClNhbWUgaGVyZS4KCj4gKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcjsKPiArCX0KPiAr Cj4gKwl4dWRjLT5kYXRhX3JvbGVfZXh0Y29uID0gZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUo JnBkZXYtPmRldiwgMCk7Cj4gKwlpZiAoSVNfRVJSKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pKSB7 Cj4gKwkJZXJyID0gUFRSX0VSUih4dWRjLT5kYXRhX3JvbGVfZXh0Y29uKTsKPiArCQlpZiAoZXJy ICE9IC1FUFJPQkVfREVGRVIpCj4gKwkJCWRldl9lcnIoeHVkYy0+ZGV2LAo+ICsJCQkJImV4dGNv bl9nZXRfZWRldl9ieV9waGFuZGxlIGZhaWxlZCAlZFxuIiwKPiArCQkJCWVycik7Cj4gKwkJZGV2 X2Vycih4dWRjLT5kZXYsICJleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZSBmYWlsZWQgJWRcbiIs Cj4gKwkJCQllcnIpOwoKU28gZm9yIGV2ZXJ5dGhpbmcgb3RoZXIgdGhhbiBFUFJPQkVfREVGRVIg eW91J2xsIHByaW50IHRoZSBlcnJvciB0d2ljZT8KCj4gKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRv cjsKPiArCX0KPiArCj4gKwo+ICsJZXJyID0gdGVncmFfeHVkY19wb3dlcmRvbWFpbl9pbml0KHh1 ZGMpOwo+ICsJaWYgKGVycikKPiArCQlnb3RvIHB1dF9wb3dlcmRvbWFpbnM7Cj4gKwo+ICsJZXJy ID0gdGVncmFfeHVkY19waHlfaW5pdCh4dWRjKTsKPiArCWlmIChlcnIpIHsKPiArCQlkZXZfZXJy KHh1ZGMtPmRldiwgInBoeSBpbml0IGZhaWxlZCAlZFxuIiwgZXJyKTsKPiArCQlnb3RvIHB1dF9w b3dlcmRvbWFpbnM7Cj4gKwl9CgpQZXJoYXBzIGl0J2QgYmUgYSBnb29kIGlkZWEgdG8gbW92ZSB0 aGUgZXJyb3IgbWVzc2FnZSBpbnRvCnRlZ3JhX3h1ZGNfcGh5X2luaXQoKSBzbyB0aGF0IHlvdSBj YW4gcmVwb3J0IGV4YWN0bHkgd2hpY2ggUEhZIGZhaWxlZCB0bwppbml0aWFsaXplPwoKPiArCj4g KwllcnIgPSB0ZWdyYV94dWRjX2FsbG9jX2V2ZW50X3JpbmcoeHVkYyk7Cj4gKwlpZiAoZXJyKQo+ ICsJCWdvdG8gZGlzYWJsZV9waHk7Cj4gKwo+ICsJZXJyID0gdGVncmFfeHVkY19hbGxvY19lcHMo eHVkYyk7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gZnJlZV9ldmVudF9yaW5nOwo+ICsKPiArCXNw aW5fbG9ja19pbml0KCZ4dWRjLT5sb2NrKTsKPiArCWluaXRfY29tcGxldGlvbigmeHVkYy0+ZGlz Y29ubmVjdF9jb21wbGV0ZSk7Cj4gKwo+ICsJSU5JVF9XT1JLKCZ4dWRjLT5kYXRhX3JvbGVfd29y aywgdGVncmFfeHVkY19kYXRhX3JvbGVfd29yayk7Cj4gKwl4dWRjLT5kYXRhX3JvbGVfbmIubm90 aWZpZXJfY2FsbCA9IHRlZ3JhX3h1ZGNfZGF0YV9yb2xlX25vdGlmaWVyOwo+ICsJZXh0Y29uX3Jl Z2lzdGVyX25vdGlmaWVyKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24sIEVYVENPTl9VU0IsCj4gKwkJ CQkgJnh1ZGMtPmRhdGFfcm9sZV9uYik7Cj4gKwo+ICsJSU5JVF9ERUxBWUVEX1dPUksoJnh1ZGMt PnBsY19yZXNldF93b3JrLCB0ZWdyYV94dWRjX3BsY19yZXNldF93b3JrKTsKPiArCj4gKwlJTklU X0RFTEFZRURfV09SSygmeHVkYy0+cG9ydF9yZXNldF93YXJfd29yaywKPiArCQkJCXRlZ3JhX3h1 ZGNfcG9ydF9yZXNldF93YXJfd29yayk7Cj4gKwo+ICsJcG1fcnVudGltZV9lbmFibGUoJnBkZXYt PmRldik7Cj4gKwo+ICsJeHVkYy0+Z2FkZ2V0Lm9wcyA9ICZ0ZWdyYV94dWRjX2dhZGdldF9vcHM7 Cj4gKwl4dWRjLT5nYWRnZXQuZXAwID0gJnh1ZGMtPmVwWzBdLnVzYl9lcDsKPiArCXh1ZGMtPmdh ZGdldC5uYW1lID0gInRlZ3JhLXh1ZGMiOwo+ICsJeHVkYy0+Z2FkZ2V0Lm1heF9zcGVlZCA9IFVT Ql9TUEVFRF9TVVBFUjsKPiArCj4gKwllcnIgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRl diwgJnh1ZGMtPmdhZGdldCk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAiZmFpbGVkIHRvIHVzYl9hZGRfZ2FkZ2V0X3VkY1xuIik7CgpCZXR0ZXIgdG8gd29yZCBlcnJv cnMgc3VjaCBhcyB0aGlzIGFzOgoKCSJmYWlsZWQgdG8gYWRkIFVTQiBnYWRnZXQ6ICVkXG4iLCBl cnIKCkFuZCBhbHdheXMgbWFrZSBzdXJlIHRvIGluY2x1ZGUgYW4gZXJyb3IgY29kZSBpbiB0aGUg ZXJyb3IgbWVzc2FnZXMsCnRoYXQgbWFrZXMgdGhpbmdzIGEgbG90IGVhc2llciB0byBkZWJ1ZyBz aG91bGQgeW91IGV2ZXIgcnVuIGludG8gdGhpcy4KVGhpcyBpcyBtYXliZSBub3QgYXMgY3J1Y2lh bCBpZiB5b3UncmUgcnVubmluZyBpbnRvIGl0IHlvdXJzZWxmIGJlY2F1c2UKeW91IGNhbiBtb2Rp ZnkgdGhlIGNvZGUgYW5kIHJlcHJvZHVjZSwgYnV0IGlmIHVzZXJzIHJlcG9ydCBhbiBlcnJvciwg aXQKaXMgdGVkaW91cyBmb3IgdGhlbSB0byBoYXZlIHRvIHJlYnVpbGQgdGhlIGtlcm5lbCBvbmx5 IHRvIGdldCBhdCB0aGUKZXJyb3IuIEJldHRlciB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGNvZGUg aXMgcmVwb3J0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlCnNvIHRoYXQgdGhpbmdzIGNhbiBiZSBuYXJy b3dlZCBkb3duLgoKPiArCQlnb3RvIGZyZWVfZXBzOwo+ICsJfQo+ICsKPiArCXRlZ3JhX3h1ZGNf dXBkYXRlX2RhdGFfcm9sZSh4dWRjKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2ZyZWVfZXBz Ogo+ICsJdGVncmFfeHVkY19mcmVlX2Vwcyh4dWRjKTsKPiArZnJlZV9ldmVudF9yaW5nOgo+ICsJ dGVncmFfeHVkY19mcmVlX2V2ZW50X3JpbmcoeHVkYyk7Cj4gK2Rpc2FibGVfcGh5Ogo+ICsJdGVn cmFfeHVkY19waHlfZXhpdCh4dWRjKTsKPiArcHV0X3Bvd2VyZG9tYWluczoKPiArCXRlZ3JhX3h1 ZGNfcG93ZXJkb21haW5fcmVtb3ZlKHh1ZGMpOwo+ICtkaXNhYmxlX3JlZ3VsYXRvcjoKPiArCXJl Z3VsYXRvcl9idWxrX2Rpc2FibGUoeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBs aWVzKTsKPiArcHV0X3BhZGN0bDoKPiArCXRlZ3JhX3h1c2JfcGFkY3RsX3B1dCh4dWRjLT5wYWRj dGwpOwo+ICsJdGVncmFfeHVkY19jbGtfZGVpbml0KHh1ZGMpOwo+ICsKPiArCXJldHVybiBlcnI7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19yZW1vdmUoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBwbGF0Zm9y bV9nZXRfZHJ2ZGF0YShwZGV2KTsKPiArCj4gKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1ZGMtPmRl dik7Cj4gKwo+ICsJY2FuY2VsX2RlbGF5ZWRfd29yaygmeHVkYy0+cGxjX3Jlc2V0X3dvcmspOwo+ ICsJaWYgKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pIHsKPiArCQlleHRjb25fdW5yZWdpc3Rlcl9u b3RpZmllcih4dWRjLT5kYXRhX3JvbGVfZXh0Y29uLCBFWFRDT05fVVNCLAo+ICsJCQkJJnh1ZGMt PmRhdGFfcm9sZV9uYik7Cj4gKwkJY2FuY2VsX3dvcmtfc3luYygmeHVkYy0+ZGF0YV9yb2xlX3dv cmspOwo+ICsJfQo+ICsJdXNiX2RlbF9nYWRnZXRfdWRjKCZ4dWRjLT5nYWRnZXQpOwo+ICsJdGVn cmFfeHVkY19mcmVlX2Vwcyh4dWRjKTsKPiArCXRlZ3JhX3h1ZGNfZnJlZV9ldmVudF9yaW5nKHh1 ZGMpOwo+ICsJdGVncmFfeHVkY19wb3dlcmRvbWFpbl9yZW1vdmUoeHVkYyk7Cj4gKwo+ICsJcmVn dWxhdG9yX2J1bGtfZGlzYWJsZSh4dWRjLT5zb2MtPm51bV9zdXBwbGllcywgeHVkYy0+c3VwcGxp ZXMpOwo+ICsKPiArCXBoeV9wb3dlcl9vZmYoeHVkYy0+dXRtaV9waHkpOwo+ICsJcGh5X3Bvd2Vy X29mZih4dWRjLT51c2IzX3BoeSk7Cj4gKwl0ZWdyYV94dWRjX3BoeV9leGl0KHh1ZGMpOwo+ICsJ cG1fcnVudGltZV9kaXNhYmxlKHh1ZGMtPmRldik7Cj4gKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5k ZXYpOwo+ICsJdGVncmFfeHVkY19jbGtfZGVpbml0KHh1ZGMpOwo+ICsKPiArCXRlZ3JhX3h1c2Jf cGFkY3RsX3B1dCh4dWRjLT5wYWRjdGwpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICsj aWYgSVNfRU5BQkxFRChDT05GSUdfUE1fU0xFRVApIHx8IElTX0VOQUJMRUQoQ09ORklHX1BNKQo+ ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcG93ZXJnYXRlKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRj KQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiArCWRldl9pbmZvKHh1ZGMtPmRl diwgImVudGVyaW5nIEVMUEdcbiIpOwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ss IGZsYWdzKTsKPiArCXh1ZGMtPnBvd2VyZ2F0ZWQgPSB0cnVlOwo+ICsJeHVkYy0+c2F2ZWRfcmVn cy5jdHJsID0geHVkY19yZWFkbCh4dWRjLCBDVFJMKTsKPiArCXh1ZGMtPnNhdmVkX3JlZ3MucG9y dHBtID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOwo+ICsJeHVkY193cml0ZWwoeHVkYywgMCwg Q1RSTCk7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4g Kwo+ICsJdGVncmFfeHVkY19jbGtfZGlzYWJsZSh4dWRjKTsKPiArCXRlZ3JhX3Bvd2VyZ2F0ZV9w b3dlcl9vZmYoVEVHUkFfUE9XRVJHQVRFX1hVU0JBKTsKPiArCXJlZ3VsYXRvcl9idWxrX2Rpc2Fi bGUoeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBsaWVzKTsKPiArCj4gKwlkZXZf aW5mbyh4dWRjLT5kZXYsICJlbnRlcmluZyBFTFBHIGRvbmVcbiIpOwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY191bnBvd2VyZ2F0ZShzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYykKPiArewo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCWludCBlcnI7Cj4g Kwo+ICsJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZXhpdGluZyBFTFBHXG4iKTsKPiArCj4gKwllcnIg PSByZWd1bGF0b3JfYnVsa19lbmFibGUoeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsCj4gKwkJCXh1 ZGMtPnN1cHBsaWVzKTsKPiArCWlmIChlcnIgPCAwKQo+ICsJCXJldHVybiBlcnI7Cj4gKwo+ICsK PiArCWVyciA9IHRlZ3JhX3h1ZGNfY2xrX2VuYWJsZSh4dWRjKTsKPiArCWlmIChlcnIgPCAwKQo+ ICsJCXJldHVybiBlcnI7Cj4gKwo+ICsJdGVncmFfeHVkY19mcGNpX2lwZnNfaW5pdCh4dWRjKTsK PiArCXRlZ3JhX3h1ZGNfZGV2aWNlX3BhcmFtc19pbml0KHh1ZGMpOwo+ICsKPiArCXRlZ3JhX3h1 ZGNfaW5pdF9ldmVudF9yaW5nKHh1ZGMpOwo+ICsJdGVncmFfeHVkY19pbml0X2Vwcyh4dWRjKTsK PiArCj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB4dWRjLT5zYXZlZF9yZWdzLnBvcnRwbSwgUE9SVFBN KTsKPiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHh1ZGMtPnNhdmVkX3JlZ3MuY3RybCwgQ1RSTCk7Cj4g Kwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiArCXh1ZGMtPnBv d2VyZ2F0ZWQgPSBmYWxzZTsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ss IGZsYWdzKTsKPiArCj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJleGl0aW5nIEVMUEcgZG9uZVxu Iik7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsjZW5kaWYKPiArCj4gKyNpZmRlZiBDT05GSUdfUE1f U0xFRVAKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2 KQo+ICt7Cj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYp Owo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVk Yy0+bG9jaywgZmxhZ3MpOwo+ICsJeHVkYy0+c3VzcGVuZGVkID0gdHJ1ZTsKPiArCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiArCj4gKwlpZiAoeHVkYy0+ZGF0 YV9yb2xlX2V4dGNvbikKPiArCQlmbHVzaF93b3JrKCZ4dWRjLT5kYXRhX3JvbGVfd29yayk7Cj4g Kwo+ICsJLyogRm9yY2libHkgZGlzY29ubmVjdCBiZWZvcmUgcG93ZXJnYXRpbmcuICovCj4gKwl0 ZWdyYV94dWRjX2RldmljZV9tb2RlX29mZih4dWRjKTsKPiArCj4gKwlpZiAoIXBtX3J1bnRpbWVf c3RhdHVzX3N1c3BlbmRlZChkZXYpKQo+ICsJCXRlZ3JhX3h1ZGNfcG93ZXJnYXRlKHh1ZGMpOwo+ ICsKPiArCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiAr ewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiAr CXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwlpbnQgZXJyOwo+ICsKPiArCWVyciA9IHRlZ3JhX3h1 ZGNfdW5wb3dlcmdhdGUoeHVkYyk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwl4dWRjLT5z dXNwZW5kZWQgPSBmYWxzZTsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ss IGZsYWdzKTsKPiArCj4gKwl0ZWdyYV94dWRjX3VwZGF0ZV9kYXRhX3JvbGUoeHVkYyk7Cj4gKwo+ ICsJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsjZW5k aWYKPiArCj4gKyNpZmRlZiBDT05GSUdfUE0KPiArc3RhdGljIGludCB0ZWdyYV94dWRjX3J1bnRp bWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRj ICp4dWRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwlpZiAoV0FS Tl9PTih4dWRjLT5kZXZpY2VfbW9kZSkpIHsKPiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwkJcmV0dXJuIC1FQlVTWTsKPiArCX0KPiArCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKClRoaXMgc2VlbXMgb3Zlcmx5IHJl c3RyaWN0aXZlLiBXaHkgcmVqZWN0IHN1c3BlbmQgbW9kZSB3aGVuIHdlJ3JlIGluCmRldmljZSBt b2RlPwoKQWxzbywgaXQgc2VlbXMgdG8gbWUgbGlrZSB0aGVyZSByZWFsbHkgYXJlbid0IGFueSBk aWZmZXJlbmNlcyBiZXR3ZWVuCnN5c3RlbSBzbGVlcCBhbmQgcnVudGltZSBQTSwgc28gd2h5IG5v dCBqdXN0IGxlYXZlIGF3YXkgdGhlIHN5c3RlbSBzbGVlcApmdW5jdGlvbnMgYW5kIGp1c3QgbGV0 IHJ1bnRpbWUgUE0gZGVhbCB3aXRoIGV2ZXJ5dGhpbmc/CgpUaGllcnJ5Cgo+ICsKPiArCXJldHVy biB0ZWdyYV94dWRjX3Bvd2VyZ2F0ZSh4dWRjKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdy YV94dWRjX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0 IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlyZXR1cm4g dGVncmFfeHVkY191bnBvd2VyZ2F0ZSh4dWRjKTsKPiArfQo+ICsjZW5kaWYKPiArCj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0ZWdyYV94dWRjX3BtX29wcyA9IHsKPiArCVNFVF9T WVNURU1fU0xFRVBfUE1fT1BTKHRlZ3JhX3h1ZGNfc3VzcGVuZCwgdGVncmFfeHVkY19yZXN1bWUp Cj4gKwlTRVRfUlVOVElNRV9QTV9PUFModGVncmFfeHVkY19ydW50aW1lX3N1c3BlbmQsCj4gKwkJ CSAgIHRlZ3JhX3h1ZGNfcnVudGltZV9yZXN1bWUsIE5VTEwpCj4gK307Cj4gKwo+ICtzdGF0aWMg c3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV94dWRjX2RyaXZlciA9IHsKPiArCS5wcm9iZSA9 IHRlZ3JhX3h1ZGNfcHJvYmUsCj4gKwkucmVtb3ZlID0gdGVncmFfeHVkY19yZW1vdmUsCj4gKwku ZHJpdmVyID0gewo+ICsJCS5uYW1lID0gInRlZ3JhLXh1ZGMiLAo+ICsJCS5wbSA9ICZ0ZWdyYV94 dWRjX3BtX29wcywKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV94dWRjX29mX21hdGNoLAo+ ICsJfSwKPiArfTsKPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0ZWdyYV94dWRjX2RyaXZlcik7 Cj4gKwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk5WSURJQSBUZWdyYSBYVVNCIERldmljZSBDb250 cm9sbGVyIik7Cj4gK01PRFVMRV9BVVRIT1IoIkFuZHJldyBCcmVzdGlja2VyIDxhYnJlc3RpY0Bj aHJvbWl1bS5vcmc+Iik7Cj4gK01PRFVMRV9BVVRIT1IoIkh1aSBGdSIpOwo+ICtNT0RVTEVfTElD RU5TRSgiR1BMIHYyIik7Cj4gLS0gCj4gMi43LjQKPgo=