From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id B69BA6E12E for ; Wed, 31 Jan 2018 14:32:29 +0000 (UTC) Date: Wed, 31 Jan 2018 16:32:26 +0200 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Message-ID: <20180131143226.GL5453@intel.com> References: <20180123125642.58698-1-maarten.lankhorst@linux.intel.com> <20180123125642.58698-9-maarten.lankhorst@linux.intel.com> <1517406337.2602.27.camel@intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1517406337.2602.27.camel@intel.com> Subject: Re: [igt-dev] [PATCH i-g-t 8/8] lib/igt_fb: Add support for NV12 format through conversion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Mika Kahola Cc: igt-dev@lists.freedesktop.org List-ID: T24gV2VkLCBKYW4gMzEsIDIwMTggYXQgMDM6NDU6MzdQTSArMDIwMCwgTWlrYSBLYWhvbGEgd3Jv dGU6Cj4gT24gVHVlLCAyMDE4LTAxLTIzIGF0IDEzOjU2ICswMTAwLCBNYWFydGVuIExhbmtob3Jz dCB3cm90ZToKPiA+IEZvciBOVjEyIGEgZm9ybWF0IGNvbnZlcnNpb24gaXMgbmVlZGVkLiBCZWNh dXNlIFlVViBmb3JtYXRzIGFyZSBub3QKPiA+IGZ1bGx5IGRlZmluZWQgd2l0aCBqdXN0IGEgZm91 cmNjLCBJJ3ZlIGNob3NlbiBCVC43MDkgbGltaXRlZCByYW5nZS4KPiA+IFRoaXMgcHV0cyB0aGUg cGl4ZWwgY2VudGVyIG9mIHRoZSBDYkNyIGNvbXBvbmVudHMgYmV0d2VlbiB0aGUgdG9wCj4gPiBs ZWZ0IFkgYW5kIGJvdHRvbSBsZWZ0IFk6Cj4gPiAKPiA+IFnCoMKgwqBZwqDCoMKgWcKgwqDCoFkK PiA+IFVWwqDCoMKgwqDCoMKgVVYKPiA+IFnCoMKgwqBZwqDCoMKgWcKgwqDCoFkKPiA+IAo+ID4g U29tZSB3b3JrIGlzIHB1dCBpbnRvIG9wdGltaXNpbmcgdGhlIGNvbnZlcnNpb24gcm91dGluZXMg aW4gb3JkZXIgdG8KPiA+IG1ha2UgaXQgZmFzdCBlbm91Z2guIEJlZm9yZSBjb252ZXJ0aW5nIG52 MTIgdG8gcmdiMjQsIGl0IGlzIGNvcGllZCB0bwo+ID4gYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIHRh a2UgYWR2YW50YWdlIG9mIG1lbW9yeSBjYWNoaW5nLiBUaGlzIGlzCj4gPiBhcHByb3hpbWF0ZWx5 IDIweCBmYXN0ZXIgdGhhbiBkaXJlY3RseSByZWFkaW5nIHRoZSBCTy4KPiA+IAo+ID4gV2hlbiB0 ZXN0aW5nIG9uIG15IEtCTCB3aXRoIGEgMTA4MHAgYnVmZmVyLCBpdCB0YWtlcyBhcHByb3hpbWF0 ZWx5Cj4gPiAuMXMgdG8gY29udmVydCBlaXRoZXIgd2F5LCB0aGlzIGlzIGZhc3QgZW5vdWdoIG5v dCB0byBib3RoZXIKPiA+IG9wdGltaXNpbmcKPiA+IGV2ZW4gZnVydGhlciBmb3IgbWUuCj4gPiAK PiA+IFNpZ25lZC1vZmYtYnk6IE1hYXJ0ZW4gTGFua2hvcnN0IDxtYWFydGVuLmxhbmtob3JzdEBs aW51eC5pbnRlbC5jb20+Cj4gPiAtLS0KPiA+IMKgbGliL2lndF9mYi5jIHwgMzkwICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KPiA+IC0tLS0tLS0tLS0K PiA+IMKgMSBmaWxlIGNoYW5nZWQsIDMxOCBpbnNlcnRpb25zKCspLCA3MiBkZWxldGlvbnMoLSkK PiA+IAo+ID4gZGlmZiAtLWdpdCBhL2xpYi9pZ3RfZmIuYyBiL2xpYi9pZ3RfZmIuYwo+ID4gaW5k ZXggNGQ2YjYyYTY0ZGVkLi40M2I3MWU2NDM1ODYgMTAwNjQ0Cj4gPiAtLS0gYS9saWIvaWd0X2Zi LmMKPiA+ICsrKyBiL2xpYi9pZ3RfZmIuYwo+ID4gQEAgLTcwLDYgKzcwLDcgQEAgc3RhdGljIHN0 cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3Qgewo+ID4gwqAJREYoWFJHQjg4ODgsCVJHQjI0LAkJMzIs IDI0KSwKPiA+IMKgCURGKFhSR0IyMTAxMDEwLAlSR0IzMCwJCTMyLCAzMCksCj4gPiDCoAlERihB UkdCODg4OCwJQVJHQjMyLAkJMzIsIDMyKSwKPiA+ICsJREYoTlYxMiwJUkdCMjQsCQkzMiwgLTEs IDIsIHs4LCAxNn0pLAo+ID4gwqB9Owo+ID4gwqAjdW5kZWYgREYKPiA+IMKgCj4gPiBAQCAtMzYz LDE0ICszNjQsMjAgQEAgc3RhdGljIGludCBjcmVhdGVfYm9fZm9yX2ZiKGludCBmZCwgaW50IHdp ZHRoLAo+ID4gaW50IGhlaWdodCwKPiA+IMKgCQkJKmlzX2R1bWIgPSBmYWxzZTsKPiA+IMKgCj4g PiDCoAkJaWYgKGlzX2k5MTVfZGV2aWNlKGZkKSkgewo+ID4gLQkJCXVpbnQzMl90ICpwdHI7Cj4g PiArCQkJdWludDhfdCAqcHRyOwo+ID4gwqAKPiA+IMKgCQkJYm8gPSBnZW1fY3JlYXRlKGZkLCBz aXplKTsKPiA+IMKgCQkJZ2VtX3NldF90aWxpbmcoZmQsIGJvLAo+ID4gaWd0X2ZiX21vZF90b190 aWxpbmcodGlsaW5nKSwgc3RyaWRlKTsKPiA+IMKgCj4gPiDCoAkJCS8qIEVuc3VyZSB0aGUgZnJh bWVidWZmZXIgaXMgcHJlYWxsb2NhdGVkICovCj4gPiAtCQkJcHRyID0gZ2VtX21tYXBfX2d0dChm ZCwgYm8sIHNpemUsCj4gPiBQUk9UX1JFQUQpOwo+ID4gLQkJCWlndF9hc3NlcnQoKnB0ciA9PSAw KTsKPiA+ICsJCQlwdHIgPSBnZW1fbW1hcF9fZ3R0KGZkLCBibywgc2l6ZSwgUFJPVF9SRUFECj4g PiB8IFBST1RfV1JJVEUpOwo+ID4gKwkJCWlndF9hc3NlcnQoKih1aW50MzJfdCAqKXB0ciA9PSAw KTsKPiA+ICsKPiA+ICsJCQlpZiAoZm9ybWF0LT5kcm1faWQgPT0gRFJNX0ZPUk1BVF9OVjEyKSB7 Cj4gPiArCQkJCS8qIGNvbXBvbmVudCBmb3JtYXRzIGhhdmUgYQo+ID4gZGlmZmVyZW50IHplcm8g cG9pbnQgKi8KPiA+ICsJCQkJbWVtc2V0KHB0ciwgMTYsIG9mZnNldHNbMV0pOwo+ID4gKwkJCQlt ZW1zZXQocHRyICsgb2Zmc2V0c1sxXSwgMHg4MCwKPiA+IChoZWlnaHQgKyAxKS8yICogc3RyaWRl KTsKPiA+ICsJCQl9Cj4gPiDCoAkJCWdlbV9tdW5tYXAocHRyLCBzaXplKTsKPiA+IMKgCj4gPiDC oAkJCWlmIChzaXplX3JldCkKPiA+IEBAIC0xMTI2LDEwMyArMTEzMywxMTcgQEAgc3RhdGljIGNh aXJvX2Zvcm1hdF90Cj4gPiBkcm1fZm9ybWF0X3RvX2NhaXJvKHVpbnQzMl90IGRybV9mb3JtYXQp Cj4gPiDCoAkJwqDCoMKgwqDCoGRybV9mb3JtYXQsIGlndF9mb3JtYXRfc3RyKGRybV9mb3JtYXQp KTsKPiA+IMKgfQo+ID4gwqAKPiA+ICtzdHJ1Y3QgZmJfYmxpdF9saW5lYXIgewo+ID4gKwl1aW50 MzJfdCBoYW5kbGU7Cj4gPiArCXVuc2lnbmVkIHNpemUsIHN0cmlkZTsKPiA+ICsJdWludDhfdCAq bWFwOwo+ID4gKwlib29sIGlzX2R1bWI7Cj4gPiArCXVpbnQzMl90IG9mZnNldHNbNF07Cj4gPiAr fTsKPiA+ICsKPiA+IMKgc3RydWN0IGZiX2JsaXRfdXBsb2FkIHsKPiA+IMKgCWludCBmZDsKPiA+ IMKgCXN0cnVjdCBpZ3RfZmIgKmZiOwo+ID4gLQlzdHJ1Y3Qgewo+ID4gLQkJdWludDMyX3QgaGFu ZGxlOwo+ID4gLQkJdW5zaWduZWQgc2l6ZSwgc3RyaWRlOwo+ID4gLQkJdWludDhfdCAqbWFwOwo+ ID4gLQkJYm9vbCBpc19kdW1iOwo+ID4gLQl9IGxpbmVhcjsKPiA+ICsJc3RydWN0IGZiX2JsaXRf bGluZWFyIGxpbmVhcjsKPiA+IMKgfTsKPiA+IMKgCj4gPiAtc3RhdGljIHZvaWQgZGVzdHJveV9j YWlyb19zdXJmYWNlX19ibGl0KHZvaWQgKmFyZykKPiA+ICtzdGF0aWMgdm9pZCBmcmVlX2xpbmVh cl9tYXBwaW5nKGludCBmZCwgc3RydWN0IGlndF9mYiAqZmIsIHN0cnVjdAo+ID4gZmJfYmxpdF9s aW5lYXIgKmxpbmVhcikKPiA+IMKgewo+ID4gLQlzdHJ1Y3QgZmJfYmxpdF91cGxvYWQgKmJsaXQg PSBhcmc7Cj4gPiAtCXN0cnVjdCBpZ3RfZmIgKmZiID0gYmxpdC0+ZmI7Cj4gPiDCoAl1bnNpZ25l ZCBpbnQgb2JqX3RpbGluZyA9IGlndF9mYl9tb2RfdG9fdGlsaW5nKGZiLT50aWxpbmcpOwo+ID4g KwlpbnQgaTsKPiA+IMKgCj4gPiAtCWdlbV9tdW5tYXAoYmxpdC0+bGluZWFyLm1hcCwgYmxpdC0+ bGluZWFyLnNpemUpOwo+ID4gLQlmYi0+Y2Fpcm9fc3VyZmFjZSA9IE5VTEw7Cj4gPiArCWdlbV9t dW5tYXAobGluZWFyLT5tYXAsIGxpbmVhci0+c2l6ZSk7Cj4gPiArCWdlbV9zZXRfZG9tYWluKGZk LCBsaW5lYXItPmhhbmRsZSwKPiA+ICsJCcKgwqDCoMKgwqDCoMKgSTkxNV9HRU1fRE9NQUlOX0dU VCwgMCk7Cj4gPiArCj4gPiArCWZvciAoaSA9IDA7IGkgPCBmYi0+bnVtX3BsYW5lczsgaSsrKQo+ ID4gKwkJaWd0X2JsaXR0ZXJfZmFzdF9jb3B5X19yYXcoZmQsCj4gPiArCQkJCQnCoMKgwqBsaW5l YXItPmhhbmRsZSwKPiA+ICsJCQkJCcKgwqDCoGxpbmVhci0+b2Zmc2V0c1tpXSwKPiA+ICsJCQkJ CcKgwqDCoGxpbmVhci0+c3RyaWRlLAo+ID4gKwkJCQkJwqDCoMKgSTkxNV9USUxJTkdfTk9ORSwK PiA+ICsJCQkJCcKgwqDCoDAsIDAsIC8qIHNyY194LCBzcmNfeSAqLwo+ID4gKwkJCQkJwqDCoMKg ZmItPnBsYW5lX3dpZHRoW2ldLCBmYi0KPiA+ID5wbGFuZV9oZWlnaHRbaV0sCj4gPiArCQkJCQnC oMKgwqBmYi0+cGxhbmVfYnBwW2ldLAo+ID4gKwkJCQkJwqDCoMKgZmItPmdlbV9oYW5kbGUsCj4g PiArCQkJCQnCoMKgwqBmYi0+b2Zmc2V0c1tpXSwKPiA+ICsJCQkJCcKgwqDCoGZiLT5zdHJpZGUs Cj4gPiArCQkJCQnCoMKgwqBvYmpfdGlsaW5nLAo+ID4gKwkJCQkJwqDCoMKgMCwgMCAvKiBkc3Rf eCwgZHN0X3kgKi8pOwo+ID4gKwo+ID4gKwlnZW1fc3luYyhmZCwgbGluZWFyLT5oYW5kbGUpOwo+ ID4gKwlnZW1fY2xvc2UoZmQsIGxpbmVhci0+aGFuZGxlKTsKPiA+ICt9Cj4gPiDCoAo+ID4gLQln ZW1fc2V0X2RvbWFpbihibGl0LT5mZCwgYmxpdC0+bGluZWFyLmhhbmRsZSwKPiA+IC0JCQlJOTE1 X0dFTV9ET01BSU5fR1RULCAwKTsKPiA+ICtzdGF0aWMgdm9pZCBkZXN0cm95X2NhaXJvX3N1cmZh Y2VfX2JsaXQodm9pZCAqYXJnKQo+ID4gK3sKPiA+ICsJc3RydWN0IGZiX2JsaXRfdXBsb2FkICpi bGl0ID0gYXJnOwo+ID4gwqAKPiA+IC0JaWd0X2JsaXR0ZXJfZmFzdF9jb3B5X19yYXcoYmxpdC0+ ZmQsCj4gPiAtCQkJCcKgwqDCoGJsaXQtPmxpbmVhci5oYW5kbGUsIDAsCj4gPiAtCQkJCcKgwqDC oGJsaXQtPmxpbmVhci5zdHJpZGUsCj4gPiAtCQkJCcKgwqDCoEk5MTVfVElMSU5HX05PTkUsCj4g PiAtCQkJCcKgwqDCoDAsIDAsIC8qIHNyY194LCBzcmNfeSAqLwo+ID4gLQkJCQnCoMKgwqBmYi0+ d2lkdGgsIGZiLT5oZWlnaHQsCj4gPiAtCQkJCcKgwqDCoGlndF9kcm1fZm9ybWF0X3RvX2JwcChm Yi0KPiA+ID5kcm1fZm9ybWF0KSwKPiA+IC0JCQkJwqDCoMKgZmItPmdlbV9oYW5kbGUsCj4gPiAt CQkJCcKgwqDCoGZiLT5vZmZzZXRzWzBdLAo+ID4gLQkJCQnCoMKgwqBmYi0+c3RyaWRlLAo+ID4g LQkJCQnCoMKgwqBvYmpfdGlsaW5nLAo+ID4gLQkJCQnCoMKgwqAwLCAwIC8qIGRzdF94LCBkc3Rf eSAqLyk7Cj4gPiAtCj4gPiAtCWdlbV9zeW5jKGJsaXQtPmZkLCBibGl0LT5saW5lYXIuaGFuZGxl KTsKPiA+IC0JZ2VtX2Nsb3NlKGJsaXQtPmZkLCBibGl0LT5saW5lYXIuaGFuZGxlKTsKPiA+ICsJ YmxpdC0+ZmItPmNhaXJvX3N1cmZhY2UgPSBOVUxMOwo+ID4gKwo+ID4gKwlmcmVlX2xpbmVhcl9t YXBwaW5nKGJsaXQtPmZkLCBibGl0LT5mYiwgJmJsaXQtPmxpbmVhcik7Cj4gPiDCoAo+ID4gwqAJ ZnJlZShibGl0KTsKPiA+IMKgfQo+ID4gwqAKPiA+IC1zdGF0aWMgdm9pZCBjcmVhdGVfY2Fpcm9f c3VyZmFjZV9fYmxpdChpbnQgZmQsIHN0cnVjdCBpZ3RfZmIgKmZiKQo+ID4gK3N0YXRpYyB2b2lk IHNldHVwX2xpbmVhcl9tYXBwaW5nKGludCBmZCwgc3RydWN0IGlndF9mYiAqZmIsIHN0cnVjdAo+ ID4gZmJfYmxpdF9saW5lYXIgKmxpbmVhcikKPiA+IMKgewo+ID4gLQlzdHJ1Y3QgZmJfYmxpdF91 cGxvYWQgKmJsaXQ7Cj4gPiAtCWNhaXJvX2Zvcm1hdF90IGNhaXJvX2Zvcm1hdDsKPiA+IMKgCXVu c2lnbmVkIGludCBvYmpfdGlsaW5nID0gaWd0X2ZiX21vZF90b190aWxpbmcoZmItPnRpbGluZyk7 Cj4gPiAtCXVpbnQzMl90IG9mZnNldHNbNF07Cj4gPiAtCj4gPiAtCWJsaXQgPSBtYWxsb2Moc2l6 ZW9mKCpibGl0KSk7Cj4gPiAtCWlndF9hc3NlcnQoYmxpdCk7Cj4gPiArCWludCBpOwo+ID4gwqAK PiA+IMKgCS8qCj4gPiDCoAnCoCogV2UgY3JlYXRlIGEgbGluZWFyIEJPIHRoYXQgd2UnbGwgbWFw IGZvciB0aGUgQ1BVIHRvIHdyaXRlCj4gPiB0byAodXNpbmcKPiA+IMKgCcKgKiBjYWlybykuIFRo aXMgbGluZWFyIGJvIHdpbGwgYmUgdGhlbiBibGl0dGVkIHRvIGl0cyBmaW5hbAo+ID4gwqAJwqAq IGRlc3RpbmF0aW9uLCB0aWxpbmcgaXQgYXQgdGhlIHNhbWUgdGltZS4KPiA+IMKgCcKgKi8KPiA+ IC0JYmxpdC0+bGluZWFyLmhhbmRsZSA9IGNyZWF0ZV9ib19mb3JfZmIoZmQsIGZiLT53aWR0aCwg ZmItCj4gPiA+aGVpZ2h0LAo+ID4gKwlsaW5lYXItPmhhbmRsZSA9IGNyZWF0ZV9ib19mb3JfZmIo ZmQsIGZiLT53aWR0aCwgZmItPmhlaWdodCwKPiA+IMKgCQkJCQnCoMKgwqDCoMKgwqDCoGxvb2t1 cF9kcm1fZm9ybWF0KGZiLQo+ID4gPmRybV9mb3JtYXQpLAo+ID4gwqAJCQkJCcKgwqDCoMKgwqDC oMKgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfCj4gPiBOT05FLCAwLAo+ID4gLQkJCQkJwqDCoMKgwqDC oMKgwqAwLCAmYmxpdC0KPiA+ID5saW5lYXIuc2l6ZSwKPiA+IC0JCQkJCcKgwqDCoMKgwqDCoMKg JmJsaXQtPmxpbmVhci5zdHJpZGUsCj4gPiAtCQkJCQnCoMKgwqDCoMKgwqDCoG9mZnNldHMsICZi bGl0LQo+ID4gPmxpbmVhci5pc19kdW1iKTsKPiA+IC0KPiA+IC0JaWd0X2Fzc2VydChibGl0LT5s aW5lYXIuaGFuZGxlID4gMCk7Cj4gPiArCQkJCQnCoMKgwqDCoMKgwqDCoDAsICZsaW5lYXItPnNp emUsCj4gPiArCQkJCQnCoMKgwqDCoMKgwqDCoCZsaW5lYXItPnN0cmlkZSwKPiA+ICsJCQkJCcKg wqDCoMKgwqDCoMKgbGluZWFyLT5vZmZzZXRzLAo+ID4gJmxpbmVhci0+aXNfZHVtYik7Cj4gPiDC oAo+ID4gLQlibGl0LT5mZCA9IGZkOwo+ID4gLQlibGl0LT5mYiA9IGZiOwo+ID4gKwlpZ3RfYXNz ZXJ0KGxpbmVhci0+aGFuZGxlID4gMCk7Cj4gPiDCoAo+ID4gwqAJLyogQ29weSBmYiBjb250ZW50 IHRvIGxpbmVhciBCTyAqLwo+ID4gLQlnZW1fc2V0X2RvbWFpbihmZCwgYmxpdC0+bGluZWFyLmhh bmRsZSwKPiA+ICsJZ2VtX3NldF9kb21haW4oZmQsIGxpbmVhci0+aGFuZGxlLAo+ID4gwqAJCQlJ OTE1X0dFTV9ET01BSU5fR1RULCAwKTsKPiA+IMKgCj4gPiAtCWlndF9ibGl0dGVyX2Zhc3RfY29w eV9fcmF3KGZkLAo+ID4gLQkJCQnCoMKgwqBmYi0+Z2VtX2hhbmRsZSwKPiA+IC0JCQkJwqDCoMKg ZmItPm9mZnNldHNbMF0sCj4gPiAtCQkJCcKgwqDCoGZiLT5zdHJpZGUsCj4gPiAtCQkJCcKgwqDC oG9ial90aWxpbmcsCj4gPiAtCQkJCcKgwqDCoDAsIDAsIC8qIHNyY194LCBzcmNfeSAqLwo+ID4g LQkJCQnCoMKgwqBmYi0+d2lkdGgsIGZiLT5oZWlnaHQsCj4gPiAtCQkJCcKgwqDCoGlndF9kcm1f Zm9ybWF0X3RvX2JwcChmYi0KPiA+ID5kcm1fZm9ybWF0KSwKPiA+IC0JCQkJwqDCoMKgYmxpdC0+ bGluZWFyLmhhbmRsZSwgMCwKPiA+IC0JCQkJwqDCoMKgYmxpdC0+bGluZWFyLnN0cmlkZSwKPiA+ IC0JCQkJwqDCoMKgSTkxNV9USUxJTkdfTk9ORSwKPiA+IC0JCQkJwqDCoMKgMCwgMCAvKiBkc3Rf eCwgZHN0X3kgKi8pOwo+ID4gLQo+ID4gLQlnZW1fc3luYyhmZCwgYmxpdC0+bGluZWFyLmhhbmRs ZSk7Cj4gPiAtCj4gPiAtCWdlbV9zZXRfZG9tYWluKGZkLCBibGl0LT5saW5lYXIuaGFuZGxlLAo+ ID4gKwlmb3IgKGkgPSAwOyBpIDwgZmItPm51bV9wbGFuZXM7IGkrKykKPiA+ICsJCWlndF9ibGl0 dGVyX2Zhc3RfY29weV9fcmF3KGZkLAo+ID4gKwkJCQkJwqDCoGZiLT5nZW1faGFuZGxlLAo+ID4g KwkJCQkJwqDCoGZiLT5vZmZzZXRzW2ldLAo+ID4gKwkJCQkJwqDCoGZiLT5zdHJpZGUsCj4gPiAr CQkJCQnCoMKgb2JqX3RpbGluZywKPiA+ICsJCQkJCcKgwqAwLCAwLCAvKiBzcmNfeCwgc3JjX3kg Ki8KPiA+ICsJCQkJCcKgwqBmYi0+cGxhbmVfd2lkdGhbaV0sIGZiLQo+ID4gPnBsYW5lX2hlaWdo dFtpXSwKPiA+ICsJCQkJCcKgwqBmYi0+cGxhbmVfYnBwW2ldLAo+ID4gKwkJCQkJwqDCoGxpbmVh ci0+aGFuZGxlLCBsaW5lYXItCj4gPiA+b2Zmc2V0c1tpXSwKPiA+ICsJCQkJCcKgwqBsaW5lYXIt PnN0cmlkZSwKPiA+ICsJCQkJCcKgwqBJOTE1X1RJTElOR19OT05FLAo+ID4gKwkJCQkJwqDCoDAs IDAgLyogZHN0X3gsIGRzdF95ICovKTsKPiA+ICsKPiA+ICsJZ2VtX3N5bmMoZmQsIGxpbmVhci0+ aGFuZGxlKTsKPiA+ICsKPiA+ICsJZ2VtX3NldF9kb21haW4oZmQsIGxpbmVhci0+aGFuZGxlLAo+ ID4gwqAJCcKgwqDCoMKgwqDCoMKgSTkxNV9HRU1fRE9NQUlOX0NQVSwgSTkxNV9HRU1fRE9NQUlO X0NQVSk7Cj4gPiDCoAo+ID4gwqAJLyogU2V0dXAgY2Fpcm8gY29udGV4dCAqLwo+ID4gLQlibGl0 LT5saW5lYXIubWFwID0gZ2VtX21tYXBfX2NwdShmZCwKPiA+IC0JCQkJCcKgYmxpdC0+bGluZWFy LmhhbmRsZSwKPiA+IC0JCQkJCcKgMCwKPiA+IC0JCQkJCcKgYmxpdC0+bGluZWFyLnNpemUsCj4g PiAtCQkJCQnCoFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwo+ID4gKwlsaW5lYXItPm1hcCA9IGdl bV9tbWFwX19jcHUoZmQsIGxpbmVhci0+aGFuZGxlLAo+ID4gKwkJCQnCoMKgwqDCoDAsIGxpbmVh ci0+c2l6ZSwgUFJPVF9SRUFEIHwKPiA+IFBST1RfV1JJVEUpOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBjcmVhdGVfY2Fpcm9fc3VyZmFjZV9fYmxpdChpbnQgZmQsIHN0cnVjdCBpZ3Rf ZmIgKmZiKQo+ID4gK3sKPiA+ICsJc3RydWN0IGZiX2JsaXRfdXBsb2FkICpibGl0Owo+ID4gKwlj YWlyb19mb3JtYXRfdCBjYWlyb19mb3JtYXQ7Cj4gPiArCj4gPiArCWJsaXQgPSBtYWxsb2Moc2l6 ZW9mKCpibGl0KSk7Cj4gPiArCWlndF9hc3NlcnQoYmxpdCk7Cj4gPiArCj4gPiArCWJsaXQtPmZk ID0gZmQ7Cj4gPiArCWJsaXQtPmZiID0gZmI7Cj4gPiArCXNldHVwX2xpbmVhcl9tYXBwaW5nKGZk LCBmYiwgJmJsaXQtPmxpbmVhcik7Cj4gPiDCoAo+ID4gwqAJY2Fpcm9fZm9ybWF0ID0gZHJtX2Zv cm1hdF90b19jYWlybyhmYi0+ZHJtX2Zvcm1hdCk7Cj4gPiDCoAlmYi0+Y2Fpcm9fc3VyZmFjZSA9 Cj4gPiBAQCAtMTI4NCw2ICsxMzA1LDIzMiBAQCBzdGF0aWMgdm9pZCBjcmVhdGVfY2Fpcm9fc3Vy ZmFjZV9fZ3R0KGludCBmZCwKPiA+IHN0cnVjdCBpZ3RfZmIgKmZiKQo+ID4gwqAJCQkJwqDCoMKg wqBmYiwgZGVzdHJveV9jYWlyb19zdXJmYWNlX19ndHQpOwo+ID4gwqB9Cj4gPiDCoAo+ID4gK3N0 cnVjdCBmYl9jb252ZXJ0X2JsaXRfdXBsb2FkIHsKPiA+ICsJaW50IGZkOwo+ID4gKwlzdHJ1Y3Qg aWd0X2ZiICpmYjsKPiA+ICsKPiA+ICsJc3RydWN0IHsKPiA+ICsJCXVpbnQ4X3QgKm1hcDsKPiA+ ICsJCXVuc2lnbmVkIHN0cmlkZSwgc2l6ZTsKPiA+ICsJfSByZ2IyNDsKPiA+ICsKPiA+ICsJc3Ry dWN0IGZiX2JsaXRfbGluZWFyIGxpbmVhcjsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyB1aW50 OF90IGNsYW1wcmdiKGZsb2F0IHZhbCkgewo+ID4gKwlpZiAodmFsIDwgMCkKPiA+ICsJCXJldHVy biAwOwo+ID4gKwlpZiAodmFsID4gMjU1KQo+ID4gKwkJcmV0dXJuIDI1NTsKPiA+ICsKPiA+ICsJ cmV0dXJuICh1aW50OF90KXZhbDsKPiBJJ20gdGhpbmtpbmcgb2YgdGhpcyByb3VuZGluZyBpc3N1 ZS4gU2hvdWxkIHdlIHVzZSByb3VuZGluZyB0byB0aGUKPiBuZWFyZXN0IGludGVnZXIgaGVyZSwg aW5zdGVhZCBvZiBmbG9vcj8gRG9lcyB0aGUgd2F5IHdlIGRvIHJvdW5kaW5nCj4gaGF2ZSBhbiBl ZmZlY3Qgb24gdGVzdCByZXN1bHRzIGlmIHdlIGZpcnN0IGdyYWIgdGhlIHJlZmVyZW5jZSBDUkMg YW5kCj4gdGhlbiBydW4gYSB0ZXN0IGluIE5WMTIgZm9ybWF0Pwo+IAo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgdm9pZCBjb252ZXJ0X252MTJfdG9fcmdiMjQoc3RydWN0IGlndF9mYiAqZmIsIHN0 cnVjdAo+ID4gZmJfY29udmVydF9ibGl0X3VwbG9hZCAqYmxpdCkKPiA+ICt7Cj4gPiArCWludCBp LCBqOwo+ID4gKwljb25zdCB1aW50OF90ICp5LCAqdXY7Cj4gPiArCXVpbnQ4X3QgKnJnYjI0ID0g YmxpdC0+cmdiMjQubWFwOwo+ID4gKwl1bnNpZ25lZCByZ2IyNF9zdHJpZGUgPSBibGl0LT5yZ2Iy NC5zdHJpZGUsIHBsYW5hcl9zdHJpZGUgPQo+ID4gYmxpdC0+bGluZWFyLnN0cmlkZTsKPiA+ICsJ dWludDhfdCAqYnVmID0gbWFsbG9jKGJsaXQtPmxpbmVhci5zaXplKTsKPiA+ICsKPiA+ICsJLyoK PiA+ICsJwqAqIFJlYWRpbmcgZnJvbSB0aGUgQk8gaXMgYXdmdWxseSBzbG93IGJlY2F1c2Ugb2Yg bGFjayBvZgo+ID4gcmVhZCBjYWNoaW5nLAo+ID4gKwnCoCogaXQncyBmYXN0ZXIgdG8gY29weSB0 aGUgd2hvbGUgQk8gdG8gYSB0ZW1wb3JhcnkgYnVmZmVyCj4gPiBhbmQgY29udmVydAo+ID4gKwnC oCogZnJvbSB0aGVyZS4KPiA+ICsJwqAqLwo+ID4gKwltZW1jcHkoYnVmLCBibGl0LT5saW5lYXIu bWFwLCBibGl0LT5saW5lYXIuc2l6ZSk7Cj4gPiArCXkgPSAmYnVmW2JsaXQtPmxpbmVhci5vZmZz ZXRzWzBdXTsKPiA+ICsJdXYgPSAmYnVmW2JsaXQtPmxpbmVhci5vZmZzZXRzWzFdXTsKPiA+ICsK PiA+ICsJZm9yIChpID0gMDsgaSA8IGZiLT5oZWlnaHQgLyAyOyBpKyspIHsKPiA+ICsJCWZvciAo aiA9IDA7IGogPCBmYi0+d2lkdGg7IGorKykgewo+ID4gKwkJCWZsb2F0IHJfLCBnXywgYl8sIHkw LCB5MSwgY2IsIGNyOwo+ID4gKwkJCS8qIENvbnZlcnQgMXgyIHBpeGVsIGJsb2NrcyAqLwo+ID4g Kwo+ID4gKwkJCXkwID0gMS4xNjRmICogKHlbal0gLSAxNi5mKTsKPiA+ICsJCQl5MSA9IDEuMTY0 ZiAqICh5W2ogKyBwbGFuYXJfc3RyaWRlXSAtIDE2LmYpOwo+ID4gKwo+ID4gKwkJCWNiID0gdXZb aiAmIH4xXSAtIDEyOC5mOwo+ID4gKwkJCWNyID0gdXZbaiB8IDFdIC0gMTI4LmY7Cj4gPiArCj4g PiArCQkJcl8gPSAwLjAwMGYgKiBjYiArwqDCoDEuNzkzZiAqIGNyOwo+ID4gKwkJCWdfID0gLTAu MjEzZiAqIGNiICsgLTAuNTMzZiAqIGNyOwo+ID4gKwkJCWJfID0gMi4xMTJmICogY2IgK8KgwqAw LjAwMGYgKiBjcjsKPiA+ICsKPiA+ICsJCQlyZ2IyNFtqICogNCArIDJdID0gY2xhbXByZ2IoeTAg KyByXyk7Cj4gPiArCQkJcmdiMjRbaiAqIDQgKyAyICsgcmdiMjRfc3RyaWRlXSA9Cj4gPiBjbGFt cHJnYih5MSArIHJfKTsKPiA+ICsKPiA+ICsJCQlyZ2IyNFtqICogNCArIDFdID0gY2xhbXByZ2Io eTAgKyBnXyk7Cj4gPiArCQkJcmdiMjRbaiAqIDQgKyAxICsgcmdiMjRfc3RyaWRlXSA9Cj4gPiBj bGFtcHJnYih5MSArIGdfKTsKPiA+ICsKPiA+ICsJCQlyZ2IyNFtqICogNF0gPSBjbGFtcHJnYih5 MCArIGJfKTsKPiA+ICsJCQlyZ2IyNFtqICogNCArIHJnYjI0X3N0cmlkZV0gPSBjbGFtcHJnYih5 MSArCj4gPiBiXyk7Cj4gPiArCQl9Cj4gPiArCj4gPiArCQlyZ2IyNCArPSAyICogcmdiMjRfc3Ry aWRlOwo+ID4gKwkJeSArPSAyICogcGxhbmFyX3N0cmlkZTsKPiA+ICsJCXV2ICs9IHBsYW5hcl9z dHJpZGU7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKGZiLT5oZWlnaHQgJiAxKSB7Cj4gPiArCQkv KiBDb252ZXJ0IGxhc3Qgcm93ICovCj4gPiArCQlmb3IgKGogPSAwOyBqIDwgZmItPndpZHRoOyBq KyspIHsKPiA+ICsJCQlmbG9hdCByXywgZ18sIGJfLCB5MCwgY2IsIGNyOwo+ID4gKwkJCS8qIENv bnZlcnQgc2luZ2xlIHBpeGVsICovCj4gPiArCj4gPiArCQkJY2IgPSB1dltqICYgfjFdIC0gMTI4 LmY7Cj4gPiArCQkJY3IgPSB1dltqIHwgMV0gLSAxMjguZjsKPiA+ICsKPiA+ICsJCQl5MCA9IDEu MTY0ZiAqICh5W2pdIC0gMTYuZik7Cj4gPiArCQkJcl8gPcKgwqAwLjAwMGYgKiBjYiArwqDCoDEu NzkzZiAqIGNyOwo+ID4gKwkJCWdfID0gLTAuMjEzZiAqIGNiICsgLTAuNTMzZiAqIGNyOwo+ID4g KwkJCWJfID3CoMKgMi4xMTJmICogY2IgK8KgwqAwLjAwMGYgKiBjcjsKPiA+ICsKPiBEbyB5b3Ug aGF2ZSBhIHJlZmVyZW5jZSBmb3IgdGhlc2UgY29udmVyc2lvbiBjb2VmZmljaWVudHM/IEFjY29y ZGluZwo+IHRvwqBodHRwczovL3d3dy5mb3VyY2Mub3JnL2ZjY3l2cmdiLnBocMKgdGhlcmUgYXJl IGEgZmV3IG9waW5pb25zIGhvdwo+IHRoaXMgY29udmVyc2lvbiBzaG91bGQgYmUgaGFuZGxlZD8K CldlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gaGFyZGNvZGUgdGhlc2UgaW4gdGhlIGNvZGUgc2lu Y2Ugd2UnbGwgd2FudCB0bwp0ZXN0IG90aGVyIGVuY29kaW5ncyBiZXNpZGVzIGxpbWl0ZWQgcmFu Z2UgQlQuNjAxLiBJIHRoaW5rIHRoZSBjbGVhbmVzdAphcHByb2FjaCBpcyB0byBkZXJpdmUgdGhl IGNvZWZmaWNpZW50cyBmcm9tIHRoZSBLci9LYiB2YWx1ZXMsIGJ1dCB0aGF0Cm1pZ2h0IG5vdCBs ZW5kIGl0c2VsZiB3ZWxsIHRvIHR3ZWFraW5nIHRoZSBjb2VmZmljaWVudHMgdG8gbWF0Y2ggdGhl CmhhcmR3YXJlIG91dHB1dCAoaWYgdGhhdCdzIG5lY2Vzc2FyeSkuCgo+IAo+ID4gKwkJCXJnYjI0 W2ogKiA0ICsgMl0gPSBjbGFtcHJnYih5MCArIHJfKTsKPiA+ICsJCQlyZ2IyNFtqICogNCArIDFd ID0gY2xhbXByZ2IoeTAgKyBnXyk7Cj4gPiArCQkJcmdiMjRbaiAqIDRdID0gY2xhbXByZ2IoeTAg KyBiXyk7Cj4gPiArCQl9Cj4gPiArCX0KPiA+ICsKPiA+ICsJZnJlZShidWYpOwo+ID4gK30KPiA+ ICsKPiA+ICtzdGF0aWMgdm9pZCBjb252ZXJ0X3JnYjI0X3RvX252MTIoc3RydWN0IGlndF9mYiAq ZmIsIHN0cnVjdAo+ID4gZmJfY29udmVydF9ibGl0X3VwbG9hZCAqYmxpdCkKPiA+ICt7Cj4gPiAr CWludCBpLCBqOwo+ID4gKwl1aW50OF90ICp5ID0gJmJsaXQtPmxpbmVhci5tYXBbYmxpdC0+bGlu ZWFyLm9mZnNldHNbMF1dOwo+ID4gKwl1aW50OF90ICp1diA9ICZibGl0LT5saW5lYXIubWFwW2Js aXQtPmxpbmVhci5vZmZzZXRzWzFdXTsKPiA+ICsJY29uc3QgdWludDhfdCAqcmdiMjQgPSBibGl0 LT5yZ2IyNC5tYXA7Cj4gPiArCXVuc2lnbmVkIHJnYjI0X3N0cmlkZSA9IGJsaXQtPnJnYjI0LnN0 cmlkZTsKPiA+ICsJdW5zaWduZWQgcGxhbmFyX3N0cmlkZSA9IGJsaXQtPmxpbmVhci5zdHJpZGU7 Cj4gPiArCj4gPiArCWlndF9hc3NlcnRfZihmYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX05W MTIsCj4gPiArCQnCoMKgwqDCoMKgIkNvbnZlcnNpb24gbm90IGltcGxlbWVudGVkIGZvciAhTlYx MiBwbGFuYXIKPiA+IGZvcm1hdHNcbiIpOwo+ID4gKwo+ID4gKwlmb3IgKGkgPSAwOyBpIDwgZmIt PnBsYW5lX2hlaWdodFswXTsgaSsrKSB7Cj4gPiArCQkvKiBVc2UgbGltaXRlZCBjb2xvciByYW5n ZSBCVC43MDkgKi8KPiA+ICsKPiA+ICsJCWZvciAoaiA9IDA7IGogPCBmYi0+cGxhbmVfd2lkdGhb MF07IGorKykgewo+ID4gKwkJCWZsb2F0IHlmID0gMC4xODNmICogcmdiMjRbaiAqIDQgKyAyXSAr Cj4gPiArCQkJCcKgwqDCoDAuNjE0ZiAqIHJnYjI0W2ogKiA0ICsgMV0gKwo+ID4gKwkJCQnCoMKg wqAwLjA2MmYgKiByZ2IyNFtqICogNF0gKyAxNjsKPiA+ICsKPiA+ICsJCQl5W2pdID0gKHVpbnQ4 X3QpeWY7Cj4gV2UgY291bGQgdXNlIGNsYW1wcmdiKCkgaGVyZSB0b28uIEp1c3QgaW4gY2FzZS4K PiA+ICsJCX0KPiA+ICsKPiA+ICsJCXJnYjI0ICs9IHJnYjI0X3N0cmlkZTsKPiA+ICsJCXkgKz0g cGxhbmFyX3N0cmlkZTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZ2IyNCA9IGJsaXQtPnJnYjI0Lm1h cDsKPiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IGZiLT5oZWlnaHQgLyAyOyBpKyspIHsKPiA+ ICsJCWZvciAoaiA9IDA7IGogPCBmYi0+cGxhbmVfd2lkdGhbMV07IGorKykgewo+ID4gKwkJCS8q Cj4gPiArCQkJwqAqIFBpeGVsIGNlbnRlciBmb3IgQ2InQ3InIGlzIGJldHdlZW4gdGhlCj4gPiBs ZWZ0IHRvcCBhbmQKPiA+ICsJCQnCoCogYm90dG9tIHBpeGVsIGluIGEgMngyIGJsb2NrLCBzbyB0 YWtlIHRoZQo+ID4gYXZlcmFnZS4KPiA+ICsJCQnCoCovCj4gPiArCQkJZmxvYXQgdWYgPSAtMC4x MDFmLzIgKiByZ2IyNFtqICogOCArIDJdICsKPiA+ICsJCQkJwqDCoMKgLTAuMTAxZi8yICogcmdi MjRbaiAqIDggKyAyICsKPiA+IHJnYjI0X3N0cmlkZV0gKwo+ID4gKwkJCQnCoMKgwqAtMC4zMzlm LzIgKiByZ2IyNFtqICogOCArIDFdICsKPiA+ICsJCQkJwqDCoMKgLTAuMzM5Zi8yICogcmdiMjRb aiAqIDggKyAxICsKPiA+IHJnYjI0X3N0cmlkZV0gKwo+ID4gKwkJCQnCoMKgwqDCoDAuNDM5Zi8y ICogcmdiMjRbaiAqIDhdICsKPiA+ICsJCQkJwqDCoMKgwqAwLjQzOWYvMiAqIHJnYjI0W2ogKiA4 ICsKPiA+IHJnYjI0X3N0cmlkZV0gKyAxMjg7Cj4gPiArCQkJZmxvYXQgdmYgPcKgwqAwLjQzOWYv MiAqIHJnYjI0W2ogKiA4ICsgMl0gKwo+ID4gKwkJCQnCoMKgwqDCoDAuNDM5Zi8yICogcmdiMjRb aiAqIDggKyAyICsKPiA+IHJnYjI0X3N0cmlkZV0gKwo+ID4gKwkJCQnCoMKgwqAtMC4zMzlmLzIg KiByZ2IyNFtqICogOCArIDFdICsKPiA+ICsJCQkJwqDCoMKgLTAuMzM5Zi8yICogcmdiMjRbaiAq IDggKyAxICsKPiA+IHJnYjI0X3N0cmlkZV0gKwo+ID4gKwkJCQnCoMKgwqAtMC4wNDBmLzIgKiBy Z2IyNFtqICogOF0gKwo+ID4gKwkJCQnCoMKgwqAtMC4wNDBmLzIgKiByZ2IyNFtqICogOCArCj4g PiByZ2IyNF9zdHJpZGVdICsgMTI4Owo+ID4gKwkJCXV2W2ogKiAyXSA9ICh1aW50OF90KXVmOwo+ ID4gKwkJCXV2W2ogKiAyICsgMV0gPSAodWludDhfdCl2ZjsKPiA+IAo+IE1heWJlIGFkZCByb3Vu ZGluZyAmIGNsYW1waW5nIGhlcmUgdG9vPwo+ID7CoAo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJcmdi MjQgKz0gMiAqIHJnYjI0X3N0cmlkZTsKPiA+ICsJCXV2ICs9IHBsYW5hcl9zdHJpZGU7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJLyogTGFzdCByb3cgY2Fubm90IGJlIGludGVycG9sYXRlZCBiZXR3ZWVu IDIgcGl4ZWxzLCB0YWtlCj4gPiB0aGUgc2luZ2xlIHZhbHVlICovCj4gPiArCWlmIChpIDwgZmIt PnBsYW5lX2hlaWdodFsxXSkgewo+ID4gKwkJZm9yIChqID0gMDsgaiA8IGZiLT5wbGFuZV93aWR0 aFsxXTsgaisrKSB7Cj4gPiArCQkJZmxvYXQgdWYgPSAtMC4xMDFmICogcmdiMjRbaiAqIDggKyAy XSArCj4gPiArCQkJCcKgwqDCoC0wLjMzOWYgKiByZ2IyNFtqICogOCArIDFdICsKPiA+ICsJCQkJ wqDCoMKgwqAwLjQzOWYgKiByZ2IyNFtqICogOF0gKyAxMjg7Cj4gPiArCQkJZmxvYXQgdmYgPcKg wqAwLjQzOWYgKiByZ2IyNFtqICogOCArIDJdICsKPiA+ICsJCQkJwqDCoMKgLTAuMzM5ZiAqIHJn YjI0W2ogKiA4ICsgMV0gKwo+ID4gKwkJCQnCoMKgwqAtMC4wNDBmICogcmdiMjRbaiAqIDhdICsg MTI4Owo+ID4gKwo+ID4gKwkJCXV2W2ogKiAyXSA9ICh1aW50OF90KXVmOwo+ID4gKwkJCXV2W2og KiAyICsgMV0gPSAodWludDhfdCl2ZjsKPiByb3VuZGluZyAmIGNsYW1waW5nPwo+IAo+ID4gKwkJ fQo+ID4gKwl9Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2Fpcm9fc3Vy ZmFjZV9fY29udmVydCh2b2lkICphcmcpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZmJfY29udmVydF9i bGl0X3VwbG9hZCAqYmxpdCA9IGFyZzsKPiA+ICsJc3RydWN0IGlndF9mYiAqZmIgPSBibGl0LT5m YjsKPiA+ICsKPiA+ICsJLyogQ29udmVydCBiYWNrIHRvIHBsYW5hciEgKi8KPiA+ICsJaWd0X2Fz c2VydF9mKGZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfTlYxMiwKPiA+ICsJCcKgwqDCoMKg wqAiQ29udmVyc2lvbiBub3QgaW1wbGVtZW50ZWQgZm9yICFOVjEyIHBsYW5hcgo+ID4gZm9ybWF0 c1xuIik7Cj4gPiArCj4gPiArCWNvbnZlcnRfcmdiMjRfdG9fbnYxMihmYiwgYmxpdCk7Cj4gPiAr Cj4gPiArCW11bm1hcChibGl0LT5yZ2IyNC5tYXAsIGJsaXQtPnJnYjI0LnNpemUpOwo+ID4gKwo+ ID4gKwlpZiAoYmxpdC0+bGluZWFyLmhhbmRsZSkKPiA+ICsJCWZyZWVfbGluZWFyX21hcHBpbmco YmxpdC0+ZmQsIGJsaXQtPmZiLCAmYmxpdC0KPiA+ID5saW5lYXIpOwo+ID4gKwllbHNlCj4gPiAr CQlnZW1fbXVubWFwKGJsaXQtPmxpbmVhci5tYXAsIGZiLT5zaXplKTsKPiA+ICsKPiA+ICsJZnJl ZShibGl0KTsKPiA+ICsKPiA+ICsJZmItPmNhaXJvX3N1cmZhY2UgPSBOVUxMOwo+ID4gK30KPiA+ ICsKPiA+ICtzdGF0aWMgdm9pZCBjcmVhdGVfY2Fpcm9fc3VyZmFjZV9fY29udmVydChpbnQgZmQs IHN0cnVjdCBpZ3RfZmIgKmZiKQo+ID4gK3sKPiA+ICsJc3RydWN0IGZiX2NvbnZlcnRfYmxpdF91 cGxvYWQgKmJsaXQgPSBtYWxsb2Moc2l6ZW9mKCpibGl0KSk7Cj4gPiArCWlndF9hc3NlcnQoYmxp dCk7Cj4gPiArCj4gPiArCWJsaXQtPmZkID0gZmQ7Cj4gPiArCWJsaXQtPmZiID0gZmI7Cj4gPiAr CWJsaXQtPnJnYjI0LnN0cmlkZSA9IEFMSUdOKGZiLT53aWR0aCAqIDQsIDE2KTsKPiA+ICsJYmxp dC0+cmdiMjQuc2l6ZSA9IEFMSUdOKGJsaXQtPnJnYjI0LnN0cmlkZSAqIGZiLT5oZWlnaHQsCj4g PiBzeXNjb25mKF9TQ19QQUdFU0laRSkpOwo+ID4gKwlibGl0LT5yZ2IyNC5tYXAgPSBtbWFwKE5V TEwsIGJsaXQtPnJnYjI0LnNpemUsIFBST1RfUkVBRCB8Cj4gPiBQUk9UX1dSSVRFLCBNQVBfUFJJ VkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKPiA+ICsJaWd0X2Fzc2VydChibGl0LT5yZ2Iy NC5tYXAgIT0gTUFQX0ZBSUxFRCk7Cj4gPiArCj4gPiArCWlmIChmYi0+dGlsaW5nID09IExPQ0FM X0k5MTVfRk9STUFUX01PRF9ZX1RJTEVEIHx8Cj4gPiArCcKgwqDCoMKgZmItPnRpbGluZyA9PSBM T0NBTF9JOTE1X0ZPUk1BVF9NT0RfWWZfVElMRUQpIHsKPiA+ICsJCXNldHVwX2xpbmVhcl9tYXBw aW5nKGZkLCBmYiwgJmJsaXQtPmxpbmVhcik7Cj4gPiArCX0gZWxzZSB7Cj4gPiArCQlibGl0LT5s aW5lYXIuaGFuZGxlID0gMDsKPiA+ICsJCWJsaXQtPmxpbmVhci5tYXAgPSBnZW1fbW1hcF9fZ3R0 KGZkLCBmYi0+Z2VtX2hhbmRsZSwgCj4gPiBmYi0+c2l6ZSwKPiA+ICsJCQkJCcKgwqDCoMKgwqDC oFBST1RfUkVBRCB8Cj4gPiBQUk9UX1dSSVRFKTsKPiA+ICsJCWlndF9hc3NlcnQoYmxpdC0+bGlu ZWFyLm1hcCk7Cj4gPiArCQlibGl0LT5saW5lYXIuc3RyaWRlID0gZmItPnN0cmlkZTsKPiA+ICsJ CWJsaXQtPmxpbmVhci5zaXplID0gZmItPnNpemU7Cj4gPiArCQltZW1jcHkoYmxpdC0+bGluZWFy Lm9mZnNldHMsIGZiLT5vZmZzZXRzLCBzaXplb2YoZmItCj4gPiA+b2Zmc2V0cykpOwo+ID4gKwl9 Cj4gPiArCj4gPiArCS8qIENvbnZlcnQgdG8gbGluZWFyISAqLwo+ID4gKwlpZ3RfYXNzZXJ0X2Yo ZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9OVjEyLAo+ID4gKwkJwqDCoMKgwqDCoCJDb252 ZXJzaW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgIU5WMTIgcGxhbmFyCj4gPiBmb3JtYXRzXG4iKTsK PiA+ICsJY29udmVydF9udjEyX3RvX3JnYjI0KGZiLCBibGl0KTsKPiA+ICsKPiA+ICsJZmItPmNh aXJvX3N1cmZhY2UgPQo+ID4gKwkJY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGEo YmxpdC0+cmdiMjQubWFwLAo+ID4gKwkJCQkJCcKgwqDCoMKgQ0FJUk9fRk9STUFUX1JHQgo+ID4g MjQsCj4gPiArCQkJCQkJwqDCoMKgwqBmYi0+d2lkdGgsIGZiLQo+ID4gPmhlaWdodCwKPiA+ICsJ CQkJCQnCoMKgwqDCoGJsaXQtCj4gPiA+cmdiMjQuc3RyaWRlKTsKPiA+ICsKPiA+ICsJY2Fpcm9f c3VyZmFjZV9zZXRfdXNlcl9kYXRhKGZiLT5jYWlyb19zdXJmYWNlLAo+ID4gKwkJCQnCoMKgwqDC oChjYWlyb191c2VyX2RhdGFfa2V5X3QKPiA+ICopY3JlYXRlX2NhaXJvX3N1cmZhY2VfX2NvbnZl cnQsCj4gPiArCQkJCcKgwqDCoMKgYmxpdCwKPiA+IGRlc3Ryb3lfY2Fpcm9fc3VyZmFjZV9fY29u dmVydCk7Cj4gPiArfQo+ID4gKwo+ID4gwqAvKioKPiA+IMKgICogaWd0X2dldF9jYWlyb19zdXJm YWNlOgo+ID4gwqAgKiBAZmQ6IG9wZW4gZHJtIGZpbGUgZGVzY3JpcHRvcgo+ID4gQEAgLTEyOTcs MTEgKzE1NDQsMTAgQEAgc3RhdGljIHZvaWQgY3JlYXRlX2NhaXJvX3N1cmZhY2VfX2d0dChpbnQg ZmQsCj4gPiBzdHJ1Y3QgaWd0X2ZiICpmYikKPiA+IMKgICovCj4gPiDCoGNhaXJvX3N1cmZhY2Vf dCAqaWd0X2dldF9jYWlyb19zdXJmYWNlKGludCBmZCwgc3RydWN0IGlndF9mYiAqZmIpCj4gPiDC oHsKPiA+IC0JLyogVGhpcyBkb2Vzbid0IHdvcmsgZm9yIHBsYW5hciBmb3JtYXRzIGZvciBub3cs IGJ1dCB3ZSB3aWxsCj4gPiBjb252ZXJ0IHRoZW0gdG8gUkdCMjQgaW4gdGhlIGZ1dHVyZS4gKi8K PiA+IC0JaWd0X2Fzc2VydChmYi0+bnVtX3BsYW5lcyA8IDIpOwo+ID4gLQo+ID4gwqAJaWYgKGZi LT5jYWlyb19zdXJmYWNlID09IE5VTEwpIHsKPiA+IC0JCWlmIChmYi0+dGlsaW5nID09IExPQ0FM X0k5MTVfRk9STUFUX01PRF9ZX1RJTEVEIHx8Cj4gPiArCQlpZiAoZmItPm51bV9wbGFuZXMgPiAx KQo+ID4gKwkJCWNyZWF0ZV9jYWlyb19zdXJmYWNlX19jb252ZXJ0KGZkLCBmYik7Cj4gPiArCQll bHNlIGlmIChmYi0+dGlsaW5nID09IExPQ0FMX0k5MTVfRk9STUFUX01PRF9ZX1RJTEVECj4gPiB8 fAo+ID4gwqAJCcKgwqDCoMKgZmItPnRpbGluZyA9PSBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWWZf VElMRUQpCj4gPiDCoAkJCWNyZWF0ZV9jYWlyb19zdXJmYWNlX19ibGl0KGZkLCBmYik7Cj4gPiDC oAkJZWxzZQo+IC0tIAo+IE1pa2EgS2Fob2xhIC0gSW50ZWwgT1RDCj4gCj4gX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBpZ3QtZGV2IG1haWxpbmcgbGlz dAo+IGlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3QtZGV2CgotLSAKVmlsbGUgU3lyasOkbMOkCklu dGVsIE9UQwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpp Z3QtZGV2IG1haWxpbmcgbGlzdAppZ3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lndC1kZXYK