From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philipp Zabel Subject: Re: [PATCH v4 3/4] gpu: ipu-ic: Add complete image conversion support with tiling Date: Tue, 06 Sep 2016 11:26:20 +0200 Message-ID: <1473153980.2805.89.camel@pengutronix.de> References: <1471481419-5917-1-git-send-email-steve_longerbeam@mentor.com> <1471481419-5917-4-git-send-email-steve_longerbeam@mentor.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by gabe.freedesktop.org (Postfix) with ESMTPS id A536C89F75 for ; Tue, 6 Sep 2016 09:26:23 +0000 (UTC) In-Reply-To: <1471481419-5917-4-git-send-email-steve_longerbeam@mentor.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Steve Longerbeam Cc: linux-fbdev@vger.kernel.org, Steve Longerbeam , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, tomi.valkeinen@ti.com, plagnioj@jcrosoft.com List-Id: dri-devel@lists.freedesktop.org SGkgU3RldmUsCgpBbSBNaXR0d29jaCwgZGVuIDE3LjA4LjIwMTYsIDE3OjUwIC0wNzAwIHNjaHJp ZWIgU3RldmUgTG9uZ2VyYmVhbToKPiBUaGlzIHBhdGNoIGltcGxlbWVudHMgY29tcGxldGUgaW1h Z2UgY29udmVyc2lvbiBzdXBwb3J0IHRvIGlwdS1pYywKPiB3aXRoIHRpbGluZyB0byBzdXBwb3J0 IHNjYWxpbmcgdG8gYW5kIGZyb20gaW1hZ2VzIHVwIHRvIDQwOTZ4NDA5Ni4KPiBJbWFnZSByb3Rh dGlvbiBpcyBhbHNvIHN1cHBvcnRlZC4KPiAKPiBUaGUgaW50ZXJuYWwgQVBJIGlzIHN1YnN5c3Rl bSBhZ25vc3RpYyAobm8gVjRMMiBkZXBlbmRlbmN5IGV4Y2VwdAo+IGZvciB0aGUgdXNlIG9mIFY0 TDIgZm91cmNjIHBpeGVsIGZvcm1hdHMpLgo+IAo+IENhbGxlcnMgcHJlcGFyZSBmb3IgaW1hZ2Ug Y29udmVyc2lvbiBieSBjYWxsaW5nCj4gaXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZSgpLCB3aGlj aCBpbml0aWFsaXplcyB0aGUgcGFyYW1ldGVycyBvZgo+IHRoZSBjb252ZXJzaW9uLgoKLi4uIGFu ZCBwb3NzaWJseSBhbGxvY2F0ZXMgaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgZm9yIHJvdGF0aW9uIHN1 cHBvcnQuClRoaXMgc2hvdWxkIGJlIGRvY3VtZW50ZWQgc29tZXdoZXJlLCB3aXRoIGEgbm9kZSB0 aGF0IHY0bDIgdXNlcnMgc2hvdWxkCmJlIGRvaW5nIHRoaXMgZHVyaW5nIFJFUUJVRlMuCgo+ICBU aGUgY2FsbGVyIHBhc3NlcyBpbiB0aGUgaXB1X2ljIHRhc2sgdG8gdXNlIGZvcgo+IHRoZSBjb252 ZXJzaW9uLCB0aGUgaW5wdXQgYW5kIG91dHB1dCBpbWFnZSBmb3JtYXRzLCBhIHJvdGF0aW9uIG1v ZGUsCj4gYW5kIGEgY29tcGxldGlvbiBjYWxsYmFjayBhbmQgY29tcGxldGlvbiBjb250ZXh0IHBv aW50ZXI6Cj4gCj4gc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKgo+IGlwdV9pbWFnZV9jb252 ZXJ0X3ByZXBhcmUoc3RydWN0IGlwdV9pYyAqaWMsCj4gICAgICAgICAgICAgICAgICAgICAgICAg ICBzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAo+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUsCj4gICAgICAg ICAgICAgICAgICAgICAgICAgICBpbWFnZV9jb252ZXJ0ZXJfY2JfdCBjb21wbGV0ZSwKPiAgICAg ICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbXBsZXRlX2NvbnRleHQpOwoKQXMgSSBjb21t ZW50ZWQgb24gdGhlIG90aGVyIHBhdGNoLCBJIHRoaW5rIHRoZSBpbWFnZV9jb252ZXJ0IGZ1bmN0 aW9ucwpzaG91bGQgdXNlIGEgc2VwYXJhdGUgaGFuZGxlIGZvciB0aGUgaW1hZ2UgY29udmVyc2lv biBxdWV1ZXMgdGhhdCBzaXQgb24KdG9wIG9mIHRoZSBpcHVfaWMgdGFzayBoYW5kbGVzLgoKPiBU aGUgY2FsbGVyIGlzIGdpdmVuIGEgbmV3IGNvbnZlcnNpb24gY29udGV4dCB0aGF0IG11c3QgYmUg cGFzc2VkIHRvCj4gdGhlIGZ1cnRoZXIgQVBJczoKPiAKPiBzdHJ1Y3QgaW1hZ2VfY29udmVydGVy X3J1biAqCj4gaXB1X2ltYWdlX2NvbnZlcnRfcnVuKHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4 ICpjdHgsCj4gICAgICAgICAgICAgICAgICAgICAgIGRtYV9hZGRyX3QgaW5fcGh5cywgZG1hX2Fk ZHJfdCBvdXRfcGh5cyk7Cj4gCj4gVGhpcyBxdWV1ZXMgYSBuZXcgaW1hZ2UgY29udmVyc2lvbiBy ZXF1ZXN0IHRvIGEgcnVuIHF1ZXVlLCBhbmQKPiBzdGFydHMgdGhlIGNvbnZlcnNpb24gaW1tZWRp YXRlbHkgaWYgdGhlIHJ1biBxdWV1ZSBpcyBlbXB0eS4gT25seQo+IHRoZSBwaHlzYWRkcidzIG9m IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGltYWdlIGJ1ZmZlcnMgYXJlIG5lZWRlZCwKPiBzaW5jZSB0 aGUgY29udmVyc2lvbiBjb250ZXh0IHdhcyBjcmVhdGVkIHByZXZpb3VzbHkgd2l0aAo+IGlwdV9p bWFnZV9jb252ZXJ0X3ByZXBhcmUoKS4gUmV0dXJucyBhIG5ldyBydW4gb2JqZWN0IHBvaW50ZXIu IFdoZW4KPiB0aGUgY29udmVyc2lvbiBjb21wbGV0ZXMsIHRoZSBydW4gcG9pbnRlciBpcyByZXR1 cm5lZCB0byB0aGUKPiBjb21wbGV0aW9uIGNhbGxiYWNrLgo+Cj4gdm9pZCBpbWFnZV9jb252ZXJ0 X2Fib3J0KHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICpjdHgpOwo+IAo+IFRoaXMgd2lsbCBh Ym9ydCBhbnkgYWN0aXZlIG9yIHBlbmRpbmcgY29udmVyc2lvbnMgZm9yIHRoaXMgY29udGV4dC4K PiBBbnkgY3VycmVudGx5IGFjdGl2ZSBvciBwZW5kaW5nIHJ1bnMgYmVsb25naW5nIHRvIHRoaXMg Y29udGV4dCBhcmUKPiByZXR1cm5lZCB2aWEgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgd2l0aCBh biBlcnJvciBzdGF0dXMuCj4KPiB2b2lkIGlwdV9pbWFnZV9jb252ZXJ0X3VucHJlcGFyZShzdHJ1 Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4KTsKPiAKPiBVbnByZXBhcmVzIHRoZSBjb252ZXJz aW9uIGNvbnRleHQuIEFueSBhY3RpdmUgb3IgcGVuZGluZyBydW5zIHdpbGwKPiBiZSBhYm9ydGVk IGJ5IGNhbGxpbmcgaW1hZ2VfY29udmVydF9hYm9ydCgpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFN0 ZXZlIExvbmdlcmJlYW0gPHN0ZXZlX2xvbmdlcmJlYW1AbWVudG9yLmNvbT4KPiAKPiAtLS0KPiAK PiB2NDoKPiAtIGRvIGF3YXkgd2l0aCBzdHJ1Y3QgaXB1X2ljX3RpbGVfb2ZmLCBhbmQgbW92ZSB0 aWxlIG9mZnNldHMgaW50bwo+ICAgc3RydWN0IGlwdV9pY190aWxlLiBUaGlzIHBhdmVzIHRoZSB3 YXkgZm9yIHBvc3NpYmx5IGFsbG93aW5nIGZvcgo+ICAgZWFjaCB0aWxlIHRvIGhhdmUgZGlmZmVy ZW50IGRpbWVuc2lvbnMgaW4gdGhlIGZ1dHVyZS4KClRoYW5rcywgdGhpcyBsb29rcyBhIGxvdCBi ZXR0ZXIgdG8gbWUuCgo+IHYzOiBubyBjaGFuZ2VzCj4gdjI6IG5vIGNoYW5nZXMKPiAtLS0KPiAg ZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1pYy5jIHwgMTY5NCArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKystCj4gIGluY2x1ZGUvdmlkZW8vaW14LWlwdS12My5oICB8ICAg NTcgKy0KPiAgMiBmaWxlcyBjaGFuZ2VkLCAxNzM5IGluc2VydGlvbnMoKyksIDEyIGRlbGV0aW9u cygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMgYi9kcml2 ZXJzL2dwdS9pcHUtdjMvaXB1LWljLmMKPiBpbmRleCAxYTM3YWZjLi4wMWIxYjU2IDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtaWMuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2lw dS12My9pcHUtaWMuYwo+IEBAIC0xNyw2ICsxNyw4IEBACj4gICNpbmNsdWRlIDxsaW51eC9iaXRy ZXYuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9lcnIuaD4K PiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hLW1h cHBpbmcuaD4KPiAgI2luY2x1ZGUgImlwdS1wcnYuaCIKPiAgCj4gIC8qIElDIFJlZ2lzdGVyIE9m ZnNldHMgKi8KPiBAQCAtODIsNiArODQsNDAgQEAKPiAgI2RlZmluZSBJQ19JRE1BQ18zX1BQX1dJ RFRIX01BU0sgICAgICAgICgweDNmZiA8PCAyMCkKPiAgI2RlZmluZSBJQ19JRE1BQ18zX1BQX1dJ RFRIX09GRlNFVCAgICAgIDIwCj4gIAo+ICsvKgo+ICsgKiBUaGUgSUMgUmVzaXplciBoYXMgYSBy ZXN0cmljdGlvbiB0aGF0IHRoZSBvdXRwdXQgZnJhbWUgZnJvbSB0aGUKPiArICogcmVzaXplciBt dXN0IGJlIDEwMjQgb3IgbGVzcyBpbiBib3RoIHdpZHRoIChwaXhlbHMpIGFuZCBoZWlnaHQKPiAr ICogKGxpbmVzKS4KPiArICoKPiArICogVGhlIGltYWdlIGNvbnZlcnNpb24gc3VwcG9ydCBhdHRl bXB0cyB0byBzcGxpdCB1cCBhIGNvbnZlcnNpb24gd2hlbgo+ICsgKiB0aGUgZGVzaXJlZCBvdXRw dXQgKGNvbnZlcnRlZCkgZnJhbWUgcmVzb2x1dGlvbiBleGNlZWRzIHRoZSBJQyByZXNpemVyCj4g KyAqIGxpbWl0IG9mIDEwMjQgaW4gZWl0aGVyIGRpbWVuc2lvbi4KPiArICoKPiArICogSWYgZWl0 aGVyIGRpbWVuc2lvbiBvZiB0aGUgb3V0cHV0IGZyYW1lIGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGUK PiArICogZGltZW5zaW9uIGlzIHNwbGl0IGludG8gMSwgMiwgb3IgNCBlcXVhbCBzdHJpcGVzLCBm b3IgYSBtYXhpbXVtCj4gKyAqIG9mIDQqNCBvciAxNiB0aWxlcy4gQSBjb252ZXJzaW9uIGlzIHRo ZW4gY2FycmllZCBvdXQgZm9yIGVhY2gKPiArICogdGlsZSAoYnV0IHRha2luZyBjYXJlIHRvIHBh c3MgdGhlIGZ1bGwgZnJhbWUgc3RyaWRlIGxlbmd0aCB0bwo+ICsgKiB0aGUgRE1BIGNoYW5uZWwn cyBwYXJhbWV0ZXIgbWVtb3J5ISkuIElETUEgZG91YmxlLWJ1ZmZlcmluZyBpcyB1c2VkCj4gKyAq IHRvIGNvbnZlcnQgZWFjaCB0aWxlIGJhY2stdG8tYmFjayB3aGVuIHBvc3NpYmxlIChzZWUgbm90 ZSBiZWxvdwo+ICsgKiB3aGVuIGRvdWJsZV9idWZmZXJpbmcgYm9vbGVhbiBpcyBzZXQpLgo+ICsg Kgo+ICsgKiBOb3RlIHRoYXQgdGhlIGlucHV0IGZyYW1lIG11c3QgYmUgc3BsaXQgdXAgaW50byB0 aGUgc2FtZSBudW1iZXIKPiArICogb2YgdGlsZXMgYXMgdGhlIG91dHB1dCBmcmFtZS4KPiArICov Cj4gKyNkZWZpbmUgTUFYX1NUUklQRVNfVyAgICA0Cj4gKyNkZWZpbmUgTUFYX1NUUklQRVNfSCAg ICA0Cj4gKyNkZWZpbmUgTUFYX1RJTEVTIChNQVhfU1RSSVBFU19XICogTUFYX1NUUklQRVNfSCkK PiArCj4gKyNkZWZpbmUgTUlOX1cgICAgIDEyOAo+ICsjZGVmaW5lIE1JTl9IICAgICAxMjgKCldo ZXJlIGRvZXMgdGhpcyBtaW5pbXVtIGNvbWUgZnJvbT8KCj4gKyNkZWZpbmUgTUFYX1cgICAgIDQw OTYKPiArI2RlZmluZSBNQVhfSCAgICAgNDA5Ngo+ICsKPiArZW51bSBpbWFnZV9jb252ZXJ0X3R5 cGUgewo+ICsJSU1BR0VfQ09OVkVSVF9JTiA9IDAsCj4gKwlJTUFHRV9DT05WRVJUX09VVCwKPiAr fTsKPiArCj4gIHN0cnVjdCBpY190YXNrX3JlZ29mZnMgewo+ICAJdTMyIHJzYzsKPiAgCXUzMiB0 cG1lbV9jc2NbMl07Cj4gQEAgLTk2LDYgKzEzMiwxNiBAQCBzdHJ1Y3QgaWNfdGFza19iaXRmaWVs ZHMgewo+ICAJdTMyIGljX2NtYl9nYWxwaGFfYml0Owo+ICB9Owo+ICAKPiArc3RydWN0IGljX3Rh c2tfY2hhbm5lbHMgewo+ICsJaW50IGluOwo+ICsJaW50IG91dDsKPiArCWludCByb3RfaW47Cj4g KwlpbnQgcm90X291dDsKPiArCWludCB2ZGlfaW5fcDsKPiArCWludCB2ZGlfaW47Cj4gKwlpbnQg dmRpX2luX247CgpUaGUgdmRpIGNoYW5uZWxzIGFyZSB1bnVzZWQuCgo+ICt9Owo+ICsKPiAgc3Rh dGljIGNvbnN0IHN0cnVjdCBpY190YXNrX3JlZ29mZnMgaWNfdGFza19yZWdbSUNfTlVNX1RBU0tT XSA9IHsKPiAgCVtJQ19UQVNLX0VOQ09ERVJdID0gewo+ICAJCS5yc2MgPSBJQ19QUlBfRU5DX1JT QywKPiBAQCAtMTM4LDEyICsxODQsMTU1IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWNfdGFza19i aXRmaWVsZHMgaWNfdGFza19iaXRbSUNfTlVNX1RBU0tTXSA9IHsKPiAgCX0sCj4gIH07Cj4gIAo+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IGljX3Rhc2tfY2hhbm5lbHMgaWNfdGFza19jaFtJQ19OVU1f VEFTS1NdID0gewo+ICsJW0lDX1RBU0tfRU5DT0RFUl0gPSB7Cj4gKwkJLm91dCA9IElQVVYzX0NI QU5ORUxfSUNfUFJQX0VOQ19NRU0sCj4gKwkJLnJvdF9pbiA9IElQVVYzX0NIQU5ORUxfTUVNX1JP VF9FTkMsCj4gKwkJLnJvdF9vdXQgPSBJUFVWM19DSEFOTkVMX1JPVF9FTkNfTUVNLAo+ICsJfSwK PiArCVtJQ19UQVNLX1ZJRVdGSU5ERVJdID0gewo+ICsJCS5pbiA9IElQVVYzX0NIQU5ORUxfTUVN X0lDX1BSUF9WRiwKPiArCQkub3V0ID0gSVBVVjNfQ0hBTk5FTF9JQ19QUlBfVkZfTUVNLAo+ICsJ CS5yb3RfaW4gPSBJUFVWM19DSEFOTkVMX01FTV9ST1RfVkYsCj4gKwkJLnJvdF9vdXQgPSBJUFVW M19DSEFOTkVMX1JPVF9WRl9NRU0sCj4gKwkJLnZkaV9pbl9wID0gSVBVVjNfQ0hBTk5FTF9NRU1f VkRJX1BSRVYsCj4gKwkJLnZkaV9pbiA9IElQVVYzX0NIQU5ORUxfTUVNX1ZESV9DVVIsCj4gKwkJ LnZkaV9pbl9uID0gSVBVVjNfQ0hBTk5FTF9NRU1fVkRJX05FWFQsCgpTZWUgYWJvdmUuCgo+ICsJ fSwKPiArCVtJQ19UQVNLX1BPU1RfUFJPQ0VTU09SXSA9IHsKPiArCQkuaW4gPSBJUFVWM19DSEFO TkVMX01FTV9JQ19QUCwKPiArCQkub3V0ID0gSVBVVjNfQ0hBTk5FTF9JQ19QUF9NRU0sCj4gKwkJ LnJvdF9pbiA9IElQVVYzX0NIQU5ORUxfTUVNX1JPVF9QUCwKPiArCQkucm90X291dCA9IElQVVYz X0NIQU5ORUxfUk9UX1BQX01FTSwKPiArCX0sCj4gK307Cj4gKwo+ICtzdHJ1Y3QgaXB1X2ljX2Rt YV9idWYgewo+ICsJdm9pZCAgICAgICAgICAqdmlydDsKPiArCWRtYV9hZGRyX3QgICAgcGh5czsK PiArCXVuc2lnbmVkIGxvbmcgbGVuOwo+ICt9Owo+ICsKPiArLyogZGltZW5zaW9ucyBvZiBvbmUg dGlsZSAqLwo+ICtzdHJ1Y3QgaXB1X2ljX3RpbGUgewo+ICsJdTMyIHdpZHRoOwo+ICsJdTMyIGhl aWdodDsKPiArCS8qIHNpemUgYW5kIHN0cmlkZXMgYXJlIGluIGJ5dGVzICovCj4gKwl1MzIgc2l6 ZTsKPiArCXUzMiBzdHJpZGU7Cj4gKwl1MzIgcm90X3N0cmlkZTsKPiArCS8qIHN0YXJ0IFkgb3Ig cGFja2VkIG9mZnNldCBvZiB0aGlzIHRpbGUgKi8KPiArCXUzMiBvZmZzZXQ7Cj4gKwkvKiBvZmZz ZXQgZnJvbSBzdGFydCB0byB0aWxlIGluIFUgcGxhbmUsIGZvciBwbGFuYXIgZm9ybWF0cyAqLwo+ ICsJdTMyIHVfb2ZmOwo+ICsJLyogb2Zmc2V0IGZyb20gc3RhcnQgdG8gdGlsZSBpbiBWIHBsYW5l LCBmb3IgcGxhbmFyIGZvcm1hdHMgKi8KPiArCXUzMiB2X29mZjsKPiArfTsKPiArCj4gK3N0cnVj dCBpcHVfaWNfcGl4Zm10IHsKPiArCWNoYXIJKm5hbWU7Cj4gKwl1MzIJZm91cmNjOyAgICAgICAg LyogVjRMMiBmb3VyY2MgKi8KPiArCWludCAgICAgYnBwOyAgICAgICAgICAgLyogdG90YWwgYnBw ICovCj4gKwlpbnQgICAgIHlfZGVwdGg7ICAgICAgIC8qIGRlcHRoIG9mIFkgcGxhbmUgZm9yIHBs YW5hciBmb3JtYXRzICovCj4gKwlpbnQgICAgIHV2X3dpZHRoX2RlYzsgIC8qIGRlY2ltYXRpb24g aW4gd2lkdGggZm9yIFUvViBwbGFuZXMgKi8KPiArCWludCAgICAgdXZfaGVpZ2h0X2RlYzsgLyog ZGVjaW1hdGlvbiBpbiBoZWlnaHQgZm9yIFUvViBwbGFuZXMgKi8KPiArCWJvb2wgICAgdXZfc3dh cHBlZDsgICAgLyogVSBhbmQgViBwbGFuZXMgYXJlIHN3YXBwZWQgKi8KPiArCWJvb2wgICAgdXZf cGFja2VkOyAgICAgLyogcGFydGlhbCBwbGFuYXIgKFUgYW5kIFYgaW4gc2FtZSBwbGFuZSkgKi8K PiArfTsKPiArCj4gK3N0cnVjdCBpcHVfaWNfaW1hZ2Ugewo+ICsJc3RydWN0IGlwdV9pbWFnZSBi YXNlOwo+ICsJZW51bSBpbWFnZV9jb252ZXJ0X3R5cGUgdHlwZTsKPiArCj4gKwljb25zdCBzdHJ1 Y3QgaXB1X2ljX3BpeGZtdCAqZm10Owo+ICsJdW5zaWduZWQgaW50IHN0cmlkZTsKPiArCj4gKwkv KiAjIG9mIHJvd3MgKGhvcml6b250YWwgc3RyaXBlcykgaWYgZGVzdCBoZWlnaHQgaXMgPiAxMDI0 ICovCj4gKwl1bnNpZ25lZCBpbnQgbnVtX3Jvd3M7Cj4gKwkvKiAjIG9mIGNvbHVtbnMgKHZlcnRp Y2FsIHN0cmlwZXMpIGlmIGRlc3Qgd2lkdGggaXMgPiAxMDI0ICovCj4gKwl1bnNpZ25lZCBpbnQg bnVtX2NvbHM7Cj4gKwo+ICsJc3RydWN0IGlwdV9pY190aWxlIHRpbGVbTUFYX1RJTEVTXTsKPiAr fTsKPiArCj4gK3N0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4Owo+ICtzdHJ1Y3QgaW1hZ2VfY29u dmVydGVyOwo+ICBzdHJ1Y3QgaXB1X2ljX3ByaXY7Cj4gK3N0cnVjdCBpcHVfaWM7Cj4gKwo+ICtz dHJ1Y3QgaW1hZ2VfY29udmVydGVyX3J1biB7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0 eCAqY3R4Owo+ICsKPiArCWRtYV9hZGRyX3QgaW5fcGh5czsKPiArCWRtYV9hZGRyX3Qgb3V0X3Bo eXM7Cj4gKwo+ICsJaW50IHN0YXR1czsKPiArCj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4g K307Cj4gKwo+ICtzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCB7Cj4gKwlzdHJ1Y3QgaW1hZ2Vf Y29udmVydGVyICpjdnQ7Cj4gKwo+ICsJaW1hZ2VfY29udmVydGVyX2NiX3QgY29tcGxldGU7Cj4g Kwl2b2lkICpjb21wbGV0ZV9jb250ZXh0Owo+ICsKPiArCS8qIFNvdXJjZS9kZXN0aW5hdGlvbiBp bWFnZSBkYXRhIGFuZCByb3RhdGlvbiBtb2RlICovCj4gKwlzdHJ1Y3QgaXB1X2ljX2ltYWdlIGlu Owo+ICsJc3RydWN0IGlwdV9pY19pbWFnZSBvdXQ7Cj4gKwllbnVtIGlwdV9yb3RhdGVfbW9kZSBy b3RfbW9kZTsKPiArCj4gKwkvKiBpbnRlcm1lZGlhdGUgYnVmZmVyIGZvciByb3RhdGlvbiAqLwo+ ICsJc3RydWN0IGlwdV9pY19kbWFfYnVmIHJvdF9pbnRlcm1lZGlhdGVbMl07CgpObyBuZWVkIHRv IGNoYW5nZSBpdCBub3csIGJ1dCBJIGFzc3VtZSB0aGVzZSBjb3VsZCBiZSBwZXIgSUMgdGFzawpp bnN0ZWFkIG9mIHBlciBjb250ZXh0LgoKPiArCS8qIGN1cnJlbnQgYnVmZmVyIG51bWJlciBmb3Ig ZG91YmxlIGJ1ZmZlcmluZyAqLwo+ICsJaW50IGN1cl9idWZfbnVtOwo+ICsKPiArCWJvb2wgYWJv cnRpbmc7Cj4gKwlzdHJ1Y3QgY29tcGxldGlvbiBhYm9ydGVkOwo+ICsKPiArCS8qIGNhbiB3ZSB1 c2UgZG91YmxlLWJ1ZmZlcmluZyBmb3IgdGhpcyBjb252ZXJzaW9uIG9wZXJhdGlvbj8gKi8KPiAr CWJvb2wgZG91YmxlX2J1ZmZlcmluZzsKPiArCS8qIG51bV9yb3dzICogbnVtX2NvbHMgKi8KPiAr CXVuc2lnbmVkIGludCBudW1fdGlsZXM7Cj4gKwkvKiBuZXh0IHRpbGUgdG8gcHJvY2VzcyAqLwo+ ICsJdW5zaWduZWQgaW50IG5leHRfdGlsZTsKPiArCS8qIHdoZXJlIHRvIHBsYWNlIGNvbnZlcnRl ZCB0aWxlIGluIGRlc3QgaW1hZ2UgKi8KPiArCXVuc2lnbmVkIGludCBvdXRfdGlsZV9tYXBbTUFY X1RJTEVTXTsKPiArCj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4gK307Cj4gKwo+ICtzdHJ1 Y3QgaW1hZ2VfY29udmVydGVyIHsKPiArCXN0cnVjdCBpcHVfaWMgKmljOwo+ICsKPiArCXN0cnVj dCBpcHV2M19jaGFubmVsICppbl9jaGFuOwo+ICsJc3RydWN0IGlwdXYzX2NoYW5uZWwgKm91dF9j aGFuOwo+ICsJc3RydWN0IGlwdXYzX2NoYW5uZWwgKnJvdGF0aW9uX2luX2NoYW47Cj4gKwlzdHJ1 Y3QgaXB1djNfY2hhbm5lbCAqcm90YXRpb25fb3V0X2NoYW47Cj4gKwo+ICsJLyogdGhlIElQVSBl bmQtb2YtZnJhbWUgaXJxcyAqLwo+ICsJaW50IG91dF9lb2ZfaXJxOwo+ICsJaW50IHJvdF9vdXRf ZW9mX2lycTsKPiArCj4gKwlzcGlubG9ja190IGlycWxvY2s7Cj4gKwo+ICsJLyogbGlzdCBvZiBj b252ZXJ0IGNvbnRleHRzICovCj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGN0eF9saXN0Owo+ICsJLyog cXVldWUgb2YgY29udmVyc2lvbiBydW5zICovCj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmdf cTsKPiArCS8qIHF1ZXVlIG9mIGNvbXBsZXRlZCBydW5zICovCj4gKwlzdHJ1Y3QgbGlzdF9oZWFk IGRvbmVfcTsKPiArCj4gKwkvKiB0aGUgY3VycmVudCBjb252ZXJzaW9uIHJ1biAqLwo+ICsJc3Ry dWN0IGltYWdlX2NvbnZlcnRlcl9ydW4gKmN1cnJlbnRfcnVuOwo+ICt9Owo+ICAKPiAgc3RydWN0 IGlwdV9pYyB7Cj4gIAllbnVtIGlwdV9pY190YXNrIHRhc2s7Cj4gIAljb25zdCBzdHJ1Y3QgaWNf dGFza19yZWdvZmZzICpyZWc7Cj4gIAljb25zdCBzdHJ1Y3QgaWNfdGFza19iaXRmaWVsZHMgKmJp dDsKPiArCWNvbnN0IHN0cnVjdCBpY190YXNrX2NoYW5uZWxzICpjaDsKPiAgCj4gIAllbnVtIGlw dV9jb2xvcl9zcGFjZSBpbl9jcywgZ19pbl9jczsKPiAgCWVudW0gaXB1X2NvbG9yX3NwYWNlIG91 dF9jczsKPiBAQCAtMTUxLDYgKzM0MCw4IEBAIHN0cnVjdCBpcHVfaWMgewo+ICAJYm9vbCByb3Rh dGlvbjsKPiAgCWJvb2wgaW5fdXNlOwo+ICAKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXIgY3Z0 Owo+ICsKPiAgCXN0cnVjdCBpcHVfaWNfcHJpdiAqcHJpdjsKPiAgfTsKPiAgCj4gQEAgLTYxOSw3 ICs4MTAsNyBAQCBpbnQgaXB1X2ljX3Rhc2tfaWRtYV9pbml0KHN0cnVjdCBpcHVfaWMgKmljLCBz dHJ1Y3QgaXB1djNfY2hhbm5lbCAqY2hhbm5lbCwKPiAgCWlwdV9pY193cml0ZShpYywgaWNfaWRt YWNfMiwgSUNfSURNQUNfMik7Cj4gIAlpcHVfaWNfd3JpdGUoaWMsIGljX2lkbWFjXzMsIElDX0lE TUFDXzMpOwo+ICAKPiAtCWlmIChyb3QgPj0gSVBVX1JPVEFURV85MF9SSUdIVCkKPiArCWlmIChp cHVfcm90X21vZGVfaXNfaXJ0KHJvdCkpCj4gIAkJaWMtPnJvdGF0aW9uID0gdHJ1ZTsKPiAgCj4g IHVubG9jazoKPiBAQCAtNjQ4LDYgKzgzOSwxNDg3IEBAIHN0YXRpYyB2b2lkIGlwdV9pcnRfZGlz YWJsZShzdHJ1Y3QgaXB1X2ljICppYykKPiAgCX0KPiAgfQo+ICAKPiArLyoKPiArICogQ29tcGxl dGUgaW1hZ2UgY29udmVyc2lvbiBzdXBwb3J0IGZvbGxvd3MKPiArICovCj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGlwdV9pY19waXhmbXQgaXB1X2ljX2Zvcm1hdHNbXSA9IHsKPiArCXsKPiAr CQkubmFtZQk9ICJSR0I1NjUiLAoKUGxlYXNlIGRyb3AgdGhlIG5hbWVzLCBrZWVwaW5nIGEgbGlz dCBvZiB1c2VyIHJlYWRhYmxlIGZvcm1hdCBuYW1lcyBpcwp0aGUgdjRsMiBjb3JlJ3MgYnVzaW5l c3MsIG5vdCBvdXJzLgoKPiArCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKPiArCQku YnBwICAgID0gMTYsCgpicHAgaXMgb25seSBldmVyIHVzZWQgaW4gYnl0ZXMsIG5vdCBiaXRzIChh bHdheXMgZGl2aWRlZCBieSA4KS4KV2h5IG5vdCBtYWtlIHRoaXMgYnl0ZXNfcGVyX3BpeGVsIG9y IHBpeGVsX3N0cmlkZSA9IDIuCgo+ICsJfSwgewo+ICsJCS5uYW1lCT0gIlJHQjI0IiwKPiArCQku Zm91cmNjCT0gVjRMMl9QSVhfRk1UX1JHQjI0LAo+ICsJCS5icHAgICAgPSAyNCwKPiArCX0sIHsK PiArCQkubmFtZQk9ICJCR1IyNCIsCj4gKwkJLmZvdXJjYwk9IFY0TDJfUElYX0ZNVF9CR1IyNCwK PiArCQkuYnBwICAgID0gMjQsCj4gKwl9LCB7Cj4gKwkJLm5hbWUJPSAiUkdCMzIiLAo+ICsJCS5m b3VyY2MJPSBWNEwyX1BJWF9GTVRfUkdCMzIsCj4gKwkJLmJwcCAgICA9IDMyLAo+ICsJfSwgewo+ ICsJCS5uYW1lCT0gIkJHUjMyIiwKPiArCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX0JHUjMyLAo+ ICsJCS5icHAgICAgPSAzMiwKPiArCX0sIHsKPiArCQkubmFtZQk9ICI0OjI6MiBwYWNrZWQsIFlV WVYiLAo+ICsJCS5mb3VyY2MJPSBWNEwyX1BJWF9GTVRfWVVZViwKPiArCQkuYnBwICAgID0gMTYs Cj4gKwkJLnV2X3dpZHRoX2RlYyA9IDIsCj4gKwkJLnV2X2hlaWdodF9kZWMgPSAxLAo+ICsJfSwg ewo+ICsJCS5uYW1lCT0gIjQ6MjoyIHBhY2tlZCwgVVlWWSIsCj4gKwkJLmZvdXJjYwk9IFY0TDJf UElYX0ZNVF9VWVZZLAo+ICsJCS5icHAgICAgPSAxNiwKPiArCQkudXZfd2lkdGhfZGVjID0gMiwK PiArCQkudXZfaGVpZ2h0X2RlYyA9IDEsCj4gKwl9LCB7Cj4gKwkJLm5hbWUJPSAiNDoyOjAgcGxh bmFyLCBZVVYiLAo+ICsJCS5mb3VyY2MJPSBWNEwyX1BJWF9GTVRfWVVWNDIwLAo+ICsJCS5icHAg ICAgPSAxMiwKPiArCQkueV9kZXB0aCA9IDgsCgp5X2RlcHRoIGlzIG9ubHkgZXZlciB1c2VkIGlu IGJ5dGVzLCBub3QgYml0cyAoYWx3YXlzIGRpdmlkZWQgYnkgOCkuCldoeSBub3QgbWFrZSB0aGlz IGJvb2wgcGxhbmFyIGluc3RlYWQuCgo+ICsJCS51dl93aWR0aF9kZWMgPSAyLAo+ICsJCS51dl9o ZWlnaHRfZGVjID0gMiwKPiArCX0sIHsKPiArCQkubmFtZQk9ICI0OjI6MCBwbGFuYXIsIFlWVSIs Cj4gKwkJLmZvdXJjYwk9IFY0TDJfUElYX0ZNVF9ZVlU0MjAsCj4gKwkJLmJwcCAgICA9IDEyLAo+ ICsJCS55X2RlcHRoID0gOCwKPiArCQkudXZfd2lkdGhfZGVjID0gMiwKPiArCQkudXZfaGVpZ2h0 X2RlYyA9IDIsCj4gKwkJLnV2X3N3YXBwZWQgPSB0cnVlLAo+ICsJfSwgewo+ICsJCS5uYW1lICAg PSAiNDoyOjAgcGFydGlhbCBwbGFuYXIsIE5WMTIiLAo+ICsJCS5mb3VyY2MgPSBWNEwyX1BJWF9G TVRfTlYxMiwKPiArCQkuYnBwICAgID0gMTIsCj4gKwkJLnlfZGVwdGggPSA4LAo+ICsJCS51dl93 aWR0aF9kZWMgPSAyLAo+ICsJCS51dl9oZWlnaHRfZGVjID0gMiwKPiArCQkudXZfcGFja2VkID0g dHJ1ZSwKPiArCX0sIHsKPiArCQkubmFtZSAgID0gIjQ6MjoyIHBsYW5hciwgWVVWIiwKPiArCQku Zm91cmNjID0gVjRMMl9QSVhfRk1UX1lVVjQyMlAsCj4gKwkJLmJwcCAgICA9IDE2LAo+ICsJCS55 X2RlcHRoID0gOCwKPiArCQkudXZfd2lkdGhfZGVjID0gMiwKPiArCQkudXZfaGVpZ2h0X2RlYyA9 IDEsCj4gKwl9LCB7Cj4gKwkJLm5hbWUgICA9ICI0OjI6MiBwYXJ0aWFsIHBsYW5hciwgTlYxNiIs Cj4gKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjE2LAo+ICsJCS5icHAgICAgPSAxNiwKPiAr CQkueV9kZXB0aCA9IDgsCj4gKwkJLnV2X3dpZHRoX2RlYyA9IDIsCj4gKwkJLnV2X2hlaWdodF9k ZWMgPSAxLAo+ICsJCS51dl9wYWNrZWQgPSB0cnVlLAo+ICsJfSwKPiArfTsKPiArCj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3QgaXB1X2ljX3BpeGZtdCAqaXB1X2ljX2dldF9mb3JtYXQodTMyIGZvdXJj YykKPiArewo+ICsJY29uc3Qgc3RydWN0IGlwdV9pY19waXhmbXQgKnJldCA9IE5VTEw7Cj4gKwl1 bnNpZ25lZCBpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcHVfaWNf Zm9ybWF0cyk7IGkrKykgewo+ICsJCWlmIChpcHVfaWNfZm9ybWF0c1tpXS5mb3VyY2MgPT0gZm91 cmNjKSB7Cj4gKwkJCXJldCA9ICZpcHVfaWNfZm9ybWF0c1tpXTsKPiArCQkJYnJlYWs7Cj4gKwkJ fQo+ICsJfQo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGlwdV9p Y19kdW1wX2Zvcm1hdChzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4LAo+ICsJCQkgICAg ICAgc3RydWN0IGlwdV9pY19pbWFnZSAqaWNfaW1hZ2UpCj4gK3sKPiArCXN0cnVjdCBpcHVfaWNf cHJpdiAqcHJpdiA9IGN0eC0+Y3Z0LT5pYy0+cHJpdjsKPiArCj4gKwlkZXZfZGJnKHByaXYtPmlw dS0+ZGV2LAo+ICsJCSJjdHggJXA6ICVzIGZvcm1hdDogJWR4JWQgKCVkeCVkIHRpbGVzIG9mIHNp emUgJWR4JWQpLCAlYyVjJWMlY1xuIiwKPiArCQljdHgsCj4gKwkJaWNfaW1hZ2UtPnR5cGUgPT0g SU1BR0VfQ09OVkVSVF9PVVQgPyAiT3V0cHV0IiA6ICJJbnB1dCIsCj4gKwkJaWNfaW1hZ2UtPmJh c2UucGl4LndpZHRoLCBpY19pbWFnZS0+YmFzZS5waXguaGVpZ2h0LAo+ICsJCWljX2ltYWdlLT5u dW1fY29scywgaWNfaW1hZ2UtPm51bV9yb3dzLAo+ICsJCWljX2ltYWdlLT50aWxlWzBdLndpZHRo LCBpY19pbWFnZS0+dGlsZVswXS5oZWlnaHQsCj4gKwkJaWNfaW1hZ2UtPmZtdC0+Zm91cmNjICYg MHhmZiwKPiArCQkoaWNfaW1hZ2UtPmZtdC0+Zm91cmNjID4+IDgpICYgMHhmZiwKPiArCQkoaWNf aW1hZ2UtPmZtdC0+Zm91cmNjID4+IDE2KSAmIDB4ZmYsCj4gKwkJKGljX2ltYWdlLT5mbXQtPmZv dXJjYyA+PiAyNCkgJiAweGZmKTsKPiArfQo+ICsKPiAraW50IGlwdV9pbWFnZV9jb252ZXJ0X2Vu dW1fZm9ybWF0KGludCBpbmRleCwgY29uc3QgY2hhciAqKmRlc2MsIHUzMiAqZm91cmNjKQo+ICt7 Cj4gKwljb25zdCBzdHJ1Y3QgaXB1X2ljX3BpeGZtdCAqZm10Owo+ICsKPiArCWlmIChpbmRleCA+ PSAoaW50KUFSUkFZX1NJWkUoaXB1X2ljX2Zvcm1hdHMpKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ ICsKPiArCS8qIEZvcm1hdCBmb3VuZCAqLwo+ICsJZm10ID0gJmlwdV9pY19mb3JtYXRzW2luZGV4 XTsKPiArCSpkZXNjID0gZm10LT5uYW1lOwo+ICsJKmZvdXJjYyA9IGZtdC0+Zm91cmNjOwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwoaXB1X2ltYWdlX2NvbnZlcnRfZW51 bV9mb3JtYXQpOwo+ICsKPiArc3RhdGljIHZvaWQgaXB1X2ljX2ZyZWVfZG1hX2J1ZihzdHJ1Y3Qg aXB1X2ljX3ByaXYgKnByaXYsCj4gKwkJCQlzdHJ1Y3QgaXB1X2ljX2RtYV9idWYgKmJ1ZikKPiAr ewo+ICsJaWYgKGJ1Zi0+dmlydCkKPiArCQlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5pcHUtPmRl diwKPiArCQkJCSAgYnVmLT5sZW4sIGJ1Zi0+dmlydCwgYnVmLT5waHlzKTsKPiArCWJ1Zi0+dmly dCA9IE5VTEw7Cj4gKwlidWYtPnBoeXMgPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGlwdV9p Y19hbGxvY19kbWFfYnVmKHN0cnVjdCBpcHVfaWNfcHJpdiAqcHJpdiwKPiArCQkJCXN0cnVjdCBp cHVfaWNfZG1hX2J1ZiAqYnVmLAo+ICsJCQkJaW50IHNpemUpCj4gK3sKPiArCXVuc2lnbmVkIGxv bmcgbmV3bGVuID0gUEFHRV9BTElHTihzaXplKTsKPiArCj4gKwlpZiAoYnVmLT52aXJ0KSB7Cj4g KwkJaWYgKGJ1Zi0+bGVuID09IG5ld2xlbikKPiArCQkJcmV0dXJuIDA7Cj4gKwkJaXB1X2ljX2Zy ZWVfZG1hX2J1Zihwcml2LCBidWYpOwo+ICsJfQoKSXMgaXQgbmVjZXNzYXJ5IHRvIHN1cHBvcnQg cmVhbGxvY2F0aW9uPyBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkKdGhlIHByZXBhcmUg ZnVuY3Rpb24sIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29udGV4dC4KCj4gKwo+ICsJYnVmLT5sZW4g PSBuZXdsZW47Cj4gKwlidWYtPnZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQocHJpdi0+aXB1LT5k ZXYsIGJ1Zi0+bGVuLCAmYnVmLT5waHlzLAo+ICsJCQkJICAgICAgIEdGUF9ETUEgfCBHRlBfS0VS TkVMKTsKPiArCWlmICghYnVmLT52aXJ0KSB7Cj4gKwkJZGV2X2Vycihwcml2LT5pcHUtPmRldiwg ImZhaWxlZCB0byBhbGxvYyBkbWEgYnVmZmVyXG4iKTsKPiArCQlyZXR1cm4gLUVOT01FTTsKPiAr CX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgaXB1X2lj X251bV9zdHJpcGVzKGludCBkaW0pCj4gK3sKPiArCWlmIChkaW0gPD0gMTAyNCkKPiArCQlyZXR1 cm4gMTsKPiArCWVsc2UgaWYgKGRpbSA8PSAyMDQ4KQo+ICsJCXJldHVybiAyOwo+ICsJZWxzZQo+ ICsJCXJldHVybiA0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpcHVfaWNfY2FsY190aWxlX2Rp bWVuc2lvbnMoc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKmN0eCwKPiArCQkJCQlzdHJ1Y3Qg aXB1X2ljX2ltYWdlICppbWFnZSkKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsg aSA8IGN0eC0+bnVtX3RpbGVzOyBpKyspIHsKPiArCQlzdHJ1Y3QgaXB1X2ljX3RpbGUgKnRpbGUg PSAmaW1hZ2UtPnRpbGVbaV07Cj4gKwo+ICsJCXRpbGUtPmhlaWdodCA9IGltYWdlLT5iYXNlLnBp eC5oZWlnaHQgLyBpbWFnZS0+bnVtX3Jvd3M7Cj4gKwkJdGlsZS0+d2lkdGggPSBpbWFnZS0+YmFz ZS5waXgud2lkdGggLyBpbWFnZS0+bnVtX2NvbHM7CgpXZSBhbHJlYWR5IGhhdmUgdGFsa2VkIGFi b3V0IHRoaXMsIHRoaXMgc2ltcGxpZmllZCB0aWxpbmcgd2lsbCBjYXVzZQppbWFnZSBhcnRpZmFj dHMgKGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHNlYW1zIGF0IHRoZSB0aWxlIGJvcmRlcnMpIHdo ZW4KdGhlIGJpbGluZWFyIHVwc2NhbGVyIHNvdXJjZSBwaXhlbCBzdGVwIGlzIHNpZ25pZmljYW50 bHkgc21hbGxlciB0aGFuIGEKd2hvbGUgcGl4ZWwuClRoaXMgY2FuIGJlIGZpeGVkIGluIHRoZSBm dXR1cmUgYnkgdXNpbmcgb3ZlcmxhcHBpbmcgdGlsZXMgb2YgZGlmZmVyZW50CnNpemVzIGFuZCBw b3NzaWJseSBieSBzbGlnaHRseSBjaGFuZ2luZyB0aGUgc2NhbGluZyBmYWN0b3JzIG9mCmluZGl2 aWR1YWwgdGlsZXMuCgo+ICsJCXRpbGUtPnNpemUgPSAoKHRpbGUtPmhlaWdodCAqIGltYWdlLT5m bXQtPmJwcCkgPj4gMykgKgo+ICsJCQl0aWxlLT53aWR0aDsKPiArCj4gKwkJaWYgKGltYWdlLT5m bXQtPnlfZGVwdGgpIHsKPiArCQkJdGlsZS0+c3RyaWRlID0KPiArCQkJCShpbWFnZS0+Zm10LT55 X2RlcHRoICogdGlsZS0+d2lkdGgpID4+IDM7Cj4gKwkJCXRpbGUtPnJvdF9zdHJpZGUgPQo+ICsJ CQkJKGltYWdlLT5mbXQtPnlfZGVwdGggKiB0aWxlLT5oZWlnaHQpID4+IDM7Cj4gKwkJfSBlbHNl IHsKPiArCQkJdGlsZS0+c3RyaWRlID0KPiArCQkJCShpbWFnZS0+Zm10LT5icHAgKiB0aWxlLT53 aWR0aCkgPj4gMzsKPiArCQkJdGlsZS0+cm90X3N0cmlkZSA9Cj4gKwkJCQkoaW1hZ2UtPmZtdC0+ YnBwICogdGlsZS0+aGVpZ2h0KSA+PiAzOwo+ICsJCX0KPiArCX0KPiArfQo+ICsKPiArLyoKPiAr ICogVXNlIHRoZSByb3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiB0byBmaW5kIHRoZSB0aWxlIGNvb3Jk aW5hdGVzCj4gKyAqIChyb3csIGNvbCkgb2YgYSB0aWxlIGluIHRoZSBkZXN0aW5hdGlvbiBmcmFt ZSB0aGF0IGNvcnJlc3BvbmRzCj4gKyAqIHRvIHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIG9m IGEgc291cmNlIGZyYW1lLiBUaGUgZGVzdGluYXRpb24KPiArICogY29vcmRpbmF0ZSBpcyB0aGVu IGNvbnZlcnRlZCB0byBhIHRpbGUgaW5kZXguCj4gKyAqLwo+ICtzdGF0aWMgaW50IGlwdV9pY190 cmFuc2Zvcm1fdGlsZV9pbmRleChzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4LAo+ICsJ CQkJICAgICAgIGludCBzcmNfcm93LCBpbnQgc3JjX2NvbCkKPiArewo+ICsJc3RydWN0IGlwdV9p Y19wcml2ICpwcml2ID0gY3R4LT5jdnQtPmljLT5wcml2Owo+ICsJc3RydWN0IGlwdV9pY19pbWFn ZSAqc19pbWFnZSA9ICZjdHgtPmluOwo+ICsJc3RydWN0IGlwdV9pY19pbWFnZSAqZF9pbWFnZSA9 ICZjdHgtPm91dDsKPiArCWludCBjb3MsIHNpbiwgZHN0X3JvdywgZHN0X2NvbDsKPiArCj4gKwkv KiB3aXRoIG5vIHJvdGF0aW9uIGl0J3MgYSAxOjEgbWFwcGluZyAqLwo+ICsJaWYgKGN0eC0+cm90 X21vZGUgPT0gSVBVX1JPVEFURV9OT05FKQo+ICsJCXJldHVybiBzcmNfcm93ICogc19pbWFnZS0+ bnVtX2NvbHMgKyBzcmNfY29sOwo+ICsKPiArCWlmIChjdHgtPnJvdF9tb2RlICYgSVBVX1JPVF9C SVRfOTApIHsKPiArCQljb3MgPSAwOwo+ICsJCXNpbiA9IDE7Cj4gKwl9IGVsc2Ugewo+ICsJCWNv cyA9IDE7Cj4gKwkJc2luID0gMDsKPiArCX0KPisKPiArCS8qCj4gKwkgKiBiZWZvcmUgZG9pbmcg dGhlIHRyYW5zZm9ybSwgZmlyc3Qgd2UgaGF2ZSB0byB0cmFuc2xhdGUKPiArCSAqIHNvdXJjZSBy b3csY29sIGZvciBhbiBvcmlnaW4gaW4gdGhlIGNlbnRlciBvZiBzX2ltYWdlCj4gKwkgKi8KPiAr CXNyY19yb3cgKj0gMjsKPiArCXNyY19jb2wgKj0gMjsKPiArCXNyY19yb3cgLT0gc19pbWFnZS0+ bnVtX3Jvd3MgLSAxOwo+ICsJc3JjX2NvbCAtPSBzX2ltYWdlLT5udW1fY29scyAtIDE7Cj4gKwo+ ICsJLyogZG8gdGhlIHJvdGF0aW9uIHRyYW5zZm9ybSAqLwo+ICsJZHN0X2NvbCA9IHNyY19jb2wg KiBjb3MgLSBzcmNfcm93ICogc2luOwo+ICsJZHN0X3JvdyA9IHNyY19jb2wgKiBzaW4gKyBzcmNf cm93ICogY29zOwoKVGhpcyBsb29rcyBuaWNlLCBidXQgSSdkIGp1c3QgbW92ZSB0aGUgcm90X21v ZGUgY29uZGl0aW9uYWwgYmVsb3cKYXNzaWdubWVudCBvZiBzcmNfcm93L2NvbCBhbmQgZG8gYXdh eSB3aXRoIHRoZSBzaW4vY29zIHRlbXBvcmFyeQp2YXJpYWJsZXM6CgoJLyoKCSAqIGJlZm9yZSBk b2luZyB0aGUgdHJhbnNmb3JtLCBmaXJzdCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZQoJICogc291cmNl IHJvdyxjb2wgZm9yIGFuIG9yaWdpbiBpbiB0aGUgY2VudGVyIG9mIHNfaW1hZ2UKCSAqLwoJc3Jj X3JvdyA9IHNyY19yb3cgKiAyIC0gKHNfaW1hZ2UtPm51bV9yb3dzIC0gMSk7CglzcmNfY29sID0g c3JjX2NvbCAqIDIgLSAoc19pbWFnZS0+bnVtX2NvbHMgLSAxKTsKCgkvKiBkbyB0aGUgcm90YXRp b24gdHJhbnNmb3JtICovCglpZiAoY3R4LT5yb3RfbW9kZSAmIElQVV9ST1RfQklUXzkwKSB7CgkJ ZHN0X2NvbCA9IC1zcmNfcm93OwoJCWRzdF9yb3cgPSBzcmNfY29sOwoJfSBlbHNlIHsKCQlkc3Rf Y29sID0gc3JjX2NvbDsKCQlkc3Rfcm93ID0gc3JjX3JvdzsKCX0KCj4gKwkvKiBhcHBseSBmbGlw ICovCj4gKwlpZiAoY3R4LT5yb3RfbW9kZSAmIElQVV9ST1RfQklUX0hGTElQKQo+ICsJCWRzdF9j b2wgPSAtZHN0X2NvbDsKPiArCWlmIChjdHgtPnJvdF9tb2RlICYgSVBVX1JPVF9CSVRfVkZMSVAp Cj4gKwkJZHN0X3JvdyA9IC1kc3Rfcm93Owo+ICsKPiArCWRldl9kYmcocHJpdi0+aXB1LT5kZXYs ICJjdHggJXA6IFslZCwlZF0gLS0+IFslZCwlZF1cbiIsCj4gKwkJY3R4LCBzcmNfY29sLCBzcmNf cm93LCBkc3RfY29sLCBkc3Rfcm93KTsKPiArCj4gKwkvKgo+ICsJICogZmluYWxseSB0cmFuc2xh dGUgZGVzdCByb3csY29sIHVzaW5nIGFuIG9yaWdpbiBpbiB1cHBlcgo+ICsJICogbGVmdCBvZiBk X2ltYWdlCj4gKwkgKi8KPiArCWRzdF9yb3cgKz0gZF9pbWFnZS0+bnVtX3Jvd3MgLSAxOwo+ICsJ ZHN0X2NvbCArPSBkX2ltYWdlLT5udW1fY29scyAtIDE7Cj4gKwlkc3Rfcm93IC89IDI7Cj4gKwlk c3RfY29sIC89IDI7Cj4gKwo+ICsJcmV0dXJuIGRzdF9yb3cgKiBkX2ltYWdlLT5udW1fY29scyAr IGRzdF9jb2w7Cj4gK30KPiArCj4gKy8qCj4gKyAqIEZpbGwgdGhlIG91dF90aWxlX21hcFtdIHdp dGggdHJhbnNmb3JtZWQgZGVzdGluYXRpb24gdGlsZSBpbmRlY2VzLgo+ICsgKi8KPiArc3RhdGlj IHZvaWQgaXB1X2ljX2NhbGNfb3V0X3RpbGVfbWFwKHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4 ICpjdHgpCj4gK3sKPiArCXN0cnVjdCBpcHVfaWNfaW1hZ2UgKnNfaW1hZ2UgPSAmY3R4LT5pbjsK PiArCXVuc2lnbmVkIGludCByb3csIGNvbCwgdGlsZSA9IDA7Cj4gKwo+ICsJZm9yIChyb3cgPSAw OyByb3cgPCBzX2ltYWdlLT5udW1fcm93czsgcm93KyspIHsKPiArCQlmb3IgKGNvbCA9IDA7IGNv bCA8IHNfaW1hZ2UtPm51bV9jb2xzOyBjb2wrKykgewo+ICsJCQljdHgtPm91dF90aWxlX21hcFt0 aWxlXSA9Cj4gKwkJCQlpcHVfaWNfdHJhbnNmb3JtX3RpbGVfaW5kZXgoY3R4LCByb3csIGNvbCk7 Cj4gKwkJCXRpbGUrKzsKPiArCQl9Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGlwdV9p Y19jYWxjX3RpbGVfb2Zmc2V0c19wbGFuYXIoc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKmN0 eCwKPiArCQkJCQkgICAgc3RydWN0IGlwdV9pY19pbWFnZSAqaW1hZ2UpCj4gK3sKPiArCXN0cnVj dCBpcHVfaWNfcHJpdiAqcHJpdiA9IGN0eC0+Y3Z0LT5pYy0+cHJpdjsKPiArCWNvbnN0IHN0cnVj dCBpcHVfaWNfcGl4Zm10ICpmbXQgPSBpbWFnZS0+Zm10Owo+ICsJdW5zaWduZWQgaW50IHJvdywg Y29sLCB0aWxlID0gMDsKPiArCXUzMiBILCB3LCBoLCB5X2RlcHRoLCB5X3N0cmlkZSwgdXZfc3Ry aWRlOwo+ICsJdTMyIHV2X3Jvd19vZmYsIHV2X2NvbF9vZmYsIHV2X29mZiwgdV9vZmYsIHZfb2Zm LCB0bXA7Cj4gKwl1MzIgeV9yb3dfb2ZmLCB5X2NvbF9vZmYsIHlfb2ZmOwo+ICsJdTMyIHlfc2l6 ZSwgdXZfc2l6ZTsKPiArCj4gKwkvKiBzZXR1cCBzb21lIGNvbnZlbmllbmNlIHZhcnMgKi8KPiAr CUggPSBpbWFnZS0+YmFzZS5waXguaGVpZ2h0Owo+ICsKPiArCXlfZGVwdGggPSBmbXQtPnlfZGVw dGg7Cj4gKwl5X3N0cmlkZSA9IGltYWdlLT5zdHJpZGU7Cj4gKwl1dl9zdHJpZGUgPSB5X3N0cmlk ZSAvIGZtdC0+dXZfd2lkdGhfZGVjOwo+ICsJaWYgKGZtdC0+dXZfcGFja2VkKQo+ICsJCXV2X3N0 cmlkZSAqPSAyOwo+ICsKPiArCXlfc2l6ZSA9IEggKiB5X3N0cmlkZTsKPiArCXV2X3NpemUgPSB5 X3NpemUgLyAoZm10LT51dl93aWR0aF9kZWMgKiBmbXQtPnV2X2hlaWdodF9kZWMpOwo+ICsKPiAr CWZvciAocm93ID0gMDsgcm93IDwgaW1hZ2UtPm51bV9yb3dzOyByb3crKykgewo+ICsJCXcgPSBp bWFnZS0+dGlsZVt0aWxlXS53aWR0aDsKPiArCQloID0gaW1hZ2UtPnRpbGVbdGlsZV0uaGVpZ2h0 Owo+ICsJCXlfcm93X29mZiA9IHJvdyAqIGggKiB5X3N0cmlkZTsKPiArCQl1dl9yb3dfb2ZmID0g KHJvdyAqIGggKiB1dl9zdHJpZGUpIC8gZm10LT51dl9oZWlnaHRfZGVjOwo+ICsKPiArCQlmb3Ig KGNvbCA9IDA7IGNvbCA8IGltYWdlLT5udW1fY29sczsgY29sKyspIHsKPiArCQkJeV9jb2xfb2Zm ID0gKGNvbCAqIHcgKiB5X2RlcHRoKSA+PiAzOwoKV2Uga25vdyB0aGF0IGZvciBwbGFuYXIgZm9y bWF0cywgeV9kZXB0aCBjYW4gb25seSBldmVyIGJlIDguIE5vIG5lZWQgdG8KY2FsY3VsYXRlIHRo aXMgaGVyZS4KCj4gKwkJCXV2X2NvbF9vZmYgPSB5X2NvbF9vZmYgLyBmbXQtPnV2X3dpZHRoX2Rl YzsKPiArCQkJaWYgKGZtdC0+dXZfcGFja2VkKQo+ICsJCQkJdXZfY29sX29mZiAqPSAyOwo+ICsK PiArCQkJeV9vZmYgPSB5X3Jvd19vZmYgKyB5X2NvbF9vZmY7Cj4gKwkJCXV2X29mZiA9IHV2X3Jv d19vZmYgKyB1dl9jb2xfb2ZmOwo+ICsKPiArCQkJdV9vZmYgPSB5X3NpemUgLSB5X29mZiArIHV2 X29mZjsKPiArCQkJdl9vZmYgPSAoZm10LT51dl9wYWNrZWQpID8gMCA6IHVfb2ZmICsgdXZfc2l6 ZTsKPiArCQkJaWYgKGZtdC0+dXZfc3dhcHBlZCkgewo+ICsJCQkJdG1wID0gdV9vZmY7Cj4gKwkJ CQl1X29mZiA9IHZfb2ZmOwo+ICsJCQkJdl9vZmYgPSB0bXA7Cj4gKwkJCX0KPiArCj4gKwkJCWlt YWdlLT50aWxlW3RpbGVdLm9mZnNldCA9IHlfb2ZmOwo+ICsJCQlpbWFnZS0+dGlsZVt0aWxlXS51 X29mZiA9IHVfb2ZmOwo+ICsJCQlpbWFnZS0+dGlsZVt0aWxlKytdLnZfb2ZmID0gdl9vZmY7Cj4g Kwo+ICsJCQlkZXZfZGJnKHByaXYtPmlwdS0+ZGV2LAo+ICsJCQkJImN0eCAlcDogJXNAWyVkLCVk XTogeV9vZmYgJTA4eCwgdV9vZmYgJTA4eCwgdl9vZmYgJTA4eFxuIiwKPiArCQkJCWN0eCwgaW1h Z2UtPnR5cGUgPT0gSU1BR0VfQ09OVkVSVF9JTiA/Cj4gKwkJCQkiSW5wdXQiIDogIk91dHB1dCIs IHJvdywgY29sLAo+ICsJCQkJeV9vZmYsIHVfb2ZmLCB2X29mZik7Cj4gKwkJfQo+ICsJfQo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBpcHVfaWNfY2FsY190aWxlX29mZnNldHNfcGFja2VkKHN0cnVj dCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICpjdHgsCj4gKwkJCQkJICAgIHN0cnVjdCBpcHVfaWNfaW1h Z2UgKmltYWdlKQo+ICt7Cj4gKwlzdHJ1Y3QgaXB1X2ljX3ByaXYgKnByaXYgPSBjdHgtPmN2dC0+ aWMtPnByaXY7Cj4gKwljb25zdCBzdHJ1Y3QgaXB1X2ljX3BpeGZtdCAqZm10ID0gaW1hZ2UtPmZt dDsKPiArCXVuc2lnbmVkIGludCByb3csIGNvbCwgdGlsZSA9IDA7Cj4gKwl1MzIgdywgaCwgYnBw LCBzdHJpZGU7Cj4gKwl1MzIgcm93X29mZiwgY29sX29mZjsKPiArCj4gKwkvKiBzZXR1cCBzb21l IGNvbnZlbmllbmNlIHZhcnMgKi8KPiArCXN0cmlkZSA9IGltYWdlLT5zdHJpZGU7Cj4gKwlicHAg PSBmbXQtPmJwcDsKPiArCj4gKwlmb3IgKHJvdyA9IDA7IHJvdyA8IGltYWdlLT5udW1fcm93czsg cm93KyspIHsKPiArCQl3ID0gaW1hZ2UtPnRpbGVbdGlsZV0ud2lkdGg7Cj4gKwkJaCA9IGltYWdl LT50aWxlW3RpbGVdLmhlaWdodDsKPiArCQlyb3dfb2ZmID0gcm93ICogaCAqIHN0cmlkZTsKPiAr Cj4gKwkJZm9yIChjb2wgPSAwOyBjb2wgPCBpbWFnZS0+bnVtX2NvbHM7IGNvbCsrKSB7Cj4gKwkJ CWNvbF9vZmYgPSAoY29sICogdyAqIGJwcCkgPj4gMzsKPiArCj4gKwkJCWltYWdlLT50aWxlW3Rp bGVdLm9mZnNldCA9IHJvd19vZmYgKyBjb2xfb2ZmOwo+ICsJCQlpbWFnZS0+dGlsZVt0aWxlXS51 X29mZiA9IDA7Cj4gKwkJCWltYWdlLT50aWxlW3RpbGUrK10udl9vZmYgPSAwOwo+ICsKPiArCQkJ ZGV2X2RiZyhwcml2LT5pcHUtPmRldiwKPiArCQkJCSJjdHggJXA6ICVzQFslZCwlZF06IHBoeXMg JTA4eFxuIiwgY3R4LAo+ICsJCQkJaW1hZ2UtPnR5cGUgPT0gSU1BR0VfQ09OVkVSVF9JTiA/Cj4g KwkJCQkiSW5wdXQiIDogIk91dHB1dCIsIHJvdywgY29sLAo+ICsJCQkJcm93X29mZiArIGNvbF9v ZmYpOwo+ICsJCX0KPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaXB1X2ljX2NhbGNfdGls ZV9vZmZzZXRzKHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICpjdHgsCj4gKwkJCQkgICAgIHN0 cnVjdCBpcHVfaWNfaW1hZ2UgKmltYWdlKQo+ICt7Cj4gKwlpZiAoaW1hZ2UtPmZtdC0+eV9kZXB0 aCkKPiArCQlpcHVfaWNfY2FsY190aWxlX29mZnNldHNfcGxhbmFyKGN0eCwgaW1hZ2UpOwo+ICsJ ZWxzZQo+ICsJCWlwdV9pY19jYWxjX3RpbGVfb2Zmc2V0c19wYWNrZWQoY3R4LCBpbWFnZSk7Cj4g K30KPiArCj4gKy8qCj4gKyAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHJ1bnMgaW4gZ2l2ZW4gcXVl dWUgKHBlbmRpbmdfcSBvciBkb25lX3EpCj4gKyAqIGZvciB0aGlzIGNvbnRleHQuIGhvbGQgaXJx bG9jayB3aGVuIGNhbGxpbmcuCj4gKyAqLwoKTW9zdCBvZiB0aGUgZm9sbG93aW5nIGNvZGUgc2Vl bXMgdG8gYmUgcnVubmluZyB1bmRlciBvbmUgYmlnIHNwaW5sb2NrLgpJcyB0aGlzIHJlYWxseSBu ZWNlc3Nhcnk/CkFsbCB0aGUgSVJRIGhhbmRsZXJzIHRvIGlzIHBvdGVudGlhbGx5IGNhbGwgaXB1 X2ljX2NvbnZlcnRfc3RvcCwgdXBkYXRlCnRoZSBDUE1FTSwgbWFyayBidWZmZXJzIGFzIHJlYWR5 IGZvciB0aGUgSURNQUMsIGFuZCBhbmQgcHV0IHRoZSBjdXJyZW50CnJ1biBvbiB0aGUgZG9uZV9x IHdoZW4gcmVhZHkuIENhbid0IHRoZSBJQy9JRE1BQyByZWdpc3RlciBhY2Nlc3MgYmUKbG9ja2Vk IGNvbXBsZXRlbHkgc2VwYXJhdGVseSBmcm9tIHRoZSBsaXN0IGhhbmRsaW5nPwoKPiArc3RhdGlj IGludCBpcHVfaWNfZ2V0X3J1bl9jb3VudChzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4 LAo+ICsJCQkJc3RydWN0IGxpc3RfaGVhZCAqcSkKPiArewo+ICsJc3RydWN0IGltYWdlX2NvbnZl cnRlcl9ydW4gKnJ1bjsKPiArCWludCBjb3VudCA9IDA7CgpBZGQKCWxvY2tkZXBfYXNzZXJ0X2hl bGQoJmN0eC0+aXJxbG9jayk7CmZvciB0aGUgZnVuY3Rpb25zIHRoYXQgZXhwZWN0IHRoZWlyIGNh bGxlciB0byBiZSBob2xkaW5nIHRoZSBsb2NrLgoKPiArCWxpc3RfZm9yX2VhY2hfZW50cnkocnVu LCBxLCBsaXN0KSB7Cj4gKwkJaWYgKHJ1bi0+Y3R4ID09IGN0eCkKPiArCQkJY291bnQrKzsKPiAr CX0KPiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gKy8qIGhvbGQgaXJxbG9jayB3aGVu IGNhbGxpbmcgKi8KPiArc3RhdGljIHZvaWQgaXB1X2ljX2NvbnZlcnRfc3RvcChzdHJ1Y3QgaW1h Z2VfY29udmVydGVyX3J1biAqcnVuKQo+ICt7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0 eCAqY3R4ID0gcnVuLT5jdHg7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyICpjdnQgPSBjdHgt PmN2dDsKPiArCXN0cnVjdCBpcHVfaWNfcHJpdiAqcHJpdiA9IGN2dC0+aWMtPnByaXY7Cj4gKwo+ ICsJZGV2X2RiZyhwcml2LT5pcHUtPmRldiwgIiVzOiBzdG9wcGluZyBjdHggJXAgcnVuICVwXG4i LAo+ICsJCV9fZnVuY19fLCBjdHgsIHJ1bik7CgpNYXliZSBhZGQgc29tZSBpbmRpY2F0aW9uIHdo aWNoIElDIHRhc2sgdGhpcyBjb250ZXh0IGJlbG9uZ3MgdG8/Cgo+ICsJLyogZGlzYWJsZSBJQyB0 YXNrcyBhbmQgdGhlIGNoYW5uZWxzICovCj4gKwlpcHVfaWNfdGFza19kaXNhYmxlKGN2dC0+aWMp Owo+ICsJaXB1X2lkbWFjX2Rpc2FibGVfY2hhbm5lbChjdnQtPmluX2NoYW4pOwo+ICsJaXB1X2lk bWFjX2Rpc2FibGVfY2hhbm5lbChjdnQtPm91dF9jaGFuKTsKPiArCj4gKwlpZiAoaXB1X3JvdF9t b2RlX2lzX2lydChjdHgtPnJvdF9tb2RlKSkgewo+ICsJCWlwdV9pZG1hY19kaXNhYmxlX2NoYW5u ZWwoY3Z0LT5yb3RhdGlvbl9pbl9jaGFuKTsKPiArCQlpcHVfaWRtYWNfZGlzYWJsZV9jaGFubmVs KGN2dC0+cm90YXRpb25fb3V0X2NoYW4pOwo+ICsJCWlwdV9pZG1hY191bmxpbmsoY3Z0LT5vdXRf Y2hhbiwgY3Z0LT5yb3RhdGlvbl9pbl9jaGFuKTsKPiArCX0KPiArCj4gKwlpcHVfaWNfZGlzYWJs ZShjdnQtPmljKTsKPiArfQo+ICsKPiArLyogaG9sZCBpcnFsb2NrIHdoZW4gY2FsbGluZyAqLwo+ ICtzdGF0aWMgdm9pZCBpbml0X2lkbWFjX2NoYW5uZWwoc3RydWN0IGltYWdlX2NvbnZlcnRlcl9j dHggKmN0eCwKPiArCQkJICAgICAgIHN0cnVjdCBpcHV2M19jaGFubmVsICpjaGFubmVsLAo+ICsJ CQkgICAgICAgc3RydWN0IGlwdV9pY19pbWFnZSAqaW1hZ2UsCj4gKwkJCSAgICAgICBlbnVtIGlw dV9yb3RhdGVfbW9kZSByb3RfbW9kZSwKPiArCQkJICAgICAgIGJvb2wgcm90X3N3YXBfd2lkdGhf aGVpZ2h0KQo+ICt7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyICpjdnQgPSBjdHgtPmN2dDsK PiArCXVuc2lnbmVkIGludCBidXJzdF9zaXplOwo+ICsJdTMyIHdpZHRoLCBoZWlnaHQsIHN0cmlk ZTsKPiArCWRtYV9hZGRyX3QgYWRkcjAsIGFkZHIxID0gMDsKPiArCXN0cnVjdCBpcHVfaW1hZ2Ug dGlsZV9pbWFnZTsKPiArCXVuc2lnbmVkIGludCB0aWxlX2lkeFsyXTsKPiArCj4gKwlpZiAoaW1h Z2UtPnR5cGUgPT0gSU1BR0VfQ09OVkVSVF9PVVQpIHsKPiArCQl0aWxlX2lkeFswXSA9IGN0eC0+ b3V0X3RpbGVfbWFwWzBdOwo+ICsJCXRpbGVfaWR4WzFdID0gY3R4LT5vdXRfdGlsZV9tYXBbMV07 Cj4gKwl9IGVsc2Ugewo+ICsJCXRpbGVfaWR4WzBdID0gMDsKPiArCQl0aWxlX2lkeFsxXSA9IDE7 Cj4gKwl9Cj4gKwo+ICsJaWYgKHJvdF9zd2FwX3dpZHRoX2hlaWdodCkgewo+ICsJCXdpZHRoID0g aW1hZ2UtPnRpbGVbMF0uaGVpZ2h0Owo+ICsJCWhlaWdodCA9IGltYWdlLT50aWxlWzBdLndpZHRo Owo+ICsJCXN0cmlkZSA9IGltYWdlLT50aWxlWzBdLnJvdF9zdHJpZGU7Cj4gKwkJYWRkcjAgPSBj dHgtPnJvdF9pbnRlcm1lZGlhdGVbMF0ucGh5czsKPiArCQlpZiAoY3R4LT5kb3VibGVfYnVmZmVy aW5nKQo+ICsJCQlhZGRyMSA9IGN0eC0+cm90X2ludGVybWVkaWF0ZVsxXS5waHlzOwo+ICsJfSBl bHNlIHsKPiArCQl3aWR0aCA9IGltYWdlLT50aWxlWzBdLndpZHRoOwo+ICsJCWhlaWdodCA9IGlt YWdlLT50aWxlWzBdLmhlaWdodDsKPiArCQlzdHJpZGUgPSBpbWFnZS0+c3RyaWRlOwo+ICsJCWFk ZHIwID0gaW1hZ2UtPmJhc2UucGh5czAgKwo+ICsJCQlpbWFnZS0+dGlsZVt0aWxlX2lkeFswXV0u b2Zmc2V0Owo+ICsJCWlmIChjdHgtPmRvdWJsZV9idWZmZXJpbmcpCj4gKwkJCWFkZHIxID0gaW1h Z2UtPmJhc2UucGh5czAgKwo+ICsJCQkJaW1hZ2UtPnRpbGVbdGlsZV9pZHhbMV1dLm9mZnNldDsK PiArCX0KPiArCj4gKwlpcHVfY3BtZW1femVybyhjaGFubmVsKTsKPiArCj4gKwltZW1zZXQoJnRp bGVfaW1hZ2UsIDAsIHNpemVvZih0aWxlX2ltYWdlKSk7Cj4gKwl0aWxlX2ltYWdlLnBpeC53aWR0 aCA9IHRpbGVfaW1hZ2UucmVjdC53aWR0aCA9IHdpZHRoOwo+ICsJdGlsZV9pbWFnZS5waXguaGVp Z2h0ID0gdGlsZV9pbWFnZS5yZWN0LmhlaWdodCA9IGhlaWdodDsKPiArCXRpbGVfaW1hZ2UucGl4 LmJ5dGVzcGVybGluZSA9IHN0cmlkZTsKPiArCXRpbGVfaW1hZ2UucGl4LnBpeGVsZm9ybWF0ID0g IGltYWdlLT5mbXQtPmZvdXJjYzsKPiArCXRpbGVfaW1hZ2UucGh5czAgPSBhZGRyMDsKPiArCXRp bGVfaW1hZ2UucGh5czEgPSBhZGRyMTsKPiArCWlwdV9jcG1lbV9zZXRfaW1hZ2UoY2hhbm5lbCwg JnRpbGVfaW1hZ2UpOwo+ICsKPiArCWlmIChpbWFnZS0+Zm10LT55X2RlcHRoICYmICFyb3Rfc3dh cF93aWR0aF9oZWlnaHQpCj4gKwkJaXB1X2NwbWVtX3NldF91dl9vZmZzZXQoY2hhbm5lbCwKPiAr CQkJCQlpbWFnZS0+dGlsZVt0aWxlX2lkeFswXV0udV9vZmYsCj4gKwkJCQkJaW1hZ2UtPnRpbGVb dGlsZV9pZHhbMF1dLnZfb2ZmKTsKPiArCj4gKwlpZiAocm90X21vZGUpCj4gKwkJaXB1X2NwbWVt X3NldF9yb3RhdGlvbihjaGFubmVsLCByb3RfbW9kZSk7Cj4gKwo+ICsJaWYgKGNoYW5uZWwgPT0g Y3Z0LT5yb3RhdGlvbl9pbl9jaGFuIHx8Cj4gKwkgICAgY2hhbm5lbCA9PSBjdnQtPnJvdGF0aW9u X291dF9jaGFuKSB7Cj4gKwkJYnVyc3Rfc2l6ZSA9IDg7Cj4gKwkJaXB1X2NwbWVtX3NldF9ibG9j a19tb2RlKGNoYW5uZWwpOwo+ICsJfSBlbHNlCj4gKwkJYnVyc3Rfc2l6ZSA9ICh3aWR0aCAlIDE2 KSA/IDggOiAxNjsKClRoaXMgaXMgZm9yIGxhdGVyLCBidXQgaXQgbWlnaHQgdHVybiBvdXQgdG8g YmUgYmV0dGVyIHRvIGFjY2VwdCBhIGxpdHRsZQpvdmVyZHJhdyBpZiBzdHJpZGUgYWxsb3dzIGZv ciBpdCBhbmQgdXNlIHRoZSBsYXJnZXIgYnVyc3Qgc2l6ZSwKZXNwZWNpYWxseSBmb3Igd2lkZSBp bWFnZXMuCgo+ICsJaXB1X2NwbWVtX3NldF9idXJzdHNpemUoY2hhbm5lbCwgYnVyc3Rfc2l6ZSk7 Cj4gKwo+ICsJaXB1X2ljX3Rhc2tfaWRtYV9pbml0KGN2dC0+aWMsIGNoYW5uZWwsIHdpZHRoLCBo ZWlnaHQsCj4gKwkJCSAgICAgIGJ1cnN0X3NpemUsIHJvdF9tb2RlKTsKPiArCj4gKwlpcHVfY3Bt ZW1fc2V0X2F4aV9pZChjaGFubmVsLCAxKTsKPiArCj4gKwlpcHVfaWRtYWNfc2V0X2RvdWJsZV9i dWZmZXIoY2hhbm5lbCwgY3R4LT5kb3VibGVfYnVmZmVyaW5nKTsKPiArfQo+ICsKPiArLyogaG9s ZCBpcnFsb2NrIHdoZW4gY2FsbGluZyAqLwo+ICtzdGF0aWMgaW50IGlwdV9pY19jb252ZXJ0X3N0 YXJ0KHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfcnVuICpydW4pCj4gK3sKPiArCXN0cnVjdCBpbWFn ZV9jb252ZXJ0ZXJfY3R4ICpjdHggPSBydW4tPmN0eDsKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0 ZXIgKmN2dCA9IGN0eC0+Y3Z0Owo+ICsJc3RydWN0IGlwdV9pY19wcml2ICpwcml2ID0gY3Z0LT5p Yy0+cHJpdjsKPiArCXN0cnVjdCBpcHVfaWNfaW1hZ2UgKnNfaW1hZ2UgPSAmY3R4LT5pbjsKPiAr CXN0cnVjdCBpcHVfaWNfaW1hZ2UgKmRfaW1hZ2UgPSAmY3R4LT5vdXQ7Cj4gKwllbnVtIGlwdV9j b2xvcl9zcGFjZSBzcmNfY3MsIGRlc3RfY3M7Cj4gKwl1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCwg ZGVzdF9oZWlnaHQ7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWRldl9kYmcocHJpdi0+aXB1LT5kZXYs ICIlczogc3RhcnRpbmcgY3R4ICVwIHJ1biAlcFxuIiwKPiArCQlfX2Z1bmNfXywgY3R4LCBydW4p Owo+ICsKPiArCXNyY19jcyA9IGlwdV9waXhlbGZvcm1hdF90b19jb2xvcnNwYWNlKHNfaW1hZ2Ut PmZtdC0+Zm91cmNjKTsKPiArCWRlc3RfY3MgPSBpcHVfcGl4ZWxmb3JtYXRfdG9fY29sb3JzcGFj ZShkX2ltYWdlLT5mbXQtPmZvdXJjYyk7Cj4gKwo+ICsJaWYgKGlwdV9yb3RfbW9kZV9pc19pcnQo Y3R4LT5yb3RfbW9kZSkpIHsKPiArCQkvKiBzd2FwIHdpZHRoL2hlaWdodCBmb3IgcmVzaXplciAq Lwo+ICsJCWRlc3Rfd2lkdGggPSBkX2ltYWdlLT50aWxlWzBdLmhlaWdodDsKPiArCQlkZXN0X2hl aWdodCA9IGRfaW1hZ2UtPnRpbGVbMF0ud2lkdGg7Cj4gKwl9IGVsc2Ugewo+ICsJCWRlc3Rfd2lk dGggPSBkX2ltYWdlLT50aWxlWzBdLndpZHRoOwo+ICsJCWRlc3RfaGVpZ2h0ID0gZF9pbWFnZS0+ dGlsZVswXS5oZWlnaHQ7Cj4gKwl9Cj4gKwo+ICsJLyogc2V0dXAgdGhlIElDIHJlc2l6ZXIgYW5k IENTQyAqLwo+ICsJcmV0ID0gaXB1X2ljX3Rhc2tfaW5pdChjdnQtPmljLAo+ICsJCQkgICAgICAg c19pbWFnZS0+dGlsZVswXS53aWR0aCwKPiArCQkJICAgICAgIHNfaW1hZ2UtPnRpbGVbMF0uaGVp Z2h0LAo+ICsJCQkgICAgICAgZGVzdF93aWR0aCwKPiArCQkJICAgICAgIGRlc3RfaGVpZ2h0LAo+ ICsJCQkgICAgICAgc3JjX2NzLCBkZXN0X2NzKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJy KHByaXYtPmlwdS0+ZGV2LCAiaXB1X2ljX3Rhc2tfaW5pdCBmYWlsZWQsICVkXG4iLCByZXQpOwo+ ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJLyogaW5pdCB0aGUgc291cmNlIE1FTS0tPklD IFBQIElETUFDIGNoYW5uZWwgKi8KPiArCWluaXRfaWRtYWNfY2hhbm5lbChjdHgsIGN2dC0+aW5f Y2hhbiwgc19pbWFnZSwKPiArCQkJICAgSVBVX1JPVEFURV9OT05FLCBmYWxzZSk7Cj4gKwo+ICsJ aWYgKGlwdV9yb3RfbW9kZV9pc19pcnQoY3R4LT5yb3RfbW9kZSkpIHsKPiArCQkvKiBpbml0IHRo ZSBJQyBQUC0tPk1FTSBJRE1BQyBjaGFubmVsICovCj4gKwkJaW5pdF9pZG1hY19jaGFubmVsKGN0 eCwgY3Z0LT5vdXRfY2hhbiwgZF9pbWFnZSwKPiArCQkJCSAgIElQVV9ST1RBVEVfTk9ORSwgdHJ1 ZSk7Cj4gKwo+ICsJCS8qIGluaXQgdGhlIE1FTS0tPklDIFBQIFJPVCBJRE1BQyBjaGFubmVsICov Cj4gKwkJaW5pdF9pZG1hY19jaGFubmVsKGN0eCwgY3Z0LT5yb3RhdGlvbl9pbl9jaGFuLCBkX2lt YWdlLAo+ICsJCQkJICAgY3R4LT5yb3RfbW9kZSwgdHJ1ZSk7Cj4gKwo+ICsJCS8qIGluaXQgdGhl IGRlc3RpbmF0aW9uIElDIFBQIFJPVC0tPk1FTSBJRE1BQyBjaGFubmVsICovCj4gKwkJaW5pdF9p ZG1hY19jaGFubmVsKGN0eCwgY3Z0LT5yb3RhdGlvbl9vdXRfY2hhbiwgZF9pbWFnZSwKPiArCQkJ CSAgIElQVV9ST1RBVEVfTk9ORSwgZmFsc2UpOwo+ICsKPiArCQkvKiBub3cgbGluayBJQyBQUC0t Pk1FTSB0byBNRU0tLT5JQyBQUCBST1QgKi8KPiArCQlpcHVfaWRtYWNfbGluayhjdnQtPm91dF9j aGFuLCBjdnQtPnJvdGF0aW9uX2luX2NoYW4pOwo+ICsJfSBlbHNlIHsKPiArCQkvKiBpbml0IHRo ZSBkZXN0aW5hdGlvbiBJQyBQUC0tPk1FTSBJRE1BQyBjaGFubmVsICovCj4gKwkJaW5pdF9pZG1h Y19jaGFubmVsKGN0eCwgY3Z0LT5vdXRfY2hhbiwgZF9pbWFnZSwKPiArCQkJCSAgIGN0eC0+cm90 X21vZGUsIGZhbHNlKTsKPiArCX0KPiArCj4gKwkvKiBlbmFibGUgdGhlIElDICovCj4gKwlpcHVf aWNfZW5hYmxlKGN2dC0+aWMpOwo+ICsKPiArCS8qIHNldCBidWZmZXJzIHJlYWR5ICovCj4gKwlp cHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihjdnQtPmluX2NoYW4sIDApOwo+ICsJaXB1X2lkbWFjX3Nl bGVjdF9idWZmZXIoY3Z0LT5vdXRfY2hhbiwgMCk7Cj4gKwlpZiAoaXB1X3JvdF9tb2RlX2lzX2ly dChjdHgtPnJvdF9tb2RlKSkKPiArCQlpcHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihjdnQtPnJvdGF0 aW9uX291dF9jaGFuLCAwKTsKPiArCWlmIChjdHgtPmRvdWJsZV9idWZmZXJpbmcpIHsKPiArCQlp cHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihjdnQtPmluX2NoYW4sIDEpOwo+ICsJCWlwdV9pZG1hY19z ZWxlY3RfYnVmZmVyKGN2dC0+b3V0X2NoYW4sIDEpOwo+ICsJCWlmIChpcHVfcm90X21vZGVfaXNf aXJ0KGN0eC0+cm90X21vZGUpKQo+ICsJCQlpcHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihjdnQtPnJv dGF0aW9uX291dF9jaGFuLCAxKTsKPiArCX0KPiArCj4gKwkvKiBlbmFibGUgdGhlIGNoYW5uZWxz ISAqLwo+ICsJaXB1X2lkbWFjX2VuYWJsZV9jaGFubmVsKGN2dC0+aW5fY2hhbik7Cj4gKwlpcHVf aWRtYWNfZW5hYmxlX2NoYW5uZWwoY3Z0LT5vdXRfY2hhbik7Cj4gKwlpZiAoaXB1X3JvdF9tb2Rl X2lzX2lydChjdHgtPnJvdF9tb2RlKSkgewo+ICsJCWlwdV9pZG1hY19lbmFibGVfY2hhbm5lbChj dnQtPnJvdGF0aW9uX2luX2NoYW4pOwo+ICsJCWlwdV9pZG1hY19lbmFibGVfY2hhbm5lbChjdnQt PnJvdGF0aW9uX291dF9jaGFuKTsKPiArCX0KPiArCj4gKwlpcHVfaWNfdGFza19lbmFibGUoY3Z0 LT5pYyk7Cj4gKwo+ICsJaXB1X2NwbWVtX2R1bXAoY3Z0LT5pbl9jaGFuKTsKPiArCWlwdV9jcG1l bV9kdW1wKGN2dC0+b3V0X2NoYW4pOwo+ICsJaWYgKGlwdV9yb3RfbW9kZV9pc19pcnQoY3R4LT5y b3RfbW9kZSkpIHsKPiArCQlpcHVfY3BtZW1fZHVtcChjdnQtPnJvdGF0aW9uX2luX2NoYW4pOwo+ ICsJCWlwdV9jcG1lbV9kdW1wKGN2dC0+cm90YXRpb25fb3V0X2NoYW4pOwo+ICsJfQo+ICsKPiAr CWlwdV9kdW1wKHByaXYtPmlwdSk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qIGhv bGQgaXJxbG9jayB3aGVuIGNhbGxpbmcgKi8KPiArc3RhdGljIGludCBpcHVfaWNfcnVuKHN0cnVj dCBpbWFnZV9jb252ZXJ0ZXJfcnVuICpydW4pCj4gK3sKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0 ZXJfY3R4ICpjdHggPSBydW4tPmN0eDsKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXIgKmN2dCA9 IGN0eC0+Y3Z0Owo+ICsKPiArCWN0eC0+aW4uYmFzZS5waHlzMCA9IHJ1bi0+aW5fcGh5czsKPiAr CWN0eC0+b3V0LmJhc2UucGh5czAgPSBydW4tPm91dF9waHlzOwo+ICsKPiArCWN0eC0+Y3VyX2J1 Zl9udW0gPSAwOwo+ICsJY3R4LT5uZXh0X3RpbGUgPSAxOwo+ICsKPiArCS8qIHJlbW92ZSBydW4g ZnJvbSBwZW5kaW5nX3EgYW5kIHNldCBhcyBjdXJyZW50ICovCj4gKwlsaXN0X2RlbCgmcnVuLT5s aXN0KTsKPiArCWN2dC0+Y3VycmVudF9ydW4gPSBydW47Cj4gKwo+ICsJcmV0dXJuIGlwdV9pY19j b252ZXJ0X3N0YXJ0KHJ1bik7Cj4gK30KPiArCj4gKy8qIGhvbGQgaXJxbG9jayB3aGVuIGNhbGxp bmcgKi8KPiArc3RhdGljIHZvaWQgaXB1X2ljX3J1bl9uZXh0KHN0cnVjdCBpbWFnZV9jb252ZXJ0 ZXIgKmN2dCkKPiArewo+ICsJc3RydWN0IGlwdV9pY19wcml2ICpwcml2ID0gY3Z0LT5pYy0+cHJp djsKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfcnVuICpydW4sICp0bXA7Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydW4sIHRtcCwgJmN2dC0+cGVuZGlu Z19xLCBsaXN0KSB7Cj4gKwkJLyogc2tpcCBjb250ZXh0cyB0aGF0IGFyZSBhYm9ydGluZyAqLwo+ ICsJCWlmIChydW4tPmN0eC0+YWJvcnRpbmcpIHsKPiArCQkJZGV2X2RiZyhwcml2LT5pcHUtPmRl diwKPiArCQkJCSAiJXM6IHNraXBwaW5nIGFib3J0aW5nIGN0eCAlcCBydW4gJXBcbiIsCj4gKwkJ CQkgX19mdW5jX18sIHJ1bi0+Y3R4LCBydW4pOwo+ICsJCQljb250aW51ZTsKPiArCQl9Cj4gKwo+ ICsJCXJldCA9IGlwdV9pY19ydW4ocnVuKTsKPiArCQlpZiAoIXJldCkKPiArCQkJYnJlYWs7Cj4g Kwo+ICsJCS8qCj4gKwkJICogc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBzdGFydCwgYWRkIHRo ZSBydW4KPiArCQkgKiB0byBkb25lIHEgYW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHJ1biBpbiB0 aGUKPiArCQkgKiBwZW5kaW5nIHEuCj4gKwkJICovCj4gKwkJcnVuLT5zdGF0dXMgPSByZXQ7Cj4g KwkJbGlzdF9hZGRfdGFpbCgmcnVuLT5saXN0LCAmY3Z0LT5kb25lX3EpOwo+ICsJCWN2dC0+Y3Vy cmVudF9ydW4gPSBOVUxMOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpcHVfaWNfZW1w dHlfZG9uZV9xKHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXIgKmN2dCkKPiArewo+ICsJc3RydWN0IGlw dV9pY19wcml2ICpwcml2ID0gY3Z0LT5pYy0+cHJpdjsKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0 ZXJfcnVuICpydW47Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiArCXNwaW5fbG9ja19p cnFzYXZlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArCj4gKwl3aGlsZSAoIWxpc3RfZW1wdHko JmN2dC0+ZG9uZV9xKSkgewo+ICsJCXJ1biA9IGxpc3RfZW50cnkoY3Z0LT5kb25lX3EubmV4dCwK PiArCQkJCSBzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX3J1biwKPiArCQkJCSBsaXN0KTsKPiArCj4g KwkJbGlzdF9kZWwoJnJ1bi0+bGlzdCk7Cj4gKwo+ICsJCWRldl9kYmcocHJpdi0+aXB1LT5kZXYs Cj4gKwkJCSIlczogY29tcGxldGluZyBjdHggJXAgcnVuICVwIHdpdGggJWRcbiIsCj4gKwkJCV9f ZnVuY19fLCBydW4tPmN0eCwgcnVuLCBydW4tPnN0YXR1cyk7Cj4gKwo+ICsJCS8qIGNhbGwgdGhl IGNvbXBsZXRpb24gY2FsbGJhY2sgYW5kIGZyZWUgdGhlIHJ1biAqLwo+ICsJCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmN2dC0+aXJxbG9jaywgZmxhZ3MpOwo+ICsJCXJ1bi0+Y3R4LT5jb21wbGV0 ZShydW4tPmN0eC0+Y29tcGxldGVfY29udGV4dCwgcnVuLAo+ICsJCQkJICAgcnVuLT5zdGF0dXMp Owo+ICsJCWtmcmVlKHJ1bik7Cj4gKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN2dC0+aXJxbG9jaywg ZmxhZ3MpOwo+ICsJfQo+ICsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2dC0+aXJxbG9j aywgZmxhZ3MpOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiB0aGUgYm90dG9tIGhhbGYgdGhyZWFkIGNs ZWFycyBvdXQgdGhlIGRvbmVfcSwgY2FsbGluZyB0aGUKPiArICogY29tcGxldGlvbiBoYW5kbGVy IGZvciBlYWNoLgo+ICsgKi8KPiArc3RhdGljIGlycXJldHVybl90IGlwdV9pY19iaChpbnQgaXJx LCB2b2lkICpkZXZfaWQpCj4gK3sKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXIgKmN2dCA9IGRl dl9pZDsKPiArCXN0cnVjdCBpcHVfaWNfcHJpdiAqcHJpdiA9IGN2dC0+aWMtPnByaXY7Cj4gKwlz dHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4Owo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsK PiArCj4gKwlkZXZfZGJnKHByaXYtPmlwdS0+ZGV2LCAiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7 Cj4gKwo+ICsJaXB1X2ljX2VtcHR5X2RvbmVfcShjdnQpOwo+ICsKPiArCXNwaW5fbG9ja19pcnFz YXZlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArCj4gKwkvKgo+ICsJICogdGhlIGRvbmVfcSBp cyBjbGVhcmVkIG91dCwgc2lnbmFsIGFueSBjb250ZXh0cwo+ICsJICogdGhhdCBhcmUgYWJvcnRp bmcgdGhhdCBhYm9ydCBjYW4gY29tcGxldGUuCj4gKwkgKi8KPiArCWxpc3RfZm9yX2VhY2hfZW50 cnkoY3R4LCAmY3Z0LT5jdHhfbGlzdCwgbGlzdCkgewo+ICsJCWlmIChjdHgtPmFib3J0aW5nKSB7 Cj4gKwkJCWRldl9kYmcocHJpdi0+aXB1LT5kZXYsCj4gKwkJCQkgIiVzOiBzaWduYWxpbmcgYWJv cnQgZm9yIGN0eCAlcFxuIiwKPiArCQkJCSBfX2Z1bmNfXywgY3R4KTsKPiArCQkJY29tcGxldGUo JmN0eC0+YWJvcnRlZCk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmN2dC0+aXJxbG9jaywgZmxhZ3MpOwo+ICsKPiArCWRldl9kYmcocHJpdi0+aXB1LT5kZXYs ICIlczogZXhpdFxuIiwgX19mdW5jX18pOwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4g Kwo+ICsvKiBob2xkIGlycWxvY2sgd2hlbiBjYWxsaW5nICovCj4gK3N0YXRpYyBpcnFyZXR1cm5f dCBpcHVfaWNfZG9pcnEoc3RydWN0IGltYWdlX2NvbnZlcnRlcl9ydW4gKnJ1bikKPiArewo+ICsJ c3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKmN0eCA9IHJ1bi0+Y3R4Owo+ICsJc3RydWN0IGlt YWdlX2NvbnZlcnRlciAqY3Z0ID0gY3R4LT5jdnQ7Cj4gKwlzdHJ1Y3QgaXB1X2ljX3RpbGUgKnNy Y190aWxlLCAqZHN0X3RpbGU7Cj4gKwlzdHJ1Y3QgaXB1X2ljX2ltYWdlICpzX2ltYWdlID0gJmN0 eC0+aW47Cj4gKwlzdHJ1Y3QgaXB1X2ljX2ltYWdlICpkX2ltYWdlID0gJmN0eC0+b3V0Owo+ICsJ c3RydWN0IGlwdXYzX2NoYW5uZWwgKm91dGNoOwo+ICsJdW5zaWduZWQgaW50IGRzdF9pZHg7Cj4g Kwo+ICsJb3V0Y2ggPSBpcHVfcm90X21vZGVfaXNfaXJ0KGN0eC0+cm90X21vZGUpID8KPiArCQlj dnQtPnJvdGF0aW9uX291dF9jaGFuIDogY3Z0LT5vdXRfY2hhbjsKPiArCj4gKwkvKgo+ICsJICog SXQgaXMgZGlmZmljdWx0IHRvIHN0b3AgdGhlIGNoYW5uZWwgRE1BIGJlZm9yZSB0aGUgY2hhbm5l bHMKPiArCSAqIGVudGVyIHRoZSBwYXVzZWQgc3RhdGUuIFdpdGhvdXQgZG91YmxlLWJ1ZmZlcmlu ZyB0aGUgY2hhbm5lbHMKPiArCSAqIGFyZSBhbHdheXMgaW4gYSBwYXVzZWQgc3RhdGUgd2hlbiB0 aGUgRU9GIGlycSBvY2N1cnMsIHNvIGl0Cj4gKwkgKiBpcyBzYWZlIHRvIHN0b3AgdGhlIGNoYW5u ZWxzIG5vdy4gRm9yIGRvdWJsZS1idWZmZXJpbmcgd2UKPiArCSAqIGp1c3QgaWdub3JlIHRoZSBh Ym9ydCB1bnRpbCB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcywgd2hlbiBpdAo+ICsJICogaXMgc2Fm ZSB0byBzaHV0IGRvd24uCj4gKwkgKi8KPiArCWlmIChjdHgtPmFib3J0aW5nICYmICFjdHgtPmRv dWJsZV9idWZmZXJpbmcpIHsKPiArCQlpcHVfaWNfY29udmVydF9zdG9wKHJ1bik7Cj4gKwkJcnVu LT5zdGF0dXMgPSAtRUlPOwo+ICsJCWdvdG8gZG9uZTsKPiArCX0KPiArCj4gKwlpZiAoY3R4LT5u ZXh0X3RpbGUgPT0gY3R4LT5udW1fdGlsZXMpIHsKPiArCQkvKgo+ICsJCSAqIHRoZSBjb252ZXJz aW9uIGlzIGNvbXBsZXRlCj4gKwkJICovCj4gKwkJaXB1X2ljX2NvbnZlcnRfc3RvcChydW4pOwo+ ICsJCXJ1bi0+c3RhdHVzID0gMDsKPiArCQlnb3RvIGRvbmU7Cj4gKwl9Cj4gKwo+ICsJLyoKPiAr CSAqIG5vdCBkb25lLCBwbGFjZSB0aGUgbmV4dCB0aWxlIGJ1ZmZlcnMuCj4gKwkgKi8KPiArCWlm ICghY3R4LT5kb3VibGVfYnVmZmVyaW5nKSB7Cj4gKwo+ICsJCXNyY190aWxlID0gJnNfaW1hZ2Ut PnRpbGVbY3R4LT5uZXh0X3RpbGVdOwo+ICsJCWRzdF9pZHggPSBjdHgtPm91dF90aWxlX21hcFtj dHgtPm5leHRfdGlsZV07Cj4gKwkJZHN0X3RpbGUgPSAmZF9pbWFnZS0+dGlsZVtkc3RfaWR4XTsK PiArCj4gKwkJaXB1X2NwbWVtX3NldF9idWZmZXIoY3Z0LT5pbl9jaGFuLCAwLAo+ICsJCQkJICAg ICBzX2ltYWdlLT5iYXNlLnBoeXMwICsgc3JjX3RpbGUtPm9mZnNldCk7Cj4gKwkJaXB1X2NwbWVt X3NldF9idWZmZXIob3V0Y2gsIDAsCj4gKwkJCQkgICAgIGRfaW1hZ2UtPmJhc2UucGh5czAgKyBk c3RfdGlsZS0+b2Zmc2V0KTsKPiArCQlpZiAoc19pbWFnZS0+Zm10LT55X2RlcHRoKQo+ICsJCQlp cHVfY3BtZW1fc2V0X3V2X29mZnNldChjdnQtPmluX2NoYW4sCj4gKwkJCQkJCXNyY190aWxlLT51 X29mZiwKPiArCQkJCQkJc3JjX3RpbGUtPnZfb2ZmKTsKPiArCQlpZiAoZF9pbWFnZS0+Zm10LT55 X2RlcHRoKQo+ICsJCQlpcHVfY3BtZW1fc2V0X3V2X29mZnNldChvdXRjaCwKPiArCQkJCQkJZHN0 X3RpbGUtPnVfb2ZmLAo+ICsJCQkJCQlkc3RfdGlsZS0+dl9vZmYpOwo+ICsKPiArCQlpcHVfaWRt YWNfc2VsZWN0X2J1ZmZlcihjdnQtPmluX2NoYW4sIDApOwo+ICsJCWlwdV9pZG1hY19zZWxlY3Rf YnVmZmVyKG91dGNoLCAwKTsKPiArCj4gKwl9IGVsc2UgaWYgKGN0eC0+bmV4dF90aWxlIDwgY3R4 LT5udW1fdGlsZXMgLSAxKSB7Cj4gKwo+ICsJCXNyY190aWxlID0gJnNfaW1hZ2UtPnRpbGVbY3R4 LT5uZXh0X3RpbGUgKyAxXTsKPiArCQlkc3RfaWR4ID0gY3R4LT5vdXRfdGlsZV9tYXBbY3R4LT5u ZXh0X3RpbGUgKyAxXTsKPiArCQlkc3RfdGlsZSA9ICZkX2ltYWdlLT50aWxlW2RzdF9pZHhdOwo+ ICsKPiArCQlpcHVfY3BtZW1fc2V0X2J1ZmZlcihjdnQtPmluX2NoYW4sIGN0eC0+Y3VyX2J1Zl9u dW0sCj4gKwkJCQkgICAgIHNfaW1hZ2UtPmJhc2UucGh5czAgKyBzcmNfdGlsZS0+b2Zmc2V0KTsK PiArCQlpcHVfY3BtZW1fc2V0X2J1ZmZlcihvdXRjaCwgY3R4LT5jdXJfYnVmX251bSwKPiArCQkJ CSAgICAgZF9pbWFnZS0+YmFzZS5waHlzMCArIGRzdF90aWxlLT5vZmZzZXQpOwo+ICsKPiArCQlp cHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihjdnQtPmluX2NoYW4sIGN0eC0+Y3VyX2J1Zl9udW0pOwo+ ICsJCWlwdV9pZG1hY19zZWxlY3RfYnVmZmVyKG91dGNoLCBjdHgtPmN1cl9idWZfbnVtKTsKPiAr Cj4gKwkJY3R4LT5jdXJfYnVmX251bSBePSAxOwo+ICsJfQo+ICsKPiArCWN0eC0+bmV4dF90aWxl Kys7Cj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gK2RvbmU6Cj4gKwlsaXN0X2FkZF90YWlsKCZy dW4tPmxpc3QsICZjdnQtPmRvbmVfcSk7Cj4gKwljdnQtPmN1cnJlbnRfcnVuID0gTlVMTDsKPiAr CWlwdV9pY19ydW5fbmV4dChjdnQpOwo+ICsJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKPiArfQo+ ICsKPiArc3RhdGljIGlycXJldHVybl90IGlwdV9pY19ub3JvdGF0ZV9pcnEoaW50IGlycSwgdm9p ZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGltYWdlX2NvbnZlcnRlciAqY3Z0ID0gZGF0YTsKPiAr CXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICpjdHg7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29udmVy dGVyX3J1biAqcnVuOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCWlycXJldHVybl90IHJl dDsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3Z0LT5pcnFsb2NrLCBmbGFncyk7Cj4gKwo+ ICsJLyogZ2V0IGN1cnJlbnQgcnVuIGFuZCBpdHMgY29udGV4dCAqLwo+ICsJcnVuID0gY3Z0LT5j dXJyZW50X3J1bjsKPiArCWlmICghcnVuKSB7Cj4gKwkJcmV0ID0gSVJRX05PTkU7Cj4gKwkJZ290 byBvdXQ7Cj4gKwl9Cj4gKwo+ICsJY3R4ID0gcnVuLT5jdHg7Cj4gKwo+ICsJaWYgKGlwdV9yb3Rf bW9kZV9pc19pcnQoY3R4LT5yb3RfbW9kZSkpIHsKPiArCQkvKiB0aGlzIGlzIGEgcm90YXRpb24g b3BlcmF0aW9uLCBqdXN0IGlnbm9yZSAqLwo+ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2 dC0+aXJxbG9jaywgZmxhZ3MpOwo+ICsJCXJldHVybiBJUlFfSEFORExFRDsKPiArCX0KCldoeSBl bmFibGUgdGhlIG91dF9jaGFuIEVPRiBpcnEgYXQgYWxsIHdoZW4gdXNpbmcgdGhlIElSVCBtb2Rl PwoKPiArCj4gKwlyZXQgPSBpcHVfaWNfZG9pcnEocnVuKTsKPiArb3V0Ogo+ICsJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmY3Z0LT5pcnFsb2NrLCBmbGFncyk7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9 Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgaXB1X2ljX3JvdGF0ZV9pcnEoaW50IGlycSwgdm9p ZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGltYWdlX2NvbnZlcnRlciAqY3Z0ID0gZGF0YTsKPiAr CXN0cnVjdCBpcHVfaWNfcHJpdiAqcHJpdiA9IGN2dC0+aWMtPnByaXY7Cj4gKwlzdHJ1Y3QgaW1h Z2VfY29udmVydGVyX2N0eCAqY3R4Owo+ICsJc3RydWN0IGltYWdlX2NvbnZlcnRlcl9ydW4gKnJ1 bjsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwlpcnFyZXR1cm5fdCByZXQ7Cj4gKwo+ICsJ c3Bpbl9sb2NrX2lycXNhdmUoJmN2dC0+aXJxbG9jaywgZmxhZ3MpOwo+ICsKPiArCS8qIGdldCBj dXJyZW50IHJ1biBhbmQgaXRzIGNvbnRleHQgKi8KPiArCXJ1biA9IGN2dC0+Y3VycmVudF9ydW47 Cj4gKwlpZiAoIXJ1bikgewo+ICsJCXJldCA9IElSUV9OT05FOwo+ICsJCWdvdG8gb3V0Owo+ICsJ fQo+ICsKPiArCWN0eCA9IHJ1bi0+Y3R4Owo+ICsKPiArCWlmICghaXB1X3JvdF9tb2RlX2lzX2ly dChjdHgtPnJvdF9tb2RlKSkgewo+ICsJCS8qIHRoaXMgd2FzIE5PVCBhIHJvdGF0aW9uIG9wZXJh dGlvbiwgc2hvdWxkbid0IGhhcHBlbiAqLwo+ICsJCWRldl9lcnIocHJpdi0+aXB1LT5kZXYsICJV bmV4cGVjdGVkIHJvdGF0aW9uIGludGVycnVwdFxuIik7Cj4gKwkJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmY3Z0LT5pcnFsb2NrLCBmbGFncyk7Cj4gKwkJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICsJ fQo+ICsKPiArCXJldCA9IGlwdV9pY19kb2lycShydW4pOwo+ICtvdXQ6Cj4gKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gKy8qCj4gKyAqIHRyeSB0byBmb3JjZSB0aGUgY29tcGxldGlvbiBvZiBydW5zIGZvciB0 aGlzIGN0eC4gQ2FsbGVkIHdoZW4KPiArICogYWJvcnQgd2FpdCB0aW1lcyBvdXQgaW4gaXB1X2lt YWdlX2NvbnZlcnRfYWJvcnQoKS4KPiArICovCj4gK3N0YXRpYyB2b2lkIGlwdV9pY19mb3JjZV9h Ym9ydChzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgaW1h Z2VfY29udmVydGVyICpjdnQgPSBjdHgtPmN2dDsKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJf cnVuICpydW47Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiArCXNwaW5fbG9ja19pcnFz YXZlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArCj4gKwlydW4gPSBjdnQtPmN1cnJlbnRfcnVu Owo+ICsJaWYgKHJ1biAmJiBydW4tPmN0eCA9PSBjdHgpIHsKPiArCQlpcHVfaWNfY29udmVydF9z dG9wKHJ1bik7Cj4gKwkJcnVuLT5zdGF0dXMgPSAtRUlPOwo+ICsJCWxpc3RfYWRkX3RhaWwoJnJ1 bi0+bGlzdCwgJmN2dC0+ZG9uZV9xKTsKPiArCQljdnQtPmN1cnJlbnRfcnVuID0gTlVMTDsKPiAr CQlpcHVfaWNfcnVuX25leHQoY3Z0KTsKPiArCX0KPiArCj4gKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArCj4gKwlpcHVfaWNfZW1wdHlfZG9uZV9xKGN2 dCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGlwdV9pY19yZWxlYXNlX2lwdV9yZXNvdXJjZXMo c3RydWN0IGltYWdlX2NvbnZlcnRlciAqY3Z0KQo+ICt7Cj4gKwlpZiAoY3Z0LT5vdXRfZW9mX2ly cSA+PSAwKQo+ICsJCWZyZWVfaXJxKGN2dC0+b3V0X2VvZl9pcnEsIGN2dCk7Cj4gKwlpZiAoY3Z0 LT5yb3Rfb3V0X2VvZl9pcnEgPj0gMCkKPiArCQlmcmVlX2lycShjdnQtPnJvdF9vdXRfZW9mX2ly cSwgY3Z0KTsKPiArCj4gKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGN2dC0+aW5fY2hhbikpCj4gKwkJ aXB1X2lkbWFjX3B1dChjdnQtPmluX2NoYW4pOwo+ICsJaWYgKCFJU19FUlJfT1JfTlVMTChjdnQt Pm91dF9jaGFuKSkKPiArCQlpcHVfaWRtYWNfcHV0KGN2dC0+b3V0X2NoYW4pOwo+ICsJaWYgKCFJ U19FUlJfT1JfTlVMTChjdnQtPnJvdGF0aW9uX2luX2NoYW4pKQo+ICsJCWlwdV9pZG1hY19wdXQo Y3Z0LT5yb3RhdGlvbl9pbl9jaGFuKTsKPiArCWlmICghSVNfRVJSX09SX05VTEwoY3Z0LT5yb3Rh dGlvbl9vdXRfY2hhbikpCj4gKwkJaXB1X2lkbWFjX3B1dChjdnQtPnJvdGF0aW9uX291dF9jaGFu KTsKPiArCj4gKwljdnQtPmluX2NoYW4gPSBjdnQtPm91dF9jaGFuID0gY3Z0LT5yb3RhdGlvbl9p bl9jaGFuID0KPiArCQljdnQtPnJvdGF0aW9uX291dF9jaGFuID0gTlVMTDsKPiArCWN2dC0+b3V0 X2VvZl9pcnEgPSBjdnQtPnJvdF9vdXRfZW9mX2lycSA9IC0xOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IGlwdV9pY19nZXRfaXB1X3Jlc291cmNlcyhzdHJ1Y3QgaW1hZ2VfY29udmVydGVyICpjdnQp Cj4gK3sKPiArCWNvbnN0IHN0cnVjdCBpY190YXNrX2NoYW5uZWxzICpjaGFuID0gY3Z0LT5pYy0+ Y2g7Cj4gKwlzdHJ1Y3QgaXB1X2ljX3ByaXYgKnByaXYgPSBjdnQtPmljLT5wcml2Owo+ICsJaW50 IHJldDsKPiArCj4gKwkvKiBnZXQgSURNQUMgY2hhbm5lbHMgKi8KPiArCWN2dC0+aW5fY2hhbiA9 IGlwdV9pZG1hY19nZXQocHJpdi0+aXB1LCBjaGFuLT5pbik7Cj4gKwljdnQtPm91dF9jaGFuID0g aXB1X2lkbWFjX2dldChwcml2LT5pcHUsIGNoYW4tPm91dCk7Cj4gKwlpZiAoSVNfRVJSKGN2dC0+ aW5fY2hhbikgfHwgSVNfRVJSKGN2dC0+b3V0X2NoYW4pKSB7Cj4gKwkJZGV2X2Vycihwcml2LT5p cHUtPmRldiwgImNvdWxkIG5vdCBhY3F1aXJlIGlkbWFjIGNoYW5uZWxzXG4iKTsKPiArCQlyZXQg PSAtRUJVU1k7Cj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJY3Z0LT5yb3RhdGlvbl9pbl9j aGFuID0gaXB1X2lkbWFjX2dldChwcml2LT5pcHUsIGNoYW4tPnJvdF9pbik7Cj4gKwljdnQtPnJv dGF0aW9uX291dF9jaGFuID0gaXB1X2lkbWFjX2dldChwcml2LT5pcHUsIGNoYW4tPnJvdF9vdXQp Owo+ICsJaWYgKElTX0VSUihjdnQtPnJvdGF0aW9uX2luX2NoYW4pIHx8IElTX0VSUihjdnQtPnJv dGF0aW9uX291dF9jaGFuKSkgewo+ICsJCWRldl9lcnIocHJpdi0+aXB1LT5kZXYsCj4gKwkJCSJj b3VsZCBub3QgYWNxdWlyZSBpZG1hYyByb3RhdGlvbiBjaGFubmVsc1xuIik7Cj4gKwkJcmV0ID0g LUVCVVNZOwo+ICsJCWdvdG8gZXJyOwo+ICsJfQo+ICsKPiArCS8qIGFjcXVpcmUgdGhlIEVPRiBp bnRlcnJ1cHRzICovCj4gKwljdnQtPm91dF9lb2ZfaXJxID0gaXB1X2lkbWFjX2NoYW5uZWxfaXJx KHByaXYtPmlwdSwKPiArCQkJCQkJY3Z0LT5vdXRfY2hhbiwKPiArCQkJCQkJSVBVX0lSUV9FT0Yp Owo+ICsKPiArCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGN2dC0+b3V0X2VvZl9pcnEsCj4g KwkJCQkgICBpcHVfaWNfbm9yb3RhdGVfaXJxLCBpcHVfaWNfYmgsCj4gKwkJCQkgICAwLCAiaXB1 LWljIiwgY3Z0KTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJZGV2X2Vycihwcml2LT5pcHUtPmRl diwgImNvdWxkIG5vdCBhY3F1aXJlIGlycSAlZFxuIiwKPiArCQkJIGN2dC0+b3V0X2VvZl9pcnEp Owo+ICsJCWN2dC0+b3V0X2VvZl9pcnEgPSAtMTsKPiArCQlnb3RvIGVycjsKPiArCX0KPiArCj4g KwljdnQtPnJvdF9vdXRfZW9mX2lycSA9IGlwdV9pZG1hY19jaGFubmVsX2lycShwcml2LT5pcHUs Cj4gKwkJCQkJCSAgICAgY3Z0LT5yb3RhdGlvbl9vdXRfY2hhbiwKPiArCQkJCQkJICAgICBJUFVf SVJRX0VPRik7Cj4gKwo+ICsJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY3Z0LT5yb3Rfb3V0 X2VvZl9pcnEsCj4gKwkJCQkgICBpcHVfaWNfcm90YXRlX2lycSwgaXB1X2ljX2JoLAo+ICsJCQkJ ICAgMCwgImlwdS1pYyIsIGN2dCk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWRldl9lcnIocHJp di0+aXB1LT5kZXYsICJjb3VsZCBub3QgYWNxdWlyZSBpcnEgJWRcbiIsCj4gKwkJCWN2dC0+cm90 X291dF9lb2ZfaXJxKTsKPiArCQljdnQtPnJvdF9vdXRfZW9mX2lycSA9IC0xOwo+ICsJCWdvdG8g ZXJyOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICtlcnI6Cj4gKwlpcHVfaWNfcmVsZWFzZV9p cHVfcmVzb3VyY2VzKGN2dCk7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGlwdV9pY19maWxsX2ltYWdlKHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICpjdHgsCj4gKwkJ CSAgICAgc3RydWN0IGlwdV9pY19pbWFnZSAqaWNfaW1hZ2UsCj4gKwkJCSAgICAgc3RydWN0IGlw dV9pbWFnZSAqaW1hZ2UsCj4gKwkJCSAgICAgZW51bSBpbWFnZV9jb252ZXJ0X3R5cGUgdHlwZSkK PiArewo+ICsJc3RydWN0IGlwdV9pY19wcml2ICpwcml2ID0gY3R4LT5jdnQtPmljLT5wcml2Owo+ ICsKPiArCWljX2ltYWdlLT5iYXNlID0gKmltYWdlOwo+ICsJaWNfaW1hZ2UtPnR5cGUgPSB0eXBl Owo+ICsKPiArCWljX2ltYWdlLT5mbXQgPSBpcHVfaWNfZ2V0X2Zvcm1hdChpbWFnZS0+cGl4LnBp eGVsZm9ybWF0KTsKPiArCWlmICghaWNfaW1hZ2UtPmZtdCkgewo+ICsJCWRldl9lcnIocHJpdi0+ aXB1LT5kZXYsICJwaXhlbGZvcm1hdCBub3Qgc3VwcG9ydGVkIGZvciAlc1xuIiwKPiArCQkJdHlw ZSA9PSBJTUFHRV9DT05WRVJUX09VVCA/ICJPdXRwdXQiIDogIklucHV0Iik7Cj4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJaWYgKGljX2ltYWdlLT5mbXQtPnlfZGVwdGgpCj4gKwkJ aWNfaW1hZ2UtPnN0cmlkZSA9IChpY19pbWFnZS0+Zm10LT55X2RlcHRoICoKPiArCQkJCSAgICBp Y19pbWFnZS0+YmFzZS5waXgud2lkdGgpID4+IDM7Cj4gKwllbHNlCj4gKwkJaWNfaW1hZ2UtPnN0 cmlkZSAgPSBpY19pbWFnZS0+YmFzZS5waXguYnl0ZXNwZXJsaW5lOwo+ICsKPiArCWlwdV9pY19j YWxjX3RpbGVfZGltZW5zaW9ucyhjdHgsIGljX2ltYWdlKTsKPiArCWlwdV9pY19jYWxjX3RpbGVf b2Zmc2V0cyhjdHgsIGljX2ltYWdlKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArLyog Ym9ycm93ZWQgZnJvbSBkcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWNvbW1vbi5jICovCj4g K3N0YXRpYyB1bnNpZ25lZCBpbnQgY2xhbXBfYWxpZ24odW5zaWduZWQgaW50IHgsIHVuc2lnbmVk IGludCBtaW4sCj4gKwkJCQl1bnNpZ25lZCBpbnQgbWF4LCB1bnNpZ25lZCBpbnQgYWxpZ24pCj4g K3sKPiArCS8qIEJpdHMgdGhhdCBtdXN0IGJlIHplcm8gdG8gYmUgYWxpZ25lZCAqLwo+ICsJdW5z aWduZWQgaW50IG1hc2sgPSB+KCgxIDw8IGFsaWduKSAtIDEpOwo+ICsKPiArCS8qIENsYW1wIHRv IGFsaWduZWQgbWluIGFuZCBtYXggKi8KPiArCXggPSBjbGFtcCh4LCAobWluICsgfm1hc2spICYg bWFzaywgbWF4ICYgbWFzayk7Cj4gKwo+ICsJLyogUm91bmQgdG8gbmVhcmVzdCBhbGlnbmVkIHZh bHVlICovCj4gKwlpZiAoYWxpZ24pCj4gKwkJeCA9ICh4ICsgKDEgPDwgKGFsaWduIC0gMSkpKSAm IG1hc2s7Cj4gKwo+ICsJcmV0dXJuIHg7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFdlIGhhdmUgdG8g YWRqdXN0IHRoZSB0aWxlIHdpZHRoIHN1Y2ggdGhhdCB0aGUgdGlsZSBwaHlzYWRkcnMgYW5kCj4g KyAqIFUgYW5kIFYgcGxhbmUgb2Zmc2V0cyBhcmUgbXVsdGlwbGVzIG9mIDggYnl0ZXMgYXMgcmVx dWlyZWQgYnkKPiArICogdGhlIElQVSBETUEgQ29udHJvbGxlci4gRm9yIHRoZSBwbGFuYXIgZm9y bWF0cywgdGhpcyBjb3JyZXNwb25kcwo+ICsgKiB0byBhIHBpeGVsIGFsaWdubWVudCBvZiAxNiAo YnV0IHVzZSBhIG1vcmUgZm9ybWFsIGVxdWF0aW9uIHNpbmNlCj4gKyAqIHRoZSB2YXJpYWJsZXMg YXJlIGF2YWlsYWJsZSkuIEZvciBhbGwgdGhlIHBhY2tlZCBmb3JtYXRzLCA4IGlzCj4gKyAqIGdv b2QgZW5vdWdoLgo+ICsgKi8KPiArc3RhdGljIGlubGluZSB1MzIgdGlsZV93aWR0aF9hbGlnbihj b25zdCBzdHJ1Y3QgaXB1X2ljX3BpeGZtdCAqZm10KQo+ICt7Cj4gKwlyZXR1cm4gZm10LT55X2Rl cHRoID8gKDY0ICogZm10LT51dl93aWR0aF9kZWMpIC8gZm10LT55X2RlcHRoIDogODsKPiArfQo+ ICsKPiArLyoKPiArICogRm9yIHRpbGUgaGVpZ2h0IGFsaWdubWVudCwgd2UgaGF2ZSB0byBlbnN1 cmUgdGhhdCB0aGUgb3V0cHV0IHRpbGUKPiArICogaGVpZ2h0cyBhcmUgbXVsdGlwbGVzIG9mIDgg bGluZXMgaWYgdGhlIElSVCBpcyByZXF1aXJlZCBieSB0aGUKPiArICogZ2l2ZW4gcm90YXRpb24g bW9kZSAodGhlIElSVCBwZXJmb3JtcyByb3RhdGlvbnMgb24gOHg4IGJsb2Nrcwo+ICsgKiBhdCBh IHRpbWUpLiBJZiB0aGUgSVJUIGlzIG5vdCB1c2VkLCBvciBmb3IgaW5wdXQgaW1hZ2UgdGlsZXMs Cj4gKyAqIDIgbGluZXMgYXJlIGdvb2QgZW5vdWdoLgo+ICsgKi8KPiArc3RhdGljIGlubGluZSB1 MzIgdGlsZV9oZWlnaHRfYWxpZ24oZW51bSBpbWFnZV9jb252ZXJ0X3R5cGUgdHlwZSwKPiArCQkJ CSAgICBlbnVtIGlwdV9yb3RhdGVfbW9kZSByb3RfbW9kZSkKPiArewo+ICsJcmV0dXJuICh0eXBl ID09IElNQUdFX0NPTlZFUlRfT1VUICYmCj4gKwkJaXB1X3JvdF9tb2RlX2lzX2lydChyb3RfbW9k ZSkpID8gOCA6IDI7Cj4gK30KPiArCj4gKy8qIEFkanVzdHMgaW5wdXQvb3V0cHV0IGltYWdlcyB0 byBJUFUgcmVzdHJpY3Rpb25zICovCj4gK2ludCBpcHVfaW1hZ2VfY29udmVydF9hZGp1c3Qoc3Ry dWN0IGlwdV9pbWFnZSAqaW4sIHN0cnVjdCBpcHVfaW1hZ2UgKm91dCwKPiArCQkJICAgICBlbnVt IGlwdV9yb3RhdGVfbW9kZSByb3RfbW9kZSkKPiArewo+ICsJY29uc3Qgc3RydWN0IGlwdV9pY19w aXhmbXQgKmluZm10LCAqb3V0Zm10Owo+ICsJdW5zaWduZWQgaW50IG51bV9pbl9yb3dzLCBudW1f aW5fY29sczsKPiArCXVuc2lnbmVkIGludCBudW1fb3V0X3Jvd3MsIG51bV9vdXRfY29sczsKPiAr CXUzMiB3X2FsaWduLCBoX2FsaWduOwo+ICsKPiArCWluZm10ID0gaXB1X2ljX2dldF9mb3JtYXQo aW4tPnBpeC5waXhlbGZvcm1hdCk7Cj4gKwlvdXRmbXQgPSBpcHVfaWNfZ2V0X2Zvcm1hdChvdXQt PnBpeC5waXhlbGZvcm1hdCk7Cj4gKwo+ICsJLyogc2V0IHNvbWUgZGVmYXVsdHMgaWYgbmVlZGVk ICovCgpJcyB0aGlzIG91ciB0YXNrIGF0IGFsbD8KCj4gKwlpZiAoIWluZm10KSB7Cj4gKwkJaW4t PnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IyNDsKPiArCQlpbmZtdCA9IGlwdV9p Y19nZXRfZm9ybWF0KFY0TDJfUElYX0ZNVF9SR0IyNCk7Cj4gKwl9Cj4gKwlpZiAoIW91dGZtdCkg ewo+ICsJCW91dC0+cGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjI0Owo+ICsJCW91 dGZtdCA9IGlwdV9pY19nZXRfZm9ybWF0KFY0TDJfUElYX0ZNVF9SR0IyNCk7Cj4gKwl9Cj4gKwo+ ICsJaWYgKCFpbi0+cGl4LndpZHRoIHx8ICFpbi0+cGl4LmhlaWdodCkgewo+ICsJCWluLT5waXgu d2lkdGggPSA2NDA7Cj4gKwkJaW4tPnBpeC5oZWlnaHQgPSA0ODA7Cj4gKwl9Cj4gKwlpZiAoIW91 dC0+cGl4LndpZHRoIHx8ICFvdXQtPnBpeC5oZWlnaHQpIHsKPiArCQlvdXQtPnBpeC53aWR0aCA9 IDY0MDsKPiArCQlvdXQtPnBpeC5oZWlnaHQgPSA0ODA7Cj4gKwl9Cj4gKwo+ICsJLyogaW1hZ2Ug Y29udmVydGVyIGRvZXMgbm90IGhhbmRsZSBmaWVsZHMgKi8KPiArCWluLT5waXguZmllbGQgPSBv dXQtPnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKCldoeSBub3Q/IFRoZSBzY2FsZXIgY2Fu IHNjYWxlIGFsdGVybmF0ZSB0b3AvYm90dG9tIGZpZWxkcyBubyBwcm9ibGVtLgoKRm9yIFNFUV9U Qi9CVCBhbmQgdGhlIGludGVybGVhdmVkIGludGVybGFjaW5nIHdlJ2QgaGF2ZSB0byBhZGp1c3QK c2NhbGluZyBmYWN0b3JzIHBlciBmaWVsZCBhbmQgdXNlIHR3byB2ZXJ0aWNhbCB0aWxlcyBmb3Ig dGhlIGZpZWxkcwpiZWZvcmUgdGhpcyBjYW4gYmUgc3VwcG9ydGVkLgoKPiArCS8qIHJlc2l6ZXIg Y2Fubm90IGRvd25zaXplIG1vcmUgdGhhbiA0OjEgKi8KPiArCWlmIChpcHVfcm90X21vZGVfaXNf aXJ0KHJvdF9tb2RlKSkgewo+ICsJCW91dC0+cGl4LmhlaWdodCA9IG1heF90KF9fdTMyLCBvdXQt PnBpeC5oZWlnaHQsCj4gKwkJCQkJaW4tPnBpeC53aWR0aCAvIDQpOwo+ICsJCW91dC0+cGl4Lndp ZHRoID0gbWF4X3QoX191MzIsIG91dC0+cGl4LndpZHRoLAo+ICsJCQkJICAgICAgIGluLT5waXgu aGVpZ2h0IC8gNCk7Cj4gKwl9IGVsc2Ugewo+ICsJCW91dC0+cGl4LndpZHRoID0gbWF4X3QoX191 MzIsIG91dC0+cGl4LndpZHRoLAo+ICsJCQkJICAgICAgIGluLT5waXgud2lkdGggLyA0KTsKPiAr CQlvdXQtPnBpeC5oZWlnaHQgPSBtYXhfdChfX3UzMiwgb3V0LT5waXguaGVpZ2h0LAo+ICsJCQkJ CWluLT5waXguaGVpZ2h0IC8gNCk7Cj4gKwl9Cj4gKwo+ICsJLyogZ2V0IHRpbGluZyByb3dzL2Nv bHMgZnJvbSBvdXRwdXQgZm9ybWF0ICovCj4gKwludW1fb3V0X3Jvd3MgPSBpcHVfaWNfbnVtX3N0 cmlwZXMob3V0LT5waXguaGVpZ2h0KTsKPiArCW51bV9vdXRfY29scyA9IGlwdV9pY19udW1fc3Ry aXBlcyhvdXQtPnBpeC53aWR0aCk7Cj4gKwlpZiAoaXB1X3JvdF9tb2RlX2lzX2lydChyb3RfbW9k ZSkpIHsKPiArCQludW1faW5fcm93cyA9IG51bV9vdXRfY29sczsKPiArCQludW1faW5fY29scyA9 IG51bV9vdXRfcm93czsKPiArCX0gZWxzZSB7Cj4gKwkJbnVtX2luX3Jvd3MgPSBudW1fb3V0X3Jv d3M7Cj4gKwkJbnVtX2luX2NvbHMgPSBudW1fb3V0X2NvbHM7Cj4gKwl9Cj4gKwo+ICsJLyogYWxp Z24gaW5wdXQgd2lkdGgvaGVpZ2h0ICovCj4gKwl3X2FsaWduID0gaWxvZzIodGlsZV93aWR0aF9h bGlnbihpbmZtdCkgKiBudW1faW5fY29scyk7Cj4gKwloX2FsaWduID0gaWxvZzIodGlsZV9oZWln aHRfYWxpZ24oSU1BR0VfQ09OVkVSVF9JTiwgcm90X21vZGUpICoKPiArCQkJbnVtX2luX3Jvd3Mp Owo+ICsJaW4tPnBpeC53aWR0aCA9IGNsYW1wX2FsaWduKGluLT5waXgud2lkdGgsIE1JTl9XLCBN QVhfVywgd19hbGlnbik7Cj4gKwlpbi0+cGl4LmhlaWdodCA9IGNsYW1wX2FsaWduKGluLT5waXgu aGVpZ2h0LCBNSU5fSCwgTUFYX0gsIGhfYWxpZ24pOwo+ICsKPiArCS8qIGFsaWduIG91dHB1dCB3 aWR0aC9oZWlnaHQgKi8KPiArCXdfYWxpZ24gPSBpbG9nMih0aWxlX3dpZHRoX2FsaWduKG91dGZt dCkgKiBudW1fb3V0X2NvbHMpOwo+ICsJaF9hbGlnbiA9IGlsb2cyKHRpbGVfaGVpZ2h0X2FsaWdu KElNQUdFX0NPTlZFUlRfT1VULCByb3RfbW9kZSkgKgo+ICsJCQludW1fb3V0X3Jvd3MpOwo+ICsJ b3V0LT5waXgud2lkdGggPSBjbGFtcF9hbGlnbihvdXQtPnBpeC53aWR0aCwgTUlOX1csIE1BWF9X LCB3X2FsaWduKTsKPiArCW91dC0+cGl4LmhlaWdodCA9IGNsYW1wX2FsaWduKG91dC0+cGl4Lmhl aWdodCwgTUlOX0gsIE1BWF9ILCBoX2FsaWduKTsKPiArCj4gKwkvKiBzZXQgaW5wdXQvb3V0cHV0 IHN0cmlkZXMgYW5kIGltYWdlIHNpemVzICovCj4gKwlpbi0+cGl4LmJ5dGVzcGVybGluZSA9IChp bi0+cGl4LndpZHRoICogaW5mbXQtPmJwcCkgPj4gMzsKPiArCWluLT5waXguc2l6ZWltYWdlID0g aW4tPnBpeC5oZWlnaHQgKiBpbi0+cGl4LmJ5dGVzcGVybGluZTsKPiArCW91dC0+cGl4LmJ5dGVz cGVybGluZSA9IChvdXQtPnBpeC53aWR0aCAqIG91dGZtdC0+YnBwKSA+PiAzOwo+ICsJb3V0LT5w aXguc2l6ZWltYWdlID0gb3V0LT5waXguaGVpZ2h0ICogb3V0LT5waXguYnl0ZXNwZXJsaW5lOwo+ ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKGlwdV9pbWFnZV9jb252 ZXJ0X2FkanVzdCk7Cj4gKwo+ICsvKgo+ICsgKiB0aGlzIGlzIHVzZWQgYnkgaXB1X2ltYWdlX2Nv bnZlcnRfcHJlcGFyZSgpIHRvIHZlcmlmeSBzZXQgaW5wdXQgYW5kCj4gKyAqIG91dHB1dCBpbWFn ZXMgYXJlIHZhbGlkIGJlZm9yZSBzdGFydGluZyB0aGUgY29udmVyc2lvbi4gQ2xpZW50cyBjYW4K PiArICogYWxzbyBjYWxsIGl0IGJlZm9yZSBjYWxsaW5nIGlwdV9pbWFnZV9jb252ZXJ0X3ByZXBh cmUoKS4KPiArICovCj4gK2ludCBpcHVfaW1hZ2VfY29udmVydF92ZXJpZnkoc3RydWN0IGlwdV9p bWFnZSAqaW4sIHN0cnVjdCBpcHVfaW1hZ2UgKm91dCwKPiArCQkJICAgICBlbnVtIGlwdV9yb3Rh dGVfbW9kZSByb3RfbW9kZSkKPiArewo+ICsJc3RydWN0IGlwdV9pbWFnZSB0ZXN0aW4sIHRlc3Rv dXQ7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXRlc3RpbiA9ICppbjsKPiArCXRlc3RvdXQgPSAqb3V0 Owo+ICsKPiArCXJldCA9IGlwdV9pbWFnZV9jb252ZXJ0X2FkanVzdCgmdGVzdGluLCAmdGVzdG91 dCwgcm90X21vZGUpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCWlmICh0 ZXN0aW4ucGl4LndpZHRoICE9IGluLT5waXgud2lkdGggfHwKPiArCSAgICB0ZXN0aW4ucGl4Lmhl aWdodCAhPSBpbi0+cGl4LmhlaWdodCB8fAo+ICsJICAgIHRlc3RvdXQucGl4LndpZHRoICE9IG91 dC0+cGl4LndpZHRoIHx8Cj4gKwkgICAgdGVzdG91dC5waXguaGVpZ2h0ICE9IG91dC0+cGl4Lmhl aWdodCkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICtFWFBP UlRfU1lNQk9MX0dQTChpcHVfaW1hZ2VfY29udmVydF92ZXJpZnkpOwo+ICsKPiArLyoKPiArICog Q2FsbCBpcHVfaW1hZ2VfY29udmVydF9wcmVwYXJlKCkgdG8gcHJlcGFyZSBmb3IgdGhlIGNvbnZl cnNpb24gb2YKPiArICogZ2l2ZW4gaW1hZ2VzIGFuZCByb3RhdGlvbiBtb2RlLiBSZXR1cm5zIGEg bmV3IGNvbnZlcnNpb24gY29udGV4dC4KPiArICovCj4gK3N0cnVjdCBpbWFnZV9jb252ZXJ0ZXJf Y3R4ICoKPiAraXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZShzdHJ1Y3QgaXB1X2ljICppYywKPiAr CQkJICBzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAo+ICsJCQkg IGVudW0gaXB1X3JvdGF0ZV9tb2RlIHJvdF9tb2RlLAo+ICsJCQkgIGltYWdlX2NvbnZlcnRlcl9j Yl90IGNvbXBsZXRlLAo+ICsJCQkgIHZvaWQgKmNvbXBsZXRlX2NvbnRleHQpCj4gK3sKPiArCXN0 cnVjdCBpcHVfaWNfcHJpdiAqcHJpdiA9IGljLT5wcml2Owo+ICsJc3RydWN0IGltYWdlX2NvbnZl cnRlciAqY3Z0ID0gJmljLT5jdnQ7Cj4gKwlzdHJ1Y3QgaXB1X2ljX2ltYWdlICpzX2ltYWdlLCAq ZF9pbWFnZTsKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICpjdHg7Cj4gKwl1bnNpZ25l ZCBsb25nIGZsYWdzOwo+ICsJYm9vbCBnZXRfcmVzOwo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAo IWljIHx8ICFpbiB8fCAhb3V0IHx8ICFjb21wbGV0ZSkKPiArCQlyZXR1cm4gRVJSX1BUUigtRUlO VkFMKTsKPiArCj4gKwkvKiB2ZXJpZnkgdGhlIGluL291dCBpbWFnZXMgYmVmb3JlIGNvbnRpbnVp bmcgKi8KPiArCXJldCA9IGlwdV9pbWFnZV9jb252ZXJ0X3ZlcmlmeShpbiwgb3V0LCByb3RfbW9k ZSk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2Vycihwcml2LT5pcHUtPmRldiwgIiVzOiBpbi9v dXQgZm9ybWF0cyBpbnZhbGlkXG4iLAo+ICsJCQlfX2Z1bmNfXyk7Cj4gKwkJcmV0dXJuIEVSUl9Q VFIocmV0KTsKPiArCX0KPiArCj4gKwljdHggPSBremFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tF Uk5FTCk7Cj4gKwlpZiAoIWN0eCkKPiArCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPiArCj4g KwlkZXZfZGJnKHByaXYtPmlwdS0+ZGV2LCAiJXM6IGN0eCAlcFxuIiwgX19mdW5jX18sIGN0eCk7 Cj4gKwo+ICsJY3R4LT5jdnQgPSBjdnQ7Cj4gKwlpbml0X2NvbXBsZXRpb24oJmN0eC0+YWJvcnRl ZCk7Cj4gKwo+ICsJc19pbWFnZSA9ICZjdHgtPmluOwo+ICsJZF9pbWFnZSA9ICZjdHgtPm91dDsK PiArCj4gKwkvKiBzZXQgdGlsaW5nIGFuZCByb3RhdGlvbiAqLwo+ICsJZF9pbWFnZS0+bnVtX3Jv d3MgPSBpcHVfaWNfbnVtX3N0cmlwZXMob3V0LT5waXguaGVpZ2h0KTsKPiArCWRfaW1hZ2UtPm51 bV9jb2xzID0gaXB1X2ljX251bV9zdHJpcGVzKG91dC0+cGl4LndpZHRoKTsKPiArCWlmIChpcHVf cm90X21vZGVfaXNfaXJ0KHJvdF9tb2RlKSkgewo+ICsJCXNfaW1hZ2UtPm51bV9yb3dzID0gZF9p bWFnZS0+bnVtX2NvbHM7Cj4gKwkJc19pbWFnZS0+bnVtX2NvbHMgPSBkX2ltYWdlLT5udW1fcm93 czsKPiArCX0gZWxzZSB7Cj4gKwkJc19pbWFnZS0+bnVtX3Jvd3MgPSBkX2ltYWdlLT5udW1fcm93 czsKPiArCQlzX2ltYWdlLT5udW1fY29scyA9IGRfaW1hZ2UtPm51bV9jb2xzOwo+ICsJfQo+ICsK PiArCWN0eC0+bnVtX3RpbGVzID0gZF9pbWFnZS0+bnVtX2NvbHMgKiBkX2ltYWdlLT5udW1fcm93 czsKPiArCWN0eC0+cm90X21vZGUgPSByb3RfbW9kZTsKPiArCj4gKwlyZXQgPSBpcHVfaWNfZmls bF9pbWFnZShjdHgsIHNfaW1hZ2UsIGluLCBJTUFHRV9DT05WRVJUX0lOKTsKPiArCWlmIChyZXQp Cj4gKwkJZ290byBvdXRfZnJlZTsKPiArCXJldCA9IGlwdV9pY19maWxsX2ltYWdlKGN0eCwgZF9p bWFnZSwgb3V0LCBJTUFHRV9DT05WRVJUX09VVCk7Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gb3V0 X2ZyZWU7Cj4gKwo+ICsJaXB1X2ljX2NhbGNfb3V0X3RpbGVfbWFwKGN0eCk7Cj4gKwo+ICsJaXB1 X2ljX2R1bXBfZm9ybWF0KGN0eCwgc19pbWFnZSk7Cj4gKwlpcHVfaWNfZHVtcF9mb3JtYXQoY3R4 LCBkX2ltYWdlKTsKPiArCj4gKwljdHgtPmNvbXBsZXRlID0gY29tcGxldGU7Cj4gKwljdHgtPmNv bXBsZXRlX2NvbnRleHQgPSBjb21wbGV0ZV9jb250ZXh0Owo+ICsKPiArCS8qCj4gKwkgKiBDYW4g d2UgdXNlIGRvdWJsZS1idWZmZXJpbmcgZm9yIHRoaXMgb3BlcmF0aW9uPyBJZiB0aGVyZSBpcwo+ ICsJICogb25seSBvbmUgdGlsZSAodGhlIHdob2xlIGltYWdlIGNhbiBiZSBjb252ZXJ0ZWQgaW4g YSBzaW5nbGUKPiArCSAqIG9wZXJhdGlvbikgdGhlcmUncyBubyBwb2ludCBpbiB1c2luZyBkb3Vi bGUtYnVmZmVyaW5nLiBBbHNvLAo+ICsJICogdGhlIElQVSdzIElETUFDIGNoYW5uZWxzIGFsbG93 IG9ubHkgYSBzaW5nbGUgVSBhbmQgViBwbGFuZQo+ICsJICogb2Zmc2V0IHNoYXJlZCBiZXR3ZWVu IGJvdGggYnVmZmVycywgYnV0IHRoZXNlIG9mZnNldHMgY2hhbmdlCj4gKwkgKiBmb3IgZXZlcnkg dGlsZSwgYW5kIHRoZXJlZm9yZSB3b3VsZCBoYXZlIHRvIGJlIHVwZGF0ZWQgZm9yCj4gKwkgKiBl YWNoIGJ1ZmZlciB3aGljaCBpcyBub3QgcG9zc2libGUuIFNvIGRvdWJsZS1idWZmZXJpbmcgaXMK PiArCSAqIGltcG9zc2libGUgd2hlbiBlaXRoZXIgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBp bWFnZXMgYXJlCj4gKwkgKiBhIHBsYW5hciBmb3JtYXQgKFlVVjQyMCwgWVVWNDIyUCwgZXRjLiku Cj4gKwkgKi8KPiArCWN0eC0+ZG91YmxlX2J1ZmZlcmluZyA9IChjdHgtPm51bV90aWxlcyA+IDEg JiYKPiArCQkJCSAhc19pbWFnZS0+Zm10LT55X2RlcHRoICYmCj4gKwkJCQkgIWRfaW1hZ2UtPmZt dC0+eV9kZXB0aCk7Cj4gKwo+ICsJaWYgKGlwdV9yb3RfbW9kZV9pc19pcnQoY3R4LT5yb3RfbW9k ZSkpIHsKPiArCQlyZXQgPSBpcHVfaWNfYWxsb2NfZG1hX2J1Zihwcml2LCAmY3R4LT5yb3RfaW50 ZXJtZWRpYXRlWzBdLAo+ICsJCQkJCSAgIGRfaW1hZ2UtPnRpbGVbMF0uc2l6ZSk7Cj4gKwkJaWYg KHJldCkKPiArCQkJZ290byBvdXRfZnJlZTsKPiArCQlpZiAoY3R4LT5kb3VibGVfYnVmZmVyaW5n KSB7Cj4gKwkJCXJldCA9IGlwdV9pY19hbGxvY19kbWFfYnVmKHByaXYsCj4gKwkJCQkJCSAgICZj dHgtPnJvdF9pbnRlcm1lZGlhdGVbMV0sCj4gKwkJCQkJCSAgIGRfaW1hZ2UtPnRpbGVbMF0uc2l6 ZSk7Cj4gKwkJCWlmIChyZXQpCj4gKwkJCQlnb3RvIG91dF9mcmVlX2RtYWJ1ZjA7Cj4gKwkJfQo+ ICsJfQo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiAr Cj4gKwlnZXRfcmVzID0gbGlzdF9lbXB0eSgmY3Z0LT5jdHhfbGlzdCk7Cj4gKwo+ICsJbGlzdF9h ZGRfdGFpbCgmY3R4LT5saXN0LCAmY3Z0LT5jdHhfbGlzdCk7Cj4gKwo+ICsJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmY3Z0LT5pcnFsb2NrLCBmbGFncyk7Cj4gKwo+ICsJaWYgKGdldF9yZXMpIHsK PiArCQlyZXQgPSBpcHVfaWNfZ2V0X2lwdV9yZXNvdXJjZXMoY3Z0KTsKPiArCQlpZiAocmV0KQo+ ICsJCQlnb3RvIG91dF9mcmVlX2RtYWJ1ZjE7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGN0eDsKPiAr Cj4gK291dF9mcmVlX2RtYWJ1ZjE6Cj4gKwlpcHVfaWNfZnJlZV9kbWFfYnVmKHByaXYsICZjdHgt PnJvdF9pbnRlcm1lZGlhdGVbMV0pOwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmN2dC0+aXJxbG9j aywgZmxhZ3MpOwo+ICsJbGlzdF9kZWwoJmN0eC0+bGlzdCk7Cj4gKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArb3V0X2ZyZWVfZG1hYnVmMDoKPiArCWlw dV9pY19mcmVlX2RtYV9idWYocHJpdiwgJmN0eC0+cm90X2ludGVybWVkaWF0ZVswXSk7Cj4gK291 dF9mcmVlOgo+ICsJa2ZyZWUoY3R4KTsKPiArCXJldHVybiBFUlJfUFRSKHJldCk7Cj4gK30KPiAr RVhQT1JUX1NZTUJPTF9HUEwoaXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZSk7Cj4gKwo+ICsvKgo+ ICsgKiBDYXJyeSBvdXQgYSBzaW5nbGUgaW1hZ2UgY29udmVyc2lvbi4gT25seSB0aGUgcGh5c2Fk ZHIncyBvZiB0aGUgaW5wdXQKPiArICogYW5kIG91dHB1dCBpbWFnZSBidWZmZXJzIGFyZSBuZWVk ZWQuIFRoZSBjb252ZXJzaW9uIGNvbnRleHQgbXVzdCBoYXZlCj4gKyAqIGJlZW4gY3JlYXRlZCBw cmV2aW91c2x5IHdpdGggaXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZSgpLiBSZXR1cm5zIHRoZQo+ ICsgKiBuZXcgcnVuIG9iamVjdC4KPiArICovCj4gK3N0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfcnVu ICoKPiAraXB1X2ltYWdlX2NvbnZlcnRfcnVuKHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICpj dHgsCj4gKwkJICAgICAgZG1hX2FkZHJfdCBpbl9waHlzLCBkbWFfYWRkcl90IG91dF9waHlzKQo+ ICt7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyICpjdnQgPSBjdHgtPmN2dDsKPiArCXN0cnVj dCBpcHVfaWNfcHJpdiAqcHJpdiA9IGN2dC0+aWMtPnByaXY7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29u dmVydGVyX3J1biAqcnVuOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCWludCByZXQgPSAw Owo+ICsKPiArCXJ1biA9IGt6YWxsb2Moc2l6ZW9mKCpydW4pLCBHRlBfS0VSTkVMKTsKPiArCWlm ICghcnVuKQo+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwoKV2hhdCBpcyB0aGUgcmVhc29u aW5nIGJlaGluZCBtYWtpbmcgdGhlIGltYWdlX2NvbnZlcnRlcl9ydW4gb3BhcXVlIHRvCnRoZSB1 c2VyPyBJZiB5b3UgbGV0IHRoZSB1c2VyIHByb3ZpZGUgaXQgdG8gaXB1X2ltYWdlX2NvbnZlcnRf cnVuLCBpdAp3b3VsZG4ndCBoYXZlIHRvIGJlIGFsbG9jYXRlZC9mcmVlZCB3aXRoIGVhY2ggZnJh bWUuCgo+ICsJcnVuLT5jdHggPSBjdHg7Cj4gKwlydW4tPmluX3BoeXMgPSBpbl9waHlzOwo+ICsJ cnVuLT5vdXRfcGh5cyA9IG91dF9waHlzOwo+ICsKPiArCWRldl9kYmcocHJpdi0+aXB1LT5kZXYs ICIlczogY3R4ICVwIHJ1biAlcFxuIiwgX19mdW5jX18sCj4gKwkJY3R4LCBydW4pOwo+ICsKPiAr CXNwaW5fbG9ja19pcnFzYXZlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArCj4gKwlpZiAoY3R4 LT5hYm9ydGluZykgewo+ICsJCXJldCA9IC1FSU87Cj4gKwkJZ290byB1bmxvY2s7Cj4gKwl9Cj4g Kwo+ICsJbGlzdF9hZGRfdGFpbCgmcnVuLT5saXN0LCAmY3Z0LT5wZW5kaW5nX3EpOwo+ICsKPiAr CWlmICghY3Z0LT5jdXJyZW50X3J1bikgewo+ICsJCXJldCA9IGlwdV9pY19ydW4ocnVuKTsKPiAr CQlpZiAocmV0KQo+ICsJCQljdnQtPmN1cnJlbnRfcnVuID0gTlVMTDsKPiArCX0KPiArdW5sb2Nr Ogo+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Z0LT5pcnFsb2NrLCBmbGFncyk7Cj4gKwo+ ICsJaWYgKHJldCkgewo+ICsJCWtmcmVlKHJ1bik7Cj4gKwkJcnVuID0gRVJSX1BUUihyZXQpOwo+ ICsJfQo+ICsKPiArCXJldHVybiBydW47Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwoaXB1X2lt YWdlX2NvbnZlcnRfcnVuKTsKPiArCj4gKy8qIEFib3J0IGFueSBhY3RpdmUgb3IgcGVuZGluZyBj b252ZXJzaW9ucyBmb3IgdGhpcyBjb250ZXh0ICovCj4gK3ZvaWQgaXB1X2ltYWdlX2NvbnZlcnRf YWJvcnQoc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKmN0eCkKPiArewo+ICsJc3RydWN0IGlt YWdlX2NvbnZlcnRlciAqY3Z0ID0gY3R4LT5jdnQ7Cj4gKwlzdHJ1Y3QgaXB1X2ljX3ByaXYgKnBy aXYgPSBjdnQtPmljLT5wcml2Owo+ICsJc3RydWN0IGltYWdlX2NvbnZlcnRlcl9ydW4gKnJ1biwg KmFjdGl2ZV9ydW4sICp0bXA7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsJaW50IHJ1bl9j b3VudCwgcmV0Owo+ICsJYm9vbCBuZWVkX2Fib3J0Owo+ICsKPiArCXJlaW5pdF9jb21wbGV0aW9u KCZjdHgtPmFib3J0ZWQpOwo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZjdnQtPmlycWxvY2ss IGZsYWdzKTsKPiArCj4gKwkvKiBtb3ZlIGFsbCByZW1haW5pbmcgcGVuZGluZyBydW5zIGluIHRo aXMgY29udGV4dCB0byBkb25lX3EgKi8KPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydW4s IHRtcCwgJmN2dC0+cGVuZGluZ19xLCBsaXN0KSB7Cj4gKwkJaWYgKHJ1bi0+Y3R4ICE9IGN0eCkK PiArCQkJY29udGludWU7Cj4gKwkJcnVuLT5zdGF0dXMgPSAtRUlPOwo+ICsJCWxpc3RfbW92ZV90 YWlsKCZydW4tPmxpc3QsICZjdnQtPmRvbmVfcSk7Cj4gKwl9Cj4gKwo+ICsJcnVuX2NvdW50ID0g aXB1X2ljX2dldF9ydW5fY291bnQoY3R4LCAmY3Z0LT5kb25lX3EpOwo+ICsJYWN0aXZlX3J1biA9 IChjdnQtPmN1cnJlbnRfcnVuICYmIGN2dC0+Y3VycmVudF9ydW4tPmN0eCA9PSBjdHgpID8KPiAr CQljdnQtPmN1cnJlbnRfcnVuIDogTlVMTDsKPiArCj4gKwluZWVkX2Fib3J0ID0gKHJ1bl9jb3Vu dCB8fCBhY3RpdmVfcnVuKTsKPiArCj4gKwljdHgtPmFib3J0aW5nID0gbmVlZF9hYm9ydDsKPiAr Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsKPiArCj4g KwlpZiAoIW5lZWRfYWJvcnQpIHsKPiArCQlkZXZfZGJnKHByaXYtPmlwdS0+ZGV2LCAiJXM6IG5v IGFib3J0IG5lZWRlZCBmb3IgY3R4ICVwXG4iLAo+ICsJCQlfX2Z1bmNfXywgY3R4KTsKPiArCQly ZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZGV2X2RiZyhwcml2LT5pcHUtPmRldiwKPiArCQkgIiVzOiB3 YWl0IGZvciBjb21wbGV0aW9uOiAlZCBydW5zLCBhY3RpdmUgcnVuICVwXG4iLAo+ICsJCSBfX2Z1 bmNfXywgcnVuX2NvdW50LCBhY3RpdmVfcnVuKTsKPiArCj4gKwlyZXQgPSB3YWl0X2Zvcl9jb21w bGV0aW9uX3RpbWVvdXQoJmN0eC0+YWJvcnRlZCwKPiArCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMo MTAwMDApKTsKPiArCWlmIChyZXQgPT0gMCkgewo+ICsJCWRldl93YXJuKHByaXYtPmlwdS0+ZGV2 LCAiJXM6IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKPiArCQlpcHVfaWNfZm9yY2VfYWJvcnQoY3R4 KTsKPiArCX0KPiArCj4gKwljdHgtPmFib3J0aW5nID0gZmFsc2U7Cj4gK30KPiArRVhQT1JUX1NZ TUJPTF9HUEwoaXB1X2ltYWdlX2NvbnZlcnRfYWJvcnQpOwo+ICsKPiArLyogVW5wcmVwYXJlIGlt YWdlIGNvbnZlcnNpb24gY29udGV4dCAqLwo+ICt2b2lkIGlwdV9pbWFnZV9jb252ZXJ0X3VucHJl cGFyZShzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgaW1h Z2VfY29udmVydGVyICpjdnQgPSBjdHgtPmN2dDsKPiArCXN0cnVjdCBpcHVfaWNfcHJpdiAqcHJp diA9IGN2dC0+aWMtPnByaXY7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsJYm9vbCBwdXRf cmVzOwo+ICsKPiArCS8qIG1ha2Ugc3VyZSBubyBydW5zIGFyZSBoYW5naW5nIGFyb3VuZCAqLwo+ ICsJaXB1X2ltYWdlX2NvbnZlcnRfYWJvcnQoY3R4KTsKPiArCj4gKwlkZXZfZGJnKHByaXYtPmlw dS0+ZGV2LCAiJXM6IHJlbW92aW5nIGN0eCAlcFxuIiwgX19mdW5jX18sIGN0eCk7Cj4gKwo+ICsJ c3Bpbl9sb2NrX2lycXNhdmUoJmN2dC0+aXJxbG9jaywgZmxhZ3MpOwo+ICsKPiArCWxpc3RfZGVs KCZjdHgtPmxpc3QpOwo+ICsKPiArCXB1dF9yZXMgPSBsaXN0X2VtcHR5KCZjdnQtPmN0eF9saXN0 KTsKPiArCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdnQtPmlycWxvY2ssIGZsYWdzKTsK PiArCj4gKwlpZiAocHV0X3JlcykKPiArCQlpcHVfaWNfcmVsZWFzZV9pcHVfcmVzb3VyY2VzKGN2 dCk7Cj4gKwo+ICsJaXB1X2ljX2ZyZWVfZG1hX2J1Zihwcml2LCAmY3R4LT5yb3RfaW50ZXJtZWRp YXRlWzFdKTsKPiArCWlwdV9pY19mcmVlX2RtYV9idWYocHJpdiwgJmN0eC0+cm90X2ludGVybWVk aWF0ZVswXSk7Cj4gKwo+ICsJa2ZyZWUoY3R4KTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChp cHVfaW1hZ2VfY29udmVydF91bnByZXBhcmUpOwo+ICsKPiArLyoKPiArICogIkNhbm5lZCIgYXN5 bmNocm9ub3VzIHNpbmdsZSBpbWFnZSBjb252ZXJzaW9uLiBPbiBzdWNjZXNzZnVsIHJldHVybgo+ ICsgKiBjYWxsZXIgbXVzdCBjYWxsIGlwdV9pbWFnZV9jb252ZXJ0X3VucHJlcGFyZSgpIGFmdGVy IGNvbnZlcnNpb24gY29tcGxldGVzLgo+ICsgKiBSZXR1cm5zIHRoZSBuZXcgY29udmVyc2lvbiBj b250ZXh0Lgo+ICsgKi8KPiArc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKgo+ICtpcHVfaW1h Z2VfY29udmVydChzdHJ1Y3QgaXB1X2ljICppYywKPiArCQkgIHN0cnVjdCBpcHVfaW1hZ2UgKmlu LCBzdHJ1Y3QgaXB1X2ltYWdlICpvdXQsCj4gKwkJICBlbnVtIGlwdV9yb3RhdGVfbW9kZSByb3Rf bW9kZSwKPiArCQkgIGltYWdlX2NvbnZlcnRlcl9jYl90IGNvbXBsZXRlLAo+ICsJCSAgdm9pZCAq Y29tcGxldGVfY29udGV4dCkKPiArewo+ICsJc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKmN0 eDsKPiArCXN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfcnVuICpydW47Cj4gKwo+ICsJY3R4ID0gaXB1 X2ltYWdlX2NvbnZlcnRfcHJlcGFyZShpYywgaW4sIG91dCwgcm90X21vZGUsCj4gKwkJCQkJY29t cGxldGUsIGNvbXBsZXRlX2NvbnRleHQpOwo+ICsJaWYgKElTX0VSUihjdHgpKQo+ICsJCXJldHVy biBjdHg7Cj4gKwo+ICsJcnVuID0gaXB1X2ltYWdlX2NvbnZlcnRfcnVuKGN0eCwgaW4tPnBoeXMw LCBvdXQtPnBoeXMwKTsKPiArCWlmIChJU19FUlIocnVuKSkgewo+ICsJCWlwdV9pbWFnZV9jb252 ZXJ0X3VucHJlcGFyZShjdHgpOwo+ICsJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIocnVuKSk7Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIGN0eDsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChpcHVfaW1h Z2VfY29udmVydCk7Cj4gKwo+ICsvKiAiQ2FubmVkIiBzeW5jaHJvbm91cyBzaW5nbGUgaW1hZ2Ug Y29udmVyc2lvbiAqLwo+ICtzdGF0aWMgdm9pZCBpbWFnZV9jb252ZXJ0X3N5bmNfY29tcGxldGUo dm9pZCAqZGF0YSwKPiArCQkJCQlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX3J1biAqcnVuLAo+ICsJ CQkJCWludCBlcnIpCj4gK3sKPiArCXN0cnVjdCBjb21wbGV0aW9uICpjb21wID0gZGF0YTsKPiAr Cj4gKwljb21wbGV0ZShjb21wKTsKPiArfQo+ICsKPiAraW50IGlwdV9pbWFnZV9jb252ZXJ0X3N5 bmMoc3RydWN0IGlwdV9pYyAqaWMsCj4gKwkJCSAgIHN0cnVjdCBpcHVfaW1hZ2UgKmluLCBzdHJ1 Y3QgaXB1X2ltYWdlICpvdXQsCj4gKwkJCSAgIGVudW0gaXB1X3JvdGF0ZV9tb2RlIHJvdF9tb2Rl KQo+ICt7Cj4gKwlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4Owo+ICsJc3RydWN0IGNv bXBsZXRpb24gY29tcDsKPiArCWludCByZXQ7Cj4gKwo+ICsJaW5pdF9jb21wbGV0aW9uKCZjb21w KTsKPiArCj4gKwljdHggPSBpcHVfaW1hZ2VfY29udmVydChpYywgaW4sIG91dCwgcm90X21vZGUs Cj4gKwkJCQlpbWFnZV9jb252ZXJ0X3N5bmNfY29tcGxldGUsICZjb21wKTsKPiArCWlmIChJU19F UlIoY3R4KSkKPiArCQlyZXR1cm4gUFRSX0VSUihjdHgpOwo+ICsKPiArCXJldCA9IHdhaXRfZm9y X2NvbXBsZXRpb25fdGltZW91dCgmY29tcCwgbXNlY3NfdG9famlmZmllcygxMDAwMCkpOwo+ICsJ cmV0ID0gKHJldCA9PSAwKSA/IC1FVElNRURPVVQgOiAwOwo+ICsKPiArCWlwdV9pbWFnZV9jb252 ZXJ0X3VucHJlcGFyZShjdHgpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArRVhQT1JUX1NZ TUJPTF9HUEwoaXB1X2ltYWdlX2NvbnZlcnRfc3luYyk7Cj4gKwoKTW9zdCBvZiB0aGlzIGNhbGN1 bGF0aW9uIG9mIHRpbGUgZ2VvbWV0cnkgYW5kIGNvbnZlcnNpb24gcXVldWUgaGFuZGxpbmcKY29k ZSBpcyBub3QgcmVhbGx5IGxvdyBsZXZlbCBJQyBoYXJkd2FyZSBhY2Nlc3MuIEknZCBsaWtlIHRo ZSBjb2RlIHRoYXQKZG9lc24ndCBoYXZlIHRvIGFjY2VzcyBpcHVfaWMgaW50ZXJuYWxzIGRpcmVj dGx5IHRvIGJlIG1vdmVkIGludG8gYQpzZXBhcmF0ZSBzb3VyY2UgZmlsZS4gSSdkIHN1Z2dlc3Qg aXB1LWljLXF1ZXVlLmMsIG9yCmlwdS1pbWFnZS1jb252ZXJ0LmMuCgo+ICBpbnQgaXB1X2ljX2Vu YWJsZShzdHJ1Y3QgaXB1X2ljICppYykKPiAgewo+ICAJc3RydWN0IGlwdV9pY19wcml2ICpwcml2 ID0gaWMtPnByaXY7Cj4gQEAgLTc0Niw2ICsyNDE4LDcgQEAgaW50IGlwdV9pY19pbml0KHN0cnVj dCBpcHVfc29jICppcHUsIHN0cnVjdCBkZXZpY2UgKmRldiwKPiAgCWlwdS0+aWNfcHJpdiA9IHBy aXY7Cj4gIAo+ICAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwo+ICsKPiAgCXByaXYtPmJh c2UgPSBkZXZtX2lvcmVtYXAoZGV2LCBiYXNlLCBQQUdFX1NJWkUpOwo+ICAJaWYgKCFwcml2LT5i YXNlKQo+ICAJCXJldHVybiAtRU5PTUVNOwo+IEBAIC03NTgsMTAgKzI0MzEsMjEgQEAgaW50IGlw dV9pY19pbml0KHN0cnVjdCBpcHVfc29jICppcHUsIHN0cnVjdCBkZXZpY2UgKmRldiwKPiAgCXBy aXYtPmlwdSA9IGlwdTsKPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgSUNfTlVNX1RBU0tTOyBpKysp IHsKPiAtCQlwcml2LT50YXNrW2ldLnRhc2sgPSBpOwo+IC0JCXByaXYtPnRhc2tbaV0ucHJpdiA9 IHByaXY7Cj4gLQkJcHJpdi0+dGFza1tpXS5yZWcgPSAmaWNfdGFza19yZWdbaV07Cj4gLQkJcHJp di0+dGFza1tpXS5iaXQgPSAmaWNfdGFza19iaXRbaV07Cj4gKwkJc3RydWN0IGlwdV9pYyAqaWMg PSAmcHJpdi0+dGFza1tpXTsKPiArCQlzdHJ1Y3QgaW1hZ2VfY29udmVydGVyICpjdnQgPSAmaWMt PmN2dDsKPiArCj4gKwkJaWMtPnRhc2sgPSBpOwo+ICsJCWljLT5wcml2ID0gcHJpdjsKPiArCQlp Yy0+cmVnID0gJmljX3Rhc2tfcmVnW2ldOwo+ICsJCWljLT5iaXQgPSAmaWNfdGFza19iaXRbaV07 Cj4gKwkJaWMtPmNoID0gJmljX3Rhc2tfY2hbaV07Cj4gKwo+ICsJCWN2dC0+aWMgPSBpYzsKPiAr CQlzcGluX2xvY2tfaW5pdCgmY3Z0LT5pcnFsb2NrKTsKPiArCQlJTklUX0xJU1RfSEVBRCgmY3Z0 LT5jdHhfbGlzdCk7Cj4gKwkJSU5JVF9MSVNUX0hFQUQoJmN2dC0+cGVuZGluZ19xKTsKPiArCQlJ TklUX0xJU1RfSEVBRCgmY3Z0LT5kb25lX3EpOwo+ICsJCWN2dC0+b3V0X2VvZl9pcnEgPSBjdnQt PnJvdF9vdXRfZW9mX2lycSA9IC0xOwo+ICAJfQo+ICAKPiAgCXJldHVybiAwOwo+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL3ZpZGVvL2lteC1pcHUtdjMuaCBiL2luY2x1ZGUvdmlkZW8vaW14LWlwdS12 My5oCj4gaW5kZXggMWEzZjdkNC4uOTkyYWRkZiAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL3ZpZGVv L2lteC1pcHUtdjMuaAo+ICsrKyBiL2luY2x1ZGUvdmlkZW8vaW14LWlwdS12My5oCj4gQEAgLTYz LDE3ICs2MywyNSBAQCBlbnVtIGlwdV9jc2lfZGVzdCB7Cj4gIC8qCj4gICAqIEVudW1lcmF0aW9u IG9mIElQVSByb3RhdGlvbiBtb2Rlcwo+ICAgKi8KPiArI2RlZmluZSBJUFVfUk9UX0JJVF9WRkxJ UCAoMSA8PCAwKQo+ICsjZGVmaW5lIElQVV9ST1RfQklUX0hGTElQICgxIDw8IDEpCj4gKyNkZWZp bmUgSVBVX1JPVF9CSVRfOTAgICAgKDEgPDwgMikKPiArCj4gIGVudW0gaXB1X3JvdGF0ZV9tb2Rl IHsKPiAgCUlQVV9ST1RBVEVfTk9ORSA9IDAsCj4gLQlJUFVfUk9UQVRFX1ZFUlRfRkxJUCwKPiAt CUlQVV9ST1RBVEVfSE9SSVpfRkxJUCwKPiAtCUlQVV9ST1RBVEVfMTgwLAo+IC0JSVBVX1JPVEFU RV85MF9SSUdIVCwKPiAtCUlQVV9ST1RBVEVfOTBfUklHSFRfVkZMSVAsCj4gLQlJUFVfUk9UQVRF XzkwX1JJR0hUX0hGTElQLAo+IC0JSVBVX1JPVEFURV85MF9MRUZULAo+ICsJSVBVX1JPVEFURV9W RVJUX0ZMSVAgPSBJUFVfUk9UX0JJVF9WRkxJUCwKPiArCUlQVV9ST1RBVEVfSE9SSVpfRkxJUCA9 IElQVV9ST1RfQklUX0hGTElQLAo+ICsJSVBVX1JPVEFURV8xODAgPSAoSVBVX1JPVF9CSVRfVkZM SVAgfCBJUFVfUk9UX0JJVF9IRkxJUCksCj4gKwlJUFVfUk9UQVRFXzkwX1JJR0hUID0gSVBVX1JP VF9CSVRfOTAsCj4gKwlJUFVfUk9UQVRFXzkwX1JJR0hUX1ZGTElQID0gKElQVV9ST1RfQklUXzkw IHwgSVBVX1JPVF9CSVRfVkZMSVApLAo+ICsJSVBVX1JPVEFURV85MF9SSUdIVF9IRkxJUCA9IChJ UFVfUk9UX0JJVF85MCB8IElQVV9ST1RfQklUX0hGTElQKSwKPiArCUlQVV9ST1RBVEVfOTBfTEVG VCA9IChJUFVfUk9UX0JJVF85MCB8Cj4gKwkJCSAgICAgIElQVV9ST1RfQklUX1ZGTElQIHwgSVBV X1JPVF9CSVRfSEZMSVApLAo+ICB9Owo+ICAKPiArLyogOTAtZGVncmVlIHJvdGF0aW9ucyByZXF1 aXJlIHRoZSBJUlQgdW5pdCAqLwo+ICsjZGVmaW5lIGlwdV9yb3RfbW9kZV9pc19pcnQobSkgKCht KSA+PSBJUFVfUk9UQVRFXzkwX1JJR0hUKQo+ICsKPiAgZW51bSBpcHVfY29sb3Jfc3BhY2Ugewo+ ICAJSVBVVjNfQ09MT1JTUEFDRV9SR0IsCj4gIAlJUFVWM19DT0xPUlNQQUNFX1lVViwKPiBAQCAt MzM3LDYgKzM0NSw3IEBAIGVudW0gaXB1X2ljX3Rhc2sgewo+ICB9Owo+ICAKPiAgc3RydWN0IGlw dV9pYzsKPiArCj4gIGludCBpcHVfaWNfdGFza19pbml0KHN0cnVjdCBpcHVfaWMgKmljLAo+ICAJ CSAgICAgaW50IGluX3dpZHRoLCBpbnQgaW5faGVpZ2h0LAo+ICAJCSAgICAgaW50IG91dF93aWR0 aCwgaW50IG91dF9oZWlnaHQsCj4gQEAgLTM1MSw2ICszNjAsNDAgQEAgdm9pZCBpcHVfaWNfdGFz a19kaXNhYmxlKHN0cnVjdCBpcHVfaWMgKmljKTsKPiAgaW50IGlwdV9pY190YXNrX2lkbWFfaW5p dChzdHJ1Y3QgaXB1X2ljICppYywgc3RydWN0IGlwdXYzX2NoYW5uZWwgKmNoYW5uZWwsCj4gIAkJ CSAgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0LCBpbnQgYnVyc3Rfc2l6ZSwKPiAgCQkJICBlbnVtIGlw dV9yb3RhdGVfbW9kZSByb3QpOwo+ICsKPiArc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHg7Cj4g K3N0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfcnVuOwo+ICsKCkFkZCBhbiBpcHVfIHByZWZpeCB0byB0 aG9zZS4KCj4gK3R5cGVkZWYgdm9pZCAoKmltYWdlX2NvbnZlcnRlcl9jYl90KSh2b2lkICpjdHgs Cj4gKwkJCQkgICAgIHN0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfcnVuICpydW4sCj4gKwkJCQkgICAg IGludCBlcnIpOwo+ICsKPiAraW50IGlwdV9pbWFnZV9jb252ZXJ0X2VudW1fZm9ybWF0KGludCBp bmRleCwgY29uc3QgY2hhciAqKmRlc2MsIHUzMiAqZm91cmNjKTsKPiAraW50IGlwdV9pbWFnZV9j b252ZXJ0X2FkanVzdChzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0 LAo+ICsJCQkgICAgIGVudW0gaXB1X3JvdGF0ZV9tb2RlIHJvdF9tb2RlKTsKPiAraW50IGlwdV9p bWFnZV9jb252ZXJ0X3ZlcmlmeShzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFn ZSAqb3V0LAo+ICsJCQkgICAgIGVudW0gaXB1X3JvdGF0ZV9tb2RlIHJvdF9tb2RlKTsKPiArc3Ry dWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKgo+ICtpcHVfaW1hZ2VfY29udmVydF9wcmVwYXJlKHN0 cnVjdCBpcHVfaWMgKmljLAo+ICsJCQkgIHN0cnVjdCBpcHVfaW1hZ2UgKmluLCBzdHJ1Y3QgaXB1 X2ltYWdlICpvdXQsCj4gKwkJCSAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUsCj4gKwkJ CSAgaW1hZ2VfY29udmVydGVyX2NiX3QgY29tcGxldGUsCj4gKwkJCSAgdm9pZCAqY29tcGxldGVf Y29udGV4dCk7Cj4gK3ZvaWQgaXB1X2ltYWdlX2NvbnZlcnRfdW5wcmVwYXJlKHN0cnVjdCBpbWFn ZV9jb252ZXJ0ZXJfY3R4ICpjdHgpOwo+ICtzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX3J1biAqCj4g K2lwdV9pbWFnZV9jb252ZXJ0X3J1bihzdHJ1Y3QgaW1hZ2VfY29udmVydGVyX2N0eCAqY3R4LAo+ ICsJCSAgICAgIGRtYV9hZGRyX3QgaW5fcGh5cywgZG1hX2FkZHJfdCBvdXRfcGh5cyk7Cj4gK3Zv aWQgaXB1X2ltYWdlX2NvbnZlcnRfYWJvcnQoc3RydWN0IGltYWdlX2NvbnZlcnRlcl9jdHggKmN0 eCk7Cj4gK3N0cnVjdCBpbWFnZV9jb252ZXJ0ZXJfY3R4ICoKPiAraXB1X2ltYWdlX2NvbnZlcnQo c3RydWN0IGlwdV9pYyAqaWMsCj4gKwkJICBzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlw dV9pbWFnZSAqb3V0LAo+ICsJCSAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUsCj4gKwkJ ICBpbWFnZV9jb252ZXJ0ZXJfY2JfdCBjb21wbGV0ZSwKPiArCQkgIHZvaWQgKmNvbXBsZXRlX2Nv bnRleHQpOwo+ICtpbnQgaXB1X2ltYWdlX2NvbnZlcnRfc3luYyhzdHJ1Y3QgaXB1X2ljICppYywK PiArCQkJICAgc3RydWN0IGlwdV9pbWFnZSAqaW4sIHN0cnVjdCBpcHVfaW1hZ2UgKm91dCwKPiAr CQkJICAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUpOwo+ICsKPiAgaW50IGlwdV9pY19l bmFibGUoc3RydWN0IGlwdV9pYyAqaWMpOwo+ICBpbnQgaXB1X2ljX2Rpc2FibGUoc3RydWN0IGlw dV9pYyAqaWMpOwo+ICBzdHJ1Y3QgaXB1X2ljICppcHVfaWNfZ2V0KHN0cnVjdCBpcHVfc29jICpp cHUsIGVudW0gaXB1X2ljX3Rhc2sgdGFzayk7CgpyZWdhcmRzClBoaWxpcHAKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=