Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753020Ab2E0Qhz (ORCPT ); Sun, 27 May 2012 12:37:55 -0400 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:47582 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752734Ab2E0Qhu (ORCPT ); Sun, 27 May 2012 12:37:50 -0400 Message-ID: <1338136652.20487.95.camel@deadeye> Subject: Re: [ 76/94] x86, realmode: 16-bit real-mode code support for relocs tool From: Ben Hutchings To: "H. Peter Anvin" , Jarkko Sakkinen Cc: linux-kernel@vger.kernel.org, stable@vger.kernel.org, torvalds@linux-foundation.org, akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk, Jarkko Sakkinen , Greg KH Date: Sun, 27 May 2012 17:37:32 +0100 In-Reply-To: <20120527010434.469185530@linuxfoundation.org> References: <20120527010434.469185530@linuxfoundation.org> Content-Type: multipart/signed; micalg="pgp-sha512"; protocol="application/pgp-signature"; boundary="=-+pOHXDXUwjcTCAXoR/vG" X-Mailer: Evolution 3.2.2-1+b1 Mime-Version: 1.0 X-SA-Exim-Connect-IP: 192.168.4.185 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 64710 Lines: 892 --=-+pOHXDXUwjcTCAXoR/vG Content-Type: multipart/mixed; boundary="=-7XFbgcqFy0hq8VmkXSHg" --=-7XFbgcqFy0hq8VmkXSHg Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sun, 2012-05-27 at 10:05 +0900, Greg KH wrote: > 3.3-stable review patch. If anyone has any objections, please let me kno= w. >=20 > ------------------ >=20 > From: "H. Peter Anvin" >=20 > commit 6520fe5564acf07ade7b18a1272db1184835c487 upstream. >=20 > A new option is added to the relocs tool called '--realmode'. > This option causes the generation of 16-bit segment relocations > and 32-bit linear relocations for the real-mode code. When > the real-mode code is moved to the low-memory during kernel > initialization, these relocation entries can be used to > relocate the code properly. >=20 > In the assembly code 16-bit segment relocations must be relative > to the 'real_mode_seg' absolute symbol. Linear relocations must be > relative to a symbol prefixed with 'pa_'. >=20 > 16-bit segment relocation is used to load cs:ip in 16-bit code. > Linear relocations are used in the 32-bit code for relocatable > data references. They are declared in the linker script of the > real-mode code. >=20 > The relocs tool is moved to arch/x86/tools/relocs.c, and added new > target archscripts that can be used to build scripts needed building > an architecture. be compiled before building the arch/x86 tree. >=20 > [ hpa: accelerating this because it detects invalid absolute > relocations, a serious bug in binutils 2.22.52.0.x which currently > produces bad kernels. ] > > [ jsakkine: applied against 3.3.7 ] [...] Are these relocs patches worth applying to 3.2.y as well? This one needs backporting (see attached). The following 5 can be cleanly cherry-picked after that. Ben. --=20 Ben Hutchings The obvious mathematical breakthrough [to break modern encryption] would be development of an easy way to factor large prime numbers. - Bill Gates --=-7XFbgcqFy0hq8VmkXSHg Content-Disposition: attachment; filename*0=x86-realmode-16-bit-real-mode-code-support-for-relocs-tool.pa; filename*1=tch Content-Type: text/x-patch; name="x86-realmode-16-bit-real-mode-code-support-for-relocs-tool.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbTogIkguIFBldGVyIEFudmluIiA8aHBhQGxpbnV4LmludGVsLmNvbT4NCkRhdGU6IFR1ZSwg OCBNYXkgMjAxMiAyMToyMjoyNCArMDMwMA0KU3ViamVjdDogW1BBVENIXSB4ODYsIHJlYWxtb2Rl OiAxNi1iaXQgcmVhbC1tb2RlIGNvZGUgc3VwcG9ydCBmb3IgcmVsb2NzIHRvb2wNCg0KY29tbWl0 IDY1MjBmZTU1NjRhY2YwN2FkZTdiMThhMTI3MmRiMTE4NDgzNWM0ODcgdXBzdHJlYW0uDQoNCkEg bmV3IG9wdGlvbiBpcyBhZGRlZCB0byB0aGUgcmVsb2NzIHRvb2wgY2FsbGVkICctLXJlYWxtb2Rl Jy4NClRoaXMgb3B0aW9uIGNhdXNlcyB0aGUgZ2VuZXJhdGlvbiBvZiAxNi1iaXQgc2VnbWVudCBy ZWxvY2F0aW9ucw0KYW5kIDMyLWJpdCBsaW5lYXIgcmVsb2NhdGlvbnMgZm9yIHRoZSByZWFsLW1v ZGUgY29kZS4gV2hlbg0KdGhlIHJlYWwtbW9kZSBjb2RlIGlzIG1vdmVkIHRvIHRoZSBsb3ctbWVt b3J5IGR1cmluZyBrZXJuZWwNCmluaXRpYWxpemF0aW9uLCB0aGVzZSByZWxvY2F0aW9uIGVudHJp ZXMgY2FuIGJlIHVzZWQgdG8NCnJlbG9jYXRlIHRoZSBjb2RlIHByb3Blcmx5Lg0KDQpJbiB0aGUg YXNzZW1ibHkgY29kZSAxNi1iaXQgc2VnbWVudCByZWxvY2F0aW9ucyBtdXN0IGJlIHJlbGF0aXZl DQp0byB0aGUgJ3JlYWxfbW9kZV9zZWcnIGFic29sdXRlIHN5bWJvbC4gTGluZWFyIHJlbG9jYXRp b25zIG11c3QgYmUNCnJlbGF0aXZlIHRvIGEgc3ltYm9sIHByZWZpeGVkIHdpdGggJ3BhXycuDQoN CjE2LWJpdCBzZWdtZW50IHJlbG9jYXRpb24gaXMgdXNlZCB0byBsb2FkIGNzOmlwIGluIDE2LWJp dCBjb2RlLg0KTGluZWFyIHJlbG9jYXRpb25zIGFyZSB1c2VkIGluIHRoZSAzMi1iaXQgY29kZSBm b3IgcmVsb2NhdGFibGUNCmRhdGEgcmVmZXJlbmNlcy4gVGhleSBhcmUgZGVjbGFyZWQgaW4gdGhl IGxpbmtlciBzY3JpcHQgb2YgdGhlDQpyZWFsLW1vZGUgY29kZS4NCg0KVGhlIHJlbG9jcyB0b29s IGlzIG1vdmVkIHRvIGFyY2gveDg2L3Rvb2xzL3JlbG9jcy5jLCBhbmQgYWRkZWQgbmV3DQp0YXJn ZXQgYXJjaHNjcmlwdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCBzY3JpcHRzIG5lZWRlZCBi dWlsZGluZw0KYW4gYXJjaGl0ZWN0dXJlLiAgYmUgY29tcGlsZWQgYmVmb3JlIGJ1aWxkaW5nIHRo ZSBhcmNoL3g4NiB0cmVlLg0KDQpbIGhwYTogYWNjZWxlcmF0aW5nIHRoaXMgYmVjYXVzZSBpdCBk ZXRlY3RzIGludmFsaWQgYWJzb2x1dGUNCiAgcmVsb2NhdGlvbnMsIGEgc2VyaW91cyBidWcgaW4g YmludXRpbHMgMi4yMi41Mi4wLnggd2hpY2ggY3VycmVudGx5DQogIHByb2R1Y2VzIGJhZCBrZXJu ZWxzLiBdDQoNClNpZ25lZC1vZmYtYnk6IEguIFBldGVyIEFudmluIDxocGFAbGludXguaW50ZWwu Y29tPg0KTGluazogaHR0cDovL2xrbWwua2VybmVsLm9yZy9yLzEzMzY1MDEzNjYtMjg2MTctMi1n aXQtc2VuZC1lbWFpbC1qYXJra28uc2Fra2luZW5AaW50ZWwuY29tDQpTaWduZWQtb2ZmLWJ5OiBK YXJra28gU2Fra2luZW4gPGphcmtrby5zYWtraW5lbkBpbnRlbC5jb20+DQpTaWduZWQtb2ZmLWJ5 OiBILiBQZXRlciBBbnZpbiA8aHBhQGxpbnV4LmludGVsLmNvbT4NCkNjOiA8c3RhYmxlQHZnZXIu a2VybmVsLm9yZz4NCltid2g6IEJhY2twb3J0ZWQgdG8gMy4yOg0KIC0gQWRqdXN0IGNvbnRleHQg KG5vIGFyY2hoZWFkZXJzOyBubyBpbnNuX3Nhbml0eSkNCiAtIEV4cGFuZCBwdXRfdW5hbGlnbmVk X2xlMzIoKV0NClNpZ25lZC1vZmYtYnk6IEJlbiBIdXRjaGluZ3MgPGJlbkBkZWNhZGVudC5vcmcu dWs+DQotLS0NCiBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA4ICstDQog YXJjaC94ODYvTWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAgMyArDQogYXJjaC94ODYvYm9v dC9jb21wcmVzc2VkL01ha2VmaWxlIHwgICAgOSArLQ0KIGFyY2gveDg2L2Jvb3QvY29tcHJlc3Nl ZC9yZWxvY3MuYyB8ICA2ODAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIGFyY2gv eDg2L3Rvb2xzLy5naXRpZ25vcmUgICAgICAgICB8ICAgIDEgKw0KIGFyY2gveDg2L3Rvb2xzL01h a2VmaWxlICAgICAgICAgICB8ICAgIDMgKw0KIGFyY2gveDg2L3Rvb2xzL3JlbG9jcy5jICAgICAg ICAgICB8ICA3OTkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KIHNjcmlw dHMvTWFrZWZpbGUgICAgICAgICAgICAgICAgICB8ICAgIDIgKw0KIDggZmlsZXMgY2hhbmdlZCwg ODE4IGluc2VydGlvbnMoKyksIDY4NyBkZWxldGlvbnMoLSkNCiBkZWxldGUgbW9kZSAxMDA2NDQg YXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3JlbG9jcy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGFy Y2gveDg2L3Rvb2xzLy5naXRpZ25vcmUNCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC94ODYvdG9v bHMvcmVsb2NzLmMNCg0KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUNCmluZGV4IGFk ZDY4ZjEuLjY4MGE3MGQgMTAwNjQ0DQotLS0gYS9NYWtlZmlsZQ0KKysrIGIvTWFrZWZpbGUNCkBA IC00NDMsNiArNDQzLDcgQEAgYXNtLWdlbmVyaWM6DQogbm8tZG90LWNvbmZpZy10YXJnZXRzIDo9 IGNsZWFuIG1ycHJvcGVyIGRpc3RjbGVhbiBcDQogCQkJIGNzY29wZSBndGFncyBUQUdTIHRhZ3Mg aGVscCAlZG9jcyBjaGVjayUgY29jY2ljaGVjayBcDQogCQkJIGluY2x1ZGUvbGludXgvdmVyc2lv bi5oIGhlYWRlcnNfJSBcDQorCQkJIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIGhlYWRlcnNfJSBh cmNoc2NyaXB0cyBcDQogCQkJIGtlcm5lbHZlcnNpb24gJXNyYy1wa2cNCiANCiBjb25maWctdGFy Z2V0cyA6PSAwDQpAQCAtOTc5LDcgKzk4MCw3IEBAIHByZXBhcmUxOiBwcmVwYXJlMiBpbmNsdWRl L2xpbnV4L3ZlcnNpb24uaCBpbmNsdWRlL2dlbmVyYXRlZC91dHNyZWxlYXNlLmggXA0KICAgICAg ICAgICAgICAgICAgICBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYNCiAJJChjbWRfY3Jtb2R2ZXJk aXIpDQogDQotYXJjaHByZXBhcmU6IHByZXBhcmUxIHNjcmlwdHNfYmFzaWMNCithcmNocHJlcGFy ZTogYXJjaHNjcmlwdHMgcHJlcGFyZTEgc2NyaXB0c19iYXNpYw0KIA0KIHByZXBhcmUwOiBhcmNo cHJlcGFyZSBGT1JDRQ0KIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0uDQpAQCAtMTA0Niw4ICsxMDQ3 LDExIEBAIGhkci1pbnN0IDo9IC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUuaGVh ZGVyc2luc3Qgb2JqDQogIyBJZiB3ZSBkbyBhbiBhbGwgYXJjaCBwcm9jZXNzIHNldCBkc3QgdG8g YXNtLSQoaGRyLWFyY2gpDQogaGRyLWRzdCA9ICQoaWYgJChLQlVJTERfSEVBREVSUyksIGRzdD1p bmNsdWRlL2FzbS0kKGhkci1hcmNoKSwgZHN0PWluY2x1ZGUvYXNtKQ0KIA0KK1BIT05ZICs9IGFy Y2hzY3JpcHRzDQorYXJjaHNjcmlwdHM6DQorDQogUEhPTlkgKz0gX19oZWFkZXJzDQotX19oZWFk ZXJzOiBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBzY3JpcHRzX2Jhc2ljIGFzbS1nZW5lcmljIEZP UkNFDQorX19oZWFkZXJzOiBpbmNsdWRlL2xpbnV4L3ZlcnNpb24uaCBzY3JpcHRzX2Jhc2ljIGFz bS1nZW5lcmljIGFyY2hzY3JpcHRzIEZPUkNFDQogCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlw dHMgYnVpbGRfdW5pZmRlZg0KIA0KIFBIT05ZICs9IGhlYWRlcnNfaW5zdGFsbF9hbGwNCmRpZmYg LS1naXQgYS9hcmNoL3g4Ni9NYWtlZmlsZSBiL2FyY2gveDg2L01ha2VmaWxlDQppbmRleCBiMDJl NTA5Li43NzRmZDE2IDEwMDY0NA0KLS0tIGEvYXJjaC94ODYvTWFrZWZpbGUNCisrKyBiL2FyY2gv eDg2L01ha2VmaWxlDQpAQCAtMTE3LDYgKzExNyw5IEBAIEtCVUlMRF9DRkxBR1MgKz0gJChjYWxs IGNjLW9wdGlvbiwtbW5vLXNzZSAtbW5vLW1teCAtbW5vLXNzZTIgLW1uby0zZG5vdywpDQogS0JV SUxEX0NGTEFHUyArPSAkKG1mbGFncy15KQ0KIEtCVUlMRF9BRkxBR1MgKz0gJChtZmxhZ3MteSkN CiANCithcmNoc2NyaXB0czoNCisJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC94ODYvdG9vbHMg cmVsb2NzDQorDQogIyMjDQogIyBLZXJuZWwgb2JqZWN0cw0KIA0KZGlmZiAtLWdpdCBhL2FyY2gv eDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9N YWtlZmlsZQ0KaW5kZXggMDk2NjRlZi4uNzc0NTNjNiAxMDA2NDQNCi0tLSBhL2FyY2gveDg2L2Jv b3QvY29tcHJlc3NlZC9NYWtlZmlsZQ0KKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01h a2VmaWxlDQpAQCAtMzEsMTMgKzMxLDEyIEBAIE9CSkNPUFlGTEFHU192bWxpbnV4LmJpbiA6PSAg LVIgLmNvbW1lbnQgLVMNCiAkKG9iaikvdm1saW51eC5iaW46IHZtbGludXggRk9SQ0UNCiAJJChj YWxsIGlmX2NoYW5nZWQsb2JqY29weSkNCiANCit0YXJnZXRzICs9IHZtbGludXguYmluLmFsbCB2 bWxpbnV4LnJlbG9jcw0KIA0KLXRhcmdldHMgKz0gdm1saW51eC5iaW4uYWxsIHZtbGludXgucmVs b2NzIHJlbG9jcw0KLWhvc3Rwcm9ncy0kKENPTkZJR19YODZfTkVFRF9SRUxPQ1MpICs9IHJlbG9j cw0KLQ0KK0NNRF9SRUxPQ1MgPSBhcmNoL3g4Ni90b29scy9yZWxvY3MNCiBxdWlldF9jbWRfcmVs b2NzID0gUkVMT0NTICAkQA0KLSAgICAgIGNtZF9yZWxvY3MgPSAkKG9iaikvcmVsb2NzICQ8ID4g JEA7JChvYmopL3JlbG9jcyAtLWFicy1yZWxvY3MgJDwNCi0kKG9iaikvdm1saW51eC5yZWxvY3M6 IHZtbGludXggJChvYmopL3JlbG9jcyBGT1JDRQ0KKyAgICAgIGNtZF9yZWxvY3MgPSAkKENNRF9S RUxPQ1MpICQ8ID4gJEA7JChDTURfUkVMT0NTKSAtLWFicy1yZWxvY3MgJDwNCiskKG9iaikvdm1s aW51eC5yZWxvY3M6IHZtbGludXggRk9SQ0UNCiAJJChjYWxsIGlmX2NoYW5nZWQscmVsb2NzKQ0K IA0KIHZtbGludXguYmluLmFsbC15IDo9ICQob2JqKS92bWxpbnV4LmJpbg0KZGlmZiAtLWdpdCBh L2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9yZWxvY3MuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJl c3NlZC9yZWxvY3MuYw0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCBlNzdmNGU0Li4w MDAwMDAwDQotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvcmVsb2NzLmMNCisrKyAvZGV2 L251bGwNCkBAIC0xLDY4MCArMCwwIEBADQotI2luY2x1ZGUgPHN0ZGlvLmg+DQotI2luY2x1ZGUg PHN0ZGFyZy5oPg0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8c3RkaW50Lmg+DQot I2luY2x1ZGUgPHN0cmluZy5oPg0KLSNpbmNsdWRlIDxlcnJuby5oPg0KLSNpbmNsdWRlIDx1bmlz dGQuaD4NCi0jaW5jbHVkZSA8ZWxmLmg+DQotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+DQotI2RlZmlu ZSBVU0VfQlNEDQotI2luY2x1ZGUgPGVuZGlhbi5oPg0KLSNpbmNsdWRlIDxyZWdleC5oPg0KLQ0K LXN0YXRpYyB2b2lkIGRpZShjaGFyICpmbXQsIC4uLik7DQotDQotI2RlZmluZSBBUlJBWV9TSVpF KHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkNCi1zdGF0aWMgRWxmMzJfRWhkciBlaGRy Ow0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlbG9jX2NvdW50LCByZWxvY19pZHg7DQotc3RhdGlj IHVuc2lnbmVkIGxvbmcgKnJlbG9jczsNCi0NCi1zdHJ1Y3Qgc2VjdGlvbiB7DQotCUVsZjMyX1No ZHIgICAgIHNoZHI7DQotCXN0cnVjdCBzZWN0aW9uICpsaW5rOw0KLQlFbGYzMl9TeW0gICAgICAq c3ltdGFiOw0KLQlFbGYzMl9SZWwgICAgICAqcmVsdGFiOw0KLQljaGFyICAgICAgICAgICAqc3Ry dGFiOw0KLX07DQotc3RhdGljIHN0cnVjdCBzZWN0aW9uICpzZWNzOw0KLQ0KLS8qDQotICogRm9s bG93aW5nIHN5bWJvbHMgaGF2ZSBiZWVuIGF1ZGl0ZWQuIFRoZXJlIHZhbHVlcyBhcmUgY29uc3Rh bnQgYW5kIGRvDQotICogbm90IGNoYW5nZSBpZiBiekltYWdlIGlzIGxvYWRlZCBhdCBhIGRpZmZl cmVudCBwaHlzaWNhbCBhZGRyZXNzIHRoYW4NCi0gKiB0aGUgYWRkcmVzcyBmb3Igd2hpY2ggaXQg aGFzIGJlZW4gY29tcGlsZWQuIERvbid0IHdhcm4gdXNlciBhYm91dA0KLSAqIGFic29sdXRlIHJl bG9jYXRpb25zIHByZXNlbnQgdy5yLnQgdGhlc2Ugc3ltYm9scy4NCi0gKi8NCi1zdGF0aWMgY29u c3QgY2hhciBhYnNfc3ltX3JlZ2V4W10gPQ0KLQkiXih4ZW5faXJxX2Rpc2FibGVfZGlyZWN0X3Jl bG9jJHwiDQotCSJ4ZW5fc2F2ZV9mbF9kaXJlY3RfcmVsb2MkfCINCi0JIlZEU098Ig0KLQkiX19j cmNfKSI7DQotc3RhdGljIHJlZ2V4X3QgYWJzX3N5bV9yZWdleF9jOw0KLXN0YXRpYyBpbnQgaXNf YWJzX3JlbG9jKGNvbnN0IGNoYXIgKnN5bV9uYW1lKQ0KLXsNCi0JcmV0dXJuICFyZWdleGVjKCZh YnNfc3ltX3JlZ2V4X2MsIHN5bV9uYW1lLCAwLCBOVUxMLCAwKTsNCi19DQotDQotLyoNCi0gKiBU aGVzZSBzeW1ib2xzIGFyZSBrbm93biB0byBiZSByZWxhdGl2ZSwgZXZlbiBpZiB0aGUgbGlua2Vy IG1hcmtzIHRoZW0NCi0gKiBhcyBhYnNvbHV0ZSAodHlwaWNhbGx5IGRlZmluZWQgb3V0c2lkZSBh bnkgc2VjdGlvbiBpbiB0aGUgbGlua2VyIHNjcmlwdC4pDQotICovDQotc3RhdGljIGNvbnN0IGNo YXIgcmVsX3N5bV9yZWdleFtdID0NCi0JIl5fZW5kJCI7DQotc3RhdGljIHJlZ2V4X3QgcmVsX3N5 bV9yZWdleF9jOw0KLXN0YXRpYyBpbnQgaXNfcmVsX3JlbG9jKGNvbnN0IGNoYXIgKnN5bV9uYW1l KQ0KLXsNCi0JcmV0dXJuICFyZWdleGVjKCZyZWxfc3ltX3JlZ2V4X2MsIHN5bV9uYW1lLCAwLCBO VUxMLCAwKTsNCi19DQotDQotc3RhdGljIHZvaWQgcmVnZXhfaW5pdCh2b2lkKQ0KLXsNCi0gICAg ICAgIGNoYXIgZXJyYnVmWzEyOF07DQotICAgICAgICBpbnQgZXJyOw0KLQkNCi0gICAgICAgIGVy ciA9IHJlZ2NvbXAoJmFic19zeW1fcmVnZXhfYywgYWJzX3N5bV9yZWdleCwNCi0gICAgICAgICAg ICAgICAgICAgICAgUkVHX0VYVEVOREVEfFJFR19OT1NVQik7DQotICAgICAgICBpZiAoZXJyKSB7 DQotICAgICAgICAgICAgICAgIHJlZ2Vycm9yKGVyciwgJmFic19zeW1fcmVnZXhfYywgZXJyYnVm LCBzaXplb2YgZXJyYnVmKTsNCi0gICAgICAgICAgICAgICAgZGllKCIlcyIsIGVycmJ1Zik7DQot ICAgICAgICB9DQotDQotICAgICAgICBlcnIgPSByZWdjb21wKCZyZWxfc3ltX3JlZ2V4X2MsIHJl bF9zeW1fcmVnZXgsDQotICAgICAgICAgICAgICAgICAgICAgIFJFR19FWFRFTkRFRHxSRUdfTk9T VUIpOw0KLSAgICAgICAgaWYgKGVycikgew0KLSAgICAgICAgICAgICAgICByZWdlcnJvcihlcnIs ICZyZWxfc3ltX3JlZ2V4X2MsIGVycmJ1Ziwgc2l6ZW9mIGVycmJ1Zik7DQotICAgICAgICAgICAg ICAgIGRpZSgiJXMiLCBlcnJidWYpOw0KLSAgICAgICAgfQ0KLX0NCi0NCi1zdGF0aWMgdm9pZCBk aWUoY2hhciAqZm10LCAuLi4pDQotew0KLQl2YV9saXN0IGFwOw0KLQl2YV9zdGFydChhcCwgZm10 KTsNCi0JdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsNCi0JdmFfZW5kKGFwKTsNCi0JZXhpdCgx KTsNCi19DQotDQotc3RhdGljIGNvbnN0IGNoYXIgKnN5bV90eXBlKHVuc2lnbmVkIHR5cGUpDQot ew0KLQlzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lW10gPSB7DQotI2RlZmluZSBTWU1fVFlQ RShYKSBbWF0gPSAjWA0KLQkJU1lNX1RZUEUoU1RUX05PVFlQRSksDQotCQlTWU1fVFlQRShTVFRf T0JKRUNUKSwNCi0JCVNZTV9UWVBFKFNUVF9GVU5DKSwNCi0JCVNZTV9UWVBFKFNUVF9TRUNUSU9O KSwNCi0JCVNZTV9UWVBFKFNUVF9GSUxFKSwNCi0JCVNZTV9UWVBFKFNUVF9DT01NT04pLA0KLQkJ U1lNX1RZUEUoU1RUX1RMUyksDQotI3VuZGVmIFNZTV9UWVBFDQotCX07DQotCWNvbnN0IGNoYXIg Km5hbWUgPSAidW5rbm93biBzeW0gdHlwZSBuYW1lIjsNCi0JaWYgKHR5cGUgPCBBUlJBWV9TSVpF KHR5cGVfbmFtZSkpIHsNCi0JCW5hbWUgPSB0eXBlX25hbWVbdHlwZV07DQotCX0NCi0JcmV0dXJu IG5hbWU7DQotfQ0KLQ0KLXN0YXRpYyBjb25zdCBjaGFyICpzeW1fYmluZCh1bnNpZ25lZCBiaW5k KQ0KLXsNCi0Jc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRfbmFtZVtdID0gew0KLSNkZWZpbmUgU1lN X0JJTkQoWCkgW1hdID0gI1gNCi0JCVNZTV9CSU5EKFNUQl9MT0NBTCksDQotCQlTWU1fQklORChT VEJfR0xPQkFMKSwNCi0JCVNZTV9CSU5EKFNUQl9XRUFLKSwNCi0jdW5kZWYgU1lNX0JJTkQNCi0J fTsNCi0JY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIHN5bSBiaW5kIG5hbWUiOw0KLQlpZiAo YmluZCA8IEFSUkFZX1NJWkUoYmluZF9uYW1lKSkgew0KLQkJbmFtZSA9IGJpbmRfbmFtZVtiaW5k XTsNCi0JfQ0KLQlyZXR1cm4gbmFtZTsNCi19DQotDQotc3RhdGljIGNvbnN0IGNoYXIgKnN5bV92 aXNpYmlsaXR5KHVuc2lnbmVkIHZpc2liaWxpdHkpDQotew0KLQlzdGF0aWMgY29uc3QgY2hhciAq dmlzaWJpbGl0eV9uYW1lW10gPSB7DQotI2RlZmluZSBTWU1fVklTSUJJTElUWShYKSBbWF0gPSAj WA0KLQkJU1lNX1ZJU0lCSUxJVFkoU1RWX0RFRkFVTFQpLA0KLQkJU1lNX1ZJU0lCSUxJVFkoU1RW X0lOVEVSTkFMKSwNCi0JCVNZTV9WSVNJQklMSVRZKFNUVl9ISURERU4pLA0KLQkJU1lNX1ZJU0lC SUxJVFkoU1RWX1BST1RFQ1RFRCksDQotI3VuZGVmIFNZTV9WSVNJQklMSVRZDQotCX07DQotCWNv bnN0IGNoYXIgKm5hbWUgPSAidW5rbm93biBzeW0gdmlzaWJpbGl0eSBuYW1lIjsNCi0JaWYgKHZp c2liaWxpdHkgPCBBUlJBWV9TSVpFKHZpc2liaWxpdHlfbmFtZSkpIHsNCi0JCW5hbWUgPSB2aXNp YmlsaXR5X25hbWVbdmlzaWJpbGl0eV07DQotCX0NCi0JcmV0dXJuIG5hbWU7DQotfQ0KLQ0KLXN0 YXRpYyBjb25zdCBjaGFyICpyZWxfdHlwZSh1bnNpZ25lZCB0eXBlKQ0KLXsNCi0Jc3RhdGljIGNv bnN0IGNoYXIgKnR5cGVfbmFtZVtdID0gew0KLSNkZWZpbmUgUkVMX1RZUEUoWCkgW1hdID0gI1gN Ci0JCVJFTF9UWVBFKFJfMzg2X05PTkUpLA0KLQkJUkVMX1RZUEUoUl8zODZfMzIpLA0KLQkJUkVM X1RZUEUoUl8zODZfUEMzMiksDQotCQlSRUxfVFlQRShSXzM4Nl9HT1QzMiksDQotCQlSRUxfVFlQ RShSXzM4Nl9QTFQzMiksDQotCQlSRUxfVFlQRShSXzM4Nl9DT1BZKSwNCi0JCVJFTF9UWVBFKFJf Mzg2X0dMT0JfREFUKSwNCi0JCVJFTF9UWVBFKFJfMzg2X0pNUF9TTE9UKSwNCi0JCVJFTF9UWVBF KFJfMzg2X1JFTEFUSVZFKSwNCi0JCVJFTF9UWVBFKFJfMzg2X0dPVE9GRiksDQotCQlSRUxfVFlQ RShSXzM4Nl9HT1RQQyksDQotI3VuZGVmIFJFTF9UWVBFDQotCX07DQotCWNvbnN0IGNoYXIgKm5h bWUgPSAidW5rbm93biB0eXBlIHJlbCB0eXBlIG5hbWUiOw0KLQlpZiAodHlwZSA8IEFSUkFZX1NJ WkUodHlwZV9uYW1lKSAmJiB0eXBlX25hbWVbdHlwZV0pIHsNCi0JCW5hbWUgPSB0eXBlX25hbWVb dHlwZV07DQotCX0NCi0JcmV0dXJuIG5hbWU7DQotfQ0KLQ0KLXN0YXRpYyBjb25zdCBjaGFyICpz ZWNfbmFtZSh1bnNpZ25lZCBzaG5keCkNCi17DQotCWNvbnN0IGNoYXIgKnNlY19zdHJ0YWI7DQot CWNvbnN0IGNoYXIgKm5hbWU7DQotCXNlY19zdHJ0YWIgPSBzZWNzW2VoZHIuZV9zaHN0cm5keF0u c3RydGFiOw0KLQluYW1lID0gIjxub25hbWU+IjsNCi0JaWYgKHNobmR4IDwgZWhkci5lX3NobnVt KSB7DQotCQluYW1lID0gc2VjX3N0cnRhYiArIHNlY3Nbc2huZHhdLnNoZHIuc2hfbmFtZTsNCi0J fQ0KLQllbHNlIGlmIChzaG5keCA9PSBTSE5fQUJTKSB7DQotCQluYW1lID0gIkFCU09MVVRFIjsN Ci0JfQ0KLQllbHNlIGlmIChzaG5keCA9PSBTSE5fQ09NTU9OKSB7DQotCQluYW1lID0gIkNPTU1P TiI7DQotCX0NCi0JcmV0dXJuIG5hbWU7DQotfQ0KLQ0KLXN0YXRpYyBjb25zdCBjaGFyICpzeW1f bmFtZShjb25zdCBjaGFyICpzeW1fc3RydGFiLCBFbGYzMl9TeW0gKnN5bSkNCi17DQotCWNvbnN0 IGNoYXIgKm5hbWU7DQotCW5hbWUgPSAiPG5vbmFtZT4iOw0KLQlpZiAoc3ltLT5zdF9uYW1lKSB7 DQotCQluYW1lID0gc3ltX3N0cnRhYiArIHN5bS0+c3RfbmFtZTsNCi0JfQ0KLQllbHNlIHsNCi0J CW5hbWUgPSBzZWNfbmFtZShzZWNzW3N5bS0+c3Rfc2huZHhdLnNoZHIuc2hfbmFtZSk7DQotCX0N Ci0JcmV0dXJuIG5hbWU7DQotfQ0KLQ0KLQ0KLQ0KLSNpZiBCWVRFX09SREVSID09IExJVFRMRV9F TkRJQU4NCi0jZGVmaW5lIGxlMTZfdG9fY3B1KHZhbCkgKHZhbCkNCi0jZGVmaW5lIGxlMzJfdG9f Y3B1KHZhbCkgKHZhbCkNCi0jZW5kaWYNCi0jaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFODQot I2RlZmluZSBsZTE2X3RvX2NwdSh2YWwpIGJzd2FwXzE2KHZhbCkNCi0jZGVmaW5lIGxlMzJfdG9f Y3B1KHZhbCkgYnN3YXBfMzIodmFsKQ0KLSNlbmRpZg0KLQ0KLXN0YXRpYyB1aW50MTZfdCBlbGYx Nl90b19jcHUodWludDE2X3QgdmFsKQ0KLXsNCi0JcmV0dXJuIGxlMTZfdG9fY3B1KHZhbCk7DQot fQ0KLQ0KLXN0YXRpYyB1aW50MzJfdCBlbGYzMl90b19jcHUodWludDMyX3QgdmFsKQ0KLXsNCi0J cmV0dXJuIGxlMzJfdG9fY3B1KHZhbCk7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkIHJlYWRfZWhkcihG SUxFICpmcCkNCi17DQotCWlmIChmcmVhZCgmZWhkciwgc2l6ZW9mKGVoZHIpLCAxLCBmcCkgIT0g MSkgew0KLQkJZGllKCJDYW5ub3QgcmVhZCBFTEYgaGVhZGVyOiAlc1xuIiwNCi0JCQlzdHJlcnJv cihlcnJubykpOw0KLQl9DQotCWlmIChtZW1jbXAoZWhkci5lX2lkZW50LCBFTEZNQUcsIFNFTEZN QUcpICE9IDApIHsNCi0JCWRpZSgiTm8gRUxGIG1hZ2ljXG4iKTsNCi0JfQ0KLQlpZiAoZWhkci5l X2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzMyKSB7DQotCQlkaWUoIk5vdCBhIDMyIGJpdCBl eGVjdXRhYmxlXG4iKTsNCi0JfQ0KLQlpZiAoZWhkci5lX2lkZW50W0VJX0RBVEFdICE9IEVMRkRB VEEyTFNCKSB7DQotCQlkaWUoIk5vdCBhIExTQiBFTEYgZXhlY3V0YWJsZVxuIik7DQotCX0NCi0J aWYgKGVoZHIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKSB7DQotCQlkaWUoIlVu a25vd24gRUxGIHZlcnNpb25cbiIpOw0KLQl9DQotCS8qIENvbnZlcnQgdGhlIGZpZWxkcyB0byBu YXRpdmUgZW5kaWFuICovDQotCWVoZHIuZV90eXBlICAgICAgPSBlbGYxNl90b19jcHUoZWhkci5l X3R5cGUpOw0KLQllaGRyLmVfbWFjaGluZSAgID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9tYWNoaW5l KTsNCi0JZWhkci5lX3ZlcnNpb24gICA9IGVsZjMyX3RvX2NwdShlaGRyLmVfdmVyc2lvbik7DQot CWVoZHIuZV9lbnRyeSAgICAgPSBlbGYzMl90b19jcHUoZWhkci5lX2VudHJ5KTsNCi0JZWhkci5l X3Bob2ZmICAgICA9IGVsZjMyX3RvX2NwdShlaGRyLmVfcGhvZmYpOw0KLQllaGRyLmVfc2hvZmYg ICAgID0gZWxmMzJfdG9fY3B1KGVoZHIuZV9zaG9mZik7DQotCWVoZHIuZV9mbGFncyAgICAgPSBl bGYzMl90b19jcHUoZWhkci5lX2ZsYWdzKTsNCi0JZWhkci5lX2Voc2l6ZSAgICA9IGVsZjE2X3Rv X2NwdShlaGRyLmVfZWhzaXplKTsNCi0JZWhkci5lX3BoZW50c2l6ZSA9IGVsZjE2X3RvX2NwdShl aGRyLmVfcGhlbnRzaXplKTsNCi0JZWhkci5lX3BobnVtICAgICA9IGVsZjE2X3RvX2NwdShlaGRy LmVfcGhudW0pOw0KLQllaGRyLmVfc2hlbnRzaXplID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9zaGVu dHNpemUpOw0KLQllaGRyLmVfc2hudW0gICAgID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9zaG51bSk7 DQotCWVoZHIuZV9zaHN0cm5keCAgPSBlbGYxNl90b19jcHUoZWhkci5lX3Noc3RybmR4KTsNCi0N Ci0JaWYgKChlaGRyLmVfdHlwZSAhPSBFVF9FWEVDKSAmJiAoZWhkci5lX3R5cGUgIT0gRVRfRFlO KSkgew0KLQkJZGllKCJVbnN1cHBvcnRlZCBFTEYgaGVhZGVyIHR5cGVcbiIpOw0KLQl9DQotCWlm IChlaGRyLmVfbWFjaGluZSAhPSBFTV8zODYpIHsNCi0JCWRpZSgiTm90IGZvciB4ODZcbiIpOw0K LQl9DQotCWlmIChlaGRyLmVfdmVyc2lvbiAhPSBFVl9DVVJSRU5UKSB7DQotCQlkaWUoIlVua25v d24gRUxGIHZlcnNpb25cbiIpOw0KLQl9DQotCWlmIChlaGRyLmVfZWhzaXplICE9IHNpemVvZihF bGYzMl9FaGRyKSkgew0KLQkJZGllKCJCYWQgRWxmIGhlYWRlciBzaXplXG4iKTsNCi0JfQ0KLQlp ZiAoZWhkci5lX3BoZW50c2l6ZSAhPSBzaXplb2YoRWxmMzJfUGhkcikpIHsNCi0JCWRpZSgiQmFk IHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iKTsNCi0JfQ0KLQlpZiAoZWhkci5lX3NoZW50c2l6ZSAh PSBzaXplb2YoRWxmMzJfU2hkcikpIHsNCi0JCWRpZSgiQmFkIHNlY3Rpb24gaGVhZGVyIGVudHJ5 XG4iKTsNCi0JfQ0KLQlpZiAoZWhkci5lX3Noc3RybmR4ID49IGVoZHIuZV9zaG51bSkgew0KLQkJ ZGllKCJTdHJpbmcgdGFibGUgaW5kZXggb3V0IG9mIGJvdW5kc1xuIik7DQotCX0NCi19DQotDQot c3RhdGljIHZvaWQgcmVhZF9zaGRycyhGSUxFICpmcCkNCi17DQotCWludCBpOw0KLQlFbGYzMl9T aGRyIHNoZHI7DQotDQotCXNlY3MgPSBjYWxsb2MoZWhkci5lX3NobnVtLCBzaXplb2Yoc3RydWN0 IHNlY3Rpb24pKTsNCi0JaWYgKCFzZWNzKSB7DQotCQlkaWUoIlVuYWJsZSB0byBhbGxvY2F0ZSAl ZCBzZWN0aW9uIGhlYWRlcnNcbiIsDQotCQkgICAgZWhkci5lX3NobnVtKTsNCi0JfQ0KLQlpZiAo ZnNlZWsoZnAsIGVoZHIuZV9zaG9mZiwgU0VFS19TRVQpIDwgMCkgew0KLQkJZGllKCJTZWVrIHRv ICVkIGZhaWxlZDogJXNcbiIsDQotCQkJZWhkci5lX3Nob2ZmLCBzdHJlcnJvcihlcnJubykpOw0K LQl9DQotCWZvciAoaSA9IDA7IGkgPCBlaGRyLmVfc2hudW07IGkrKykgew0KLQkJc3RydWN0IHNl Y3Rpb24gKnNlYyA9ICZzZWNzW2ldOw0KLQkJaWYgKGZyZWFkKCZzaGRyLCBzaXplb2Ygc2hkciwg MSwgZnApICE9IDEpDQotCQkJZGllKCJDYW5ub3QgcmVhZCBFTEYgc2VjdGlvbiBoZWFkZXJzICVk LyVkOiAlc1xuIiwNCi0JCQkgICAgaSwgZWhkci5lX3NobnVtLCBzdHJlcnJvcihlcnJubykpOw0K LQkJc2VjLT5zaGRyLnNoX25hbWUgICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX25hbWUpOw0K LQkJc2VjLT5zaGRyLnNoX3R5cGUgICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX3R5cGUpOw0K LQkJc2VjLT5zaGRyLnNoX2ZsYWdzICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2ZsYWdzKTsN Ci0JCXNlYy0+c2hkci5zaF9hZGRyICAgICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9hZGRyKTsN Ci0JCXNlYy0+c2hkci5zaF9vZmZzZXQgICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9vZmZzZXQp Ow0KLQkJc2VjLT5zaGRyLnNoX3NpemUgICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX3NpemUp Ow0KLQkJc2VjLT5zaGRyLnNoX2xpbmsgICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2xpbmsp Ow0KLQkJc2VjLT5zaGRyLnNoX2luZm8gICAgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2luZm8p Ow0KLQkJc2VjLT5zaGRyLnNoX2FkZHJhbGlnbiA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2FkZHJh bGlnbik7DQotCQlzZWMtPnNoZHIuc2hfZW50c2l6ZSAgID0gZWxmMzJfdG9fY3B1KHNoZHIuc2hf ZW50c2l6ZSk7DQotCQlpZiAoc2VjLT5zaGRyLnNoX2xpbmsgPCBlaGRyLmVfc2hudW0pDQotCQkJ c2VjLT5saW5rID0gJnNlY3Nbc2VjLT5zaGRyLnNoX2xpbmtdOw0KLQl9DQotDQotfQ0KLQ0KLXN0 YXRpYyB2b2lkIHJlYWRfc3RydGFicyhGSUxFICpmcCkNCi17DQotCWludCBpOw0KLQlmb3IgKGkg PSAwOyBpIDwgZWhkci5lX3NobnVtOyBpKyspIHsNCi0JCXN0cnVjdCBzZWN0aW9uICpzZWMgPSAm c2Vjc1tpXTsNCi0JCWlmIChzZWMtPnNoZHIuc2hfdHlwZSAhPSBTSFRfU1RSVEFCKSB7DQotCQkJ Y29udGludWU7DQotCQl9DQotCQlzZWMtPnN0cnRhYiA9IG1hbGxvYyhzZWMtPnNoZHIuc2hfc2l6 ZSk7DQotCQlpZiAoIXNlYy0+c3RydGFiKSB7DQotCQkJZGllKCJtYWxsb2Mgb2YgJWQgYnl0ZXMg Zm9yIHN0cnRhYiBmYWlsZWRcbiIsDQotCQkJCXNlYy0+c2hkci5zaF9zaXplKTsNCi0JCX0NCi0J CWlmIChmc2VlayhmcCwgc2VjLT5zaGRyLnNoX29mZnNldCwgU0VFS19TRVQpIDwgMCkgew0KLQkJ CWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLA0KLQkJCQlzZWMtPnNoZHIuc2hfb2Zmc2V0 LCBzdHJlcnJvcihlcnJubykpOw0KLQkJfQ0KLQkJaWYgKGZyZWFkKHNlYy0+c3RydGFiLCAxLCBz ZWMtPnNoZHIuc2hfc2l6ZSwgZnApDQotCQkgICAgIT0gc2VjLT5zaGRyLnNoX3NpemUpIHsNCi0J CQlkaWUoIkNhbm5vdCByZWFkIHN5bWJvbCB0YWJsZTogJXNcbiIsDQotCQkJCXN0cmVycm9yKGVy cm5vKSk7DQotCQl9DQotCX0NCi19DQotDQotc3RhdGljIHZvaWQgcmVhZF9zeW10YWJzKEZJTEUg KmZwKQ0KLXsNCi0JaW50IGksajsNCi0JZm9yIChpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsr KSB7DQotCQlzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gJnNlY3NbaV07DQotCQlpZiAoc2VjLT5zaGRy LnNoX3R5cGUgIT0gU0hUX1NZTVRBQikgew0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJc2VjLT5z eW10YWIgPSBtYWxsb2Moc2VjLT5zaGRyLnNoX3NpemUpOw0KLQkJaWYgKCFzZWMtPnN5bXRhYikg ew0KLQkJCWRpZSgibWFsbG9jIG9mICVkIGJ5dGVzIGZvciBzeW10YWIgZmFpbGVkXG4iLA0KLQkJ CQlzZWMtPnNoZHIuc2hfc2l6ZSk7DQotCQl9DQotCQlpZiAoZnNlZWsoZnAsIHNlYy0+c2hkci5z aF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApIHsNCi0JCQlkaWUoIlNlZWsgdG8gJWQgZmFpbGVkOiAl c1xuIiwNCi0JCQkJc2VjLT5zaGRyLnNoX29mZnNldCwgc3RyZXJyb3IoZXJybm8pKTsNCi0JCX0N Ci0JCWlmIChmcmVhZChzZWMtPnN5bXRhYiwgMSwgc2VjLT5zaGRyLnNoX3NpemUsIGZwKQ0KLQkJ ICAgICE9IHNlYy0+c2hkci5zaF9zaXplKSB7DQotCQkJZGllKCJDYW5ub3QgcmVhZCBzeW1ib2wg dGFibGU6ICVzXG4iLA0KLQkJCQlzdHJlcnJvcihlcnJubykpOw0KLQkJfQ0KLQkJZm9yIChqID0g MDsgaiA8IHNlYy0+c2hkci5zaF9zaXplL3NpemVvZihFbGYzMl9TeW0pOyBqKyspIHsNCi0JCQlF bGYzMl9TeW0gKnN5bSA9ICZzZWMtPnN5bXRhYltqXTsNCi0JCQlzeW0tPnN0X25hbWUgID0gZWxm MzJfdG9fY3B1KHN5bS0+c3RfbmFtZSk7DQotCQkJc3ltLT5zdF92YWx1ZSA9IGVsZjMyX3RvX2Nw dShzeW0tPnN0X3ZhbHVlKTsNCi0JCQlzeW0tPnN0X3NpemUgID0gZWxmMzJfdG9fY3B1KHN5bS0+ c3Rfc2l6ZSk7DQotCQkJc3ltLT5zdF9zaG5keCA9IGVsZjE2X3RvX2NwdShzeW0tPnN0X3NobmR4 KTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi1zdGF0aWMgdm9pZCByZWFkX3JlbG9jcyhGSUxFICpm cCkNCi17DQotCWludCBpLGo7DQotCWZvciAoaSA9IDA7IGkgPCBlaGRyLmVfc2hudW07IGkrKykg ew0KLQkJc3RydWN0IHNlY3Rpb24gKnNlYyA9ICZzZWNzW2ldOw0KLQkJaWYgKHNlYy0+c2hkci5z aF90eXBlICE9IFNIVF9SRUwpIHsNCi0JCQljb250aW51ZTsNCi0JCX0NCi0JCXNlYy0+cmVsdGFi ID0gbWFsbG9jKHNlYy0+c2hkci5zaF9zaXplKTsNCi0JCWlmICghc2VjLT5yZWx0YWIpIHsNCi0J CQlkaWUoIm1hbGxvYyBvZiAlZCBieXRlcyBmb3IgcmVsb2NzIGZhaWxlZFxuIiwNCi0JCQkJc2Vj LT5zaGRyLnNoX3NpemUpOw0KLQkJfQ0KLQkJaWYgKGZzZWVrKGZwLCBzZWMtPnNoZHIuc2hfb2Zm c2V0LCBTRUVLX1NFVCkgPCAwKSB7DQotCQkJZGllKCJTZWVrIHRvICVkIGZhaWxlZDogJXNcbiIs DQotCQkJCXNlYy0+c2hkci5zaF9vZmZzZXQsIHN0cmVycm9yKGVycm5vKSk7DQotCQl9DQotCQlp ZiAoZnJlYWQoc2VjLT5yZWx0YWIsIDEsIHNlYy0+c2hkci5zaF9zaXplLCBmcCkNCi0JCSAgICAh PSBzZWMtPnNoZHIuc2hfc2l6ZSkgew0KLQkJCWRpZSgiQ2Fubm90IHJlYWQgc3ltYm9sIHRhYmxl OiAlc1xuIiwNCi0JCQkJc3RyZXJyb3IoZXJybm8pKTsNCi0JCX0NCi0JCWZvciAoaiA9IDA7IGog PCBzZWMtPnNoZHIuc2hfc2l6ZS9zaXplb2YoRWxmMzJfUmVsKTsgaisrKSB7DQotCQkJRWxmMzJf UmVsICpyZWwgPSAmc2VjLT5yZWx0YWJbal07DQotCQkJcmVsLT5yX29mZnNldCA9IGVsZjMyX3Rv X2NwdShyZWwtPnJfb2Zmc2V0KTsNCi0JCQlyZWwtPnJfaW5mbyAgID0gZWxmMzJfdG9fY3B1KHJl bC0+cl9pbmZvKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCi1zdGF0aWMgdm9pZCBwcmludF9hYnNv bHV0ZV9zeW1ib2xzKHZvaWQpDQotew0KLQlpbnQgaTsNCi0JcHJpbnRmKCJBYnNvbHV0ZSBzeW1i b2xzXG4iKTsNCi0JcHJpbnRmKCIgTnVtOiAgICBWYWx1ZSBTaXplICBUeXBlICAgICAgIEJpbmQg ICAgICAgIFZpc2liaWxpdHkgIE5hbWVcbiIpOw0KLQlmb3IgKGkgPSAwOyBpIDwgZWhkci5lX3No bnVtOyBpKyspIHsNCi0JCXN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2Vjc1tpXTsNCi0JCWNoYXIg KnN5bV9zdHJ0YWI7DQotCQlpbnQgajsNCi0NCi0JCWlmIChzZWMtPnNoZHIuc2hfdHlwZSAhPSBT SFRfU1lNVEFCKSB7DQotCQkJY29udGludWU7DQotCQl9DQotCQlzeW1fc3RydGFiID0gc2VjLT5s aW5rLT5zdHJ0YWI7DQotCQlmb3IgKGogPSAwOyBqIDwgc2VjLT5zaGRyLnNoX3NpemUvc2l6ZW9m KEVsZjMyX1N5bSk7IGorKykgew0KLQkJCUVsZjMyX1N5bSAqc3ltOw0KLQkJCWNvbnN0IGNoYXIg Km5hbWU7DQotCQkJc3ltID0gJnNlYy0+c3ltdGFiW2pdOw0KLQkJCW5hbWUgPSBzeW1fbmFtZShz eW1fc3RydGFiLCBzeW0pOw0KLQkJCWlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9BQlMpIHsNCi0J CQkJY29udGludWU7DQotCQkJfQ0KLQkJCXByaW50ZigiJTVkICUwOHggJTVkICUxMHMgJTEwcyAl MTJzICVzXG4iLA0KLQkJCQlqLCBzeW0tPnN0X3ZhbHVlLCBzeW0tPnN0X3NpemUsDQotCQkJCXN5 bV90eXBlKEVMRjMyX1NUX1RZUEUoc3ltLT5zdF9pbmZvKSksDQotCQkJCXN5bV9iaW5kKEVMRjMy X1NUX0JJTkQoc3ltLT5zdF9pbmZvKSksDQotCQkJCXN5bV92aXNpYmlsaXR5KEVMRjMyX1NUX1ZJ U0lCSUxJVFkoc3ltLT5zdF9vdGhlcikpLA0KLQkJCQluYW1lKTsNCi0JCX0NCi0JfQ0KLQlwcmlu dGYoIlxuIik7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkIHByaW50X2Fic29sdXRlX3JlbG9jcyh2b2lk KQ0KLXsNCi0JaW50IGksIHByaW50ZWQgPSAwOw0KLQ0KLQlmb3IgKGkgPSAwOyBpIDwgZWhkci5l X3NobnVtOyBpKyspIHsNCi0JCXN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2Vjc1tpXTsNCi0JCXN0 cnVjdCBzZWN0aW9uICpzZWNfYXBwbGllcywgKnNlY19zeW10YWI7DQotCQljaGFyICpzeW1fc3Ry dGFiOw0KLQkJRWxmMzJfU3ltICpzaF9zeW10YWI7DQotCQlpbnQgajsNCi0JCWlmIChzZWMtPnNo ZHIuc2hfdHlwZSAhPSBTSFRfUkVMKSB7DQotCQkJY29udGludWU7DQotCQl9DQotCQlzZWNfc3lt dGFiICA9IHNlYy0+bGluazsNCi0JCXNlY19hcHBsaWVzID0gJnNlY3Nbc2VjLT5zaGRyLnNoX2lu Zm9dOw0KLQkJaWYgKCEoc2VjX2FwcGxpZXMtPnNoZHIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKSB7 DQotCQkJY29udGludWU7DQotCQl9DQotCQlzaF9zeW10YWIgID0gc2VjX3N5bXRhYi0+c3ltdGFi Ow0KLQkJc3ltX3N0cnRhYiA9IHNlY19zeW10YWItPmxpbmstPnN0cnRhYjsNCi0JCWZvciAoaiA9 IDA7IGogPCBzZWMtPnNoZHIuc2hfc2l6ZS9zaXplb2YoRWxmMzJfUmVsKTsgaisrKSB7DQotCQkJ RWxmMzJfUmVsICpyZWw7DQotCQkJRWxmMzJfU3ltICpzeW07DQotCQkJY29uc3QgY2hhciAqbmFt ZTsNCi0JCQlyZWwgPSAmc2VjLT5yZWx0YWJbal07DQotCQkJc3ltID0gJnNoX3N5bXRhYltFTEYz Ml9SX1NZTShyZWwtPnJfaW5mbyldOw0KLQkJCW5hbWUgPSBzeW1fbmFtZShzeW1fc3RydGFiLCBz eW0pOw0KLQkJCWlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9BQlMpIHsNCi0JCQkJY29udGludWU7 DQotCQkJfQ0KLQ0KLQkJCS8qIEFic29sdXRlIHN5bWJvbHMgYXJlIG5vdCByZWxvY2F0ZWQgaWYg YnpJbWFnZSBpcw0KLQkJCSAqIGxvYWRlZCBhdCBhIG5vbi1jb21waWxlZCBhZGRyZXNzLiBEaXNw bGF5IGEgd2FybmluZw0KLQkJCSAqIHRvIHVzZXIgYXQgY29tcGlsZSB0aW1lIGFib3V0IHRoZSBh YnNvbHV0ZQ0KLQkJCSAqIHJlbG9jYXRpb25zIHByZXNlbnQuDQotCQkJICoNCi0JCQkgKiBVc2Vy IG5lZWQgdG8gYXVkaXQgdGhlIGNvZGUgdG8gbWFrZSBzdXJlDQotCQkJICogc29tZSBzeW1ib2xz IHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VjdGlvbg0KLQkJCSAqIHJlbGF0aXZlIGhhdmUgbm90 IGJlY29tZSBhYnNvbHV0ZSBiZWNhdXNlIG9mIHNvbWUNCi0JCQkgKiBsaW5rZXIgb3B0aW1pemF0 aW9uIG9yIHdyb25nIHByb2dyYW1taW5nIHVzYWdlLg0KLQkJCSAqDQotCQkJICogQmVmb3JlIHdh cm5pbmcgY2hlY2sgaWYgdGhpcyBhYnNvbHV0ZSBzeW1ib2wNCi0JCQkgKiByZWxvY2F0aW9uIGlz IGhhcm1sZXNzLg0KLQkJCSAqLw0KLQkJCWlmIChpc19hYnNfcmVsb2MobmFtZSkgfHwgaXNfcmVs X3JlbG9jKG5hbWUpKQ0KLQkJCQljb250aW51ZTsNCi0NCi0JCQlpZiAoIXByaW50ZWQpIHsNCi0J CQkJcHJpbnRmKCJXQVJOSU5HOiBBYnNvbHV0ZSByZWxvY2F0aW9ucyINCi0JCQkJCSIgcHJlc2Vu dFxuIik7DQotCQkJCXByaW50ZigiT2Zmc2V0ICAgICBJbmZvICAgICBUeXBlICAgICBTeW0uVmFs dWUgIg0KLQkJCQkJIlN5bS5OYW1lXG4iKTsNCi0JCQkJcHJpbnRlZCA9IDE7DQotCQkJfQ0KLQ0K LQkJCXByaW50ZigiJTA4eCAlMDh4ICUxMHMgJTA4eCAgJXNcbiIsDQotCQkJCXJlbC0+cl9vZmZz ZXQsDQotCQkJCXJlbC0+cl9pbmZvLA0KLQkJCQlyZWxfdHlwZShFTEYzMl9SX1RZUEUocmVsLT5y X2luZm8pKSwNCi0JCQkJc3ltLT5zdF92YWx1ZSwNCi0JCQkJbmFtZSk7DQotCQl9DQotCX0NCi0N Ci0JaWYgKHByaW50ZWQpDQotCQlwcmludGYoIlxuIik7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkIHdh bGtfcmVsb2NzKHZvaWQgKCp2aXNpdCkoRWxmMzJfUmVsICpyZWwsIEVsZjMyX1N5bSAqc3ltKSkN Ci17DQotCWludCBpOw0KLQkvKiBXYWxrIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zICovDQotCWZv ciAoaSA9IDA7IGkgPCBlaGRyLmVfc2hudW07IGkrKykgew0KLQkJY2hhciAqc3ltX3N0cnRhYjsN Ci0JCUVsZjMyX1N5bSAqc2hfc3ltdGFiOw0KLQkJc3RydWN0IHNlY3Rpb24gKnNlY19hcHBsaWVz LCAqc2VjX3N5bXRhYjsNCi0JCWludCBqOw0KLQkJc3RydWN0IHNlY3Rpb24gKnNlYyA9ICZzZWNz W2ldOw0KLQ0KLQkJaWYgKHNlYy0+c2hkci5zaF90eXBlICE9IFNIVF9SRUwpIHsNCi0JCQljb250 aW51ZTsNCi0JCX0NCi0JCXNlY19zeW10YWIgID0gc2VjLT5saW5rOw0KLQkJc2VjX2FwcGxpZXMg PSAmc2Vjc1tzZWMtPnNoZHIuc2hfaW5mb107DQotCQlpZiAoIShzZWNfYXBwbGllcy0+c2hkci5z aF9mbGFncyAmIFNIRl9BTExPQykpIHsNCi0JCQljb250aW51ZTsNCi0JCX0NCi0JCXNoX3N5bXRh YiA9IHNlY19zeW10YWItPnN5bXRhYjsNCi0JCXN5bV9zdHJ0YWIgPSBzZWNfc3ltdGFiLT5saW5r LT5zdHJ0YWI7DQotCQlmb3IgKGogPSAwOyBqIDwgc2VjLT5zaGRyLnNoX3NpemUvc2l6ZW9mKEVs ZjMyX1JlbCk7IGorKykgew0KLQkJCUVsZjMyX1JlbCAqcmVsOw0KLQkJCUVsZjMyX1N5bSAqc3lt Ow0KLQkJCXVuc2lnbmVkIHJfdHlwZTsNCi0JCQlyZWwgPSAmc2VjLT5yZWx0YWJbal07DQotCQkJ c3ltID0gJnNoX3N5bXRhYltFTEYzMl9SX1NZTShyZWwtPnJfaW5mbyldOw0KLQkJCXJfdHlwZSA9 IEVMRjMyX1JfVFlQRShyZWwtPnJfaW5mbyk7DQotCQkJLyogRG9uJ3QgdmlzaXQgcmVsb2NhdGlv bnMgdG8gYWJzb2x1dGUgc3ltYm9scyAqLw0KLQkJCWlmIChzeW0tPnN0X3NobmR4ID09IFNITl9B QlMgJiYNCi0JCQkgICAgIWlzX3JlbF9yZWxvYyhzeW1fbmFtZShzeW1fc3RydGFiLCBzeW0pKSkg ew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJc3dpdGNoIChyX3R5cGUpIHsNCi0JCQljYXNl IFJfMzg2X05PTkU6DQotCQkJY2FzZSBSXzM4Nl9QQzMyOg0KLQkJCQkvKg0KLQkJCQkgKiBOT05F IGNhbiBiZSBpZ25vcmVkIGFuZCBhbmQgUEMgcmVsYXRpdmUNCi0JCQkJICogcmVsb2NhdGlvbnMg ZG9uJ3QgbmVlZCB0byBiZSBhZGp1c3RlZC4NCi0JCQkJICovDQotCQkJCWJyZWFrOw0KLQkJCWNh c2UgUl8zODZfMzI6DQotCQkJCS8qIFZpc2l0IHJlbG9jYXRpb25zIHRoYXQgbmVlZCB0byBiZSBh ZGp1c3RlZCAqLw0KLQkJCQl2aXNpdChyZWwsIHN5bSk7DQotCQkJCWJyZWFrOw0KLQkJCWRlZmF1 bHQ6DQotCQkJCWRpZSgiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlOiAlcyAoJWQpXG4iLA0K LQkJCQkgICAgcmVsX3R5cGUocl90eXBlKSwgcl90eXBlKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0K LQkJfQ0KLQl9DQotfQ0KLQ0KLXN0YXRpYyB2b2lkIGNvdW50X3JlbG9jKEVsZjMyX1JlbCAqcmVs LCBFbGYzMl9TeW0gKnN5bSkNCi17DQotCXJlbG9jX2NvdW50ICs9IDE7DQotfQ0KLQ0KLXN0YXRp YyB2b2lkIGNvbGxlY3RfcmVsb2MoRWxmMzJfUmVsICpyZWwsIEVsZjMyX1N5bSAqc3ltKQ0KLXsN Ci0JLyogUmVtZW1iZXIgdGhlIGFkZHJlc3MgdGhhdCBuZWVkcyB0byBiZSBhZGp1c3RlZC4gKi8N Ci0JcmVsb2NzW3JlbG9jX2lkeCsrXSA9IHJlbC0+cl9vZmZzZXQ7DQotfQ0KLQ0KLXN0YXRpYyBp bnQgY21wX3JlbG9jcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpDQotew0KLQljb25z dCB1bnNpZ25lZCBsb25nICphLCAqYjsNCi0JYSA9IHZhOyBiID0gdmI7DQotCXJldHVybiAoKmEg PT0gKmIpPyAwIDogKCphID4gKmIpPyAxIDogLTE7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkIGVtaXRf cmVsb2NzKGludCBhc190ZXh0KQ0KLXsNCi0JaW50IGk7DQotCS8qIENvdW50IGhvdyBtYW55IHJl bG9jYXRpb25zIEkgaGF2ZSBhbmQgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0uICovDQotCXJlbG9j X2NvdW50ID0gMDsNCi0Jd2Fsa19yZWxvY3MoY291bnRfcmVsb2MpOw0KLQlyZWxvY3MgPSBtYWxs b2MocmVsb2NfY291bnQgKiBzaXplb2YocmVsb2NzWzBdKSk7DQotCWlmICghcmVsb2NzKSB7DQot CQlkaWUoIm1hbGxvYyBvZiAlZCBlbnRyaWVzIGZvciByZWxvY3MgZmFpbGVkXG4iLA0KLQkJCXJl bG9jX2NvdW50KTsNCi0JfQ0KLQkvKiBDb2xsZWN0IHVwIHRoZSByZWxvY2F0aW9ucyAqLw0KLQly ZWxvY19pZHggPSAwOw0KLQl3YWxrX3JlbG9jcyhjb2xsZWN0X3JlbG9jKTsNCi0NCi0JLyogT3Jk ZXIgdGhlIHJlbG9jYXRpb25zIGZvciBtb3JlIGVmZmljaWVudCBwcm9jZXNzaW5nICovDQotCXFz b3J0KHJlbG9jcywgcmVsb2NfY291bnQsIHNpemVvZihyZWxvY3NbMF0pLCBjbXBfcmVsb2NzKTsN Ci0NCi0JLyogUHJpbnQgdGhlIHJlbG9jYXRpb25zICovDQotCWlmIChhc190ZXh0KSB7DQotCQkv KiBQcmludCB0aGUgcmVsb2NhdGlvbnMgaW4gYSBmb3JtIHN1aXRhYmxlIHRoYXQNCi0JCSAqIGdh cyB3aWxsIGxpa2UuDQotCQkgKi8NCi0JCXByaW50ZigiLnNlY3Rpb24gXCIuZGF0YS5yZWxvY1wi LFwiYVwiXG4iKTsNCi0JCXByaW50ZigiLmJhbGlnbiA0XG4iKTsNCi0JCWZvciAoaSA9IDA7IGkg PCByZWxvY19jb3VudDsgaSsrKSB7DQotCQkJcHJpbnRmKCJcdCAubG9uZyAweCUwOGx4XG4iLCBy ZWxvY3NbaV0pOw0KLQkJfQ0KLQkJcHJpbnRmKCJcbiIpOw0KLQl9DQotCWVsc2Ugew0KLQkJdW5z aWduZWQgY2hhciBidWZbNF07DQotCQkvKiBQcmludCBhIHN0b3AgKi8NCi0JCWZ3cml0ZSgiXDBc MFwwXDAiLCA0LCAxLCBzdGRvdXQpOw0KLQkJLyogTm93IHByaW50IGVhY2ggcmVsb2NhdGlvbiAq Lw0KLQkJZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspIHsNCi0JCQlidWZbMF0gPSAo cmVsb2NzW2ldID4+ICAwKSAmIDB4ZmY7DQotCQkJYnVmWzFdID0gKHJlbG9jc1tpXSA+PiAgOCkg JiAweGZmOw0KLQkJCWJ1ZlsyXSA9IChyZWxvY3NbaV0gPj4gMTYpICYgMHhmZjsNCi0JCQlidWZb M10gPSAocmVsb2NzW2ldID4+IDI0KSAmIDB4ZmY7DQotCQkJZndyaXRlKGJ1ZiwgNCwgMSwgc3Rk b3V0KTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi1zdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQ0KLXsNCi0J ZGllKCJyZWxvY3MgWy0tYWJzLXN5bXMgfC0tYWJzLXJlbG9jcyB8IC0tdGV4dF0gdm1saW51eFxu Iik7DQotfQ0KLQ0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikNCi17DQotCWludCBz aG93X2Fic29sdXRlX3N5bXMsIHNob3dfYWJzb2x1dGVfcmVsb2NzOw0KLQlpbnQgYXNfdGV4dDsN Ci0JY29uc3QgY2hhciAqZm5hbWU7DQotCUZJTEUgKmZwOw0KLQlpbnQgaTsNCi0NCi0JcmVnZXhf aW5pdCgpOw0KLQ0KLQlzaG93X2Fic29sdXRlX3N5bXMgPSAwOw0KLQlzaG93X2Fic29sdXRlX3Jl bG9jcyA9IDA7DQotCWFzX3RleHQgPSAwOw0KLQlmbmFtZSA9IE5VTEw7DQotCWZvciAoaSA9IDE7 IGkgPCBhcmdjOyBpKyspIHsNCi0JCWNoYXIgKmFyZyA9IGFyZ3ZbaV07DQotCQlpZiAoKmFyZyA9 PSAnLScpIHsNCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICItLWFicy1zeW1zIikgPT0gMCkgew0K LQkJCQlzaG93X2Fic29sdXRlX3N5bXMgPSAxOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQot CQkJaWYgKHN0cmNtcChhcmd2WzFdLCAiLS1hYnMtcmVsb2NzIikgPT0gMCkgew0KLQkJCQlzaG93 X2Fic29sdXRlX3JlbG9jcyA9IDE7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQllbHNlIGlm IChzdHJjbXAoYXJndlsxXSwgIi0tdGV4dCIpID09IDApIHsNCi0JCQkJYXNfdGV4dCA9IDE7DQot CQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UgaWYgKCFmbmFtZSkgew0KLQkJCWZu YW1lID0gYXJnOw0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJdXNhZ2UoKTsNCi0JfQ0KLQlpZiAo IWZuYW1lKSB7DQotCQl1c2FnZSgpOw0KLQl9DQotCWZwID0gZm9wZW4oZm5hbWUsICJyIik7DQot CWlmICghZnApIHsNCi0JCWRpZSgiQ2Fubm90IG9wZW4gJXM6ICVzXG4iLA0KLQkJCWZuYW1lLCBz dHJlcnJvcihlcnJubykpOw0KLQl9DQotCXJlYWRfZWhkcihmcCk7DQotCXJlYWRfc2hkcnMoZnAp Ow0KLQlyZWFkX3N0cnRhYnMoZnApOw0KLQlyZWFkX3N5bXRhYnMoZnApOw0KLQlyZWFkX3JlbG9j cyhmcCk7DQotCWlmIChzaG93X2Fic29sdXRlX3N5bXMpIHsNCi0JCXByaW50X2Fic29sdXRlX3N5 bWJvbHMoKTsNCi0JCXJldHVybiAwOw0KLQl9DQotCWlmIChzaG93X2Fic29sdXRlX3JlbG9jcykg ew0KLQkJcHJpbnRfYWJzb2x1dGVfcmVsb2NzKCk7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLQllbWl0 X3JlbG9jcyhhc190ZXh0KTsNCi0JcmV0dXJuIDA7DQotfQ0KZGlmZiAtLWdpdCBhL2FyY2gveDg2 L3Rvb2xzLy5naXRpZ25vcmUgYi9hcmNoL3g4Ni90b29scy8uZ2l0aWdub3JlDQpuZXcgZmlsZSBt b2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uYmUwZWQwNg0KLS0tIC9kZXYvbnVsbA0KKysrIGIv YXJjaC94ODYvdG9vbHMvLmdpdGlnbm9yZQ0KQEAgLTAsMCArMSBAQA0KK3JlbG9jcw0KZGlmZiAt LWdpdCBhL2FyY2gveDg2L3Rvb2xzL01ha2VmaWxlIGIvYXJjaC94ODYvdG9vbHMvTWFrZWZpbGUN CmluZGV4IGY4MjA4MjYuLjE2MmEzNGEgMTAwNjQ0DQotLS0gYS9hcmNoL3g4Ni90b29scy9NYWtl ZmlsZQ0KKysrIGIvYXJjaC94ODYvdG9vbHMvTWFrZWZpbGUNCkBAIC0yOSwzICsyOSw2IEBAIEhP U1RDRkxBR1NfdGVzdF9nZXRfbGVuLm8gOj0gLVdhbGwgLUkkKG9ianRyZWUpL2FyY2gveDg2L2xp Yi8gLUkkKHNyY3RyZWUpL2FyY2gvDQogIyBEZXBlbmRlbmNpZXMgYXJlIGFsc28gbmVlZGVkLg0K ICQob2JqKS90ZXN0X2dldF9sZW4ubzogJChzcmN0cmVlKS9hcmNoL3g4Ni9saWIvaW5zbi5jICQo c3JjdHJlZSkvYXJjaC94ODYvbGliL2luYXQuYyAkKHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUv YXNtL2luYXRfdHlwZXMuaCAkKHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luYXQuaCAk KHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luc24uaCAkKG9ianRyZWUpL2FyY2gveDg2 L2xpYi9pbmF0LXRhYmxlcy5jDQogDQorSE9TVF9FWFRSQUNGTEFHUyArPSAtSSQoc3JjdHJlZSkv dG9vbHMvaW5jbHVkZQ0KK2hvc3Rwcm9ncy15CSs9IHJlbG9jcw0KK3JlbG9jczogJChvYmopL3Jl bG9jcw0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Rvb2xzL3JlbG9jcy5jIGIvYXJjaC94ODYvdG9v bHMvcmVsb2NzLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi4yMDcxYmFk DQotLS0gL2Rldi9udWxsDQorKysgYi9hcmNoL3g4Ni90b29scy9yZWxvY3MuYw0KQEAgLTAsMCAr MSw3OTkgQEANCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkYXJnLmg+DQorI2lu Y2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjaW5jbHVkZSA8c3RyaW5n Lmg+DQorI2luY2x1ZGUgPGVycm5vLmg+DQorI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyNpbmNsdWRl IDxlbGYuaD4NCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4NCisjZGVmaW5lIFVTRV9CU0QNCisjaW5j bHVkZSA8ZW5kaWFuLmg+DQorI2luY2x1ZGUgPHJlZ2V4Lmg+DQorDQorc3RhdGljIHZvaWQgZGll KGNoYXIgKmZtdCwgLi4uKTsNCisNCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAv IHNpemVvZigoeClbMF0pKQ0KK3N0YXRpYyBFbGYzMl9FaGRyIGVoZHI7DQorc3RhdGljIHVuc2ln bmVkIGxvbmcgcmVsb2NfY291bnQsIHJlbG9jX2lkeDsNCitzdGF0aWMgdW5zaWduZWQgbG9uZyAq cmVsb2NzOw0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlbG9jMTZfY291bnQsIHJlbG9jMTZfaWR4 Ow0KK3N0YXRpYyB1bnNpZ25lZCBsb25nICpyZWxvY3MxNjsNCisNCitzdHJ1Y3Qgc2VjdGlvbiB7 DQorCUVsZjMyX1NoZHIgICAgIHNoZHI7DQorCXN0cnVjdCBzZWN0aW9uICpsaW5rOw0KKwlFbGYz Ml9TeW0gICAgICAqc3ltdGFiOw0KKwlFbGYzMl9SZWwgICAgICAqcmVsdGFiOw0KKwljaGFyICAg ICAgICAgICAqc3RydGFiOw0KK307DQorc3RhdGljIHN0cnVjdCBzZWN0aW9uICpzZWNzOw0KKw0K K2VudW0gc3ltdHlwZSB7DQorCVNfQUJTLA0KKwlTX1JFTCwNCisJU19TRUcsDQorCVNfTElOLA0K KwlTX05TWU1UWVBFUw0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeW1fcmVn ZXhfa2VybmVsW1NfTlNZTVRZUEVTXSA9IHsNCisvKg0KKyAqIEZvbGxvd2luZyBzeW1ib2xzIGhh dmUgYmVlbiBhdWRpdGVkLiBUaGVyZSB2YWx1ZXMgYXJlIGNvbnN0YW50IGFuZCBkbw0KKyAqIG5v dCBjaGFuZ2UgaWYgYnpJbWFnZSBpcyBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRk cmVzcyB0aGFuDQorICogdGhlIGFkZHJlc3MgZm9yIHdoaWNoIGl0IGhhcyBiZWVuIGNvbXBpbGVk LiBEb24ndCB3YXJuIHVzZXIgYWJvdXQNCisgKiBhYnNvbHV0ZSByZWxvY2F0aW9ucyBwcmVzZW50 IHcuci50IHRoZXNlIHN5bWJvbHMuDQorICovDQorCVtTX0FCU10gPQ0KKwkiXih4ZW5faXJxX2Rp c2FibGVfZGlyZWN0X3JlbG9jJHwiDQorCSJ4ZW5fc2F2ZV9mbF9kaXJlY3RfcmVsb2MkfCINCisJ IlZEU098Ig0KKwkiX19jcmNfKSIsDQorDQorLyoNCisgKiBUaGVzZSBzeW1ib2xzIGFyZSBrbm93 biB0byBiZSByZWxhdGl2ZSwgZXZlbiBpZiB0aGUgbGlua2VyIG1hcmtzIHRoZW0NCisgKiBhcyBh YnNvbHV0ZSAodHlwaWNhbGx5IGRlZmluZWQgb3V0c2lkZSBhbnkgc2VjdGlvbiBpbiB0aGUgbGlu a2VyIHNjcmlwdC4pDQorICovDQorCVtTX1JFTF0gPQ0KKwkiXl9lbmQkIiwNCit9Ow0KKw0KKw0K K3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3ltX3JlZ2V4X3JlYWxtb2RlW1NfTlNZTVRZUEVT XSA9IHsNCisvKg0KKyAqIFRoZXNlIGFyZSAxNi1iaXQgc2VnbWVudCBzeW1ib2xzIHdoZW4gY29t cGlsaW5nIDE2LWJpdCBjb2RlLg0KKyAqLw0KKwlbU19TRUddID0NCisJIl5yZWFsX21vZGVfc2Vn JCIsDQorDQorLyoNCisgKiBUaGVzZSBhcmUgb2Zmc2V0cyBiZWxvbmdpbmcgdG8gc2VnbWVudHMs IGFzIG9wcG9zZWQgdG8gbGluZWFyIGFkZHJlc3NlcywNCisgKiB3aGVuIGNvbXBpbGluZyAxNi1i aXQgY29kZS4NCisgKi8NCisJW1NfTElOXSA9DQorCSJecGFfIiwNCit9Ow0KKw0KK3N0YXRpYyBj b25zdCBjaGFyICogY29uc3QgKnN5bV9yZWdleDsNCisNCitzdGF0aWMgcmVnZXhfdCBzeW1fcmVn ZXhfY1tTX05TWU1UWVBFU107DQorc3RhdGljIGludCBpc19yZWxvYyhlbnVtIHN5bXR5cGUgdHlw ZSwgY29uc3QgY2hhciAqc3ltX25hbWUpDQorew0KKwlyZXR1cm4gc3ltX3JlZ2V4W3R5cGVdICYm DQorCQkhcmVnZXhlYygmc3ltX3JlZ2V4X2NbdHlwZV0sIHN5bV9uYW1lLCAwLCBOVUxMLCAwKTsN Cit9DQorDQorc3RhdGljIHZvaWQgcmVnZXhfaW5pdChpbnQgdXNlX3JlYWxfbW9kZSkNCit7DQor ICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOw0KKyAgICAgICAgaW50IGVycjsNCisJaW50IGk7DQor DQorCWlmICh1c2VfcmVhbF9tb2RlKQ0KKwkJc3ltX3JlZ2V4ID0gc3ltX3JlZ2V4X3JlYWxtb2Rl Ow0KKwllbHNlDQorCQlzeW1fcmVnZXggPSBzeW1fcmVnZXhfa2VybmVsOw0KKw0KKwlmb3IgKGkg PSAwOyBpIDwgU19OU1lNVFlQRVM7IGkrKykgew0KKwkJaWYgKCFzeW1fcmVnZXhbaV0pDQorCQkJ Y29udGludWU7DQorDQorCQllcnIgPSByZWdjb21wKCZzeW1fcmVnZXhfY1tpXSwgc3ltX3JlZ2V4 W2ldLA0KKwkJCSAgICAgIFJFR19FWFRFTkRFRHxSRUdfTk9TVUIpOw0KKw0KKwkJaWYgKGVycikg ew0KKwkJCXJlZ2Vycm9yKGVyciwgJnN5bV9yZWdleF9jW2ldLCBlcnJidWYsIHNpemVvZiBlcnJi dWYpOw0KKwkJCWRpZSgiJXMiLCBlcnJidWYpOw0KKwkJfQ0KKyAgICAgICAgfQ0KK30NCisNCitz dGF0aWMgdm9pZCBkaWUoY2hhciAqZm10LCAuLi4pDQorew0KKwl2YV9saXN0IGFwOw0KKwl2YV9z dGFydChhcCwgZm10KTsNCisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsNCisJdmFfZW5kKGFw KTsNCisJZXhpdCgxKTsNCit9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKnN5bV90eXBlKHVuc2ln bmVkIHR5cGUpDQorew0KKwlzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lW10gPSB7DQorI2Rl ZmluZSBTWU1fVFlQRShYKSBbWF0gPSAjWA0KKwkJU1lNX1RZUEUoU1RUX05PVFlQRSksDQorCQlT WU1fVFlQRShTVFRfT0JKRUNUKSwNCisJCVNZTV9UWVBFKFNUVF9GVU5DKSwNCisJCVNZTV9UWVBF KFNUVF9TRUNUSU9OKSwNCisJCVNZTV9UWVBFKFNUVF9GSUxFKSwNCisJCVNZTV9UWVBFKFNUVF9D T01NT04pLA0KKwkJU1lNX1RZUEUoU1RUX1RMUyksDQorI3VuZGVmIFNZTV9UWVBFDQorCX07DQor CWNvbnN0IGNoYXIgKm5hbWUgPSAidW5rbm93biBzeW0gdHlwZSBuYW1lIjsNCisJaWYgKHR5cGUg PCBBUlJBWV9TSVpFKHR5cGVfbmFtZSkpIHsNCisJCW5hbWUgPSB0eXBlX25hbWVbdHlwZV07DQor CX0NCisJcmV0dXJuIG5hbWU7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICpzeW1fYmluZCh1 bnNpZ25lZCBiaW5kKQ0KK3sNCisJc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRfbmFtZVtdID0gew0K KyNkZWZpbmUgU1lNX0JJTkQoWCkgW1hdID0gI1gNCisJCVNZTV9CSU5EKFNUQl9MT0NBTCksDQor CQlTWU1fQklORChTVEJfR0xPQkFMKSwNCisJCVNZTV9CSU5EKFNUQl9XRUFLKSwNCisjdW5kZWYg U1lNX0JJTkQNCisJfTsNCisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIHN5bSBiaW5kIG5h bWUiOw0KKwlpZiAoYmluZCA8IEFSUkFZX1NJWkUoYmluZF9uYW1lKSkgew0KKwkJbmFtZSA9IGJp bmRfbmFtZVtiaW5kXTsNCisJfQ0KKwlyZXR1cm4gbmFtZTsNCit9DQorDQorc3RhdGljIGNvbnN0 IGNoYXIgKnN5bV92aXNpYmlsaXR5KHVuc2lnbmVkIHZpc2liaWxpdHkpDQorew0KKwlzdGF0aWMg Y29uc3QgY2hhciAqdmlzaWJpbGl0eV9uYW1lW10gPSB7DQorI2RlZmluZSBTWU1fVklTSUJJTElU WShYKSBbWF0gPSAjWA0KKwkJU1lNX1ZJU0lCSUxJVFkoU1RWX0RFRkFVTFQpLA0KKwkJU1lNX1ZJ U0lCSUxJVFkoU1RWX0lOVEVSTkFMKSwNCisJCVNZTV9WSVNJQklMSVRZKFNUVl9ISURERU4pLA0K KwkJU1lNX1ZJU0lCSUxJVFkoU1RWX1BST1RFQ1RFRCksDQorI3VuZGVmIFNZTV9WSVNJQklMSVRZ DQorCX07DQorCWNvbnN0IGNoYXIgKm5hbWUgPSAidW5rbm93biBzeW0gdmlzaWJpbGl0eSBuYW1l IjsNCisJaWYgKHZpc2liaWxpdHkgPCBBUlJBWV9TSVpFKHZpc2liaWxpdHlfbmFtZSkpIHsNCisJ CW5hbWUgPSB2aXNpYmlsaXR5X25hbWVbdmlzaWJpbGl0eV07DQorCX0NCisJcmV0dXJuIG5hbWU7 DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICpyZWxfdHlwZSh1bnNpZ25lZCB0eXBlKQ0KK3sN CisJc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZVtdID0gew0KKyNkZWZpbmUgUkVMX1RZUEUo WCkgW1hdID0gI1gNCisJCVJFTF9UWVBFKFJfMzg2X05PTkUpLA0KKwkJUkVMX1RZUEUoUl8zODZf MzIpLA0KKwkJUkVMX1RZUEUoUl8zODZfUEMzMiksDQorCQlSRUxfVFlQRShSXzM4Nl9HT1QzMiks DQorCQlSRUxfVFlQRShSXzM4Nl9QTFQzMiksDQorCQlSRUxfVFlQRShSXzM4Nl9DT1BZKSwNCisJ CVJFTF9UWVBFKFJfMzg2X0dMT0JfREFUKSwNCisJCVJFTF9UWVBFKFJfMzg2X0pNUF9TTE9UKSwN CisJCVJFTF9UWVBFKFJfMzg2X1JFTEFUSVZFKSwNCisJCVJFTF9UWVBFKFJfMzg2X0dPVE9GRiks DQorCQlSRUxfVFlQRShSXzM4Nl9HT1RQQyksDQorCQlSRUxfVFlQRShSXzM4Nl84KSwNCisJCVJF TF9UWVBFKFJfMzg2X1BDOCksDQorCQlSRUxfVFlQRShSXzM4Nl8xNiksDQorCQlSRUxfVFlQRShS XzM4Nl9QQzE2KSwNCisjdW5kZWYgUkVMX1RZUEUNCisJfTsNCisJY29uc3QgY2hhciAqbmFtZSA9 ICJ1bmtub3duIHR5cGUgcmVsIHR5cGUgbmFtZSI7DQorCWlmICh0eXBlIDwgQVJSQVlfU0laRSh0 eXBlX25hbWUpICYmIHR5cGVfbmFtZVt0eXBlXSkgew0KKwkJbmFtZSA9IHR5cGVfbmFtZVt0eXBl XTsNCisJfQ0KKwlyZXR1cm4gbmFtZTsNCit9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKnNlY19u YW1lKHVuc2lnbmVkIHNobmR4KQ0KK3sNCisJY29uc3QgY2hhciAqc2VjX3N0cnRhYjsNCisJY29u c3QgY2hhciAqbmFtZTsNCisJc2VjX3N0cnRhYiA9IHNlY3NbZWhkci5lX3Noc3RybmR4XS5zdHJ0 YWI7DQorCW5hbWUgPSAiPG5vbmFtZT4iOw0KKwlpZiAoc2huZHggPCBlaGRyLmVfc2hudW0pIHsN CisJCW5hbWUgPSBzZWNfc3RydGFiICsgc2Vjc1tzaG5keF0uc2hkci5zaF9uYW1lOw0KKwl9DQor CWVsc2UgaWYgKHNobmR4ID09IFNITl9BQlMpIHsNCisJCW5hbWUgPSAiQUJTT0xVVEUiOw0KKwl9 DQorCWVsc2UgaWYgKHNobmR4ID09IFNITl9DT01NT04pIHsNCisJCW5hbWUgPSAiQ09NTU9OIjsN CisJfQ0KKwlyZXR1cm4gbmFtZTsNCit9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKnN5bV9uYW1l KGNvbnN0IGNoYXIgKnN5bV9zdHJ0YWIsIEVsZjMyX1N5bSAqc3ltKQ0KK3sNCisJY29uc3QgY2hh ciAqbmFtZTsNCisJbmFtZSA9ICI8bm9uYW1lPiI7DQorCWlmIChzeW0tPnN0X25hbWUpIHsNCisJ CW5hbWUgPSBzeW1fc3RydGFiICsgc3ltLT5zdF9uYW1lOw0KKwl9DQorCWVsc2Ugew0KKwkJbmFt ZSA9IHNlY19uYW1lKHN5bS0+c3Rfc2huZHgpOw0KKwl9DQorCXJldHVybiBuYW1lOw0KK30NCisN CisNCisNCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFODQorI2RlZmluZSBsZTE2X3Rv X2NwdSh2YWwpICh2YWwpDQorI2RlZmluZSBsZTMyX3RvX2NwdSh2YWwpICh2YWwpDQorI2VuZGlm DQorI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTg0KKyNkZWZpbmUgbGUxNl90b19jcHUodmFs KSBic3dhcF8xNih2YWwpDQorI2RlZmluZSBsZTMyX3RvX2NwdSh2YWwpIGJzd2FwXzMyKHZhbCkN CisjZW5kaWYNCisNCitzdGF0aWMgdWludDE2X3QgZWxmMTZfdG9fY3B1KHVpbnQxNl90IHZhbCkN Cit7DQorCXJldHVybiBsZTE2X3RvX2NwdSh2YWwpOw0KK30NCisNCitzdGF0aWMgdWludDMyX3Qg ZWxmMzJfdG9fY3B1KHVpbnQzMl90IHZhbCkNCit7DQorCXJldHVybiBsZTMyX3RvX2NwdSh2YWwp Ow0KK30NCisNCitzdGF0aWMgdm9pZCByZWFkX2VoZHIoRklMRSAqZnApDQorew0KKwlpZiAoZnJl YWQoJmVoZHIsIHNpemVvZihlaGRyKSwgMSwgZnApICE9IDEpIHsNCisJCWRpZSgiQ2Fubm90IHJl YWQgRUxGIGhlYWRlcjogJXNcbiIsDQorCQkJc3RyZXJyb3IoZXJybm8pKTsNCisJfQ0KKwlpZiAo bWVtY21wKGVoZHIuZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKSB7DQorCQlkaWUoIk5v IEVMRiBtYWdpY1xuIik7DQorCX0NCisJaWYgKGVoZHIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxG Q0xBU1MzMikgew0KKwkJZGllKCJOb3QgYSAzMiBiaXQgZXhlY3V0YWJsZVxuIik7DQorCX0NCisJ aWYgKGVoZHIuZV9pZGVudFtFSV9EQVRBXSAhPSBFTEZEQVRBMkxTQikgew0KKwkJZGllKCJOb3Qg YSBMU0IgRUxGIGV4ZWN1dGFibGVcbiIpOw0KKwl9DQorCWlmIChlaGRyLmVfaWRlbnRbRUlfVkVS U0lPTl0gIT0gRVZfQ1VSUkVOVCkgew0KKwkJZGllKCJVbmtub3duIEVMRiB2ZXJzaW9uXG4iKTsN CisJfQ0KKwkvKiBDb252ZXJ0IHRoZSBmaWVsZHMgdG8gbmF0aXZlIGVuZGlhbiAqLw0KKwllaGRy LmVfdHlwZSAgICAgID0gZWxmMTZfdG9fY3B1KGVoZHIuZV90eXBlKTsNCisJZWhkci5lX21hY2hp bmUgICA9IGVsZjE2X3RvX2NwdShlaGRyLmVfbWFjaGluZSk7DQorCWVoZHIuZV92ZXJzaW9uICAg PSBlbGYzMl90b19jcHUoZWhkci5lX3ZlcnNpb24pOw0KKwllaGRyLmVfZW50cnkgICAgID0gZWxm MzJfdG9fY3B1KGVoZHIuZV9lbnRyeSk7DQorCWVoZHIuZV9waG9mZiAgICAgPSBlbGYzMl90b19j cHUoZWhkci5lX3Bob2ZmKTsNCisJZWhkci5lX3Nob2ZmICAgICA9IGVsZjMyX3RvX2NwdShlaGRy LmVfc2hvZmYpOw0KKwllaGRyLmVfZmxhZ3MgICAgID0gZWxmMzJfdG9fY3B1KGVoZHIuZV9mbGFn cyk7DQorCWVoZHIuZV9laHNpemUgICAgPSBlbGYxNl90b19jcHUoZWhkci5lX2Voc2l6ZSk7DQor CWVoZHIuZV9waGVudHNpemUgPSBlbGYxNl90b19jcHUoZWhkci5lX3BoZW50c2l6ZSk7DQorCWVo ZHIuZV9waG51bSAgICAgPSBlbGYxNl90b19jcHUoZWhkci5lX3BobnVtKTsNCisJZWhkci5lX3No ZW50c2l6ZSA9IGVsZjE2X3RvX2NwdShlaGRyLmVfc2hlbnRzaXplKTsNCisJZWhkci5lX3NobnVt ICAgICA9IGVsZjE2X3RvX2NwdShlaGRyLmVfc2hudW0pOw0KKwllaGRyLmVfc2hzdHJuZHggID0g ZWxmMTZfdG9fY3B1KGVoZHIuZV9zaHN0cm5keCk7DQorDQorCWlmICgoZWhkci5lX3R5cGUgIT0g RVRfRVhFQykgJiYgKGVoZHIuZV90eXBlICE9IEVUX0RZTikpIHsNCisJCWRpZSgiVW5zdXBwb3J0 ZWQgRUxGIGhlYWRlciB0eXBlXG4iKTsNCisJfQ0KKwlpZiAoZWhkci5lX21hY2hpbmUgIT0gRU1f Mzg2KSB7DQorCQlkaWUoIk5vdCBmb3IgeDg2XG4iKTsNCisJfQ0KKwlpZiAoZWhkci5lX3ZlcnNp b24gIT0gRVZfQ1VSUkVOVCkgew0KKwkJZGllKCJVbmtub3duIEVMRiB2ZXJzaW9uXG4iKTsNCisJ fQ0KKwlpZiAoZWhkci5lX2Voc2l6ZSAhPSBzaXplb2YoRWxmMzJfRWhkcikpIHsNCisJCWRpZSgi QmFkIEVsZiBoZWFkZXIgc2l6ZVxuIik7DQorCX0NCisJaWYgKGVoZHIuZV9waGVudHNpemUgIT0g c2l6ZW9mKEVsZjMyX1BoZHIpKSB7DQorCQlkaWUoIkJhZCBwcm9ncmFtIGhlYWRlciBlbnRyeVxu Iik7DQorCX0NCisJaWYgKGVoZHIuZV9zaGVudHNpemUgIT0gc2l6ZW9mKEVsZjMyX1NoZHIpKSB7 DQorCQlkaWUoIkJhZCBzZWN0aW9uIGhlYWRlciBlbnRyeVxuIik7DQorCX0NCisJaWYgKGVoZHIu ZV9zaHN0cm5keCA+PSBlaGRyLmVfc2hudW0pIHsNCisJCWRpZSgiU3RyaW5nIHRhYmxlIGluZGV4 IG91dCBvZiBib3VuZHNcbiIpOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHJlYWRfc2hkcnMo RklMRSAqZnApDQorew0KKwlpbnQgaTsNCisJRWxmMzJfU2hkciBzaGRyOw0KKw0KKwlzZWNzID0g Y2FsbG9jKGVoZHIuZV9zaG51bSwgc2l6ZW9mKHN0cnVjdCBzZWN0aW9uKSk7DQorCWlmICghc2Vj cykgew0KKwkJZGllKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgc2VjdGlvbiBoZWFkZXJzXG4iLA0K KwkJICAgIGVoZHIuZV9zaG51bSk7DQorCX0NCisJaWYgKGZzZWVrKGZwLCBlaGRyLmVfc2hvZmYs IFNFRUtfU0VUKSA8IDApIHsNCisJCWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLA0KKwkJ CWVoZHIuZV9zaG9mZiwgc3RyZXJyb3IoZXJybm8pKTsNCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwg ZWhkci5lX3NobnVtOyBpKyspIHsNCisJCXN0cnVjdCBzZWN0aW9uICpzZWMgPSAmc2Vjc1tpXTsN CisJCWlmIChmcmVhZCgmc2hkciwgc2l6ZW9mIHNoZHIsIDEsIGZwKSAhPSAxKQ0KKwkJCWRpZSgi Q2Fubm90IHJlYWQgRUxGIHNlY3Rpb24gaGVhZGVycyAlZC8lZDogJXNcbiIsDQorCQkJICAgIGks IGVoZHIuZV9zaG51bSwgc3RyZXJyb3IoZXJybm8pKTsNCisJCXNlYy0+c2hkci5zaF9uYW1lICAg ICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9uYW1lKTsNCisJCXNlYy0+c2hkci5zaF90eXBlICAg ICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF90eXBlKTsNCisJCXNlYy0+c2hkci5zaF9mbGFncyAg ICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9mbGFncyk7DQorCQlzZWMtPnNoZHIuc2hfYWRkciAg ICAgID0gZWxmMzJfdG9fY3B1KHNoZHIuc2hfYWRkcik7DQorCQlzZWMtPnNoZHIuc2hfb2Zmc2V0 ICAgID0gZWxmMzJfdG9fY3B1KHNoZHIuc2hfb2Zmc2V0KTsNCisJCXNlYy0+c2hkci5zaF9zaXpl ICAgICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9zaXplKTsNCisJCXNlYy0+c2hkci5zaF9saW5r ICAgICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9saW5rKTsNCisJCXNlYy0+c2hkci5zaF9pbmZv ICAgICAgPSBlbGYzMl90b19jcHUoc2hkci5zaF9pbmZvKTsNCisJCXNlYy0+c2hkci5zaF9hZGRy YWxpZ24gPSBlbGYzMl90b19jcHUoc2hkci5zaF9hZGRyYWxpZ24pOw0KKwkJc2VjLT5zaGRyLnNo X2VudHNpemUgICA9IGVsZjMyX3RvX2NwdShzaGRyLnNoX2VudHNpemUpOw0KKwkJaWYgKHNlYy0+ c2hkci5zaF9saW5rIDwgZWhkci5lX3NobnVtKQ0KKwkJCXNlYy0+bGluayA9ICZzZWNzW3NlYy0+ c2hkci5zaF9saW5rXTsNCisJfQ0KKw0KK30NCisNCitzdGF0aWMgdm9pZCByZWFkX3N0cnRhYnMo RklMRSAqZnApDQorew0KKwlpbnQgaTsNCisJZm9yIChpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsg aSsrKSB7DQorCQlzdHJ1Y3Qgc2VjdGlvbiAqc2VjID0gJnNlY3NbaV07DQorCQlpZiAoc2VjLT5z aGRyLnNoX3R5cGUgIT0gU0hUX1NUUlRBQikgew0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKwkJc2Vj LT5zdHJ0YWIgPSBtYWxsb2Moc2VjLT5zaGRyLnNoX3NpemUpOw0KKwkJaWYgKCFzZWMtPnN0cnRh Yikgew0KKwkJCWRpZSgibWFsbG9jIG9mICVkIGJ5dGVzIGZvciBzdHJ0YWIgZmFpbGVkXG4iLA0K KwkJCQlzZWMtPnNoZHIuc2hfc2l6ZSk7DQorCQl9DQorCQlpZiAoZnNlZWsoZnAsIHNlYy0+c2hk ci5zaF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApIHsNCisJCQlkaWUoIlNlZWsgdG8gJWQgZmFpbGVk OiAlc1xuIiwNCisJCQkJc2VjLT5zaGRyLnNoX29mZnNldCwgc3RyZXJyb3IoZXJybm8pKTsNCisJ CX0NCisJCWlmIChmcmVhZChzZWMtPnN0cnRhYiwgMSwgc2VjLT5zaGRyLnNoX3NpemUsIGZwKQ0K KwkJICAgICE9IHNlYy0+c2hkci5zaF9zaXplKSB7DQorCQkJZGllKCJDYW5ub3QgcmVhZCBzeW1i b2wgdGFibGU6ICVzXG4iLA0KKwkJCQlzdHJlcnJvcihlcnJubykpOw0KKwkJfQ0KKwl9DQorfQ0K Kw0KK3N0YXRpYyB2b2lkIHJlYWRfc3ltdGFicyhGSUxFICpmcCkNCit7DQorCWludCBpLGo7DQor CWZvciAoaSA9IDA7IGkgPCBlaGRyLmVfc2hudW07IGkrKykgew0KKwkJc3RydWN0IHNlY3Rpb24g KnNlYyA9ICZzZWNzW2ldOw0KKwkJaWYgKHNlYy0+c2hkci5zaF90eXBlICE9IFNIVF9TWU1UQUIp IHsNCisJCQljb250aW51ZTsNCisJCX0NCisJCXNlYy0+c3ltdGFiID0gbWFsbG9jKHNlYy0+c2hk ci5zaF9zaXplKTsNCisJCWlmICghc2VjLT5zeW10YWIpIHsNCisJCQlkaWUoIm1hbGxvYyBvZiAl ZCBieXRlcyBmb3Igc3ltdGFiIGZhaWxlZFxuIiwNCisJCQkJc2VjLT5zaGRyLnNoX3NpemUpOw0K KwkJfQ0KKwkJaWYgKGZzZWVrKGZwLCBzZWMtPnNoZHIuc2hfb2Zmc2V0LCBTRUVLX1NFVCkgPCAw KSB7DQorCQkJZGllKCJTZWVrIHRvICVkIGZhaWxlZDogJXNcbiIsDQorCQkJCXNlYy0+c2hkci5z aF9vZmZzZXQsIHN0cmVycm9yKGVycm5vKSk7DQorCQl9DQorCQlpZiAoZnJlYWQoc2VjLT5zeW10 YWIsIDEsIHNlYy0+c2hkci5zaF9zaXplLCBmcCkNCisJCSAgICAhPSBzZWMtPnNoZHIuc2hfc2l6 ZSkgew0KKwkJCWRpZSgiQ2Fubm90IHJlYWQgc3ltYm9sIHRhYmxlOiAlc1xuIiwNCisJCQkJc3Ry ZXJyb3IoZXJybm8pKTsNCisJCX0NCisJCWZvciAoaiA9IDA7IGogPCBzZWMtPnNoZHIuc2hfc2l6 ZS9zaXplb2YoRWxmMzJfU3ltKTsgaisrKSB7DQorCQkJRWxmMzJfU3ltICpzeW0gPSAmc2VjLT5z eW10YWJbal07DQorCQkJc3ltLT5zdF9uYW1lICA9IGVsZjMyX3RvX2NwdShzeW0tPnN0X25hbWUp Ow0KKwkJCXN5bS0+c3RfdmFsdWUgPSBlbGYzMl90b19jcHUoc3ltLT5zdF92YWx1ZSk7DQorCQkJ c3ltLT5zdF9zaXplICA9IGVsZjMyX3RvX2NwdShzeW0tPnN0X3NpemUpOw0KKwkJCXN5bS0+c3Rf c2huZHggPSBlbGYxNl90b19jcHUoc3ltLT5zdF9zaG5keCk7DQorCQl9DQorCX0NCit9DQorDQor DQorc3RhdGljIHZvaWQgcmVhZF9yZWxvY3MoRklMRSAqZnApDQorew0KKwlpbnQgaSxqOw0KKwlm b3IgKGkgPSAwOyBpIDwgZWhkci5lX3NobnVtOyBpKyspIHsNCisJCXN0cnVjdCBzZWN0aW9uICpz ZWMgPSAmc2Vjc1tpXTsNCisJCWlmIChzZWMtPnNoZHIuc2hfdHlwZSAhPSBTSFRfUkVMKSB7DQor CQkJY29udGludWU7DQorCQl9DQorCQlzZWMtPnJlbHRhYiA9IG1hbGxvYyhzZWMtPnNoZHIuc2hf c2l6ZSk7DQorCQlpZiAoIXNlYy0+cmVsdGFiKSB7DQorCQkJZGllKCJtYWxsb2Mgb2YgJWQgYnl0 ZXMgZm9yIHJlbG9jcyBmYWlsZWRcbiIsDQorCQkJCXNlYy0+c2hkci5zaF9zaXplKTsNCisJCX0N CisJCWlmIChmc2VlayhmcCwgc2VjLT5zaGRyLnNoX29mZnNldCwgU0VFS19TRVQpIDwgMCkgew0K KwkJCWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLA0KKwkJCQlzZWMtPnNoZHIuc2hfb2Zm c2V0LCBzdHJlcnJvcihlcnJubykpOw0KKwkJfQ0KKwkJaWYgKGZyZWFkKHNlYy0+cmVsdGFiLCAx LCBzZWMtPnNoZHIuc2hfc2l6ZSwgZnApDQorCQkgICAgIT0gc2VjLT5zaGRyLnNoX3NpemUpIHsN CisJCQlkaWUoIkNhbm5vdCByZWFkIHN5bWJvbCB0YWJsZTogJXNcbiIsDQorCQkJCXN0cmVycm9y KGVycm5vKSk7DQorCQl9DQorCQlmb3IgKGogPSAwOyBqIDwgc2VjLT5zaGRyLnNoX3NpemUvc2l6 ZW9mKEVsZjMyX1JlbCk7IGorKykgew0KKwkJCUVsZjMyX1JlbCAqcmVsID0gJnNlYy0+cmVsdGFi W2pdOw0KKwkJCXJlbC0+cl9vZmZzZXQgPSBlbGYzMl90b19jcHUocmVsLT5yX29mZnNldCk7DQor CQkJcmVsLT5yX2luZm8gICA9IGVsZjMyX3RvX2NwdShyZWwtPnJfaW5mbyk7DQorCQl9DQorCX0N Cit9DQorDQorDQorc3RhdGljIHZvaWQgcHJpbnRfYWJzb2x1dGVfc3ltYm9scyh2b2lkKQ0KK3sN CisJaW50IGk7DQorCXByaW50ZigiQWJzb2x1dGUgc3ltYm9sc1xuIik7DQorCXByaW50ZigiIE51 bTogICAgVmFsdWUgU2l6ZSAgVHlwZSAgICAgICBCaW5kICAgICAgICBWaXNpYmlsaXR5ICBOYW1l XG4iKTsNCisJZm9yIChpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7DQorCQlzdHJ1Y3Qg c2VjdGlvbiAqc2VjID0gJnNlY3NbaV07DQorCQljaGFyICpzeW1fc3RydGFiOw0KKwkJaW50IGo7 DQorDQorCQlpZiAoc2VjLT5zaGRyLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikgew0KKwkJCWNvbnRp bnVlOw0KKwkJfQ0KKwkJc3ltX3N0cnRhYiA9IHNlYy0+bGluay0+c3RydGFiOw0KKwkJZm9yIChq ID0gMDsgaiA8IHNlYy0+c2hkci5zaF9zaXplL3NpemVvZihFbGYzMl9TeW0pOyBqKyspIHsNCisJ CQlFbGYzMl9TeW0gKnN5bTsNCisJCQljb25zdCBjaGFyICpuYW1lOw0KKwkJCXN5bSA9ICZzZWMt PnN5bXRhYltqXTsNCisJCQluYW1lID0gc3ltX25hbWUoc3ltX3N0cnRhYiwgc3ltKTsNCisJCQlp ZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fQUJTKSB7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJ CQlwcmludGYoIiU1ZCAlMDh4ICU1ZCAlMTBzICUxMHMgJTEycyAlc1xuIiwNCisJCQkJaiwgc3lt LT5zdF92YWx1ZSwgc3ltLT5zdF9zaXplLA0KKwkJCQlzeW1fdHlwZShFTEYzMl9TVF9UWVBFKHN5 bS0+c3RfaW5mbykpLA0KKwkJCQlzeW1fYmluZChFTEYzMl9TVF9CSU5EKHN5bS0+c3RfaW5mbykp LA0KKwkJCQlzeW1fdmlzaWJpbGl0eShFTEYzMl9TVF9WSVNJQklMSVRZKHN5bS0+c3Rfb3RoZXIp KSwNCisJCQkJbmFtZSk7DQorCQl9DQorCX0NCisJcHJpbnRmKCJcbiIpOw0KK30NCisNCitzdGF0 aWMgdm9pZCBwcmludF9hYnNvbHV0ZV9yZWxvY3Modm9pZCkNCit7DQorCWludCBpLCBwcmludGVk ID0gMDsNCisNCisJZm9yIChpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7DQorCQlzdHJ1 Y3Qgc2VjdGlvbiAqc2VjID0gJnNlY3NbaV07DQorCQlzdHJ1Y3Qgc2VjdGlvbiAqc2VjX2FwcGxp ZXMsICpzZWNfc3ltdGFiOw0KKwkJY2hhciAqc3ltX3N0cnRhYjsNCisJCUVsZjMyX1N5bSAqc2hf c3ltdGFiOw0KKwkJaW50IGo7DQorCQlpZiAoc2VjLT5zaGRyLnNoX3R5cGUgIT0gU0hUX1JFTCkg ew0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKwkJc2VjX3N5bXRhYiAgPSBzZWMtPmxpbms7DQorCQlz ZWNfYXBwbGllcyA9ICZzZWNzW3NlYy0+c2hkci5zaF9pbmZvXTsNCisJCWlmICghKHNlY19hcHBs aWVzLT5zaGRyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkgew0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0K KwkJc2hfc3ltdGFiICA9IHNlY19zeW10YWItPnN5bXRhYjsNCisJCXN5bV9zdHJ0YWIgPSBzZWNf c3ltdGFiLT5saW5rLT5zdHJ0YWI7DQorCQlmb3IgKGogPSAwOyBqIDwgc2VjLT5zaGRyLnNoX3Np emUvc2l6ZW9mKEVsZjMyX1JlbCk7IGorKykgew0KKwkJCUVsZjMyX1JlbCAqcmVsOw0KKwkJCUVs ZjMyX1N5bSAqc3ltOw0KKwkJCWNvbnN0IGNoYXIgKm5hbWU7DQorCQkJcmVsID0gJnNlYy0+cmVs dGFiW2pdOw0KKwkJCXN5bSA9ICZzaF9zeW10YWJbRUxGMzJfUl9TWU0ocmVsLT5yX2luZm8pXTsN CisJCQluYW1lID0gc3ltX25hbWUoc3ltX3N0cnRhYiwgc3ltKTsNCisJCQlpZiAoc3ltLT5zdF9z aG5keCAhPSBTSE5fQUJTKSB7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisNCisJCQkvKiBBYnNv bHV0ZSBzeW1ib2xzIGFyZSBub3QgcmVsb2NhdGVkIGlmIGJ6SW1hZ2UgaXMNCisJCQkgKiBsb2Fk ZWQgYXQgYSBub24tY29tcGlsZWQgYWRkcmVzcy4gRGlzcGxheSBhIHdhcm5pbmcNCisJCQkgKiB0 byB1c2VyIGF0IGNvbXBpbGUgdGltZSBhYm91dCB0aGUgYWJzb2x1dGUNCisJCQkgKiByZWxvY2F0 aW9ucyBwcmVzZW50Lg0KKwkJCSAqDQorCQkJICogVXNlciBuZWVkIHRvIGF1ZGl0IHRoZSBjb2Rl IHRvIG1ha2Ugc3VyZQ0KKwkJCSAqIHNvbWUgc3ltYm9scyB3aGljaCBzaG91bGQgaGF2ZSBiZWVu IHNlY3Rpb24NCisJCQkgKiByZWxhdGl2ZSBoYXZlIG5vdCBiZWNvbWUgYWJzb2x1dGUgYmVjYXVz ZSBvZiBzb21lDQorCQkJICogbGlua2VyIG9wdGltaXphdGlvbiBvciB3cm9uZyBwcm9ncmFtbWlu ZyB1c2FnZS4NCisJCQkgKg0KKwkJCSAqIEJlZm9yZSB3YXJuaW5nIGNoZWNrIGlmIHRoaXMgYWJz b2x1dGUgc3ltYm9sDQorCQkJICogcmVsb2NhdGlvbiBpcyBoYXJtbGVzcy4NCisJCQkgKi8NCisJ CQlpZiAoaXNfcmVsb2MoU19BQlMsIG5hbWUpIHx8IGlzX3JlbG9jKFNfUkVMLCBuYW1lKSkNCisJ CQkJY29udGludWU7DQorDQorCQkJaWYgKCFwcmludGVkKSB7DQorCQkJCXByaW50ZigiV0FSTklO RzogQWJzb2x1dGUgcmVsb2NhdGlvbnMiDQorCQkJCQkiIHByZXNlbnRcbiIpOw0KKwkJCQlwcmlu dGYoIk9mZnNldCAgICAgSW5mbyAgICAgVHlwZSAgICAgU3ltLlZhbHVlICINCisJCQkJCSJTeW0u TmFtZVxuIik7DQorCQkJCXByaW50ZWQgPSAxOw0KKwkJCX0NCisNCisJCQlwcmludGYoIiUwOHgg JTA4eCAlMTBzICUwOHggICVzXG4iLA0KKwkJCQlyZWwtPnJfb2Zmc2V0LA0KKwkJCQlyZWwtPnJf aW5mbywNCisJCQkJcmVsX3R5cGUoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSksDQorCQkJCXN5 bS0+c3RfdmFsdWUsDQorCQkJCW5hbWUpOw0KKwkJfQ0KKwl9DQorDQorCWlmIChwcmludGVkKQ0K KwkJcHJpbnRmKCJcbiIpOw0KK30NCisNCitzdGF0aWMgdm9pZCB3YWxrX3JlbG9jcyh2b2lkICgq dmlzaXQpKEVsZjMyX1JlbCAqcmVsLCBFbGYzMl9TeW0gKnN5bSksDQorCQkJaW50IHVzZV9yZWFs X21vZGUpDQorew0KKwlpbnQgaTsNCisJLyogV2FsayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucyAq Lw0KKwlmb3IgKGkgPSAwOyBpIDwgZWhkci5lX3NobnVtOyBpKyspIHsNCisJCWNoYXIgKnN5bV9z dHJ0YWI7DQorCQlFbGYzMl9TeW0gKnNoX3N5bXRhYjsNCisJCXN0cnVjdCBzZWN0aW9uICpzZWNf YXBwbGllcywgKnNlY19zeW10YWI7DQorCQlpbnQgajsNCisJCXN0cnVjdCBzZWN0aW9uICpzZWMg PSAmc2Vjc1tpXTsNCisNCisJCWlmIChzZWMtPnNoZHIuc2hfdHlwZSAhPSBTSFRfUkVMKSB7DQor CQkJY29udGludWU7DQorCQl9DQorCQlzZWNfc3ltdGFiICA9IHNlYy0+bGluazsNCisJCXNlY19h cHBsaWVzID0gJnNlY3Nbc2VjLT5zaGRyLnNoX2luZm9dOw0KKwkJaWYgKCEoc2VjX2FwcGxpZXMt PnNoZHIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKSB7DQorCQkJY29udGludWU7DQorCQl9DQorCQlz aF9zeW10YWIgPSBzZWNfc3ltdGFiLT5zeW10YWI7DQorCQlzeW1fc3RydGFiID0gc2VjX3N5bXRh Yi0+bGluay0+c3RydGFiOw0KKwkJZm9yIChqID0gMDsgaiA8IHNlYy0+c2hkci5zaF9zaXplL3Np emVvZihFbGYzMl9SZWwpOyBqKyspIHsNCisJCQlFbGYzMl9SZWwgKnJlbDsNCisJCQlFbGYzMl9T eW0gKnN5bTsNCisJCQl1bnNpZ25lZCByX3R5cGU7DQorCQkJY29uc3QgY2hhciAqc3ltbmFtZTsN CisJCQlyZWwgPSAmc2VjLT5yZWx0YWJbal07DQorCQkJc3ltID0gJnNoX3N5bXRhYltFTEYzMl9S X1NZTShyZWwtPnJfaW5mbyldOw0KKwkJCXJfdHlwZSA9IEVMRjMyX1JfVFlQRShyZWwtPnJfaW5m byk7DQorDQorCQkJc3dpdGNoIChyX3R5cGUpIHsNCisJCQljYXNlIFJfMzg2X05PTkU6DQorCQkJ Y2FzZSBSXzM4Nl9QQzMyOg0KKwkJCWNhc2UgUl8zODZfUEMxNjoNCisJCQljYXNlIFJfMzg2X1BD ODoNCisJCQkJLyoNCisJCQkJICogTk9ORSBjYW4gYmUgaWdub3JlZCBhbmQgYW5kIFBDIHJlbGF0 aXZlDQorCQkJCSAqIHJlbG9jYXRpb25zIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuDQorCQkJ CSAqLw0KKwkJCQlicmVhazsNCisNCisJCQljYXNlIFJfMzg2XzE2Og0KKwkJCQlzeW1uYW1lID0g c3ltX25hbWUoc3ltX3N0cnRhYiwgc3ltKTsNCisJCQkJaWYgKCF1c2VfcmVhbF9tb2RlKQ0KKwkJ CQkJZ290byBiYWQ7DQorCQkJCWlmIChzeW0tPnN0X3NobmR4ID09IFNITl9BQlMpIHsNCisJCQkJ CWlmIChpc19yZWxvYyhTX0FCUywgc3ltbmFtZSkpDQorCQkJCQkJYnJlYWs7DQorCQkJCQllbHNl IGlmICghaXNfcmVsb2MoU19TRUcsIHN5bW5hbWUpKQ0KKwkJCQkJCWdvdG8gYmFkOw0KKwkJCQl9 IGVsc2Ugew0KKwkJCQkJaWYgKGlzX3JlbG9jKFNfTElOLCBzeW1uYW1lKSkNCisJCQkJCQlnb3Rv IGJhZDsNCisJCQkJCWVsc2UNCisJCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCQl2aXNpdChyZWws IHN5bSk7DQorCQkJCWJyZWFrOw0KKw0KKwkJCWNhc2UgUl8zODZfMzI6DQorCQkJCXN5bW5hbWUg PSBzeW1fbmFtZShzeW1fc3RydGFiLCBzeW0pOw0KKwkJCQlpZiAoc3ltLT5zdF9zaG5keCA9PSBT SE5fQUJTKSB7DQorCQkJCQlpZiAoaXNfcmVsb2MoU19BQlMsIHN5bW5hbWUpKQ0KKwkJCQkJCWJy ZWFrOw0KKwkJCQkJZWxzZSBpZiAoIWlzX3JlbG9jKFNfUkVMLCBzeW1uYW1lKSkNCisJCQkJCQln b3RvIGJhZDsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWlmICh1c2VfcmVhbF9tb2RlICYmDQorCQkJ CQkgICAgIWlzX3JlbG9jKFNfTElOLCBzeW1uYW1lKSkNCisJCQkJCQlicmVhazsNCisJCQkJfQ0K KwkJCQl2aXNpdChyZWwsIHN5bSk7DQorCQkJCWJyZWFrOw0KKwkJCWRlZmF1bHQ6DQorCQkJCWRp ZSgiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlOiAlcyAoJWQpXG4iLA0KKwkJCQkgICAgcmVs X3R5cGUocl90eXBlKSwgcl90eXBlKTsNCisJCQkJYnJlYWs7DQorCQkJYmFkOg0KKwkJCQlzeW1u YW1lID0gc3ltX25hbWUoc3ltX3N0cnRhYiwgc3ltKTsNCisJCQkJZGllKCJJbnZhbGlkICVzIHJl bG9jYXRpb246ICVzXG4iLA0KKwkJCQkgICAgcmVsX3R5cGUocl90eXBlKSwgc3ltbmFtZSk7DQor CQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGNvdW50X3JlbG9jKEVsZjMyX1Jl bCAqcmVsLCBFbGYzMl9TeW0gKnN5bSkNCit7DQorCWlmIChFTEYzMl9SX1RZUEUocmVsLT5yX2lu Zm8pID09IFJfMzg2XzE2KQ0KKwkJcmVsb2MxNl9jb3VudCsrOw0KKwllbHNlDQorCQlyZWxvY19j b3VudCsrOw0KK30NCisNCitzdGF0aWMgdm9pZCBjb2xsZWN0X3JlbG9jKEVsZjMyX1JlbCAqcmVs LCBFbGYzMl9TeW0gKnN5bSkNCit7DQorCS8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzIHRoYXQgbmVl ZHMgdG8gYmUgYWRqdXN0ZWQuICovDQorCWlmIChFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pID09 IFJfMzg2XzE2KQ0KKwkJcmVsb2NzMTZbcmVsb2MxNl9pZHgrK10gPSByZWwtPnJfb2Zmc2V0Ow0K KwllbHNlDQorCQlyZWxvY3NbcmVsb2NfaWR4KytdID0gcmVsLT5yX29mZnNldDsNCit9DQorDQor c3RhdGljIGludCBjbXBfcmVsb2NzKGNvbnN0IHZvaWQgKnZhLCBjb25zdCB2b2lkICp2YikNCit7 DQorCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmEsICpiOw0KKwlhID0gdmE7IGIgPSB2YjsNCisJcmV0 dXJuICgqYSA9PSAqYik/IDAgOiAoKmEgPiAqYik/IDEgOiAtMTsNCit9DQorDQorc3RhdGljIGlu dCB3cml0ZTMyKHVuc2lnbmVkIGludCB2LCBGSUxFICpmKQ0KK3sNCisJdW5zaWduZWQgY2hhciBi dWZbNF07DQorDQorCWJ1ZlswXSA9ICh2ID4+ICAwKSAmIDB4ZmY7DQorCWJ1ZlsxXSA9ICh2ID4+ ICA4KSAmIDB4ZmY7DQorCWJ1ZlsyXSA9ICh2ID4+IDE2KSAmIDB4ZmY7DQorCWJ1ZlszXSA9ICh2 ID4+IDI0KSAmIDB4ZmY7DQorCXJldHVybiBmd3JpdGUoYnVmLCAxLCA0LCBmKSA9PSA0ID8gMCA6 IC0xOw0KK30NCisNCitzdGF0aWMgdm9pZCBlbWl0X3JlbG9jcyhpbnQgYXNfdGV4dCwgaW50IHVz ZV9yZWFsX21vZGUpDQorew0KKwlpbnQgaTsNCisJLyogQ291bnQgaG93IG1hbnkgcmVsb2NhdGlv bnMgSSBoYXZlIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlbS4gKi8NCisJcmVsb2NfY291bnQg PSAwOw0KKwl3YWxrX3JlbG9jcyhjb3VudF9yZWxvYywgdXNlX3JlYWxfbW9kZSk7DQorCXJlbG9j cyA9IG1hbGxvYyhyZWxvY19jb3VudCAqIHNpemVvZihyZWxvY3NbMF0pKTsNCisJaWYgKCFyZWxv Y3MpIHsNCisJCWRpZSgibWFsbG9jIG9mICVkIGVudHJpZXMgZm9yIHJlbG9jcyBmYWlsZWRcbiIs DQorCQkJcmVsb2NfY291bnQpOw0KKwl9DQorDQorCXJlbG9jczE2ID0gbWFsbG9jKHJlbG9jMTZf Y291bnQgKiBzaXplb2YocmVsb2NzWzBdKSk7DQorCWlmICghcmVsb2NzMTYpIHsNCisJCWRpZSgi bWFsbG9jIG9mICVkIGVudHJpZXMgZm9yIHJlbG9jczE2IGZhaWxlZFxuIiwNCisJCQlyZWxvYzE2 X2NvdW50KTsNCisJfQ0KKwkvKiBDb2xsZWN0IHVwIHRoZSByZWxvY2F0aW9ucyAqLw0KKwlyZWxv Y19pZHggPSAwOw0KKwl3YWxrX3JlbG9jcyhjb2xsZWN0X3JlbG9jLCB1c2VfcmVhbF9tb2RlKTsN CisNCisJaWYgKHJlbG9jMTZfY291bnQgJiYgIXVzZV9yZWFsX21vZGUpDQorCQlkaWUoIlNlZ21l bnQgcmVsb2NhdGlvbnMgZm91bmQgYnV0IC0tcmVhbG1vZGUgbm90IHNwZWNpZmllZFxuIik7DQor DQorCS8qIE9yZGVyIHRoZSByZWxvY2F0aW9ucyBmb3IgbW9yZSBlZmZpY2llbnQgcHJvY2Vzc2lu ZyAqLw0KKwlxc29ydChyZWxvY3MsIHJlbG9jX2NvdW50LCBzaXplb2YocmVsb2NzWzBdKSwgY21w X3JlbG9jcyk7DQorCXFzb3J0KHJlbG9jczE2LCByZWxvYzE2X2NvdW50LCBzaXplb2YocmVsb2Nz MTZbMF0pLCBjbXBfcmVsb2NzKTsNCisNCisJLyogUHJpbnQgdGhlIHJlbG9jYXRpb25zICovDQor CWlmIChhc190ZXh0KSB7DQorCQkvKiBQcmludCB0aGUgcmVsb2NhdGlvbnMgaW4gYSBmb3JtIHN1 aXRhYmxlIHRoYXQNCisJCSAqIGdhcyB3aWxsIGxpa2UuDQorCQkgKi8NCisJCXByaW50ZigiLnNl Y3Rpb24gXCIuZGF0YS5yZWxvY1wiLFwiYVwiXG4iKTsNCisJCXByaW50ZigiLmJhbGlnbiA0XG4i KTsNCisJCWlmICh1c2VfcmVhbF9tb2RlKSB7DQorCQkJcHJpbnRmKCJcdC5sb25nICVsdVxuIiwg cmVsb2MxNl9jb3VudCk7DQorCQkJZm9yIChpID0gMDsgaSA8IHJlbG9jMTZfY291bnQ7IGkrKykN CisJCQkJcHJpbnRmKCJcdC5sb25nIDB4JTA4bHhcbiIsIHJlbG9jczE2W2ldKTsNCisJCQlwcmlu dGYoIlx0LmxvbmcgJWx1XG4iLCByZWxvY19jb3VudCk7DQorCQkJZm9yIChpID0gMDsgaSA8IHJl bG9jX2NvdW50OyBpKyspIHsNCisJCQkJcHJpbnRmKCJcdC5sb25nIDB4JTA4bHhcbiIsIHJlbG9j c1tpXSk7DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQkvKiBQcmludCBhIHN0b3AgKi8NCisJCQlw cmludGYoIlx0LmxvbmcgMHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpMCk7DQorCQkJZm9yIChp ID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspIHsNCisJCQkJcHJpbnRmKCJcdC5sb25nIDB4JTA4 bHhcbiIsIHJlbG9jc1tpXSk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcHJpbnRmKCJcbiIpOw0KKwl9 DQorCWVsc2Ugew0KKwkJaWYgKHVzZV9yZWFsX21vZGUpIHsNCisJCQl3cml0ZTMyKHJlbG9jMTZf Y291bnQsIHN0ZG91dCk7DQorCQkJZm9yIChpID0gMDsgaSA8IHJlbG9jMTZfY291bnQ7IGkrKykN CisJCQkJd3JpdGUzMihyZWxvY3MxNltpXSwgc3Rkb3V0KTsNCisJCQl3cml0ZTMyKHJlbG9jX2Nv dW50LCBzdGRvdXQpOw0KKw0KKwkJCS8qIE5vdyBwcmludCBlYWNoIHJlbG9jYXRpb24gKi8NCisJ CQlmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykNCisJCQkJd3JpdGUzMihyZWxvY3Nb aV0sIHN0ZG91dCk7DQorCQl9IGVsc2Ugew0KKwkJCS8qIFByaW50IGEgc3RvcCAqLw0KKwkJCXdy aXRlMzIoMCwgc3Rkb3V0KTsNCisNCisJCQkvKiBOb3cgcHJpbnQgZWFjaCByZWxvY2F0aW9uICov DQorCQkJZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspIHsNCisJCQkJd3JpdGUzMihy ZWxvY3NbaV0sIHN0ZG91dCk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lk IHVzYWdlKHZvaWQpDQorew0KKwlkaWUoInJlbG9jcyBbLS1hYnMtc3ltc3wtLWFicy1yZWxvY3N8 LS10ZXh0fC0tcmVhbG1vZGVdIHZtbGludXhcbiIpOw0KK30NCisNCitpbnQgbWFpbihpbnQgYXJn YywgY2hhciAqKmFyZ3YpDQorew0KKwlpbnQgc2hvd19hYnNvbHV0ZV9zeW1zLCBzaG93X2Fic29s dXRlX3JlbG9jczsNCisJaW50IGFzX3RleHQsIHVzZV9yZWFsX21vZGU7DQorCWNvbnN0IGNoYXIg KmZuYW1lOw0KKwlGSUxFICpmcDsNCisJaW50IGk7DQorDQorCXNob3dfYWJzb2x1dGVfc3ltcyA9 IDA7DQorCXNob3dfYWJzb2x1dGVfcmVsb2NzID0gMDsNCisJYXNfdGV4dCA9IDA7DQorCXVzZV9y ZWFsX21vZGUgPSAwOw0KKwlmbmFtZSA9IE5VTEw7DQorCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBp KyspIHsNCisJCWNoYXIgKmFyZyA9IGFyZ3ZbaV07DQorCQlpZiAoKmFyZyA9PSAnLScpIHsNCisJ CQlpZiAoc3RyY21wKGFyZywgIi0tYWJzLXN5bXMiKSA9PSAwKSB7DQorCQkJCXNob3dfYWJzb2x1 dGVfc3ltcyA9IDE7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoc3RyY21wKGFyZywg Ii0tYWJzLXJlbG9jcyIpID09IDApIHsNCisJCQkJc2hvd19hYnNvbHV0ZV9yZWxvY3MgPSAxOw0K KwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHN0cmNtcChhcmcsICItLXRleHQiKSA9PSAw KSB7DQorCQkJCWFzX3RleHQgPSAxOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHN0 cmNtcChhcmcsICItLXJlYWxtb2RlIikgPT0gMCkgew0KKwkJCQl1c2VfcmVhbF9tb2RlID0gMTsN CisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiAoIWZuYW1lKSB7DQorCQkJ Zm5hbWUgPSBhcmc7DQorCQkJY29udGludWU7DQorCQl9DQorCQl1c2FnZSgpOw0KKwl9DQorCWlm ICghZm5hbWUpIHsNCisJCXVzYWdlKCk7DQorCX0NCisJcmVnZXhfaW5pdCh1c2VfcmVhbF9tb2Rl KTsNCisJZnAgPSBmb3BlbihmbmFtZSwgInIiKTsNCisJaWYgKCFmcCkgew0KKwkJZGllKCJDYW5u b3Qgb3BlbiAlczogJXNcbiIsDQorCQkJZm5hbWUsIHN0cmVycm9yKGVycm5vKSk7DQorCX0NCisJ cmVhZF9laGRyKGZwKTsNCisJcmVhZF9zaGRycyhmcCk7DQorCXJlYWRfc3RydGFicyhmcCk7DQor CXJlYWRfc3ltdGFicyhmcCk7DQorCXJlYWRfcmVsb2NzKGZwKTsNCisJaWYgKHNob3dfYWJzb2x1 dGVfc3ltcykgew0KKwkJcHJpbnRfYWJzb2x1dGVfc3ltYm9scygpOw0KKwkJcmV0dXJuIDA7DQor CX0NCisJaWYgKHNob3dfYWJzb2x1dGVfcmVsb2NzKSB7DQorCQlwcmludF9hYnNvbHV0ZV9yZWxv Y3MoKTsNCisJCXJldHVybiAwOw0KKwl9DQorCWVtaXRfcmVsb2NzKGFzX3RleHQsIHVzZV9yZWFs X21vZGUpOw0KKwlyZXR1cm4gMDsNCit9DQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZSBi L3NjcmlwdHMvTWFrZWZpbGUNCmluZGV4IGRmNzY3OGYuLjM2MjY2NjYgMTAwNjQ0DQotLS0gYS9z Y3JpcHRzL01ha2VmaWxlDQorKysgYi9zY3JpcHRzL01ha2VmaWxlDQpAQCAtOCw2ICs4LDggQEAN CiAjIGNvbm1ha2VoYXNoOgkgQ3JlYXRlIGFycmF5cyBmb3IgaW5pdGlhbGl6aW5nIHRoZSBrZXJu ZWwgY29uc29sZSB0YWJsZXMNCiAjIGRvY3Byb2M6ICAgICAgIFVzZWQgaW4gRG9jdW1lbnRhdGlv bi9Eb2NCb29rDQogDQorSE9TVF9FWFRSQUNGTEFHUyArPSAtSSQoc3JjdHJlZSkvdG9vbHMvaW5j bHVkZQ0KKw0KIGhvc3Rwcm9ncy0kKENPTkZJR19LQUxMU1lNUykgICAgICs9IGthbGxzeW1zDQog aG9zdHByb2dzLSQoQ09ORklHX0xPR08pICAgICAgICAgKz0gcG5tdG9sb2dvDQogaG9zdHByb2dz LSQoQ09ORklHX1ZUKSAgICAgICAgICAgKz0gY29ubWFrZWhhc2gNCi0tIA0KMS43LjEwDQoNCl== --=-7XFbgcqFy0hq8VmkXSHg-- --=-+pOHXDXUwjcTCAXoR/vG Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIVAwUAT8JYTOe/yOyVhhEJAQqSfA//ez1aumOBw440MoBuxmjWS1g9I7DM1vOB owlArppEeE3B7pzSjelfJW6T+b/iXm1di7MEwAEOmelBZElJ4ZPj050Xz2Ov1E2h +oy10KrCiz2uGS0TUY1HNEIK/FEmtZxn4nOQ4fTTZVLhpWbeXvboFm/U6vavMSr7 EbTZ+1CDeG4L9hfL2zvE5IlR4Lk88iO1JSq/i6+e5vgoUDa8SVHC+qcrmDF7Ks2a 9E+38i2lmDWwjMe1STUZ2EtgD0Lg/nwsTcYbvgbme65vOCHOkZs6wuddZ++0scj6 owjkzC0C0+qYsZmxQTIakoEOIMrs17uGvNxyWr+Gw8Z/BhZ70bExesw96n7dhEE1 puZ22qkVd8ZyGL88svIaOywlHPmpq8ybHCYzp82J09cz6aH64zIFiYf/yYeUxw/4 TB+7njgUHEHcUrGAK2V1I/C90JUwuEso8bUi9Lp0v0Y7psaiervQyRribnmjAypg HMWrfiKn/M559e7TmY+24CRV3nd85wF4vddJ85sHhouaR1MrE6iS+gFR/oFG7kOe XlCjaNiPoe0wACbA31hkeD04ZimuvVamrtQ8r0RUoJLrvUAPUdSthw6zRDtQn6Fp fFRCo95zjpN0in08NkoHg1I17l/dInfVYB4c03t6EnqEVLTkodjbyvFVNwVeM7oW 47TuqliKxhg= =A3pI -----END PGP SIGNATURE----- --=-+pOHXDXUwjcTCAXoR/vG-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/