Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932975AbcLIDYN (ORCPT ); Thu, 8 Dec 2016 22:24:13 -0500 Received: from rtits2.realtek.com ([211.75.126.72]:47462 "EHLO rtits2.realtek.com.tw" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753981AbcLIDYH (ORCPT ); Thu, 8 Dec 2016 22:24:07 -0500 Authenticated-By: X-SpamFilter-By: BOX Solutions SpamTrap 5.56 with qID uB93M8p0024816, This message is accepted by code: ctloc85258 From: Hayes Wang To: "mlord@pobox.com" CC: "netdev@vger.kernel.org" , nic_swsd , "linux-kernel@vger.kernel.org" , "linux-usb@vger.kernel.org" Subject: RE: [PATCH net 1/2] r8152: fix the sw rx checksum is unavailable Thread-Topic: [PATCH net 1/2] r8152: fix the sw rx checksum is unavailable Thread-Index: AQHSO+t3nHKkZLLsBUqa3CUPsCXz6KDci+AwgAAm4ICAAaIjoP//1LUAgAfJkeCAAC16gIAAmNB+///IdICAAR1zgIAAiCTw//+4SQAAAMTjgAAA+GcAAALhTwAADFMsAAAHEqSAACOgmaD//79lgP/38ohA/+JUncA= Date: Fri, 9 Dec 2016 03:23:56 +0000 Message-ID: <0835B3720019904CB8F7AA43166CEEB20105C9EE@RTITMBSV03.realtek.com.tw> References: <20161125095350.GA20653@kroah.com> <1816ec7e-2733-f4ba-5d30-29dbabd20aad@pobox.com> <20161125.115827.2014848246966159357.davem@davemloft.net> <0835B3720019904CB8F7AA43166CEEB201057793@RTITMBSV03.realtek.com.tw> In-Reply-To: <0835B3720019904CB8F7AA43166CEEB201057793@RTITMBSV03.realtek.com.tw> Accept-Language: zh-TW, en-US Content-Language: zh-TW X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [172.21.177.128] Content-Type: multipart/mixed; boundary="_002_0835B3720019904CB8F7AA43166CEEB20105C9EERTITMBSV03realt_" MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 145921 Lines: 1909 --_002_0835B3720019904CB8F7AA43166CEEB20105C9EERTITMBSV03realt_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Mark Lord I find an issue about autosuspend, and it may result in the same problem with you. I don't sure if this is helpful to you, because it only occurs when enabling the autosuspend. Best Regards, Hayes --_002_0835B3720019904CB8F7AA43166CEEB20105C9EERTITMBSV03realt_ Content-Type: text/plain; name="r8152.c" Content-Description: r8152.c Content-Disposition: attachment; filename="r8152.c"; size=107439; creation-date="Thu, 24 Nov 2016 15:25:00 GMT"; modification-date="Fri, 09 Dec 2016 02:10:24 GMT" Content-Transfer-Encoding: base64 LyoNCiAqICBDb3B5cmlnaHQgKGMpIDIwMTQgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuIEFs bCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAqIHZlcnNpb24gMiBhcyBw dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4NCiAqDQogKi8NCg0KI2lu Y2x1ZGUgPGxpbnV4L3NpZ25hbC5oPg0KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4NCiNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4NCiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4NCiNpbmNsdWRl IDxsaW51eC9ldGhlcmRldmljZS5oPg0KI2luY2x1ZGUgPGxpbnV4L21paS5oPg0KI2luY2x1ZGUg PGxpbnV4L2V0aHRvb2wuaD4NCiNpbmNsdWRlIDxsaW51eC91c2IuaD4NCiNpbmNsdWRlIDxsaW51 eC9jcmMzMi5oPg0KI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4NCiNpbmNsdWRlIDxsaW51eC91 YWNjZXNzLmg+DQojaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KI2luY2x1ZGUgPGxpbnV4L2lwLmg+ DQojaW5jbHVkZSA8bGludXgvaXB2Ni5oPg0KI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4N CiNpbmNsdWRlIDx1YXBpL2xpbnV4L21kaW8uaD4NCiNpbmNsdWRlIDxsaW51eC9tZGlvLmg+DQoj aW5jbHVkZSA8bGludXgvdXNiL2NkYy5oPg0KDQovKiBJbmZvcm1hdGlvbiBmb3IgbmV0LW5leHQg Ki8NCiNkZWZpbmUgTkVUTkVYVF9WRVJTSU9OCQkiMDgiDQoNCi8qIEluZm9ybWF0aW9uIGZvciBu ZXQgKi8NCiNkZWZpbmUgTkVUX1ZFUlNJT04JCSIyIg0KDQojZGVmaW5lIERSSVZFUl9WRVJTSU9O CQkidjEuIiBORVRORVhUX1ZFUlNJT04gIi4iIE5FVF9WRVJTSU9ODQojZGVmaW5lIERSSVZFUl9B VVRIT1IgIlJlYWx0ZWsgbGludXggbmljIG1haW50YWluZXJzIDxuaWNfc3dzZEByZWFsdGVrLmNv bT4iDQojZGVmaW5lIERSSVZFUl9ERVNDICJSZWFsdGVrIFJUTDgxNTIvUlRMODE1MyBCYXNlZCBV U0IgRXRoZXJuZXQgQWRhcHRlcnMiDQojZGVmaW5lIE1PRFVMRU5BTUUgInI4MTUyIg0KDQojZGVm aW5lIFI4MTUyX1BIWV9JRAkJMzINCg0KI2RlZmluZSBQTEFfSURSCQkJMHhjMDAwDQojZGVmaW5l IFBMQV9SQ1IJCQkweGMwMTANCiNkZWZpbmUgUExBX1JNUwkJCTB4YzAxNg0KI2RlZmluZSBQTEFf UlhGSUZPX0NUUkwwCTB4YzBhMA0KI2RlZmluZSBQTEFfUlhGSUZPX0NUUkwxCTB4YzBhNA0KI2Rl ZmluZSBQTEFfUlhGSUZPX0NUUkwyCTB4YzBhOA0KI2RlZmluZSBQTEFfRE1ZX1JFRzAJCTB4YzBi MA0KI2RlZmluZSBQTEFfRk1DCQkJMHhjMGI0DQojZGVmaW5lIFBMQV9DRkdfV09MCQkweGMwYjYN CiNkZWZpbmUgUExBX1RFUkVET19DRkcJCTB4YzBiYw0KI2RlZmluZSBQTEFfTUFSCQkJMHhjZDAw DQojZGVmaW5lIFBMQV9CQUNLVVAJCTB4ZDAwMA0KI2RlZmluZSBQQUxfQkRDX0NSCQkweGQxYTAN CiNkZWZpbmUgUExBX1RFUkVET19USU1FUgkweGQyY2MNCiNkZWZpbmUgUExBX1JFQUxXT1dfVElN RVIJMHhkMmU4DQojZGVmaW5lIFBMQV9MRURTRUwJCTB4ZGQ5MA0KI2RlZmluZSBQTEFfTEVEX0ZF QVRVUkUJCTB4ZGQ5Mg0KI2RlZmluZSBQTEFfUEhZQVIJCTB4ZGUwMA0KI2RlZmluZSBQTEFfQk9P VF9DVFJMCQkweGUwMDQNCiNkZWZpbmUgUExBX0dQSFlfSU5UUl9JTVIJMHhlMDIyDQojZGVmaW5l IFBMQV9FRUVfQ1IJCTB4ZTA0MA0KI2RlZmluZSBQTEFfRUVFUF9DUgkJMHhlMDgwDQojZGVmaW5l IFBMQV9NQUNfUFdSX0NUUkwJMHhlMGMwDQojZGVmaW5lIFBMQV9NQUNfUFdSX0NUUkwyCTB4ZTBj YQ0KI2RlZmluZSBQTEFfTUFDX1BXUl9DVFJMMwkweGUwY2MNCiNkZWZpbmUgUExBX01BQ19QV1Jf Q1RSTDQJMHhlMGNlDQojZGVmaW5lIFBMQV9XRFQ2X0NUUkwJCTB4ZTQyOA0KI2RlZmluZSBQTEFf VENSMAkJMHhlNjEwDQojZGVmaW5lIFBMQV9UQ1IxCQkweGU2MTINCiNkZWZpbmUgUExBX01UUFMJ CTB4ZTYxNQ0KI2RlZmluZSBQTEFfVFhGSUZPX0NUUkwJCTB4ZTYxOA0KI2RlZmluZSBQTEFfUlNU VEFMTFkJCTB4ZTgwMA0KI2RlZmluZSBQTEFfQ1IJCQkweGU4MTMNCiNkZWZpbmUgUExBX0NSV0VD UgkJMHhlODFjDQojZGVmaW5lIFBMQV9DT05GSUcxMgkJMHhlODFlCS8qIENPTkZJRzEsIENPTkZJ RzIgKi8NCiNkZWZpbmUgUExBX0NPTkZJRzM0CQkweGU4MjAJLyogQ09ORklHMywgQ09ORklHNCAq Lw0KI2RlZmluZSBQTEFfQ09ORklHNQkJMHhlODIyDQojZGVmaW5lIFBMQV9QSFlfUFdSCQkweGU4 NGMNCiNkZWZpbmUgUExBX09PQl9DVFJMCQkweGU4NGYNCiNkZWZpbmUgUExBX0NQQ1IJCTB4ZTg1 NA0KI2RlZmluZSBQTEFfTUlTQ18wCQkweGU4NTgNCiNkZWZpbmUgUExBX01JU0NfMQkJMHhlODVh DQojZGVmaW5lIFBMQV9PQ1BfR1BIWV9CQVNFCTB4ZTg2Yw0KI2RlZmluZSBQTEFfVEFMTFlDTlQJ CTB4ZTg5MA0KI2RlZmluZSBQTEFfU0ZGX1NUU183CQkweGU4ZGUNCiNkZWZpbmUgUExBX1BIWVNU QVRVUwkJMHhlOTA4DQojZGVmaW5lIFBMQV9CUF9CQQkJMHhmYzI2DQojZGVmaW5lIFBMQV9CUF8w CQkweGZjMjgNCiNkZWZpbmUgUExBX0JQXzEJCTB4ZmMyYQ0KI2RlZmluZSBQTEFfQlBfMgkJMHhm YzJjDQojZGVmaW5lIFBMQV9CUF8zCQkweGZjMmUNCiNkZWZpbmUgUExBX0JQXzQJCTB4ZmMzMA0K I2RlZmluZSBQTEFfQlBfNQkJMHhmYzMyDQojZGVmaW5lIFBMQV9CUF82CQkweGZjMzQNCiNkZWZp bmUgUExBX0JQXzcJCTB4ZmMzNg0KI2RlZmluZSBQTEFfQlBfRU4JCTB4ZmMzOA0KDQojZGVmaW5l IFVTQl9VU0IyUEhZCQkweGI0MWUNCiNkZWZpbmUgVVNCX1NTUEhZTElOSzIJCTB4YjQyOA0KI2Rl ZmluZSBVU0JfVTJQM19DVFJMCQkweGI0NjANCiNkZWZpbmUgVVNCX0NTUl9EVU1NWTEJCTB4YjQ2 NA0KI2RlZmluZSBVU0JfQ1NSX0RVTU1ZMgkJMHhiNDY2DQojZGVmaW5lIFVTQl9ERVZfU1RBVAkJ MHhiODA4DQojZGVmaW5lIFVTQl9DT05ORUNUX1RJTUVSCTB4Y2JmOA0KI2RlZmluZSBVU0JfQlVS U1RfU0laRQkJMHhjZmMwDQojZGVmaW5lIFVTQl9VU0JfQ1RSTAkJMHhkNDA2DQojZGVmaW5lIFVT Ql9QSFlfQ1RSTAkJMHhkNDA4DQojZGVmaW5lIFVTQl9UWF9BR0cJCTB4ZDQwYQ0KI2RlZmluZSBV U0JfUlhfQlVGX1RICQkweGQ0MGMNCiNkZWZpbmUgVVNCX1VTQl9USU1FUgkJMHhkNDI4DQojZGVm aW5lIFVTQl9SWF9FQVJMWV9USU1FT1VUCTB4ZDQyYw0KI2RlZmluZSBVU0JfUlhfRUFSTFlfU0la RQkweGQ0MmUNCiNkZWZpbmUgVVNCX1BNX0NUUkxfU1RBVFVTCTB4ZDQzMg0KI2RlZmluZSBVU0Jf VFhfRE1BCQkweGQ0MzQNCiNkZWZpbmUgVVNCX1RPTEVSQU5DRQkJMHhkNDkwDQojZGVmaW5lIFVT Ql9MUE1fQ1RSTAkJMHhkNDFhDQojZGVmaW5lIFVTQl9VUFNfQ1RSTAkJMHhkODAwDQojZGVmaW5l IFVTQl9NSVNDXzAJCTB4ZDgxYQ0KI2RlZmluZSBVU0JfUE9XRVJfQ1VUCQkweGQ4MGENCiNkZWZp bmUgVVNCX0FGRV9DVFJMMgkJMHhkODI0DQojZGVmaW5lIFVTQl9XRFQxMV9DVFJMCQkweGU0M2MN CiNkZWZpbmUgVVNCX0JQX0JBCQkweGZjMjYNCiNkZWZpbmUgVVNCX0JQXzAJCTB4ZmMyOA0KI2Rl ZmluZSBVU0JfQlBfMQkJMHhmYzJhDQojZGVmaW5lIFVTQl9CUF8yCQkweGZjMmMNCiNkZWZpbmUg VVNCX0JQXzMJCTB4ZmMyZQ0KI2RlZmluZSBVU0JfQlBfNAkJMHhmYzMwDQojZGVmaW5lIFVTQl9C UF81CQkweGZjMzINCiNkZWZpbmUgVVNCX0JQXzYJCTB4ZmMzNA0KI2RlZmluZSBVU0JfQlBfNwkJ MHhmYzM2DQojZGVmaW5lIFVTQl9CUF9FTgkJMHhmYzM4DQoNCi8qIE9DUCBSZWdpc3RlcnMgKi8N CiNkZWZpbmUgT0NQX0FMRFBTX0NPTkZJRwkweDIwMTANCiNkZWZpbmUgT0NQX0VFRV9DT05GSUcx CQkweDIwODANCiNkZWZpbmUgT0NQX0VFRV9DT05GSUcyCQkweDIwOTINCiNkZWZpbmUgT0NQX0VF RV9DT05GSUczCQkweDIwOTQNCiNkZWZpbmUgT0NQX0JBU0VfTUlJCQkweGE0MDANCiNkZWZpbmUg T0NQX0VFRV9BUgkJMHhhNDFhDQojZGVmaW5lIE9DUF9FRUVfREFUQQkJMHhhNDFjDQojZGVmaW5l IE9DUF9QSFlfU1RBVFVTCQkweGE0MjANCiNkZWZpbmUgT0NQX1BPV0VSX0NGRwkJMHhhNDMwDQoj ZGVmaW5lIE9DUF9FRUVfQ0ZHCQkweGE0MzINCiNkZWZpbmUgT0NQX1NSQU1fQUREUgkJMHhhNDM2 DQojZGVmaW5lIE9DUF9TUkFNX0RBVEEJCTB4YTQzOA0KI2RlZmluZSBPQ1BfRE9XTl9TUEVFRAkJ MHhhNDQyDQojZGVmaW5lIE9DUF9FRUVfQUJMRQkJMHhhNWM0DQojZGVmaW5lIE9DUF9FRUVfQURW CQkweGE1ZDANCiNkZWZpbmUgT0NQX0VFRV9MUEFCTEUJCTB4YTVkMg0KI2RlZmluZSBPQ1BfUEhZ X1NUQVRFCQkweGE3MDgJCS8qIG53YXkgc3RhdGUgZm9yIDgxNTMgKi8NCiNkZWZpbmUgT0NQX0FE Q19DRkcJCTB4YmMwNg0KDQovKiBTUkFNIFJlZ2lzdGVyICovDQojZGVmaW5lIFNSQU1fTFBGX0NG RwkJMHg4MDEyDQojZGVmaW5lIFNSQU1fMTBNX0FNUDEJCTB4ODA4MA0KI2RlZmluZSBTUkFNXzEw TV9BTVAyCQkweDgwODINCiNkZWZpbmUgU1JBTV9JTVBFREFOQ0UJCTB4ODA4NA0KDQovKiBQTEFf UkNSICovDQojZGVmaW5lIFJDUl9BQVAJCQkweDAwMDAwMDAxDQojZGVmaW5lIFJDUl9BUE0JCQkw eDAwMDAwMDAyDQojZGVmaW5lIFJDUl9BTQkJCTB4MDAwMDAwMDQNCiNkZWZpbmUgUkNSX0FCCQkJ MHgwMDAwMDAwOA0KI2RlZmluZSBSQ1JfQUNQVF9BTEwJCShSQ1JfQUFQIHwgUkNSX0FQTSB8IFJD Ul9BTSB8IFJDUl9BQikNCg0KLyogUExBX1JYRklGT19DVFJMMCAqLw0KI2RlZmluZSBSWEZJRk9f VEhSMV9OT1JNQUwJMHgwMDA4MDAwMg0KI2RlZmluZSBSWEZJRk9fVEhSMV9PT0IJCTB4MDE4MDAw MDMNCg0KLyogUExBX1JYRklGT19DVFJMMSAqLw0KI2RlZmluZSBSWEZJRk9fVEhSMl9GVUxMCTB4 MDAwMDAwNjANCiNkZWZpbmUgUlhGSUZPX1RIUjJfSElHSAkweDAwMDAwMDM4DQojZGVmaW5lIFJY RklGT19USFIyX09PQgkJMHgwMDAwMDA0YQ0KI2RlZmluZSBSWEZJRk9fVEhSMl9OT1JNQUwJMHgw MGEwDQoNCi8qIFBMQV9SWEZJRk9fQ1RSTDIgKi8NCiNkZWZpbmUgUlhGSUZPX1RIUjNfRlVMTAkw eDAwMDAwMDc4DQojZGVmaW5lIFJYRklGT19USFIzX0hJR0gJMHgwMDAwMDA0OA0KI2RlZmluZSBS WEZJRk9fVEhSM19PT0IJCTB4MDAwMDAwNWENCiNkZWZpbmUgUlhGSUZPX1RIUjNfTk9STUFMCTB4 MDExMA0KDQovKiBQTEFfVFhGSUZPX0NUUkwgKi8NCiNkZWZpbmUgVFhGSUZPX1RIUl9OT1JNQUwJ MHgwMDQwMDAwOA0KI2RlZmluZSBUWEZJRk9fVEhSX05PUk1BTDIJMHgwMTAwMDAwOA0KDQovKiBQ TEFfRE1ZX1JFRzAgKi8NCiNkZWZpbmUgRUNNX0FMRFBTCQkweDAwMDINCg0KLyogUExBX0ZNQyAq Lw0KI2RlZmluZSBGTUNfRkNSX01DVV9FTgkJMHgwMDAxDQoNCi8qIFBMQV9FRUVQX0NSICovDQoj ZGVmaW5lIEVFRVBfQ1JfRUVFUF9UWAkJMHgwMDAyDQoNCi8qIFBMQV9XRFQ2X0NUUkwgKi8NCiNk ZWZpbmUgV0RUNl9TRVRfTU9ERQkJMHgwMDEwDQoNCi8qIFBMQV9UQ1IwICovDQojZGVmaW5lIFRD UjBfVFhfRU1QVFkJCTB4MDgwMA0KI2RlZmluZSBUQ1IwX0FVVE9fRklGTwkJMHgwMDgwDQoNCi8q IFBMQV9UQ1IxICovDQojZGVmaW5lIFZFUlNJT05fTUFTSwkJMHg3Y2YwDQoNCi8qIFBMQV9NVFBT ICovDQojZGVmaW5lIE1UUFNfSlVNQk8JCSgxMiAqIDEwMjQgLyA2NCkNCiNkZWZpbmUgTVRQU19E RUZBVUxUCQkoNiAqIDEwMjQgLyA2NCkNCg0KLyogUExBX1JTVFRBTExZICovDQojZGVmaW5lIFRB TExZX1JFU0VUCQkweDAwMDENCg0KLyogUExBX0NSICovDQojZGVmaW5lIENSX1JTVAkJCTB4MTAN CiNkZWZpbmUgQ1JfUkUJCQkweDA4DQojZGVmaW5lIENSX1RFCQkJMHgwNA0KDQovKiBQTEFfQ1JX RUNSICovDQojZGVmaW5lIENSV0VDUl9OT1JBTUwJCTB4MDANCiNkZWZpbmUgQ1JXRUNSX0NPTkZJ RwkJMHhjMA0KDQovKiBQTEFfT09CX0NUUkwgKi8NCiNkZWZpbmUgTk9XX0lTX09PQgkJMHg4MA0K I2RlZmluZSBUWEZJRk9fRU1QVFkJCTB4MjANCiNkZWZpbmUgUlhGSUZPX0VNUFRZCQkweDEwDQoj ZGVmaW5lIExJTktfTElTVF9SRUFEWQkJMHgwMg0KI2RlZmluZSBESVNfTUNVX0NMUk9PQgkJMHgw MQ0KI2RlZmluZSBGSUZPX0VNUFRZCQkoVFhGSUZPX0VNUFRZIHwgUlhGSUZPX0VNUFRZKQ0KDQov KiBQTEFfTUlTQ18xICovDQojZGVmaW5lIFJYRFlfR0FURURfRU4JCTB4MDAwOA0KDQovKiBQTEFf U0ZGX1NUU183ICovDQojZGVmaW5lIFJFX0lOSVRfTEwJCTB4ODAwMA0KI2RlZmluZSBNQ1VfQk9S V19FTgkJMHg0MDAwDQoNCi8qIFBMQV9DUENSICovDQojZGVmaW5lIENQQ1JfUlhfVkxBTgkJMHgw MDQwDQoNCi8qIFBMQV9DRkdfV09MICovDQojZGVmaW5lIE1BR0lDX0VOCQkweDAwMDENCg0KLyog UExBX1RFUkVET19DRkcgKi8NCiNkZWZpbmUgVEVSRURPX1NFTAkJMHg4MDAwDQojZGVmaW5lIFRF UkVET19XQUtFX01BU0sJMHg3ZjAwDQojZGVmaW5lIFRFUkVET19SU19FVkVOVF9NQVNLCTB4MDBm ZQ0KI2RlZmluZSBPT0JfVEVSRURPX0VOCQkweDAwMDENCg0KLyogUEFMX0JEQ19DUiAqLw0KI2Rl ZmluZSBBTERQU19QUk9YWV9NT0RFCTB4MDAwMQ0KDQovKiBQTEFfQ09ORklHMzQgKi8NCiNkZWZp bmUgTElOS19PTl9XQUtFX0VOCQkweDAwMTANCiNkZWZpbmUgTElOS19PRkZfV0FLRV9FTgkweDAw MDgNCg0KLyogUExBX0NPTkZJRzUgKi8NCiNkZWZpbmUgQldGX0VOCQkJMHgwMDQwDQojZGVmaW5l IE1XRl9FTgkJCTB4MDAyMA0KI2RlZmluZSBVV0ZfRU4JCQkweDAwMTANCiNkZWZpbmUgTEFOX1dB S0VfRU4JCTB4MDAwMg0KDQovKiBQTEFfTEVEX0ZFQVRVUkUgKi8NCiNkZWZpbmUgTEVEX01PREVf TUFTSwkJMHgwNzAwDQoNCi8qIFBMQV9QSFlfUFdSICovDQojZGVmaW5lIFRYXzEwTV9JRExFX0VO CQkweDAwODANCiNkZWZpbmUgUEZNX1BXTV9TV0lUQ0gJCTB4MDA0MA0KDQovKiBQTEFfTUFDX1BX Ul9DVFJMICovDQojZGVmaW5lIEQzX0NMS19HQVRFRF9FTgkJMHgwMDAwNDAwMA0KI2RlZmluZSBN Q1VfQ0xLX1JBVElPCQkweDA3MDEwZjA3DQojZGVmaW5lIE1DVV9DTEtfUkFUSU9fTUFTSwkweDBm MGYwZjBmDQojZGVmaW5lIEFMRFBTX1NQRFdOX1JBVElPCTB4MGY4Nw0KDQovKiBQTEFfTUFDX1BX Ul9DVFJMMiAqLw0KI2RlZmluZSBFRUVfU1BEV05fUkFUSU8JCTB4ODAwNw0KDQovKiBQTEFfTUFD X1BXUl9DVFJMMyAqLw0KI2RlZmluZSBQS1RfQVZBSUxfU1BEV05fRU4JMHgwMTAwDQojZGVmaW5l IFNVU1BFTkRfU1BEV05fRU4JMHgwMDA0DQojZGVmaW5lIFUxVTJfU1BEV05fRU4JCTB4MDAwMg0K I2RlZmluZSBMMV9TUERXTl9FTgkJMHgwMDAxDQoNCi8qIFBMQV9NQUNfUFdSX0NUUkw0ICovDQoj ZGVmaW5lIFBXUlNBVkVfU1BEV05fRU4JMHgxMDAwDQojZGVmaW5lIFJYRFZfU1BEV05fRU4JCTB4 MDgwMA0KI2RlZmluZSBUWDEwTUlETEVfRU4JCTB4MDEwMA0KI2RlZmluZSBUUDEwMF9TUERXTl9F TgkJMHgwMDIwDQojZGVmaW5lIFRQNTAwX1NQRFdOX0VOCQkweDAwMTANCiNkZWZpbmUgVFAxMDAw X1NQRFdOX0VOCQkweDAwMDgNCiNkZWZpbmUgRUVFX1NQRFdOX0VOCQkweDAwMDENCg0KLyogUExB X0dQSFlfSU5UUl9JTVIgKi8NCiNkZWZpbmUgR1BIWV9TVFNfTVNLCQkweDAwMDENCiNkZWZpbmUg U1BFRURfRE9XTl9NU0sJCTB4MDAwMg0KI2RlZmluZSBTUERXTl9SWERWX01TSwkJMHgwMDA0DQoj ZGVmaW5lIFNQRFdOX0xJTktDSEdfTVNLCTB4MDAwOA0KDQovKiBQTEFfUEhZQVIgKi8NCiNkZWZp bmUgUEhZQVJfRkxBRwkJMHg4MDAwMDAwMA0KDQovKiBQTEFfRUVFX0NSICovDQojZGVmaW5lIEVF RV9SWF9FTgkJMHgwMDAxDQojZGVmaW5lIEVFRV9UWF9FTgkJMHgwMDAyDQoNCi8qIFBMQV9CT09U X0NUUkwgKi8NCiNkZWZpbmUgQVVUT0xPQURfRE9ORQkJMHgwMDAyDQoNCi8qIFVTQl9VU0IyUEhZ ICovDQojZGVmaW5lIFVTQjJQSFlfU1VTUEVORAkJMHgwMDAxDQojZGVmaW5lIFVTQjJQSFlfTDEJ CTB4MDAwMg0KDQovKiBVU0JfU1NQSFlMSU5LMiAqLw0KI2RlZmluZSBwd2RfZG5fc2NhbGVfbWFz awkweDNmZmUNCiNkZWZpbmUgcHdkX2RuX3NjYWxlKHgpCQkoKHgpIDw8IDEpDQoNCi8qIFVTQl9D U1JfRFVNTVkxICovDQojZGVmaW5lIERZTkFNSUNfQlVSU1QJCTB4MDAwMQ0KDQovKiBVU0JfQ1NS X0RVTU1ZMiAqLw0KI2RlZmluZSBFUDRfRlVMTF9GQwkJMHgwMDAxDQoNCi8qIFVTQl9ERVZfU1RB VCAqLw0KI2RlZmluZSBTVEFUX1NQRUVEX01BU0sJCTB4MDAwNg0KI2RlZmluZSBTVEFUX1NQRUVE X0hJR0gJCTB4MDAwMA0KI2RlZmluZSBTVEFUX1NQRUVEX0ZVTEwJCTB4MDAwMg0KDQovKiBVU0Jf VFhfQUdHICovDQojZGVmaW5lIFRYX0FHR19NQVhfVEhSRVNIT0xECTB4MDMNCg0KLyogVVNCX1JY X0JVRl9USCAqLw0KI2RlZmluZSBSWF9USFJfU1VQUEVSCQkweDBjMzUwMTgwDQojZGVmaW5lIFJY X1RIUl9ISUdICQkweDdhMTIwMTgwDQojZGVmaW5lIFJYX1RIUl9TTE9XCQkweGZmZmYwMTgwDQoN Ci8qIFVTQl9UWF9ETUEgKi8NCiNkZWZpbmUgVEVTVF9NT0RFX0RJU0FCTEUJMHgwMDAwMDAwMQ0K I2RlZmluZSBUWF9TSVpFX0FESlVTVDEJCTB4MDAwMDAxMDANCg0KLyogVVNCX1VQU19DVFJMICov DQojZGVmaW5lIFBPV0VSX0NVVAkJMHgwMTAwDQoNCi8qIFVTQl9QTV9DVFJMX1NUQVRVUyAqLw0K I2RlZmluZSBSRVNVTUVfSU5ESUNBVEUJCTB4MDAwMQ0KDQovKiBVU0JfVVNCX0NUUkwgKi8NCiNk ZWZpbmUgUlhfQUdHX0RJU0FCTEUJCTB4MDAxMA0KI2RlZmluZSBSWF9aRVJPX0VOCQkweDAwODAN Cg0KLyogVVNCX1UyUDNfQ1RSTCAqLw0KI2RlZmluZSBVMlAzX0VOQUJMRQkJMHgwMDAxDQoNCi8q IFVTQl9QT1dFUl9DVVQgKi8NCiNkZWZpbmUgUFdSX0VOCQkJMHgwMDAxDQojZGVmaW5lIFBIQVNF Ml9FTgkJMHgwMDA4DQoNCi8qIFVTQl9NSVNDXzAgKi8NCiNkZWZpbmUgUENVVF9TVEFUVVMJCTB4 MDAwMQ0KDQovKiBVU0JfUlhfRUFSTFlfVElNRU9VVCAqLw0KI2RlZmluZSBDT0FMRVNDRV9TVVBF UgkJIDg1MDAwVQ0KI2RlZmluZSBDT0FMRVNDRV9ISUdICQkyNTAwMDBVDQojZGVmaW5lIENPQUxF U0NFX1NMT1cJCTUyNDI4MFUNCg0KLyogVVNCX1dEVDExX0NUUkwgKi8NCiNkZWZpbmUgVElNRVIx MV9FTgkJMHgwMDAxDQoNCi8qIFVTQl9MUE1fQ1RSTCAqLw0KLyogYml0IDQgfiA1OiBmaWZvIGVt cHR5IGJvdW5kYXJ5ICovDQojZGVmaW5lIEZJRk9fRU1QVFlfMUZCCQkweDMwCS8qIDB4MWZiICog NjQgPSAzMjQ0OCBieXRlcyAqLw0KLyogYml0IDIgfiAzOiBMTVAgdGltZXIgKi8NCiNkZWZpbmUg TFBNX1RJTUVSX01BU0sJCTB4MGMNCiNkZWZpbmUgTFBNX1RJTUVSXzUwME1TCQkweDA0CS8qIDUw MCBtcyAqLw0KI2RlZmluZSBMUE1fVElNRVJfNTAwVVMJCTB4MGMJLyogNTAwIHVzICovDQojZGVm aW5lIFJPS19FWElUX0xQTQkJMHgwMg0KDQovKiBVU0JfQUZFX0NUUkwyICovDQojZGVmaW5lIFNF Tl9WQUxfTUFTSwkJMHhmODAwDQojZGVmaW5lIFNFTl9WQUxfTk9STUFMCQkweGEwMDANCiNkZWZp bmUgU0VMX1JYSURMRQkJMHgwMTAwDQoNCi8qIE9DUF9BTERQU19DT05GSUcgKi8NCiNkZWZpbmUg RU5QV1JTQVZFCQkweDgwMDANCiNkZWZpbmUgRU5QRE5QUwkJCTB4MDIwMA0KI2RlZmluZSBMSU5L RU5BCQkJMHgwMTAwDQojZGVmaW5lIERJU19TRFNBVkUJCTB4MDAxMA0KDQovKiBPQ1BfUEhZX1NU QVRVUyAqLw0KI2RlZmluZSBQSFlfU1RBVF9NQVNLCQkweDAwMDcNCiNkZWZpbmUgUEhZX1NUQVRf TEFOX09OCQkzDQojZGVmaW5lIFBIWV9TVEFUX1BXUkROCQk1DQoNCi8qIE9DUF9QT1dFUl9DRkcg Ki8NCiNkZWZpbmUgRUVFX0NMS0RJVl9FTgkJMHg4MDAwDQojZGVmaW5lIEVOX0FMRFBTCQkweDAw MDQNCiNkZWZpbmUgRU5fMTBNX1BMTE9GRgkJMHgwMDAxDQoNCi8qIE9DUF9FRUVfQ09ORklHMSAq Lw0KI2RlZmluZSBSR19UWExQSV9NU0tfSEZEVVAJMHg4MDAwDQojZGVmaW5lIFJHX01BVENMUl9F TgkJMHg0MDAwDQojZGVmaW5lIEVFRV8xMF9DQVAJCTB4MjAwMA0KI2RlZmluZSBFRUVfTldBWV9F TgkJMHgxMDAwDQojZGVmaW5lIFRYX1FVSUVUX0VOCQkweDAyMDANCiNkZWZpbmUgUlhfUVVJRVRf RU4JCTB4MDEwMA0KI2RlZmluZSBzZF9yaXNlX3RpbWVfbWFzawkweDAwNzANCiNkZWZpbmUgc2Rf cmlzZV90aW1lKHgpCQkobWluKHgsIDcpIDw8IDQpCS8qIGJpdCA0IH4gNiAqLw0KI2RlZmluZSBS R19SWExQSV9NU0tfSEZEVVAJMHgwMDA4DQojZGVmaW5lIFNERkFMTFRJTUUJCTB4MDAwNwkvKiBi aXQgMCB+IDIgKi8NCg0KLyogT0NQX0VFRV9DT05GSUcyICovDQojZGVmaW5lIFJHX0xQSUhZU19O VU0JCTB4NzAwMAkvKiBiaXQgMTIgfiAxNSAqLw0KI2RlZmluZSBSR19EQUNRVUlFVF9FTgkJMHgw NDAwDQojZGVmaW5lIFJHX0xEVlFVSUVUX0VOCQkweDAyMDANCiNkZWZpbmUgUkdfQ0tSU0VMCQkw eDAwMjANCiNkZWZpbmUgUkdfRUVFUFJHX0VOCQkweDAwMTANCg0KLyogT0NQX0VFRV9DT05GSUcz ICovDQojZGVmaW5lIGZhc3Rfc25yX21hc2sJCTB4ZmY4MA0KI2RlZmluZSBmYXN0X3Nucih4KQkJ KG1pbih4LCAweDFmZikgPDwgNykJLyogYml0IDcgfiAxNSAqLw0KI2RlZmluZSBSR19MRlNfU0VM CQkweDAwNjAJLyogYml0IDYgfiA1ICovDQojZGVmaW5lIE1TS19QSAkJCTB4MDAwNgkvKiBiaXQg MCB+IDMgKi8NCg0KLyogT0NQX0VFRV9BUiAqLw0KLyogYml0WzE1OjE0XSBmdW5jdGlvbiAqLw0K I2RlZmluZSBGVU5fQUREUgkJMHgwMDAwDQojZGVmaW5lIEZVTl9EQVRBCQkweDQwMDANCi8qIGJp dFs0OjBdIGRldmljZSBhZGRyICovDQoNCi8qIE9DUF9FRUVfQ0ZHICovDQojZGVmaW5lIENUQVBf U0hPUlRfRU4JCTB4MDA0MA0KI2RlZmluZSBFRUUxMF9FTgkJMHgwMDEwDQoNCi8qIE9DUF9ET1dO X1NQRUVEICovDQojZGVmaW5lIEVOXzEwTV9CR09GRgkJMHgwMDgwDQoNCi8qIE9DUF9QSFlfU1RB VEUgKi8NCiNkZWZpbmUgVFhESVNfU1RBVEUJCTB4MDENCiNkZWZpbmUgQUJEX1NUQVRFCQkweDAy DQoNCi8qIE9DUF9BRENfQ0ZHICovDQojZGVmaW5lIENLQURTRUxfTAkJMHgwMTAwDQojZGVmaW5l IEFEQ19FTgkJCTB4MDA4MA0KI2RlZmluZSBFTl9FTUlfTAkJMHgwMDQwDQoNCi8qIFNSQU1fTFBG X0NGRyAqLw0KI2RlZmluZSBMUEZfQVVUT19UVU5FCQkweDgwMDANCg0KLyogU1JBTV8xME1fQU1Q MSAqLw0KI2RlZmluZSBHREFDX0lCX1VQQUxMCQkweDAwMDgNCg0KLyogU1JBTV8xME1fQU1QMiAq Lw0KI2RlZmluZSBBTVBfRE4JCQkweDAyMDANCg0KLyogU1JBTV9JTVBFREFOQ0UgKi8NCiNkZWZp bmUgUlhfRFJJVklOR19NQVNLCQkweDYwMDANCg0KZW51bSBydGxfcmVnaXN0ZXJfY29udGVudCB7 DQoJXzEwMDBicHMJPSAweDEwLA0KCV8xMDBicHMJCT0gMHgwOCwNCglfMTBicHMJCT0gMHgwNCwN CglMSU5LX1NUQVRVUwk9IDB4MDIsDQoJRlVMTF9EVVAJPSAweDAxLA0KfTsNCg0KI2RlZmluZSBS VEw4MTUyX01BWF9UWAkJNA0KI2RlZmluZSBSVEw4MTUyX01BWF9SWAkJMTANCiNkZWZpbmUgSU5U QlVGU0laRQkJMg0KI2RlZmluZSBDUkNfU0laRQkJNA0KI2RlZmluZSBUWF9BTElHTgkJNA0KI2Rl ZmluZSBSWF9BTElHTgkJOA0KDQojZGVmaW5lIElOVFJfTElOSwkJMHgwMDA0DQoNCiNkZWZpbmUg UlRMODE1Ml9SRVFUX1JFQUQJMHhjMA0KI2RlZmluZSBSVEw4MTUyX1JFUVRfV1JJVEUJMHg0MA0K I2RlZmluZSBSVEw4MTUyX1JFUV9HRVRfUkVHUwkweDA1DQojZGVmaW5lIFJUTDgxNTJfUkVRX1NF VF9SRUdTCTB4MDUNCg0KI2RlZmluZSBCWVRFX0VOX0RXT1JECQkweGZmDQojZGVmaW5lIEJZVEVf RU5fV09SRAkJMHgzMw0KI2RlZmluZSBCWVRFX0VOX0JZVEUJCTB4MTENCiNkZWZpbmUgQllURV9F Tl9TSVhfQllURVMJMHgzZg0KI2RlZmluZSBCWVRFX0VOX1NUQVJUX01BU0sJMHgwZg0KI2RlZmlu ZSBCWVRFX0VOX0VORF9NQVNLCTB4ZjANCg0KI2RlZmluZSBSVEw4MTUzX01BWF9QQUNLRVQJOTIx NiAvKiA5SyAqLw0KI2RlZmluZSBSVEw4MTUzX01BWF9NVFUJCShSVEw4MTUzX01BWF9QQUNLRVQg LSBWTEFOX0VUSF9ITEVOIC0gVkxBTl9ITEVOKQ0KI2RlZmluZSBSVEw4MTUyX1JNUwkJKFZMQU5f RVRIX0ZSQU1FX0xFTiArIFZMQU5fSExFTikNCiNkZWZpbmUgUlRMODE1M19STVMJCVJUTDgxNTNf TUFYX1BBQ0tFVA0KI2RlZmluZSBSVEw4MTUyX1RYX1RJTUVPVVQJKDUgKiBIWikNCiNkZWZpbmUg UlRMODE1Ml9OQVBJX1dFSUdIVAk2NA0KDQovKiBydGw4MTUyIGZsYWdzICovDQplbnVtIHJ0bDgx NTJfZmxhZ3Mgew0KCVJUTDgxNTJfVU5QTFVHID0gMCwNCglSVEw4MTUyX1NFVF9SWF9NT0RFLA0K CVdPUktfRU5BQkxFLA0KCVJUTDgxNTJfTElOS19DSEcsDQoJU0VMRUNUSVZFX1NVU1BFTkQsDQoJ UEhZX1JFU0VULA0KCVNDSEVEVUxFX05BUEksDQp9Ow0KDQovKiBEZWZpbmUgdGhlc2UgdmFsdWVz IHRvIG1hdGNoIHlvdXIgZGV2aWNlICovDQojZGVmaW5lIFZFTkRPUl9JRF9SRUFMVEVLCQkweDBi ZGENCiNkZWZpbmUgVkVORE9SX0lEX1NBTVNVTkcJCTB4MDRlOA0KI2RlZmluZSBWRU5ET1JfSURf TEVOT1ZPCQkweDE3ZWYNCiNkZWZpbmUgVkVORE9SX0lEX05WSURJQQkJMHgwOTU1DQoNCiNkZWZp bmUgTUNVX1RZUEVfUExBCQkJMHgwMTAwDQojZGVmaW5lIE1DVV9UWVBFX1VTQgkJCTB4MDAwMA0K DQpzdHJ1Y3QgdGFsbHlfY291bnRlciB7DQoJX19sZTY0CXR4X3BhY2tldHM7DQoJX19sZTY0CXJ4 X3BhY2tldHM7DQoJX19sZTY0CXR4X2Vycm9yczsNCglfX2xlMzIJcnhfZXJyb3JzOw0KCV9fbGUx NglyeF9taXNzZWQ7DQoJX19sZTE2CWFsaWduX2Vycm9yczsNCglfX2xlMzIJdHhfb25lX2NvbGxp c2lvbjsNCglfX2xlMzIJdHhfbXVsdGlfY29sbGlzaW9uOw0KCV9fbGU2NAlyeF91bmljYXN0Ow0K CV9fbGU2NAlyeF9icm9hZGNhc3Q7DQoJX19sZTMyCXJ4X211bHRpY2FzdDsNCglfX2xlMTYJdHhf YWJvcnRlZDsNCglfX2xlMTYJdHhfdW5kZXJydW47DQp9Ow0KDQpzdHJ1Y3QgcnhfZGVzYyB7DQoJ X19sZTMyIG9wdHMxOw0KI2RlZmluZSBSWF9MRU5fTUFTSwkJCTB4N2ZmZg0KDQoJX19sZTMyIG9w dHMyOw0KI2RlZmluZSBSRF9VRFBfQ1MJCQlCSVQoMjMpDQojZGVmaW5lIFJEX1RDUF9DUwkJCUJJ VCgyMikNCiNkZWZpbmUgUkRfSVBWNl9DUwkJCUJJVCgyMCkNCiNkZWZpbmUgUkRfSVBWNF9DUwkJ CUJJVCgxOSkNCg0KCV9fbGUzMiBvcHRzMzsNCiNkZWZpbmUgSVBGCQkJCUJJVCgyMykgLyogSVAg Y2hlY2tzdW0gZmFpbCAqLw0KI2RlZmluZSBVRFBGCQkJCUJJVCgyMikgLyogVURQIGNoZWNrc3Vt IGZhaWwgKi8NCiNkZWZpbmUgVENQRgkJCQlCSVQoMjEpIC8qIFRDUCBjaGVja3N1bSBmYWlsICov DQojZGVmaW5lIFJYX1ZMQU5fVEFHCQkJQklUKDE2KQ0KDQoJX19sZTMyIG9wdHM0Ow0KCV9fbGUz MiBvcHRzNTsNCglfX2xlMzIgb3B0czY7DQp9Ow0KDQpzdHJ1Y3QgdHhfZGVzYyB7DQoJX19sZTMy IG9wdHMxOw0KI2RlZmluZSBUWF9GUwkJCUJJVCgzMSkgLyogRmlyc3Qgc2VnbWVudCBvZiBhIHBh Y2tldCAqLw0KI2RlZmluZSBUWF9MUwkJCUJJVCgzMCkgLyogRmluYWwgc2VnbWVudCBvZiBhIHBh Y2tldCAqLw0KI2RlZmluZSBHVFNFTkRWNAkJQklUKDI4KQ0KI2RlZmluZSBHVFNFTkRWNgkJQklU KDI3KQ0KI2RlZmluZSBHVFRDUEhPX1NISUZUCQkxOA0KI2RlZmluZSBHVFRDUEhPX01BWAkJMHg3 ZlUNCiNkZWZpbmUgVFhfTEVOX01BWAkJMHgzZmZmZlUNCg0KCV9fbGUzMiBvcHRzMjsNCiNkZWZp bmUgVURQX0NTCQkJQklUKDMxKSAvKiBDYWxjdWxhdGUgVURQL0lQIGNoZWNrc3VtICovDQojZGVm aW5lIFRDUF9DUwkJCUJJVCgzMCkgLyogQ2FsY3VsYXRlIFRDUC9JUCBjaGVja3N1bSAqLw0KI2Rl ZmluZSBJUFY0X0NTCQkJQklUKDI5KSAvKiBDYWxjdWxhdGUgSVB2NCBjaGVja3N1bSAqLw0KI2Rl ZmluZSBJUFY2X0NTCQkJQklUKDI4KSAvKiBDYWxjdWxhdGUgSVB2NiBjaGVja3N1bSAqLw0KI2Rl ZmluZSBNU1NfU0hJRlQJCTE3DQojZGVmaW5lIE1TU19NQVgJCQkweDdmZlUNCiNkZWZpbmUgVENQ SE9fU0hJRlQJCTE3DQojZGVmaW5lIFRDUEhPX01BWAkJMHg3ZmZVDQojZGVmaW5lIFRYX1ZMQU5f VEFHCQlCSVQoMTYpDQp9Ow0KDQpzdHJ1Y3QgcjgxNTI7DQoNCnN0cnVjdCByeF9hZ2cgew0KCXN0 cnVjdCBsaXN0X2hlYWQgbGlzdDsNCglzdHJ1Y3QgdXJiICp1cmI7DQoJc3RydWN0IHI4MTUyICpj b250ZXh0Ow0KCWRtYV9hZGRyX3QgdHJhbnNmZXJfZG1hOw0KCXZvaWQgKmJ1ZmZlcjsNCgl2b2lk ICpoZWFkOw0KfTsNCg0Kc3RydWN0IHR4X2FnZyB7DQoJc3RydWN0IGxpc3RfaGVhZCBsaXN0Ow0K CXN0cnVjdCB1cmIgKnVyYjsNCglzdHJ1Y3QgcjgxNTIgKmNvbnRleHQ7DQoJdm9pZCAqYnVmZmVy Ow0KCXZvaWQgKmhlYWQ7DQoJdTMyIHNrYl9udW07DQoJdTMyIHNrYl9sZW47DQp9Ow0KDQpzdHJ1 Y3QgcjgxNTIgew0KCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQoJc3RydWN0IHVzYl9kZXZpY2UgKnVk ZXY7DQoJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7DQoJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlu dGY7DQoJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsNCglzdHJ1Y3QgdXJiICppbnRyX3VyYjsN CglzdHJ1Y3QgdHhfYWdnIHR4X2luZm9bUlRMODE1Ml9NQVhfVFhdOw0KCXN0cnVjdCByeF9hZ2cg cnhfaW5mb1tSVEw4MTUyX01BWF9SWF07DQoJc3RydWN0IGxpc3RfaGVhZCByeF9kb25lLCB0eF9m cmVlOw0KCXN0cnVjdCBza19idWZmX2hlYWQgdHhfcXVldWUsIHJ4X3F1ZXVlOw0KCXNwaW5sb2Nr X3QgcnhfbG9jaywgdHhfbG9jazsNCglzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkdWxlOw0KCXN0 cnVjdCBtaWlfaWZfaW5mbyBtaWk7DQoJc3RydWN0IG11dGV4IGNvbnRyb2w7CS8qIHVzZSBmb3Ig aHcgc2V0dGluZyAqLw0KDQoJc3RydWN0IHJ0bF9vcHMgew0KCQl2b2lkICgqaW5pdCkoc3RydWN0 IHI4MTUyICopOw0KCQlpbnQgKCplbmFibGUpKHN0cnVjdCByODE1MiAqKTsNCgkJdm9pZCAoKmRp c2FibGUpKHN0cnVjdCByODE1MiAqKTsNCgkJdm9pZCAoKnVwKShzdHJ1Y3QgcjgxNTIgKik7DQoJ CXZvaWQgKCpkb3duKShzdHJ1Y3QgcjgxNTIgKik7DQoJCXZvaWQgKCp1bmxvYWQpKHN0cnVjdCBy ODE1MiAqKTsNCgkJaW50ICgqZWVlX2dldCkoc3RydWN0IHI4MTUyICosIHN0cnVjdCBldGh0b29s X2VlZSAqKTsNCgkJaW50ICgqZWVlX3NldCkoc3RydWN0IHI4MTUyICosIHN0cnVjdCBldGh0b29s X2VlZSAqKTsNCgkJYm9vbCAoKmluX253YXkpKHN0cnVjdCByODE1MiAqKTsNCgl9IHJ0bF9vcHM7 DQoNCglpbnQgaW50cl9pbnRlcnZhbDsNCgl1MzIgc2F2ZWRfd29sb3B0czsNCgl1MzIgbXNnX2Vu YWJsZTsNCgl1MzIgdHhfcWxlbjsNCgl1MzIgY29hbGVzY2U7DQoJdTE2IG9jcF9iYXNlOw0KCXU4 ICppbnRyX2J1ZmY7DQoJdTggdmVyc2lvbjsNCn07DQoNCmVudW0gcnRsX3ZlcnNpb24gew0KCVJU TF9WRVJfVU5LTk9XTiA9IDAsDQoJUlRMX1ZFUl8wMSwNCglSVExfVkVSXzAyLA0KCVJUTF9WRVJf MDMsDQoJUlRMX1ZFUl8wNCwNCglSVExfVkVSXzA1LA0KCVJUTF9WRVJfMDYsDQoJUlRMX1ZFUl9N QVgNCn07DQoNCmVudW0gdHhfY3N1bV9zdGF0IHsNCglUWF9DU1VNX1NVQ0NFU1MgPSAwLA0KCVRY X0NTVU1fVFNPLA0KCVRYX0NTVU1fTk9ORQ0KfTsNCg0KLyogTWF4aW11bSBudW1iZXIgb2YgbXVs dGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiBSeC1hbGwtbXVsdGljYXN0KS4NCiAqIFRo ZSBSVEwgY2hpcHMgdXNlIGEgNjQgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhl cm5ldCBDUkMuDQogKi8NCnN0YXRpYyBjb25zdCBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9 IDMyOw0Kc3RhdGljIHVuc2lnbmVkIGludCBhZ2dfYnVmX3N6ID0gMTYzODQ7DQoNCiNkZWZpbmUg UlRMX0xJTUlURURfVFNPX1NJWkUJKGFnZ19idWZfc3ogLSBzaXplb2Yoc3RydWN0IHR4X2Rlc2Mp IC0gXA0KCQkJCSBWTEFOX0VUSF9ITEVOIC0gVkxBTl9ITEVOKQ0KDQpzdGF0aWMNCmludCBnZXRf cmVnaXN0ZXJzKHN0cnVjdCByODE1MiAqdHAsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LCB1MTYgc2l6 ZSwgdm9pZCAqZGF0YSkNCnsNCglpbnQgcmV0Ow0KCXZvaWQgKnRtcDsNCg0KCXRtcCA9IGttYWxs b2Moc2l6ZSwgR0ZQX0tFUk5FTCk7DQoJaWYgKCF0bXApDQoJCXJldHVybiAtRU5PTUVNOw0KDQoJ cmV0ID0gdXNiX2NvbnRyb2xfbXNnKHRwLT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUodHAtPnVkZXYs IDApLA0KCQkJICAgICAgUlRMODE1Ml9SRVFfR0VUX1JFR1MsIFJUTDgxNTJfUkVRVF9SRUFELA0K CQkJICAgICAgdmFsdWUsIGluZGV4LCB0bXAsIHNpemUsIDUwMCk7DQoNCgltZW1jcHkoZGF0YSwg dG1wLCBzaXplKTsNCglrZnJlZSh0bXApOw0KDQoJcmV0dXJuIHJldDsNCn0NCg0Kc3RhdGljDQpp bnQgc2V0X3JlZ2lzdGVycyhzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwg dTE2IHNpemUsIHZvaWQgKmRhdGEpDQp7DQoJaW50IHJldDsNCgl2b2lkICp0bXA7DQoNCgl0bXAg PSBrbWVtZHVwKGRhdGEsIHNpemUsIEdGUF9LRVJORUwpOw0KCWlmICghdG1wKQ0KCQlyZXR1cm4g LUVOT01FTTsNCg0KCXJldCA9IHVzYl9jb250cm9sX21zZyh0cC0+dWRldiwgdXNiX3NuZGN0cmxw aXBlKHRwLT51ZGV2LCAwKSwNCgkJCSAgICAgIFJUTDgxNTJfUkVRX1NFVF9SRUdTLCBSVEw4MTUy X1JFUVRfV1JJVEUsDQoJCQkgICAgICB2YWx1ZSwgaW5kZXgsIHRtcCwgc2l6ZSwgNTAwKTsNCg0K CWtmcmVlKHRtcCk7DQoNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgaW50IGdlbmVyaWNfb2Nw X3JlYWQoc3RydWN0IHI4MTUyICp0cCwgdTE2IGluZGV4LCB1MTYgc2l6ZSwNCgkJCSAgICB2b2lk ICpkYXRhLCB1MTYgdHlwZSkNCnsNCgl1MTYgbGltaXQgPSA2NDsNCglpbnQgcmV0ID0gMDsNCg0K CWlmICh0ZXN0X2JpdChSVEw4MTUyX1VOUExVRywgJnRwLT5mbGFncykpDQoJCXJldHVybiAtRU5P REVWOw0KDQoJLyogYm90aCBzaXplIGFuZCBpbmRpeCBtdXN0IGJlIDQgYnl0ZXMgYWxpZ24gKi8N CglpZiAoKHNpemUgJiAzKSB8fCAhc2l6ZSB8fCAoaW5kZXggJiAzKSB8fCAhZGF0YSkNCgkJcmV0 dXJuIC1FUEVSTTsNCg0KCWlmICgodTMyKWluZGV4ICsgKHUzMilzaXplID4gMHhmZmZmKQ0KCQly ZXR1cm4gLUVQRVJNOw0KDQoJd2hpbGUgKHNpemUpIHsNCgkJaWYgKHNpemUgPiBsaW1pdCkgew0K CQkJcmV0ID0gZ2V0X3JlZ2lzdGVycyh0cCwgaW5kZXgsIHR5cGUsIGxpbWl0LCBkYXRhKTsNCgkJ CWlmIChyZXQgPCAwKQ0KCQkJCWJyZWFrOw0KDQoJCQlpbmRleCArPSBsaW1pdDsNCgkJCWRhdGEg Kz0gbGltaXQ7DQoJCQlzaXplIC09IGxpbWl0Ow0KCQl9IGVsc2Ugew0KCQkJcmV0ID0gZ2V0X3Jl Z2lzdGVycyh0cCwgaW5kZXgsIHR5cGUsIHNpemUsIGRhdGEpOw0KCQkJaWYgKHJldCA8IDApDQoJ CQkJYnJlYWs7DQoNCgkJCWluZGV4ICs9IHNpemU7DQoJCQlkYXRhICs9IHNpemU7DQoJCQlzaXpl ID0gMDsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0KDQoJaWYgKHJldCA9PSAtRU5PREVWKQ0KCQlzZXRf Yml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdzKTsNCg0KCXJldHVybiByZXQ7DQp9DQoNCnN0 YXRpYyBpbnQgZ2VuZXJpY19vY3Bfd3JpdGUoc3RydWN0IHI4MTUyICp0cCwgdTE2IGluZGV4LCB1 MTYgYnl0ZWVuLA0KCQkJICAgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSwgdTE2IHR5cGUpDQp7DQoJ aW50IHJldDsNCgl1MTYgYnl0ZWVuX3N0YXJ0LCBieXRlZW5fZW5kLCBieWVuOw0KCXUxNiBsaW1p dCA9IDUxMjsNCg0KCWlmICh0ZXN0X2JpdChSVEw4MTUyX1VOUExVRywgJnRwLT5mbGFncykpDQoJ CXJldHVybiAtRU5PREVWOw0KDQoJLyogYm90aCBzaXplIGFuZCBpbmRpeCBtdXN0IGJlIDQgYnl0 ZXMgYWxpZ24gKi8NCglpZiAoKHNpemUgJiAzKSB8fCAhc2l6ZSB8fCAoaW5kZXggJiAzKSB8fCAh ZGF0YSkNCgkJcmV0dXJuIC1FUEVSTTsNCg0KCWlmICgodTMyKWluZGV4ICsgKHUzMilzaXplID4g MHhmZmZmKQ0KCQlyZXR1cm4gLUVQRVJNOw0KDQoJYnl0ZWVuX3N0YXJ0ID0gYnl0ZWVuICYgQllU RV9FTl9TVEFSVF9NQVNLOw0KCWJ5dGVlbl9lbmQgPSBieXRlZW4gJiBCWVRFX0VOX0VORF9NQVNL Ow0KDQoJYnllbiA9IGJ5dGVlbl9zdGFydCB8IChieXRlZW5fc3RhcnQgPDwgNCk7DQoJcmV0ID0g c2V0X3JlZ2lzdGVycyh0cCwgaW5kZXgsIHR5cGUgfCBieWVuLCA0LCBkYXRhKTsNCglpZiAocmV0 IDwgMCkNCgkJZ290byBlcnJvcjE7DQoNCglpbmRleCArPSA0Ow0KCWRhdGEgKz0gNDsNCglzaXpl IC09IDQ7DQoNCglpZiAoc2l6ZSkgew0KCQlzaXplIC09IDQ7DQoNCgkJd2hpbGUgKHNpemUpIHsN CgkJCWlmIChzaXplID4gbGltaXQpIHsNCgkJCQlyZXQgPSBzZXRfcmVnaXN0ZXJzKHRwLCBpbmRl eCwNCgkJCQkJCSAgICB0eXBlIHwgQllURV9FTl9EV09SRCwNCgkJCQkJCSAgICBsaW1pdCwgZGF0 YSk7DQoJCQkJaWYgKHJldCA8IDApDQoJCQkJCWdvdG8gZXJyb3IxOw0KDQoJCQkJaW5kZXggKz0g bGltaXQ7DQoJCQkJZGF0YSArPSBsaW1pdDsNCgkJCQlzaXplIC09IGxpbWl0Ow0KCQkJfSBlbHNl IHsNCgkJCQlyZXQgPSBzZXRfcmVnaXN0ZXJzKHRwLCBpbmRleCwNCgkJCQkJCSAgICB0eXBlIHwg QllURV9FTl9EV09SRCwNCgkJCQkJCSAgICBzaXplLCBkYXRhKTsNCgkJCQlpZiAocmV0IDwgMCkN CgkJCQkJZ290byBlcnJvcjE7DQoNCgkJCQlpbmRleCArPSBzaXplOw0KCQkJCWRhdGEgKz0gc2l6 ZTsNCgkJCQlzaXplID0gMDsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KDQoJCWJ5ZW4gPSBieXRl ZW5fZW5kIHwgKGJ5dGVlbl9lbmQgPj4gNCk7DQoJCXJldCA9IHNldF9yZWdpc3RlcnModHAsIGlu ZGV4LCB0eXBlIHwgYnllbiwgNCwgZGF0YSk7DQoJCWlmIChyZXQgPCAwKQ0KCQkJZ290byBlcnJv cjE7DQoJfQ0KDQplcnJvcjE6DQoJaWYgKHJldCA9PSAtRU5PREVWKQ0KCQlzZXRfYml0KFJUTDgx NTJfVU5QTFVHLCAmdHAtPmZsYWdzKTsNCg0KCXJldHVybiByZXQ7DQp9DQoNCnN0YXRpYyBpbmxp bmUNCmludCBwbGFfb2NwX3JlYWQoc3RydWN0IHI4MTUyICp0cCwgdTE2IGluZGV4LCB1MTYgc2l6 ZSwgdm9pZCAqZGF0YSkNCnsNCglyZXR1cm4gZ2VuZXJpY19vY3BfcmVhZCh0cCwgaW5kZXgsIHNp emUsIGRhdGEsIE1DVV9UWVBFX1BMQSk7DQp9DQoNCnN0YXRpYyBpbmxpbmUNCmludCBwbGFfb2Nw X3dyaXRlKHN0cnVjdCByODE1MiAqdHAsIHUxNiBpbmRleCwgdTE2IGJ5dGVlbiwgdTE2IHNpemUs IHZvaWQgKmRhdGEpDQp7DQoJcmV0dXJuIGdlbmVyaWNfb2NwX3dyaXRlKHRwLCBpbmRleCwgYnl0 ZWVuLCBzaXplLCBkYXRhLCBNQ1VfVFlQRV9QTEEpOw0KfQ0KDQpzdGF0aWMgaW5saW5lDQppbnQg dXNiX29jcF9yZWFkKHN0cnVjdCByODE1MiAqdHAsIHUxNiBpbmRleCwgdTE2IHNpemUsIHZvaWQg KmRhdGEpDQp7DQoJcmV0dXJuIGdlbmVyaWNfb2NwX3JlYWQodHAsIGluZGV4LCBzaXplLCBkYXRh LCBNQ1VfVFlQRV9VU0IpOw0KfQ0KDQpzdGF0aWMgaW5saW5lDQppbnQgdXNiX29jcF93cml0ZShz dHJ1Y3QgcjgxNTIgKnRwLCB1MTYgaW5kZXgsIHUxNiBieXRlZW4sIHUxNiBzaXplLCB2b2lkICpk YXRhKQ0Kew0KCXJldHVybiBnZW5lcmljX29jcF93cml0ZSh0cCwgaW5kZXgsIGJ5dGVlbiwgc2l6 ZSwgZGF0YSwgTUNVX1RZUEVfVVNCKTsNCn0NCg0Kc3RhdGljIHUzMiBvY3BfcmVhZF9kd29yZChz dHJ1Y3QgcjgxNTIgKnRwLCB1MTYgdHlwZSwgdTE2IGluZGV4KQ0Kew0KCV9fbGUzMiBkYXRhOw0K DQoJZ2VuZXJpY19vY3BfcmVhZCh0cCwgaW5kZXgsIHNpemVvZihkYXRhKSwgJmRhdGEsIHR5cGUp Ow0KDQoJcmV0dXJuIF9fbGUzMl90b19jcHUoZGF0YSk7DQp9DQoNCnN0YXRpYyB2b2lkIG9jcF93 cml0ZV9kd29yZChzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgdHlwZSwgdTE2IGluZGV4LCB1MzIgZGF0 YSkNCnsNCglfX2xlMzIgdG1wID0gX19jcHVfdG9fbGUzMihkYXRhKTsNCg0KCWdlbmVyaWNfb2Nw X3dyaXRlKHRwLCBpbmRleCwgQllURV9FTl9EV09SRCwgc2l6ZW9mKHRtcCksICZ0bXAsIHR5cGUp Ow0KfQ0KDQpzdGF0aWMgdTE2IG9jcF9yZWFkX3dvcmQoc3RydWN0IHI4MTUyICp0cCwgdTE2IHR5 cGUsIHUxNiBpbmRleCkNCnsNCgl1MzIgZGF0YTsNCglfX2xlMzIgdG1wOw0KCXU4IHNoaWZ0ID0g aW5kZXggJiAyOw0KDQoJaW5kZXggJj0gfjM7DQoNCglnZW5lcmljX29jcF9yZWFkKHRwLCBpbmRl eCwgc2l6ZW9mKHRtcCksICZ0bXAsIHR5cGUpOw0KDQoJZGF0YSA9IF9fbGUzMl90b19jcHUodG1w KTsNCglkYXRhID4+PSAoc2hpZnQgKiA4KTsNCglkYXRhICY9IDB4ZmZmZjsNCg0KCXJldHVybiAo dTE2KWRhdGE7DQp9DQoNCnN0YXRpYyB2b2lkIG9jcF93cml0ZV93b3JkKHN0cnVjdCByODE1MiAq dHAsIHUxNiB0eXBlLCB1MTYgaW5kZXgsIHUzMiBkYXRhKQ0Kew0KCXUzMiBtYXNrID0gMHhmZmZm Ow0KCV9fbGUzMiB0bXA7DQoJdTE2IGJ5ZW4gPSBCWVRFX0VOX1dPUkQ7DQoJdTggc2hpZnQgPSBp bmRleCAmIDI7DQoNCglkYXRhICY9IG1hc2s7DQoNCglpZiAoaW5kZXggJiAyKSB7DQoJCWJ5ZW4g PDw9IHNoaWZ0Ow0KCQltYXNrIDw8PSAoc2hpZnQgKiA4KTsNCgkJZGF0YSA8PD0gKHNoaWZ0ICog OCk7DQoJCWluZGV4ICY9IH4zOw0KCX0NCg0KCXRtcCA9IF9fY3B1X3RvX2xlMzIoZGF0YSk7DQoN CglnZW5lcmljX29jcF93cml0ZSh0cCwgaW5kZXgsIGJ5ZW4sIHNpemVvZih0bXApLCAmdG1wLCB0 eXBlKTsNCn0NCg0Kc3RhdGljIHU4IG9jcF9yZWFkX2J5dGUoc3RydWN0IHI4MTUyICp0cCwgdTE2 IHR5cGUsIHUxNiBpbmRleCkNCnsNCgl1MzIgZGF0YTsNCglfX2xlMzIgdG1wOw0KCXU4IHNoaWZ0 ID0gaW5kZXggJiAzOw0KDQoJaW5kZXggJj0gfjM7DQoNCglnZW5lcmljX29jcF9yZWFkKHRwLCBp bmRleCwgc2l6ZW9mKHRtcCksICZ0bXAsIHR5cGUpOw0KDQoJZGF0YSA9IF9fbGUzMl90b19jcHUo dG1wKTsNCglkYXRhID4+PSAoc2hpZnQgKiA4KTsNCglkYXRhICY9IDB4ZmY7DQoNCglyZXR1cm4g KHU4KWRhdGE7DQp9DQoNCnN0YXRpYyB2b2lkIG9jcF93cml0ZV9ieXRlKHN0cnVjdCByODE1MiAq dHAsIHUxNiB0eXBlLCB1MTYgaW5kZXgsIHUzMiBkYXRhKQ0Kew0KCXUzMiBtYXNrID0gMHhmZjsN CglfX2xlMzIgdG1wOw0KCXUxNiBieWVuID0gQllURV9FTl9CWVRFOw0KCXU4IHNoaWZ0ID0gaW5k ZXggJiAzOw0KDQoJZGF0YSAmPSBtYXNrOw0KDQoJaWYgKGluZGV4ICYgMykgew0KCQlieWVuIDw8 PSBzaGlmdDsNCgkJbWFzayA8PD0gKHNoaWZ0ICogOCk7DQoJCWRhdGEgPDw9IChzaGlmdCAqIDgp Ow0KCQlpbmRleCAmPSB+MzsNCgl9DQoNCgl0bXAgPSBfX2NwdV90b19sZTMyKGRhdGEpOw0KDQoJ Z2VuZXJpY19vY3Bfd3JpdGUodHAsIGluZGV4LCBieWVuLCBzaXplb2YodG1wKSwgJnRtcCwgdHlw ZSk7DQp9DQoNCnN0YXRpYyB1MTYgb2NwX3JlZ19yZWFkKHN0cnVjdCByODE1MiAqdHAsIHUxNiBh ZGRyKQ0Kew0KCXUxNiBvY3BfYmFzZSwgb2NwX2luZGV4Ow0KDQoJb2NwX2Jhc2UgPSBhZGRyICYg MHhmMDAwOw0KCWlmIChvY3BfYmFzZSAhPSB0cC0+b2NwX2Jhc2UpIHsNCgkJb2NwX3dyaXRlX3dv cmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX09DUF9HUEhZX0JBU0UsIG9jcF9iYXNlKTsNCgkJdHAt Pm9jcF9iYXNlID0gb2NwX2Jhc2U7DQoJfQ0KDQoJb2NwX2luZGV4ID0gKGFkZHIgJiAweDBmZmYp IHwgMHhiMDAwOw0KCXJldHVybiBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIG9jcF9p bmRleCk7DQp9DQoNCnN0YXRpYyB2b2lkIG9jcF9yZWdfd3JpdGUoc3RydWN0IHI4MTUyICp0cCwg dTE2IGFkZHIsIHUxNiBkYXRhKQ0Kew0KCXUxNiBvY3BfYmFzZSwgb2NwX2luZGV4Ow0KDQoJb2Nw X2Jhc2UgPSBhZGRyICYgMHhmMDAwOw0KCWlmIChvY3BfYmFzZSAhPSB0cC0+b2NwX2Jhc2UpIHsN CgkJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX09DUF9HUEhZX0JBU0UsIG9j cF9iYXNlKTsNCgkJdHAtPm9jcF9iYXNlID0gb2NwX2Jhc2U7DQoJfQ0KDQoJb2NwX2luZGV4ID0g KGFkZHIgJiAweDBmZmYpIHwgMHhiMDAwOw0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9Q TEEsIG9jcF9pbmRleCwgZGF0YSk7DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCByODE1Ml9tZGlv X3dyaXRlKHN0cnVjdCByODE1MiAqdHAsIHUzMiByZWdfYWRkciwgdTMyIHZhbHVlKQ0Kew0KCW9j cF9yZWdfd3JpdGUodHAsIE9DUF9CQVNFX01JSSArIHJlZ19hZGRyICogMiwgdmFsdWUpOw0KfQ0K DQpzdGF0aWMgaW5saW5lIGludCByODE1Ml9tZGlvX3JlYWQoc3RydWN0IHI4MTUyICp0cCwgdTMy IHJlZ19hZGRyKQ0Kew0KCXJldHVybiBvY3BfcmVnX3JlYWQodHAsIE9DUF9CQVNFX01JSSArIHJl Z19hZGRyICogMik7DQp9DQoNCnN0YXRpYyB2b2lkIHNyYW1fd3JpdGUoc3RydWN0IHI4MTUyICp0 cCwgdTE2IGFkZHIsIHUxNiBkYXRhKQ0Kew0KCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9TUkFNX0FE RFIsIGFkZHIpOw0KCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9TUkFNX0RBVEEsIGRhdGEpOw0KfQ0K DQpzdGF0aWMgaW50IHJlYWRfbWlpX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50 IHBoeV9pZCwgaW50IHJlZykNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYobmV0 ZGV2KTsNCglpbnQgcmV0Ow0KDQoJaWYgKHRlc3RfYml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZs YWdzKSkNCgkJcmV0dXJuIC1FTk9ERVY7DQoNCglpZiAocGh5X2lkICE9IFI4MTUyX1BIWV9JRCkN CgkJcmV0dXJuIC1FSU5WQUw7DQoNCglyZXQgPSByODE1Ml9tZGlvX3JlYWQodHAsIHJlZyk7DQoN CglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMNCnZvaWQgd3JpdGVfbWlpX3dvcmQoc3RydWN0IG5l dF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZywgaW50IHZhbCkNCnsNCglzdHJ1 Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsNCg0KCWlmICh0ZXN0X2JpdChSVEw4 MTUyX1VOUExVRywgJnRwLT5mbGFncykpDQoJCXJldHVybjsNCg0KCWlmIChwaHlfaWQgIT0gUjgx NTJfUEhZX0lEKQ0KCQlyZXR1cm47DQoNCglyODE1Ml9tZGlvX3dyaXRlKHRwLCByZWcsIHZhbCk7 DQp9DQoNCnN0YXRpYyBpbnQNCnI4MTUyX3N1Ym1pdF9yeChzdHJ1Y3QgcjgxNTIgKnRwLCBzdHJ1 Y3QgcnhfYWdnICphZ2csIGdmcF90IG1lbV9mbGFncyk7DQoNCnN0YXRpYyBpbnQgcnRsODE1Ml9z ZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkNCnsNCglz dHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsNCglzdHJ1Y3Qgc29ja2FkZHIg KmFkZHIgPSBwOw0KCWludCByZXQgPSAtRUFERFJOT1RBVkFJTDsNCg0KCWlmICghaXNfdmFsaWRf ZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkNCgkJZ290byBvdXQxOw0KDQoJcmV0ID0gdXNiX2F1 dG9wbV9nZXRfaW50ZXJmYWNlKHRwLT5pbnRmKTsNCglpZiAocmV0IDwgMCkNCgkJZ290byBvdXQx Ow0KDQoJbXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOw0KDQoJbWVtY3B5KG5ldGRldi0+ZGV2X2Fk ZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOw0KDQoJb2NwX3dyaXRlX2J5dGUo dHAsIE1DVV9UWVBFX1BMQSwgUExBX0NSV0VDUiwgQ1JXRUNSX0NPTkZJRyk7DQoJcGxhX29jcF93 cml0ZSh0cCwgUExBX0lEUiwgQllURV9FTl9TSVhfQllURVMsIDgsIGFkZHItPnNhX2RhdGEpOw0K CW9jcF93cml0ZV9ieXRlKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9DUldFQ1IsIENSV0VDUl9OT1JB TUwpOw0KDQoJbXV0ZXhfdW5sb2NrKCZ0cC0+Y29udHJvbCk7DQoNCgl1c2JfYXV0b3BtX3B1dF9p bnRlcmZhY2UodHAtPmludGYpOw0Kb3V0MToNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgaW50 IHNldF9ldGhlcm5ldF9hZGRyKHN0cnVjdCByODE1MiAqdHApDQp7DQoJc3RydWN0IG5ldF9kZXZp Y2UgKmRldiA9IHRwLT5uZXRkZXY7DQoJc3RydWN0IHNvY2thZGRyIHNhOw0KCWludCByZXQ7DQoN CglpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMSkNCgkJcmV0ID0gcGxhX29jcF9yZWFkKHRw LCBQTEFfSURSLCA4LCBzYS5zYV9kYXRhKTsNCgllbHNlDQoJCXJldCA9IHBsYV9vY3BfcmVhZCh0 cCwgUExBX0JBQ0tVUCwgOCwgc2Euc2FfZGF0YSk7DQoNCglpZiAocmV0IDwgMCkgew0KCQluZXRp Zl9lcnIodHAsIHByb2JlLCBkZXYsICJHZXQgZXRoZXIgYWRkciBmYWlsXG4iKTsNCgl9IGVsc2Ug aWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNhLnNhX2RhdGEpKSB7DQoJCW5ldGlmX2Vycih0cCwg cHJvYmUsIGRldiwgIkludmFsaWQgZXRoZXIgYWRkciAlcE1cbiIsDQoJCQkgIHNhLnNhX2RhdGEp Ow0KCQlldGhfaHdfYWRkcl9yYW5kb20oZGV2KTsNCgkJZXRoZXJfYWRkcl9jb3B5KHNhLnNhX2Rh dGEsIGRldi0+ZGV2X2FkZHIpOw0KCQlyZXQgPSBydGw4MTUyX3NldF9tYWNfYWRkcmVzcyhkZXYs ICZzYSk7DQoJCW5ldGlmX2luZm8odHAsIHByb2JlLCBkZXYsICJSYW5kb20gZXRoZXIgYWRkciAl cE1cbiIsDQoJCQkgICBzYS5zYV9kYXRhKTsNCgl9IGVsc2Ugew0KCQlpZiAodHAtPnZlcnNpb24g PT0gUlRMX1ZFUl8wMSkNCgkJCWV0aGVyX2FkZHJfY29weShkZXYtPmRldl9hZGRyLCBzYS5zYV9k YXRhKTsNCgkJZWxzZQ0KCQkJcmV0ID0gcnRsODE1Ml9zZXRfbWFjX2FkZHJlc3MoZGV2LCAmc2Ep Ow0KCX0NCg0KCXJldHVybiByZXQ7DQp9DQoNCnN0YXRpYyB2b2lkIHJlYWRfYnVsa19jYWxsYmFj ayhzdHJ1Y3QgdXJiICp1cmIpDQp7DQoJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsNCglpbnQg c3RhdHVzID0gdXJiLT5zdGF0dXM7DQoJc3RydWN0IHJ4X2FnZyAqYWdnOw0KCXN0cnVjdCByODE1 MiAqdHA7DQoNCglhZ2cgPSB1cmItPmNvbnRleHQ7DQoJaWYgKCFhZ2cpDQoJCXJldHVybjsNCg0K CXRwID0gYWdnLT5jb250ZXh0Ow0KCWlmICghdHApDQoJCXJldHVybjsNCg0KCWlmICh0ZXN0X2Jp dChSVEw4MTUyX1VOUExVRywgJnRwLT5mbGFncykpDQoJCXJldHVybjsNCg0KCWlmICghdGVzdF9i aXQoV09SS19FTkFCTEUsICZ0cC0+ZmxhZ3MpKQ0KCQlyZXR1cm47DQoNCgluZXRkZXYgPSB0cC0+ bmV0ZGV2Ow0KDQoJLyogV2hlbiBsaW5rIGRvd24sIHRoZSBkcml2ZXIgd291bGQgY2FuY2VsIGFs bCBidWxrcy4gKi8NCgkvKiBUaGlzIGF2b2lkIHRoZSByZS1zdWJtaXR0aW5nIGJ1bGsgKi8NCglp ZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkNCgkJcmV0dXJuOw0KDQoJdXNiX21hcmtfbGFz dF9idXN5KHRwLT51ZGV2KTsNCg0KCXN3aXRjaCAoc3RhdHVzKSB7DQoJY2FzZSAwOg0KCQltYigp Ow0KCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDwgKHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKyBF VEhfWkxFTikpIHsNCgkJCXByaW50ayhLRVJOX0lORk8gInI4MTUyX3JlYWRfYnVsa19jYWxsYmFj azogYWN0dWFsX2xlbmd0aCAoJXUpIHRvbyBzaG9ydFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsN CgkJCWJyZWFrOw0KCQl9DQoNCgkJc3Bpbl9sb2NrKCZ0cC0+cnhfbG9jayk7DQoJCWxpc3RfYWRk X3RhaWwoJmFnZy0+bGlzdCwgJnRwLT5yeF9kb25lKTsNCgkJc3Bpbl91bmxvY2soJnRwLT5yeF9s b2NrKTsNCgkJbmFwaV9zY2hlZHVsZSgmdHAtPm5hcGkpOw0KCQlyZXR1cm47DQoJY2FzZSAtRVNI VVRET1dOOg0KCQlzZXRfYml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdzKTsNCgkJbmV0aWZf ZGV2aWNlX2RldGFjaCh0cC0+bmV0ZGV2KTsNCgkJcmV0dXJuOw0KCWNhc2UgLUVOT0VOVDoNCgkJ cmV0dXJuOwkvKiB0aGUgdXJiIGlzIGluIHVubGluayBzdGF0ZSAqLw0KCWNhc2UgLUVUSU1FOg0K CQlpZiAobmV0X3JhdGVsaW1pdCgpKQ0KCQkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAibWF5YmUgcmVz ZXQgaXMgbmVlZGVkP1xuIik7DQoJCWJyZWFrOw0KCWRlZmF1bHQ6DQoJCWlmIChuZXRfcmF0ZWxp bWl0KCkpDQoJCQluZXRkZXZfd2FybihuZXRkZXYsICJSeCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7 DQoJCWJyZWFrOw0KCX0NCg0KCXI4MTUyX3N1Ym1pdF9yeCh0cCwgYWdnLCBHRlBfQVRPTUlDKTsN Cn0NCg0Kc3RhdGljIHZvaWQgd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpDQp7 DQoJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOw0KCXN0cnVjdCBuZXRfZGV2aWNlICpu ZXRkZXY7DQoJc3RydWN0IHR4X2FnZyAqYWdnOw0KCXN0cnVjdCByODE1MiAqdHA7DQoJaW50IHN0 YXR1cyA9IHVyYi0+c3RhdHVzOw0KDQoJYWdnID0gdXJiLT5jb250ZXh0Ow0KCWlmICghYWdnKQ0K CQlyZXR1cm47DQoNCgl0cCA9IGFnZy0+Y29udGV4dDsNCglpZiAoIXRwKQ0KCQlyZXR1cm47DQoN CgluZXRkZXYgPSB0cC0+bmV0ZGV2Ow0KCXN0YXRzID0gJm5ldGRldi0+c3RhdHM7DQoJaWYgKHN0 YXR1cykgew0KCQlpZiAobmV0X3JhdGVsaW1pdCgpKQ0KCQkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAi VHggc3RhdHVzICVkXG4iLCBzdGF0dXMpOw0KCQlzdGF0cy0+dHhfZXJyb3JzICs9IGFnZy0+c2ti X251bTsNCgl9IGVsc2Ugew0KCQlzdGF0cy0+dHhfcGFja2V0cyArPSBhZ2ctPnNrYl9udW07DQoJ CXN0YXRzLT50eF9ieXRlcyArPSBhZ2ctPnNrYl9sZW47DQoJfQ0KDQoJc3Bpbl9sb2NrKCZ0cC0+ dHhfbG9jayk7DQoJbGlzdF9hZGRfdGFpbCgmYWdnLT5saXN0LCAmdHAtPnR4X2ZyZWUpOw0KCXNw aW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5 bmModHAtPmludGYpOw0KDQoJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpDQoJCXJldHVy bjsNCg0KCWlmICghdGVzdF9iaXQoV09SS19FTkFCTEUsICZ0cC0+ZmxhZ3MpKQ0KCQlyZXR1cm47 DQoNCglpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKQ0KCQlyZXR1cm47 DQoNCglpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPnR4X3F1ZXVlKSkNCgkJbmFwaV9zY2hlZHVs ZSgmdHAtPm5hcGkpOw0KfQ0KDQpzdGF0aWMgdm9pZCBpbnRyX2NhbGxiYWNrKHN0cnVjdCB1cmIg KnVyYikNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwOw0KCV9fbGUxNiAqZDsNCglpbnQgc3RhdHVzID0g dXJiLT5zdGF0dXM7DQoJaW50IHJlczsNCg0KCXRwID0gdXJiLT5jb250ZXh0Ow0KCWlmICghdHAp DQoJCXJldHVybjsNCg0KCWlmICghdGVzdF9iaXQoV09SS19FTkFCTEUsICZ0cC0+ZmxhZ3MpKQ0K CQlyZXR1cm47DQoNCglpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKQ0K CQlyZXR1cm47DQoNCglzd2l0Y2ggKHN0YXR1cykgew0KCWNhc2UgMDoJCQkvKiBzdWNjZXNzICov DQoJCWJyZWFrOw0KCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLw0KCWNhc2UgLUVTSFVU RE9XTjoNCgkJbmV0aWZfZGV2aWNlX2RldGFjaCh0cC0+bmV0ZGV2KTsNCgljYXNlIC1FTk9FTlQ6 DQoJY2FzZSAtRVBST1RPOg0KCQluZXRpZl9pbmZvKHRwLCBpbnRyLCB0cC0+bmV0ZGV2LA0KCQkJ ICAgIlN0b3Agc3VibWl0dGluZyBpbnRyLCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7DQoJCXJldHVy bjsNCgljYXNlIC1FT1ZFUkZMT1c6DQoJCW5ldGlmX2luZm8odHAsIGludHIsIHRwLT5uZXRkZXYs ICJpbnRyIHN0YXR1cyAtRU9WRVJGTE9XXG4iKTsNCgkJZ290byByZXN1Ym1pdDsNCgkvKiAtRVBJ UEU6ICBzaG91bGQgY2xlYXIgdGhlIGhhbHQgKi8NCglkZWZhdWx0Og0KCQluZXRpZl9pbmZvKHRw LCBpbnRyLCB0cC0+bmV0ZGV2LCAiaW50ciBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7DQoJCWdvdG8g cmVzdWJtaXQ7DQoJfQ0KDQoJZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOw0KCWlmIChJTlRSX0xJ TksgJiBfX2xlMTZfdG9fY3B1KGRbMF0pKSB7DQoJCWlmICghbmV0aWZfY2Fycmllcl9vayh0cC0+ bmV0ZGV2KSkgew0KCQkJc2V0X2JpdChSVEw4MTUyX0xJTktfQ0hHLCAmdHAtPmZsYWdzKTsNCgkJ CXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHAtPnNjaGVkdWxlLCAwKTsNCgkJfQ0KCX0gZWxzZSB7 DQoJCWlmIChuZXRpZl9jYXJyaWVyX29rKHRwLT5uZXRkZXYpKSB7DQoJCQlzZXRfYml0KFJUTDgx NTJfTElOS19DSEcsICZ0cC0+ZmxhZ3MpOw0KCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0cC0+ c2NoZWR1bGUsIDApOw0KCQl9DQoJfQ0KDQpyZXN1Ym1pdDoNCglyZXMgPSB1c2Jfc3VibWl0X3Vy Yih1cmIsIEdGUF9BVE9NSUMpOw0KCWlmIChyZXMgPT0gLUVOT0RFVikgew0KCQlzZXRfYml0KFJU TDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdzKTsNCgkJbmV0aWZfZGV2aWNlX2RldGFjaCh0cC0+bmV0 ZGV2KTsNCgl9IGVsc2UgaWYgKHJlcykgew0KCQluZXRpZl9lcnIodHAsIGludHIsIHRwLT5uZXRk ZXYsDQoJCQkgICJjYW4ndCByZXN1Ym1pdCBpbnRyLCBzdGF0dXMgJWRcbiIsIHJlcyk7DQoJfQ0K fQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgKnJ4X2FnZ19hbGlnbih2b2lkICpkYXRhKQ0Kew0KCXJl dHVybiAodm9pZCAqKUFMSUdOKCh1aW50cHRyX3QpZGF0YSwgUlhfQUxJR04pOw0KfQ0KDQpzdGF0 aWMgaW5saW5lIHZvaWQgKnR4X2FnZ19hbGlnbih2b2lkICpkYXRhKQ0Kew0KCXJldHVybiAodm9p ZCAqKUFMSUdOKCh1aW50cHRyX3QpZGF0YSwgVFhfQUxJR04pOw0KfQ0KDQpzdGF0aWMgdm9pZCBm cmVlX2FsbF9tZW0oc3RydWN0IHI4MTUyICp0cCkNCnsNCglpbnQgaTsNCg0KCWZvciAoaSA9IDA7 IGkgPCBSVEw4MTUyX01BWF9SWDsgaSsrKSB7DQoJCXVzYl9mcmVlX3VyYih0cC0+cnhfaW5mb1tp XS51cmIpOw0KCQl0cC0+cnhfaW5mb1tpXS51cmIgPSBOVUxMOw0KDQoJCXVzYl9mcmVlX2NvaGVy ZW50KHRwLT51ZGV2LCBhZ2dfYnVmX3N6LCB0cC0+cnhfaW5mb1tpXS5idWZmZXIsIHRwLT5yeF9p bmZvW2ldLnRyYW5zZmVyX2RtYSk7DQoJCXRwLT5yeF9pbmZvW2ldLmJ1ZmZlciA9IE5VTEw7DQoJ CXRwLT5yeF9pbmZvW2ldLmhlYWQgPSBOVUxMOw0KCX0NCg0KCWZvciAoaSA9IDA7IGkgPCBSVEw4 MTUyX01BWF9UWDsgaSsrKSB7DQoJCXVzYl9mcmVlX3VyYih0cC0+dHhfaW5mb1tpXS51cmIpOw0K CQl0cC0+dHhfaW5mb1tpXS51cmIgPSBOVUxMOw0KDQoJCWtmcmVlKHRwLT50eF9pbmZvW2ldLmJ1 ZmZlcik7DQoJCXRwLT50eF9pbmZvW2ldLmJ1ZmZlciA9IE5VTEw7DQoJCXRwLT50eF9pbmZvW2ld LmhlYWQgPSBOVUxMOw0KCX0NCg0KCXVzYl9mcmVlX3VyYih0cC0+aW50cl91cmIpOw0KCXRwLT5p bnRyX3VyYiA9IE5VTEw7DQoNCglrZnJlZSh0cC0+aW50cl9idWZmKTsNCgl0cC0+aW50cl9idWZm ID0gTlVMTDsNCn0NCg0Kc3RhdGljIGludCBhbGxvY19hbGxfbWVtKHN0cnVjdCByODE1MiAqdHAp DQp7DQoJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHRwLT5uZXRkZXY7DQoJc3RydWN0IHVz Yl9pbnRlcmZhY2UgKmludGYgPSB0cC0+aW50ZjsNCglzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNl ICphbHQgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsNCglzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQg KmVwX2ludHIgPSBhbHQtPmVuZHBvaW50ICsgMjsNCglzdHJ1Y3QgdXJiICp1cmI7DQoJaW50IG5v ZGUsIGk7DQoJdTggKmJ1ZjsNCg0KCW5vZGUgPSBuZXRkZXYtPmRldi5wYXJlbnQgPyBkZXZfdG9f bm9kZShuZXRkZXYtPmRldi5wYXJlbnQpIDogLTE7DQoNCglzcGluX2xvY2tfaW5pdCgmdHAtPnJ4 X2xvY2spOw0KCXNwaW5fbG9ja19pbml0KCZ0cC0+dHhfbG9jayk7DQoJSU5JVF9MSVNUX0hFQUQo JnRwLT50eF9mcmVlKTsNCglza2JfcXVldWVfaGVhZF9pbml0KCZ0cC0+dHhfcXVldWUpOw0KCXNr Yl9xdWV1ZV9oZWFkX2luaXQoJnRwLT5yeF9xdWV1ZSk7DQoNCglmb3IgKGkgPSAwOyBpIDwgUlRM ODE1Ml9NQVhfUlg7IGkrKykgew0KCQlkbWFfYWRkcl90IHRyYW5zZmVyX2RtYSA9IDA7DQoJCWJ1 ZiA9IHVzYl9hbGxvY19jb2hlcmVudCh0cC0+dWRldiwgYWdnX2J1Zl9zeiwgR0ZQX0tFUk5FTCwg JnRyYW5zZmVyX2RtYSk7DQoJCWlmICghYnVmKQ0KCQkJZ290byBlcnIxOw0KDQoJCWlmIChidWYg IT0gcnhfYWdnX2FsaWduKGJ1ZikpIHsNCgkJCWtmcmVlKGJ1Zik7DQoJCQlidWYgPSBrbWFsbG9j X25vZGUoYWdnX2J1Zl9zeiArIFJYX0FMSUdOLCBHRlBfS0VSTkVMLA0KCQkJCQkgICBub2RlKTsN CgkJCWlmICghYnVmKQ0KCQkJCWdvdG8gZXJyMTsNCgkJfQ0KDQoJCXVyYiA9IHVzYl9hbGxvY191 cmIoMCwgR0ZQX0tFUk5FTCk7DQoJCWlmICghdXJiKSB7DQoJCQlrZnJlZShidWYpOw0KCQkJZ290 byBlcnIxOw0KCQl9DQoNCgkJSU5JVF9MSVNUX0hFQUQoJnRwLT5yeF9pbmZvW2ldLmxpc3QpOw0K CQl0cC0+cnhfaW5mb1tpXS5jb250ZXh0ID0gdHA7DQoJCXRwLT5yeF9pbmZvW2ldLnVyYiA9IHVy YjsNCgkJdHAtPnJ4X2luZm9baV0udHJhbnNmZXJfZG1hID0gdHJhbnNmZXJfZG1hOw0KCQl0cC0+ cnhfaW5mb1tpXS5idWZmZXIgPSBidWY7DQoJCXRwLT5yeF9pbmZvW2ldLmhlYWQgPSByeF9hZ2df YWxpZ24oYnVmKTsNCgl9DQoNCglmb3IgKGkgPSAwOyBpIDwgUlRMODE1Ml9NQVhfVFg7IGkrKykg ew0KCQlidWYgPSBrbWFsbG9jX25vZGUoYWdnX2J1Zl9zeiwgR0ZQX0tFUk5FTCwgbm9kZSk7DQoJ CWlmICghYnVmKQ0KCQkJZ290byBlcnIxOw0KDQoJCWlmIChidWYgIT0gdHhfYWdnX2FsaWduKGJ1 ZikpIHsNCgkJCWtmcmVlKGJ1Zik7DQoJCQlidWYgPSBrbWFsbG9jX25vZGUoYWdnX2J1Zl9zeiAr IFRYX0FMSUdOLCBHRlBfS0VSTkVMLA0KCQkJCQkgICBub2RlKTsNCgkJCWlmICghYnVmKQ0KCQkJ CWdvdG8gZXJyMTsNCgkJfQ0KDQoJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7 DQoJCWlmICghdXJiKSB7DQoJCQlrZnJlZShidWYpOw0KCQkJZ290byBlcnIxOw0KCQl9DQoNCgkJ SU5JVF9MSVNUX0hFQUQoJnRwLT50eF9pbmZvW2ldLmxpc3QpOw0KCQl0cC0+dHhfaW5mb1tpXS5j b250ZXh0ID0gdHA7DQoJCXRwLT50eF9pbmZvW2ldLnVyYiA9IHVyYjsNCgkJdHAtPnR4X2luZm9b aV0uYnVmZmVyID0gYnVmOw0KCQl0cC0+dHhfaW5mb1tpXS5oZWFkID0gdHhfYWdnX2FsaWduKGJ1 Zik7DQoNCgkJbGlzdF9hZGRfdGFpbCgmdHAtPnR4X2luZm9baV0ubGlzdCwgJnRwLT50eF9mcmVl KTsNCgl9DQoNCgl0cC0+aW50cl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOw0K CWlmICghdHAtPmludHJfdXJiKQ0KCQlnb3RvIGVycjE7DQoNCgl0cC0+aW50cl9idWZmID0ga21h bGxvYyhJTlRCVUZTSVpFLCBHRlBfS0VSTkVMKTsNCglpZiAoIXRwLT5pbnRyX2J1ZmYpDQoJCWdv dG8gZXJyMTsNCg0KCXRwLT5pbnRyX2ludGVydmFsID0gKGludCllcF9pbnRyLT5kZXNjLmJJbnRl cnZhbDsNCgl1c2JfZmlsbF9pbnRfdXJiKHRwLT5pbnRyX3VyYiwgdHAtPnVkZXYsIHVzYl9yY3Zp bnRwaXBlKHRwLT51ZGV2LCAzKSwNCgkJCSB0cC0+aW50cl9idWZmLCBJTlRCVUZTSVpFLCBpbnRy X2NhbGxiYWNrLA0KCQkJIHRwLCB0cC0+aW50cl9pbnRlcnZhbCk7DQoNCglyZXR1cm4gMDsNCg0K ZXJyMToNCglmcmVlX2FsbF9tZW0odHApOw0KCXJldHVybiAtRU5PTUVNOw0KfQ0KDQpzdGF0aWMg c3RydWN0IHR4X2FnZyAqcjgxNTJfZ2V0X3R4X2FnZyhzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXN0 cnVjdCB0eF9hZ2cgKmFnZyA9IE5VTEw7DQoJdW5zaWduZWQgbG9uZyBmbGFnczsNCg0KCWlmIChs aXN0X2VtcHR5KCZ0cC0+dHhfZnJlZSkpDQoJCXJldHVybiBOVUxMOw0KDQoJc3Bpbl9sb2NrX2ly cXNhdmUoJnRwLT50eF9sb2NrLCBmbGFncyk7DQoJaWYgKCFsaXN0X2VtcHR5KCZ0cC0+dHhfZnJl ZSkpIHsNCgkJc3RydWN0IGxpc3RfaGVhZCAqY3Vyc29yOw0KDQoJCWN1cnNvciA9IHRwLT50eF9m cmVlLm5leHQ7DQoJCWxpc3RfZGVsX2luaXQoY3Vyc29yKTsNCgkJYWdnID0gbGlzdF9lbnRyeShj dXJzb3IsIHN0cnVjdCB0eF9hZ2csIGxpc3QpOw0KCX0NCglzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZ0cC0+dHhfbG9jaywgZmxhZ3MpOw0KDQoJcmV0dXJuIGFnZzsNCn0NCg0KLyogcjgxNTJfY3N1 bV93b3JrYXJvdW5kKCkNCiAqIFRoZSBodyBsaW1pdGVzIHRoZSB2YWx1ZSB0aGUgdHJhbnNwb3J0 IG9mZnNldC4gV2hlbiB0aGUgb2Zmc2V0IGlzIG91dCBvZiB0aGUNCiAqIHJhbmdlLCBjYWxjdWxh dGUgdGhlIGNoZWNrc3VtIGJ5IHN3Lg0KICovDQpzdGF0aWMgdm9pZCByODE1Ml9jc3VtX3dvcmth cm91bmQoc3RydWN0IHI4MTUyICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwNCgkJCQkgIHN0cnVj dCBza19idWZmX2hlYWQgKmxpc3QpDQp7DQoJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUp IHsNCgkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMgPSB0cC0+bmV0ZGV2LT5mZWF0dXJlczsN CgkJc3RydWN0IHNrX2J1ZmZfaGVhZCBzZWdfbGlzdDsNCgkJc3RydWN0IHNrX2J1ZmYgKnNlZ3Ms ICpuc2tiOw0KDQoJCWZlYXR1cmVzICY9IH4oTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBWNl9DU1VN IHwgTkVUSUZfRl9UU082KTsNCgkJc2VncyA9IHNrYl9nc29fc2VnbWVudChza2IsIGZlYXR1cmVz KTsNCgkJaWYgKElTX0VSUihzZWdzKSB8fCAhc2VncykNCgkJCWdvdG8gZHJvcDsNCg0KCQlfX3Nr Yl9xdWV1ZV9oZWFkX2luaXQoJnNlZ19saXN0KTsNCg0KCQlkbyB7DQoJCQluc2tiID0gc2VnczsN CgkJCXNlZ3MgPSBzZWdzLT5uZXh0Ow0KCQkJbnNrYi0+bmV4dCA9IE5VTEw7DQoJCQlfX3NrYl9x dWV1ZV90YWlsKCZzZWdfbGlzdCwgbnNrYik7DQoJCX0gd2hpbGUgKHNlZ3MpOw0KDQoJCXNrYl9x dWV1ZV9zcGxpY2UoJnNlZ19saXN0LCBsaXN0KTsNCgkJZGV2X2tmcmVlX3NrYihza2IpOw0KCX0g ZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgew0KCQlpZiAoc2ti X2NoZWNrc3VtX2hlbHAoc2tiKSA8IDApDQoJCQlnb3RvIGRyb3A7DQoNCgkJX19za2JfcXVldWVf aGVhZChsaXN0LCBza2IpOw0KCX0gZWxzZSB7DQoJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpz dGF0czsNCg0KZHJvcDoNCgkJc3RhdHMgPSAmdHAtPm5ldGRldi0+c3RhdHM7DQoJCXN0YXRzLT50 eF9kcm9wcGVkKys7DQoJCWRldl9rZnJlZV9za2Ioc2tiKTsNCgl9DQp9DQoNCi8qIG1zZG5fZ2lh bnRfc2VuZF9jaGVjaygpDQogKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IG9mIG1pY3Jvc29m dCwgdGhlIFRDUCBQc2V1ZG8gSGVhZGVyIGV4Y2x1ZGVzIHRoZQ0KICogcGFja2V0IGxlbmd0aCBm b3IgSVB2NiBUQ1AgbGFyZ2UgcGFja2V0cy4NCiAqLw0Kc3RhdGljIGludCBtc2RuX2dpYW50X3Nl bmRfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYikNCnsNCgljb25zdCBzdHJ1Y3QgaXB2NmhkciAq aXB2Nmg7DQoJc3RydWN0IHRjcGhkciAqdGg7DQoJaW50IHJldDsNCg0KCXJldCA9IHNrYl9jb3df aGVhZChza2IsIDApOw0KCWlmIChyZXQpDQoJCXJldHVybiByZXQ7DQoNCglpcHY2aCA9IGlwdjZf aGRyKHNrYik7DQoJdGggPSB0Y3BfaGRyKHNrYik7DQoNCgl0aC0+Y2hlY2sgPSAwOw0KCXRoLT5j aGVjayA9IH50Y3BfdjZfY2hlY2soMCwgJmlwdjZoLT5zYWRkciwgJmlwdjZoLT5kYWRkciwgMCk7 DQoNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgaW5saW5lIHZvaWQgcnRsX3R4X3ZsYW5fdGFn KHN0cnVjdCB0eF9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQ0Kew0KCWlmIChza2Jf dmxhbl90YWdfcHJlc2VudChza2IpKSB7DQoJCXUzMiBvcHRzMjsNCg0KCQlvcHRzMiA9IFRYX1ZM QU5fVEFHIHwgc3dhYjE2KHNrYl92bGFuX3RhZ19nZXQoc2tiKSk7DQoJCWRlc2MtPm9wdHMyIHw9 IGNwdV90b19sZTMyKG9wdHMyKTsNCgl9DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCBydGxfcnhf dmxhbl90YWcoc3RydWN0IHJ4X2Rlc2MgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpDQp7DQoJ dTMyIG9wdHMyID0gbGUzMl90b19jcHUoZGVzYy0+b3B0czIpOw0KDQoJaWYgKG9wdHMyICYgUlhf VkxBTl9UQUcpDQoJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBodG9ucyhFVEhfUF84MDIx USksDQoJCQkJICAgICAgIHN3YWIxNihvcHRzMiAmIDB4ZmZmZikpOw0KfQ0KDQpzdGF0aWMgaW50 IHI4MTUyX3R4X2NzdW0oc3RydWN0IHI4MTUyICp0cCwgc3RydWN0IHR4X2Rlc2MgKmRlc2MsDQoJ CQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbiwgdTMyIHRyYW5zcG9ydF9vZmZzZXQpDQp7 DQoJdTMyIG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7DQoJdTMyIG9wdHMxLCBvcHRz MiA9IDA7DQoJaW50IHJldCA9IFRYX0NTVU1fU1VDQ0VTUzsNCg0KCVdBUk5fT05fT05DRShsZW4g PiBUWF9MRU5fTUFYKTsNCg0KCW9wdHMxID0gbGVuIHwgVFhfRlMgfCBUWF9MUzsNCg0KCWlmICht c3MpIHsNCgkJaWYgKHRyYW5zcG9ydF9vZmZzZXQgPiBHVFRDUEhPX01BWCkgew0KCQkJbmV0aWZf d2Fybih0cCwgdHhfZXJyLCB0cC0+bmV0ZGV2LA0KCQkJCSAgICJJbnZhbGlkIHRyYW5zcG9ydCBv ZmZzZXQgMHgleCBmb3IgVFNPXG4iLA0KCQkJCSAgIHRyYW5zcG9ydF9vZmZzZXQpOw0KCQkJcmV0 ID0gVFhfQ1NVTV9UU087DQoJCQlnb3RvIHVuYXZhaWxhYmxlOw0KCQl9DQoNCgkJc3dpdGNoICh2 bGFuX2dldF9wcm90b2NvbChza2IpKSB7DQoJCWNhc2UgaHRvbnMoRVRIX1BfSVApOg0KCQkJb3B0 czEgfD0gR1RTRU5EVjQ7DQoJCQlicmVhazsNCg0KCQljYXNlIGh0b25zKEVUSF9QX0lQVjYpOg0K CQkJaWYgKG1zZG5fZ2lhbnRfc2VuZF9jaGVjayhza2IpKSB7DQoJCQkJcmV0ID0gVFhfQ1NVTV9U U087DQoJCQkJZ290byB1bmF2YWlsYWJsZTsNCgkJCX0NCgkJCW9wdHMxIHw9IEdUU0VORFY2Ow0K CQkJYnJlYWs7DQoNCgkJZGVmYXVsdDoNCgkJCVdBUk5fT05fT05DRSgxKTsNCgkJCWJyZWFrOw0K CQl9DQoNCgkJb3B0czEgfD0gdHJhbnNwb3J0X29mZnNldCA8PCBHVFRDUEhPX1NISUZUOw0KCQlv cHRzMiB8PSBtaW4obXNzLCBNU1NfTUFYKSA8PCBNU1NfU0hJRlQ7DQoJfSBlbHNlIGlmIChza2It PmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7DQoJCXU4IGlwX3Byb3RvY29sOw0KDQoJ CWlmICh0cmFuc3BvcnRfb2Zmc2V0ID4gVENQSE9fTUFYKSB7DQoJCQluZXRpZl93YXJuKHRwLCB0 eF9lcnIsIHRwLT5uZXRkZXYsDQoJCQkJICAgIkludmFsaWQgdHJhbnNwb3J0IG9mZnNldCAweCV4 XG4iLA0KCQkJCSAgIHRyYW5zcG9ydF9vZmZzZXQpOw0KCQkJcmV0ID0gVFhfQ1NVTV9OT05FOw0K CQkJZ290byB1bmF2YWlsYWJsZTsNCgkJfQ0KDQoJCXN3aXRjaCAodmxhbl9nZXRfcHJvdG9jb2wo c2tiKSkgew0KCQljYXNlIGh0b25zKEVUSF9QX0lQKToNCgkJCW9wdHMyIHw9IElQVjRfQ1M7DQoJ CQlpcF9wcm90b2NvbCA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsNCgkJCWJyZWFrOw0KDQoJCWNh c2UgaHRvbnMoRVRIX1BfSVBWNik6DQoJCQlvcHRzMiB8PSBJUFY2X0NTOw0KCQkJaXBfcHJvdG9j b2wgPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOw0KCQkJYnJlYWs7DQoNCgkJZGVmYXVsdDoNCgkJ CWlwX3Byb3RvY29sID0gSVBQUk9UT19SQVc7DQoJCQlicmVhazsNCgkJfQ0KDQoJCWlmIChpcF9w cm90b2NvbCA9PSBJUFBST1RPX1RDUCkNCgkJCW9wdHMyIHw9IFRDUF9DUzsNCgkJZWxzZSBpZiAo aXBfcHJvdG9jb2wgPT0gSVBQUk9UT19VRFApDQoJCQlvcHRzMiB8PSBVRFBfQ1M7DQoJCWVsc2UN CgkJCVdBUk5fT05fT05DRSgxKTsNCg0KCQlvcHRzMiB8PSB0cmFuc3BvcnRfb2Zmc2V0IDw8IFRD UEhPX1NISUZUOw0KCX0NCg0KCWRlc2MtPm9wdHMyID0gY3B1X3RvX2xlMzIob3B0czIpOw0KCWRl c2MtPm9wdHMxID0gY3B1X3RvX2xlMzIob3B0czEpOw0KDQp1bmF2YWlsYWJsZToNCglyZXR1cm4g cmV0Ow0KfQ0KDQpzdGF0aWMgaW50IHI4MTUyX3R4X2FnZ19maWxsKHN0cnVjdCByODE1MiAqdHAs IHN0cnVjdCB0eF9hZ2cgKmFnZykNCnsNCglzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl9oZWFkLCAq dHhfcXVldWUgPSAmdHAtPnR4X3F1ZXVlOw0KCWludCByZW1haW4sIHJldDsNCgl1OCAqdHhfZGF0 YTsNCg0KCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2tiX2hlYWQpOw0KCXNwaW5fbG9jaygmdHhf cXVldWUtPmxvY2spOw0KCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdCh0eF9xdWV1ZSwgJnNrYl9oZWFk KTsNCglzcGluX3VubG9jaygmdHhfcXVldWUtPmxvY2spOw0KDQoJdHhfZGF0YSA9IGFnZy0+aGVh ZDsNCglhZ2ctPnNrYl9udW0gPSAwOw0KCWFnZy0+c2tiX2xlbiA9IDA7DQoJcmVtYWluID0gYWdn X2J1Zl9zejsNCg0KCXdoaWxlIChyZW1haW4gPj0gRVRIX1pMRU4gKyBzaXplb2Yoc3RydWN0IHR4 X2Rlc2MpKSB7DQoJCXN0cnVjdCB0eF9kZXNjICp0eF9kZXNjOw0KCQlzdHJ1Y3Qgc2tfYnVmZiAq c2tiOw0KCQl1bnNpZ25lZCBpbnQgbGVuOw0KCQl1MzIgb2Zmc2V0Ow0KDQoJCXNrYiA9IF9fc2ti X2RlcXVldWUoJnNrYl9oZWFkKTsNCgkJaWYgKCFza2IpDQoJCQlicmVhazsNCg0KCQlsZW4gPSBz a2ItPmxlbiArIHNpemVvZigqdHhfZGVzYyk7DQoNCgkJaWYgKGxlbiA+IHJlbWFpbikgew0KCQkJ X19za2JfcXVldWVfaGVhZCgmc2tiX2hlYWQsIHNrYik7DQoJCQlicmVhazsNCgkJfQ0KDQoJCXR4 X2RhdGEgPSB0eF9hZ2dfYWxpZ24odHhfZGF0YSk7DQoJCXR4X2Rlc2MgPSAoc3RydWN0IHR4X2Rl c2MgKil0eF9kYXRhOw0KDQoJCW9mZnNldCA9ICh1MzIpc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2ti KTsNCg0KCQlpZiAocjgxNTJfdHhfY3N1bSh0cCwgdHhfZGVzYywgc2tiLCBza2ItPmxlbiwgb2Zm c2V0KSkgew0KCQkJcjgxNTJfY3N1bV93b3JrYXJvdW5kKHRwLCBza2IsICZza2JfaGVhZCk7DQoJ CQljb250aW51ZTsNCgkJfQ0KDQoJCXJ0bF90eF92bGFuX3RhZyh0eF9kZXNjLCBza2IpOw0KDQoJ CXR4X2RhdGEgKz0gc2l6ZW9mKCp0eF9kZXNjKTsNCg0KCQlsZW4gPSBza2ItPmxlbjsNCgkJaWYg KHNrYl9jb3B5X2JpdHMoc2tiLCAwLCB0eF9kYXRhLCBsZW4pIDwgMCkgew0KCQkJc3RydWN0IG5l dF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnRwLT5uZXRkZXYtPnN0YXRzOw0KDQoJCQlzdGF0cy0+ dHhfZHJvcHBlZCsrOw0KCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCgkJCXR4X2RhdGEgLT0g c2l6ZW9mKCp0eF9kZXNjKTsNCgkJCWNvbnRpbnVlOw0KCQl9DQoNCgkJdHhfZGF0YSArPSBsZW47 DQoJCWFnZy0+c2tiX2xlbiArPSBsZW47DQoJCWFnZy0+c2tiX251bSsrOw0KDQoJCWRldl9rZnJl ZV9za2JfYW55KHNrYik7DQoNCgkJcmVtYWluID0gYWdnX2J1Zl9zeiAtIChpbnQpKHR4X2FnZ19h bGlnbih0eF9kYXRhKSAtIGFnZy0+aGVhZCk7DQoJfQ0KDQoJaWYgKCFza2JfcXVldWVfZW1wdHko JnNrYl9oZWFkKSkgew0KCQlzcGluX2xvY2soJnR4X3F1ZXVlLT5sb2NrKTsNCgkJc2tiX3F1ZXVl X3NwbGljZSgmc2tiX2hlYWQsIHR4X3F1ZXVlKTsNCgkJc3Bpbl91bmxvY2soJnR4X3F1ZXVlLT5s b2NrKTsNCgl9DQoNCgluZXRpZl90eF9sb2NrKHRwLT5uZXRkZXYpOw0KDQoJaWYgKG5ldGlmX3F1 ZXVlX3N0b3BwZWQodHAtPm5ldGRldikgJiYNCgkgICAgc2tiX3F1ZXVlX2xlbigmdHAtPnR4X3F1 ZXVlKSA8IHRwLT50eF9xbGVuKQ0KCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5uZXRkZXYpOw0KDQoJ bmV0aWZfdHhfdW5sb2NrKHRwLT5uZXRkZXYpOw0KDQoJcmV0ID0gdXNiX2F1dG9wbV9nZXRfaW50 ZXJmYWNlX2FzeW5jKHRwLT5pbnRmKTsNCglpZiAocmV0IDwgMCkNCgkJZ290byBvdXRfdHhfZmls bDsNCg0KCXVzYl9maWxsX2J1bGtfdXJiKGFnZy0+dXJiLCB0cC0+dWRldiwgdXNiX3NuZGJ1bGtw aXBlKHRwLT51ZGV2LCAyKSwNCgkJCSAgYWdnLT5oZWFkLCAoaW50KSh0eF9kYXRhIC0gKHU4ICop YWdnLT5oZWFkKSwNCgkJCSAgKHVzYl9jb21wbGV0ZV90KXdyaXRlX2J1bGtfY2FsbGJhY2ssIGFn Zyk7DQoNCglyZXQgPSB1c2Jfc3VibWl0X3VyYihhZ2ctPnVyYiwgR0ZQX0FUT01JQyk7DQoJaWYg KHJldCA8IDApDQoJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyh0cC0+aW50Zik7DQoN Cm91dF90eF9maWxsOg0KCXJldHVybiByZXQ7DQp9DQoNCnN0YXRpYyB1OCByODE1Ml9yeF9jc3Vt KHN0cnVjdCByODE1MiAqdHAsIHN0cnVjdCByeF9kZXNjICpyeF9kZXNjKQ0Kew0KCXU4IGNoZWNr c3VtID0gQ0hFQ0tTVU1fTk9ORTsNCgl1MzIgb3B0czIsIG9wdHMzOw0KDQoJaWYgKHRwLT52ZXJz aW9uID09IFJUTF9WRVJfMDEpDQoJCWdvdG8gcmV0dXJuX3Jlc3VsdDsNCg0KCW9wdHMyID0gbGUz Ml90b19jcHUocnhfZGVzYy0+b3B0czIpOw0KCW9wdHMzID0gbGUzMl90b19jcHUocnhfZGVzYy0+ b3B0czMpOw0KDQoJaWYgKG9wdHMyICYgUkRfSVBWNF9DUykgew0KCQlpZiAob3B0czMgJiBJUEYp DQoJCQljaGVja3N1bSA9IENIRUNLU1VNX05PTkU7DQoJCWVsc2UgaWYgKChvcHRzMiAmIFJEX1VE UF9DUykgJiYgKG9wdHMzICYgVURQRikpDQoJCQljaGVja3N1bSA9IENIRUNLU1VNX05PTkU7DQoJ CWVsc2UgaWYgKChvcHRzMiAmIFJEX1RDUF9DUykgJiYgKG9wdHMzICYgVENQRikpDQoJCQljaGVj a3N1bSA9IENIRUNLU1VNX05PTkU7DQoJCWVsc2UNCgkJCWNoZWNrc3VtID0gQ0hFQ0tTVU1fVU5O RUNFU1NBUlk7DQoJfSBlbHNlIGlmIChvcHRzMiAmIFJEX0lQVjZfQ1MpIHsNCgkJaWYgKChvcHRz MiAmIFJEX1VEUF9DUykgJiYgIShvcHRzMyAmIFVEUEYpKQ0KCQkJY2hlY2tzdW0gPSBDSEVDS1NV TV9VTk5FQ0VTU0FSWTsNCgkJZWxzZSBpZiAoKG9wdHMyICYgUkRfVENQX0NTKSAmJiAhKG9wdHMz ICYgVENQRikpDQoJCQljaGVja3N1bSA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOw0KCX0NCg0KcmV0 dXJuX3Jlc3VsdDoNCglyZXR1cm4gY2hlY2tzdW07DQp9DQoNCnN0YXRpYyB2b2lkIHI4MTUyX2R1 bXBfcnhfZGVzYyhzdHJ1Y3QgcnhfZGVzYyAqcnhfZGVzYykNCnsNCglpbnQgcnhfbGVuID0gKGxl MzJfdG9fY3B1KHJ4X2Rlc2MtPm9wdHMxKSAmIFJYX0xFTl9NQVNLKTsNCg0KCXByaW50ayhLRVJO X0lORk8gIiVzOiAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCByeF9sZW49JWRcbiIsDQoJ CV9fZnVuY19fLA0KCQlsZTMyX3RvX2NwdShyeF9kZXNjLT5vcHRzMSksDQoJCWxlMzJfdG9fY3B1 KHJ4X2Rlc2MtPm9wdHMyKSwNCgkJbGUzMl90b19jcHUocnhfZGVzYy0+b3B0czMpLA0KCQlsZTMy X3RvX2NwdShyeF9kZXNjLT5vcHRzNCksDQoJCWxlMzJfdG9fY3B1KHJ4X2Rlc2MtPm9wdHM1KSwN CgkJbGUzMl90b19jcHUocnhfZGVzYy0+b3B0czYpLA0KCQlyeF9sZW4pOw0KfQ0KDQpzdGF0aWMg aW50IHI4MTUyX2NoZWNrX3J4X2Rlc2Moc3RydWN0IHI4MTUyICp0cCwgc3RydWN0IHJ4X2Rlc2Mg KnJ4X2Rlc2MpDQp7DQoJdTMyIG9wdHMxLCBvcHRzMiwgb3B0czMsIG9wdHM0LCBvcHRzNSwgb3B0 czY7DQoJaW50IHBrdF9sZW47DQoNCglpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMSkNCgkJ cmV0dXJuIDA7ICAvKiByeF9kZXNjIGxvb2tzIG9rYXkgKi8NCg0KCW9wdHMxID0gbGUzMl90b19j cHUocnhfZGVzYy0+b3B0czEpOw0KCW9wdHMyID0gbGUzMl90b19jcHUocnhfZGVzYy0+b3B0czIp Ow0KCW9wdHMzID0gbGUzMl90b19jcHUocnhfZGVzYy0+b3B0czMpOw0KCW9wdHM0ID0gbGUzMl90 b19jcHUocnhfZGVzYy0+b3B0czQpOw0KCW9wdHM1ID0gbGUzMl90b19jcHUocnhfZGVzYy0+b3B0 czUpOw0KCW9wdHM2ID0gbGUzMl90b19jcHUocnhfZGVzYy0+b3B0czYpOw0KCXBrdF9sZW4gPSAo b3B0czEgJiBSWF9MRU5fTUFTSykgLSBDUkNfU0laRTsNCg0KCWlmICggIW9wdHMxDQoJIHx8ICgo b3B0czEgJiAweDBmZjNmMDAwKSAhPSAweDA0NDAwMDAwICYmIChvcHRzMSAmIDB4ZmZmZjAwMDAp ICE9IDB4MDAwNDAwMDAgJiYgKG9wdHMxICYgMHhmZmZmMDAwMCkgIT0gMHgwMDA4MDAwMCkNCgkg fHwgIChvcHRzMiAmIH4oQklUKDMwKXxSRF9VRFBfQ1N8UkRfVENQX0NTfFJEX0lQVjZfQ1N8UkRf SVBWNF9DUykpDQoJIHx8ICgob3B0czIgJiBSRF9JUFY2X0NTKSAmJiAob3B0czIgJiBSRF9JUFY0 X0NTKSkNCgkgfHwgKChvcHRzMyAmIDB4ZmZmZjAwMDApICYgfihJUEZ8VURQRnxUQ1BGfFJYX1ZM QU5fVEFHKSkgIC8vIDB4ZmYxNzAwMDANCgkgfHwgIChvcHRzNCAmIDB4MDYwY2ZmZjgpICE9IDB4 MDYwMDAwMDANCgkgfHwgIChvcHRzNSB8IG9wdHM2KQ0KCSB8fCBwa3RfbGVuID4gKHRwLT5uZXRk ZXYtPm10dSArIDQyKQ0KCSl7DQoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByeF9kZXNjIGxv b2tzIGJhZC5cbiIsIF9fZnVuY19fKTsNCgkJcmV0dXJuIC1FSU87ICAvKiByeF9kZXNjIGxvb2tz IGJhZCAqLw0KCX0NCglyZXR1cm4gMDsgIC8qIHJ4X2Rlc2MgbG9va3Mgb2theSAqLw0KfQ0KDQpz dGF0aWMgaW50IHJ4X2JvdHRvbShzdHJ1Y3QgcjgxNTIgKnRwLCBpbnQgYnVkZ2V0KQ0Kew0KCXVu c2lnbmVkIGxvbmcgZmxhZ3M7DQoJc3RydWN0IGxpc3RfaGVhZCAqY3Vyc29yLCAqbmV4dCwgcnhf cXVldWU7DQoJaW50IHJldCA9IDAsIHdvcmtfZG9uZSA9IDA7DQoNCglpZiAoIXNrYl9xdWV1ZV9l bXB0eSgmdHAtPnJ4X3F1ZXVlKSkgew0KCQl3aGlsZSAod29ya19kb25lIDwgYnVkZ2V0KSB7DQoJ CQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZSgmdHAtPnJ4X3F1ZXVlKTsNCgkJ CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0cC0+bmV0ZGV2Ow0KCQkJc3RydWN0IG5ldF9k ZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5ldGRldi0+c3RhdHM7DQoJCQl1bnNpZ25lZCBpbnQgcGt0 X2xlbjsNCg0KCQkJaWYgKCFza2IpDQoJCQkJYnJlYWs7DQoNCgkJCXBrdF9sZW4gPSBza2ItPmxl bjsNCgkJCW5hcGlfZ3JvX3JlY2VpdmUoJnRwLT5uYXBpLCBza2IpOw0KCQkJd29ya19kb25lKys7 DQoJCQlzdGF0cy0+cnhfcGFja2V0cysrOw0KCQkJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9sZW47 DQoJCX0NCgl9DQoNCglpZiAobGlzdF9lbXB0eSgmdHAtPnJ4X2RvbmUpKQ0KCQlnb3RvIG91dDE7 DQoNCglJTklUX0xJU1RfSEVBRCgmcnhfcXVldWUpOw0KCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+ cnhfbG9jaywgZmxhZ3MpOw0KCWxpc3Rfc3BsaWNlX2luaXQoJnRwLT5yeF9kb25lLCAmcnhfcXVl dWUpOw0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5yeF9sb2NrLCBmbGFncyk7DQoNCgls aXN0X2Zvcl9lYWNoX3NhZmUoY3Vyc29yLCBuZXh0LCAmcnhfcXVldWUpIHsNCgkJc3RydWN0IHJ4 X2Rlc2MgKnJ4X2Rlc2M7DQoJCXN0cnVjdCByeF9hZ2cgKmFnZzsNCgkJaW50IGxlbl91c2VkID0g MDsNCgkJc3RydWN0IHVyYiAqdXJiOw0KCQl1OCAqcnhfZGF0YTsNCg0KCQlsaXN0X2RlbF9pbml0 KGN1cnNvcik7DQoNCgkJYWdnID0gbGlzdF9lbnRyeShjdXJzb3IsIHN0cnVjdCByeF9hZ2csIGxp c3QpOw0KCQl1cmIgPSBhZ2ctPnVyYjsNCgkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IChzaXpl b2Yoc3RydWN0IHJ4X2Rlc2MpICsgRVRIX1pMRU4pKSB7DQoJCQlwcmludGsoS0VSTl9XQVJOSU5H ICJyODE1Ml9yeF9ib3R0b206IFVSQiB0b28gc21hbGw6IGFjdHVhbF9sZW5ndGg9JXVcbiIsIHVy Yi0+YWN0dWFsX2xlbmd0aCk7DQoJCQlnb3RvIHN1Ym1pdDsNCgkJfQ0KDQoJCXJ4X2Rlc2MgPSBh Z2ctPmhlYWQ7DQoJCXJ4X2RhdGEgPSBhZ2ctPmhlYWQ7DQoNCgkJbWIoKTsNCgkJd2hpbGUgKHVy Yi0+YWN0dWFsX2xlbmd0aCA+IGxlbl91c2VkKSB7DQoJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0 ZGV2ID0gdHAtPm5ldGRldjsNCgkJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZu ZXRkZXYtPnN0YXRzOw0KCQkJdW5zaWduZWQgaW50IHBrdF9sZW47DQoJCQlzdHJ1Y3Qgc2tfYnVm ZiAqc2tiOw0KDQoJCQlpZiAoKGxlbl91c2VkICsgc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSkgPiB1 cmItPmFjdHVhbF9sZW5ndGgpIHsNCgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyODE1Ml9yeF9i b3R0b206IG9mZnNldD0ldS8ldSB0b28gc21hbGwgZm9yIHJ4X2Rlc2NcbiIsDQoJCQkJCWxlbl91 c2VkLCB1cmItPmFjdHVhbF9sZW5ndGgpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJbGVuX3VzZWQg Kz0gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsNCg0KCQkJaWYgKHI4MTUyX2NoZWNrX3J4X2Rlc2Mo dHAsIHJ4X2Rlc2MpKSB7DQoJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicjgxNTJfcnhfYm90dG9t OiBvZmZzZXQ9JXUvJXUgYmFkIHJ4X2Rlc2NcbiIsDQoJCQkJCWxlbl91c2VkIC0gc2l6ZW9mKHN0 cnVjdCByeF9kZXNjKSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsNCgkJCQlyODE1Ml9kdW1wX3J4X2Rl c2MocnhfZGVzYyk7DQoJCQl9DQoNCgkJCXBrdF9sZW4gPSBsZTMyX3RvX2NwdShyeF9kZXNjLT5v cHRzMSkgJiBSWF9MRU5fTUFTSzsNCgkJCWlmIChwa3RfbGVuIDwgRVRIX1pMRU4pIHsNCgkJCQlw cmludGsoS0VSTl9XQVJOSU5HICJyODE1Ml9yeF9ib3R0b206IG9mZnNldD0ldS8ldSBwa3RfbGVu KCV1KSA8IEVUSF9aTEVOXG4iLA0KCQkJCQlsZW5fdXNlZCwgdXJiLT5hY3R1YWxfbGVuZ3RoLCBw a3RfbGVuKTsNCgkJCQlyODE1Ml9kdW1wX3J4X2Rlc2MocnhfZGVzYyk7DQoJCQkJYnJlYWs7DQoJ CQl9DQoNCgkJCWxlbl91c2VkICs9IHBrdF9sZW47DQoJCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3Ro IDwgbGVuX3VzZWQpIHsNCgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyODE1Ml9yeF9ib3R0b206 IG9mZnNldD0ldS8ldSBwa3RfbGVuKCV1KSBleGNlZWRzIGJ1ZmZlclxuIiwNCgkJCQkJbGVuX3Vz ZWQgLSBwa3RfbGVuLCB1cmItPmFjdHVhbF9sZW5ndGgsIHBrdF9sZW4pOw0KCQkJCXI4MTUyX2R1 bXBfcnhfZGVzYyhyeF9kZXNjKTsNCgkJCQlicmVhazsNCgkJCX0NCg0KCQkJcGt0X2xlbiAtPSBD UkNfU0laRTsNCgkJCXJ4X2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsNCg0KCQkJc2ti ID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZXRkZXYsIHBrdF9sZW4pOw0KCQkJaWYgKCFz a2IpIHsNCgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyODE1Ml9yeF9ib3R0b206IG5ldGRldl9h bGxvY19za2JfaXBfYWxpZ24oJXUpIGZhaWxlZFxuIiwgcGt0X2xlbik7DQoJCQkJc3RhdHMtPnJ4 X2Ryb3BwZWQrKzsNCgkJCQlnb3RvIGZpbmRfbmV4dF9yeDsNCgkJCX0NCg0KCQkJc2tiLT5pcF9z dW1tZWQgPSByODE1Ml9yeF9jc3VtKHRwLCByeF9kZXNjKTsNCgkJCW1lbWNweShza2ItPmRhdGEs IHJ4X2RhdGEsIHBrdF9sZW4pOw0KCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOw0KCQkJc2tiLT5w cm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsNCgkJCXJ0bF9yeF92bGFuX3Rh ZyhyeF9kZXNjLCBza2IpOw0KCQkJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgew0KCQkJCW5hcGlf Z3JvX3JlY2VpdmUoJnRwLT5uYXBpLCBza2IpOw0KCQkJCXdvcmtfZG9uZSsrOw0KCQkJCXN0YXRz LT5yeF9wYWNrZXRzKys7DQoJCQkJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9sZW47DQoJCQl9IGVs c2Ugew0KCQkJCV9fc2tiX3F1ZXVlX3RhaWwoJnRwLT5yeF9xdWV1ZSwgc2tiKTsNCgkJCX0NCg0K ZmluZF9uZXh0X3J4Og0KCQkJcnhfZGF0YSA9IHJ4X2FnZ19hbGlnbihyeF9kYXRhICsgcGt0X2xl biArIENSQ19TSVpFKTsNCgkJCXJ4X2Rlc2MgPSAoc3RydWN0IHJ4X2Rlc2MgKilyeF9kYXRhOw0K CQkJbGVuX3VzZWQgPSAoaW50KShyeF9kYXRhIC0gKHU4ICopYWdnLT5oZWFkKTsNCgkJfQ0KDQpz dWJtaXQ6DQoJCWlmICghcmV0KSB7DQoJCQlyZXQgPSByODE1Ml9zdWJtaXRfcngodHAsIGFnZywg R0ZQX0FUT01JQyk7DQoJCX0gZWxzZSB7DQoJCQl1cmItPmFjdHVhbF9sZW5ndGggPSAwOw0KCQkJ bGlzdF9hZGRfdGFpbCgmYWdnLT5saXN0LCBuZXh0KTsNCgkJfQ0KCX0NCg0KCWlmICghbGlzdF9l bXB0eSgmcnhfcXVldWUpKSB7DQoJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+cnhfbG9jaywgZmxh Z3MpOw0KCQlsaXN0X3NwbGljZV90YWlsKCZyeF9xdWV1ZSwgJnRwLT5yeF9kb25lKTsNCgkJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPnJ4X2xvY2ssIGZsYWdzKTsNCgl9DQoNCm91dDE6DQoJ cmV0dXJuIHdvcmtfZG9uZTsNCn0NCg0Kc3RhdGljIHZvaWQgdHhfYm90dG9tKHN0cnVjdCByODE1 MiAqdHApDQp7DQoJaW50IHJlczsNCg0KCWRvIHsNCgkJc3RydWN0IHR4X2FnZyAqYWdnOw0KDQoJ CWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT50eF9xdWV1ZSkpDQoJCQlicmVhazsNCg0KCQlhZ2cg PSByODE1Ml9nZXRfdHhfYWdnKHRwKTsNCgkJaWYgKCFhZ2cpDQoJCQlicmVhazsNCg0KCQlyZXMg PSByODE1Ml90eF9hZ2dfZmlsbCh0cCwgYWdnKTsNCgkJaWYgKHJlcykgew0KCQkJc3RydWN0IG5l dF9kZXZpY2UgKm5ldGRldiA9IHRwLT5uZXRkZXY7DQoNCgkJCWlmIChyZXMgPT0gLUVOT0RFVikg ew0KCQkJCXNldF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpOw0KCQkJCW5ldGlmX2Rl dmljZV9kZXRhY2gobmV0ZGV2KTsNCgkJCX0gZWxzZSB7DQoJCQkJc3RydWN0IG5ldF9kZXZpY2Vf c3RhdHMgKnN0YXRzID0gJm5ldGRldi0+c3RhdHM7DQoJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsN Cg0KCQkJCW5ldGlmX3dhcm4odHAsIHR4X2VyciwgbmV0ZGV2LA0KCQkJCQkgICAiZmFpbGVkIHR4 X3VyYiAlZFxuIiwgcmVzKTsNCgkJCQlzdGF0cy0+dHhfZHJvcHBlZCArPSBhZ2ctPnNrYl9udW07 DQoNCgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPnR4X2xvY2ssIGZsYWdzKTsNCgkJCQlsaXN0 X2FkZF90YWlsKCZhZ2ctPmxpc3QsICZ0cC0+dHhfZnJlZSk7DQoJCQkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmdHAtPnR4X2xvY2ssIGZsYWdzKTsNCgkJCX0NCgkJfQ0KCX0gd2hpbGUgKHJlcyA9 PSAwKTsNCn0NCg0Kc3RhdGljIHZvaWQgYm90dG9tX2hhbGYoc3RydWN0IHI4MTUyICp0cCkNCnsN CglpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKQ0KCQlyZXR1cm47DQoN CglpZiAoIXRlc3RfYml0KFdPUktfRU5BQkxFLCAmdHAtPmZsYWdzKSkNCgkJcmV0dXJuOw0KDQoJ LyogV2hlbiBsaW5rIGRvd24sIHRoZSBkcml2ZXIgd291bGQgY2FuY2VsIGFsbCBidWxrcy4gKi8N CgkvKiBUaGlzIGF2b2lkIHRoZSByZS1zdWJtaXR0aW5nIGJ1bGsgKi8NCglpZiAoIW5ldGlmX2Nh cnJpZXJfb2sodHAtPm5ldGRldikpDQoJCXJldHVybjsNCg0KCWNsZWFyX2JpdChTQ0hFRFVMRV9O QVBJLCAmdHAtPmZsYWdzKTsNCg0KCXR4X2JvdHRvbSh0cCk7DQp9DQoNCnN0YXRpYyBpbnQgcjgx NTJfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpDQp7DQoJc3RydWN0 IHI4MTUyICp0cCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgcjgxNTIsIG5hcGkpOw0KCWlu dCB3b3JrX2RvbmU7DQoNCgl3b3JrX2RvbmUgPSByeF9ib3R0b20odHAsIGJ1ZGdldCk7DQoJYm90 dG9tX2hhbGYodHApOw0KDQoJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgew0KCQluYXBpX2NvbXBs ZXRlKG5hcGkpOw0KCQlpZiAoIWxpc3RfZW1wdHkoJnRwLT5yeF9kb25lKSkNCgkJCW5hcGlfc2No ZWR1bGUobmFwaSk7DQoJfQ0KDQoJcmV0dXJuIHdvcmtfZG9uZTsNCn0NCg0Kc3RhdGljDQppbnQg cjgxNTJfc3VibWl0X3J4KHN0cnVjdCByODE1MiAqdHAsIHN0cnVjdCByeF9hZ2cgKmFnZywgZ2Zw X3QgbWVtX2ZsYWdzKQ0Kew0KCWludCByZXQ7DQoNCgkvKiBUaGUgcnggd291bGQgYmUgc3RvcHBl ZCwgc28gc2tpcCBzdWJtaXR0aW5nICovDQoJaWYgKHRlc3RfYml0KFJUTDgxNTJfVU5QTFVHLCAm dHAtPmZsYWdzKSB8fA0KCSAgICAhdGVzdF9iaXQoV09SS19FTkFCTEUsICZ0cC0+ZmxhZ3MpIHx8 ICFuZXRpZl9jYXJyaWVyX29rKHRwLT5uZXRkZXYpKQ0KCQlyZXR1cm4gMDsgIC8qIEZJWE1FOiBt ZW1vcnkgbGVhaz8gKi8NCg0KCXVzYl9maWxsX2J1bGtfdXJiKGFnZy0+dXJiLCB0cC0+dWRldiwg dXNiX3JjdmJ1bGtwaXBlKHRwLT51ZGV2LCAxKSwNCgkJCSAgYWdnLT5oZWFkLCBhZ2dfYnVmX3N6 LA0KCQkJICAodXNiX2NvbXBsZXRlX3QpcmVhZF9idWxrX2NhbGxiYWNrLCBhZ2cpOw0KDQoJYWdn LT51cmItPnRyYW5zZmVyX2RtYSAgPSBhZ2ctPnRyYW5zZmVyX2RtYTsNCglhZ2ctPnVyYi0+dHJh bnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7DQoJbWIoKTsNCglyZXQgPSB1 c2Jfc3VibWl0X3VyYihhZ2ctPnVyYiwgbWVtX2ZsYWdzKTsNCglpZiAocmV0ID09IC1FTk9ERVYp IHsNCgkJc2V0X2JpdChSVEw4MTUyX1VOUExVRywgJnRwLT5mbGFncyk7DQoJCW5ldGlmX2Rldmlj ZV9kZXRhY2godHAtPm5ldGRldik7DQoJfSBlbHNlIGlmIChyZXQpIHsNCgkJc3RydWN0IHVyYiAq dXJiID0gYWdnLT51cmI7DQoJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQoNCgkJdXJiLT5hY3R1YWxf bGVuZ3RoID0gMDsNCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5yeF9sb2NrLCBmbGFncyk7DQoJ CWxpc3RfYWRkX3RhaWwoJmFnZy0+bGlzdCwgJnRwLT5yeF9kb25lKTsNCgkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmdHAtPnJ4X2xvY2ssIGZsYWdzKTsNCg0KCQluZXRpZl9lcnIodHAsIHJ4X2Vy ciwgdHAtPm5ldGRldiwNCgkJCSAgIkNvdWxkbid0IHN1Ym1pdCByeFslcF0sIHJldCA9ICVkXG4i LCBhZ2csIHJldCk7DQoNCgkJbmFwaV9zY2hlZHVsZSgmdHAtPm5hcGkpOw0KCX0NCg0KCXJldHVy biByZXQ7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bF9kcm9wX3F1ZXVlZF90eChzdHJ1Y3QgcjgxNTIg KnRwKQ0Kew0KCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0cC0+bmV0ZGV2LT5z dGF0czsNCglzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl9oZWFkLCAqdHhfcXVldWUgPSAmdHAtPnR4 X3F1ZXVlOw0KCXN0cnVjdCBza19idWZmICpza2I7DQoNCglpZiAoc2tiX3F1ZXVlX2VtcHR5KHR4 X3F1ZXVlKSkNCgkJcmV0dXJuOw0KDQoJX19za2JfcXVldWVfaGVhZF9pbml0KCZza2JfaGVhZCk7 DQoJc3Bpbl9sb2NrX2JoKCZ0eF9xdWV1ZS0+bG9jayk7DQoJc2tiX3F1ZXVlX3NwbGljZV9pbml0 KHR4X3F1ZXVlLCAmc2tiX2hlYWQpOw0KCXNwaW5fdW5sb2NrX2JoKCZ0eF9xdWV1ZS0+bG9jayk7 DQoNCgl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnNrYl9oZWFkKSkpIHsNCgkJZGV2X2tm cmVlX3NrYihza2IpOw0KCQlzdGF0cy0+dHhfZHJvcHBlZCsrOw0KCX0NCn0NCg0Kc3RhdGljIHZv aWQgcnRsODE1Ml90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpDQp7DQoJc3Ry dWN0IHI4MTUyICp0cCA9IG5ldGRldl9wcml2KG5ldGRldik7DQoNCgluZXRpZl93YXJuKHRwLCB0 eF9lcnIsIG5ldGRldiwgIlR4IHRpbWVvdXRcbiIpOw0KDQoJdXNiX3F1ZXVlX3Jlc2V0X2Rldmlj ZSh0cC0+aW50Zik7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bDgxNTJfc2V0X3J4X21vZGUoc3RydWN0 IG5ldF9kZXZpY2UgKm5ldGRldikNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYo bmV0ZGV2KTsNCg0KCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsNCgkJc2V0X2JpdChS VEw4MTUyX1NFVF9SWF9NT0RFLCAmdHAtPmZsYWdzKTsNCgkJc2NoZWR1bGVfZGVsYXllZF93b3Jr KCZ0cC0+c2NoZWR1bGUsIDApOw0KCX0NCn0NCg0Kc3RhdGljIHZvaWQgX3J0bDgxNTJfc2V0X3J4 X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0g bmV0ZGV2X3ByaXYobmV0ZGV2KTsNCgl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFz aCBmaWx0ZXIgKi8NCglfX2xlMzIgdG1wWzJdOw0KCXUzMiBvY3BfZGF0YTsNCg0KCWNsZWFyX2Jp dChSVEw4MTUyX1NFVF9SWF9NT0RFLCAmdHAtPmZsYWdzKTsNCgluZXRpZl9zdG9wX3F1ZXVlKG5l dGRldik7DQoJb2NwX2RhdGEgPSBvY3BfcmVhZF9kd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFf UkNSKTsNCglvY3BfZGF0YSAmPSB+UkNSX0FDUFRfQUxMOw0KCW9jcF9kYXRhIHw9IFJDUl9BQiB8 IFJDUl9BUE07DQoNCglpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7DQoJCS8qIFVu Y29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovDQoJCW5ldGlmX25vdGljZSh0cCwgbGluaywg bmV0ZGV2LCAiUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkXG4iKTsNCgkJb2NwX2RhdGEgfD0gUkNS X0FNIHwgUkNSX0FBUDsNCgkJbWNfZmlsdGVyWzFdID0gMHhmZmZmZmZmZjsNCgkJbWNfZmlsdGVy WzBdID0gMHhmZmZmZmZmZjsNCgl9IGVsc2UgaWYgKChuZXRkZXZfbWNfY291bnQobmV0ZGV2KSA+ IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpIHx8DQoJCSAgIChuZXRkZXYtPmZsYWdzICYgSUZGX0FM TE1VTFRJKSkgew0KCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBh bGwgbXVsdGljYXN0cy4gKi8NCgkJb2NwX2RhdGEgfD0gUkNSX0FNOw0KCQltY19maWx0ZXJbMV0g PSAweGZmZmZmZmZmOw0KCQltY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOw0KCX0gZWxzZSB7DQoJ CXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7DQoNCgkJbWNfZmlsdGVyWzFdID0gMDsNCgkJbWNf ZmlsdGVyWzBdID0gMDsNCgkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5ldGRldikgew0K CQkJaW50IGJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgaGEtPmFkZHIpID4+IDI2Ow0KDQoJ CQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsNCgkJCW9jcF9k YXRhIHw9IFJDUl9BTTsNCgkJfQ0KCX0NCg0KCXRtcFswXSA9IF9fY3B1X3RvX2xlMzIoc3dhYjMy KG1jX2ZpbHRlclsxXSkpOw0KCXRtcFsxXSA9IF9fY3B1X3RvX2xlMzIoc3dhYjMyKG1jX2ZpbHRl clswXSkpOw0KDQoJcGxhX29jcF93cml0ZSh0cCwgUExBX01BUiwgQllURV9FTl9EV09SRCwgc2l6 ZW9mKHRtcCksIHRtcCk7DQoJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9S Q1IsIG9jcF9kYXRhKTsNCgluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7DQp9DQoNCnN0YXRpYyBu ZXRkZXZfZmVhdHVyZXNfdA0KcnRsODE1Ml9mZWF0dXJlc19jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAq c2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LA0KCQkgICAgICAgbmV0ZGV2X2ZlYXR1cmVzX3Qg ZmVhdHVyZXMpDQp7DQoJdTMyIG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7DQoJaW50 IG1heF9vZmZzZXQgPSBtc3MgPyBHVFRDUEhPX01BWCA6IFRDUEhPX01BWDsNCglpbnQgb2Zmc2V0 ID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsNCg0KCWlmICgobXNzIHx8IHNrYi0+aXBfc3Vt bWVkID09IENIRUNLU1VNX1BBUlRJQUwpICYmIG9mZnNldCA+IG1heF9vZmZzZXQpDQoJCWZlYXR1 cmVzICY9IH4oTkVUSUZfRl9BTExfQ1NVTSB8IE5FVElGX0ZfR1NPX01BU0spOw0KCWVsc2UgaWYg KChza2ItPmxlbiArIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpID4gYWdnX2J1Zl9zeikNCgkJZmVh dHVyZXMgJj0gfk5FVElGX0ZfR1NPX01BU0s7DQoNCglyZXR1cm4gZmVhdHVyZXM7DQp9DQoNCnN0 YXRpYyBuZXRkZXZfdHhfdCBydGw4MTUyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwN CgkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQ0Kew0KCXN0cnVjdCByODE1MiAq dHAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOw0KDQoJc2tiX3R4X3RpbWVzdGFtcChza2IpOw0KDQoJ c2tiX3F1ZXVlX3RhaWwoJnRwLT50eF9xdWV1ZSwgc2tiKTsNCg0KCWlmICghbGlzdF9lbXB0eSgm dHAtPnR4X2ZyZWUpKSB7DQoJCWlmICh0ZXN0X2JpdChTRUxFQ1RJVkVfU1VTUEVORCwgJnRwLT5m bGFncykpIHsNCgkJCXNldF9iaXQoU0NIRURVTEVfTkFQSSwgJnRwLT5mbGFncyk7DQoJCQlzY2hl ZHVsZV9kZWxheWVkX3dvcmsoJnRwLT5zY2hlZHVsZSwgMCk7DQoJCX0gZWxzZSB7DQoJCQl1c2Jf bWFya19sYXN0X2J1c3kodHAtPnVkZXYpOw0KCQkJbmFwaV9zY2hlZHVsZSgmdHAtPm5hcGkpOw0K CQl9DQoJfSBlbHNlIGlmIChza2JfcXVldWVfbGVuKCZ0cC0+dHhfcXVldWUpID4gdHAtPnR4X3Fs ZW4pIHsNCgkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOw0KCX0NCg0KCXJldHVybiBORVRERVZf VFhfT0s7DQp9DQoNCnN0YXRpYyB2b2lkIHI4MTUyYl9yZXNldF9wYWNrZXRfZmlsdGVyKHN0cnVj dCByODE1MiAqdHApDQp7DQoJdTMyCW9jcF9kYXRhOw0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93 b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9GTUMpOw0KCW9jcF9kYXRhICY9IH5GTUNfRkNSX01D VV9FTjsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRk1DLCBvY3BfZGF0 YSk7DQoJb2NwX2RhdGEgfD0gRk1DX0ZDUl9NQ1VfRU47DQoJb2NwX3dyaXRlX3dvcmQodHAsIE1D VV9UWVBFX1BMQSwgUExBX0ZNQywgb2NwX2RhdGEpOw0KfQ0KDQpzdGF0aWMgdm9pZCBydGw4MTUy X25pY19yZXNldChzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCWludAlpOw0KDQoJb2NwX3dyaXRlX2J5 dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX0NSLCBDUl9SU1QpOw0KDQoJZm9yIChpID0gMDsgaSA8 IDEwMDA7IGkrKykgew0KCQlpZiAoIShvY3BfcmVhZF9ieXRlKHRwLCBNQ1VfVFlQRV9QTEEsIFBM QV9DUikgJiBDUl9SU1QpKQ0KCQkJYnJlYWs7DQoJCXVzbGVlcF9yYW5nZSgxMDAsIDQwMCk7DQoJ fQ0KfQ0KDQpzdGF0aWMgdm9pZCBzZXRfdHhfcWxlbihzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXN0 cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0cC0+bmV0ZGV2Ow0KDQoJdHAtPnR4X3FsZW4gPSBh Z2dfYnVmX3N6IC8gKG5ldGRldi0+bXR1ICsgVkxBTl9FVEhfSExFTiArIFZMQU5fSExFTiArDQoJ CQkJICAgIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpOw0KfQ0KDQpzdGF0aWMgaW5saW5lIHU4IHJ0 bDgxNTJfZ2V0X3NwZWVkKHN0cnVjdCByODE1MiAqdHApDQp7DQoJcmV0dXJuIG9jcF9yZWFkX2J5 dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX1BIWVNUQVRVUyk7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0 bF9zZXRfZWVlX3BsdXMoc3RydWN0IHI4MTUyICp0cCkNCnsNCgl1MzIgb2NwX2RhdGE7DQoJdTgg c3BlZWQ7DQoNCglzcGVlZCA9IHJ0bDgxNTJfZ2V0X3NwZWVkKHRwKTsNCglpZiAoc3BlZWQgJiBf MTBicHMpIHsNCgkJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBM QV9FRUVQX0NSKTsNCgkJb2NwX2RhdGEgfD0gRUVFUF9DUl9FRUVQX1RYOw0KCQlvY3Bfd3JpdGVf d29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFUF9DUiwgb2NwX2RhdGEpOw0KCX0gZWxzZSB7 DQoJCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFUF9D Uik7DQoJCW9jcF9kYXRhICY9IH5FRUVQX0NSX0VFRVBfVFg7DQoJCW9jcF93cml0ZV93b3JkKHRw LCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVQX0NSLCBvY3BfZGF0YSk7DQoJfQ0KfQ0KDQpzdGF0aWMg dm9pZCByeGR5X2dhdGVkX2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQ0Kew0KCXUz MiBvY3BfZGF0YTsNCg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExB LCBQTEFfTUlTQ18xKTsNCglpZiAoZW5hYmxlKQ0KCQlvY3BfZGF0YSB8PSBSWERZX0dBVEVEX0VO Ow0KCWVsc2UNCgkJb2NwX2RhdGEgJj0gflJYRFlfR0FURURfRU47DQoJb2NwX3dyaXRlX3dvcmQo dHAsIE1DVV9UWVBFX1BMQSwgUExBX01JU0NfMSwgb2NwX2RhdGEpOw0KfQ0KDQpzdGF0aWMgaW50 IHJ0bF9zdGFydF9yeChzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCWludCBpLCByZXQgPSAwOw0KDQoJ SU5JVF9MSVNUX0hFQUQoJnRwLT5yeF9kb25lKTsNCglmb3IgKGkgPSAwOyBpIDwgUlRMODE1Ml9N QVhfUlg7IGkrKykgew0KCQlJTklUX0xJU1RfSEVBRCgmdHAtPnJ4X2luZm9baV0ubGlzdCk7DQoJ CXJldCA9IHI4MTUyX3N1Ym1pdF9yeCh0cCwgJnRwLT5yeF9pbmZvW2ldLCBHRlBfS0VSTkVMKTsN CgkJaWYgKHJldCkNCgkJCWJyZWFrOw0KCX0NCg0KCWlmIChyZXQgJiYgKytpIDwgUlRMODE1Ml9N QVhfUlgpIHsNCgkJc3RydWN0IGxpc3RfaGVhZCByeF9xdWV1ZTsNCgkJdW5zaWduZWQgbG9uZyBm bGFnczsNCg0KCQlJTklUX0xJU1RfSEVBRCgmcnhfcXVldWUpOw0KDQoJCWRvIHsNCgkJCXN0cnVj dCByeF9hZ2cgKmFnZyA9ICZ0cC0+cnhfaW5mb1tpKytdOw0KCQkJc3RydWN0IHVyYiAqdXJiID0g YWdnLT51cmI7DQoNCgkJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7DQoJCQlsaXN0X2FkZF90YWls KCZhZ2ctPmxpc3QsICZyeF9xdWV1ZSk7DQoJCX0gd2hpbGUgKGkgPCBSVEw4MTUyX01BWF9SWCk7 DQoNCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5yeF9sb2NrLCBmbGFncyk7DQoJCWxpc3Rfc3Bs aWNlX3RhaWwoJnJ4X3F1ZXVlLCAmdHAtPnJ4X2RvbmUpOw0KCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZ0cC0+cnhfbG9jaywgZmxhZ3MpOw0KCX0NCg0KCXJldHVybiByZXQ7DQp9DQoNCnN0YXRp YyBpbnQgcnRsX3N0b3Bfcngoc3RydWN0IHI4MTUyICp0cCkNCnsNCglpbnQgaTsNCg0KCWZvciAo aSA9IDA7IGkgPCBSVEw4MTUyX01BWF9SWDsgaSsrKQ0KCQl1c2Jfa2lsbF91cmIodHAtPnJ4X2lu Zm9baV0udXJiKTsNCg0KCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+cnhfcXVldWUpKQ0K CQlkZXZfa2ZyZWVfc2tiKF9fc2tiX2RlcXVldWUoJnRwLT5yeF9xdWV1ZSkpOw0KDQoJcmV0dXJu IDA7DQp9DQoNCnN0YXRpYyBpbnQgcnRsX2VuYWJsZShzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXUz MiBvY3BfZGF0YTsNCg0KCXI4MTUyYl9yZXNldF9wYWNrZXRfZmlsdGVyKHRwKTsNCg0KCW9jcF9k YXRhID0gb2NwX3JlYWRfYnl0ZSh0cCwgTUNVX1RZUEVfUExBLCBQTEFfQ1IpOw0KCW9jcF9kYXRh IHw9IENSX1JFIHwgQ1JfVEU7DQoJb2NwX3dyaXRlX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExB X0NSLCBvY3BfZGF0YSk7DQoNCglyeGR5X2dhdGVkX2VuKHRwLCBmYWxzZSk7DQoNCglyZXR1cm4g MDsNCn0NCg0Kc3RhdGljIGludCBydGw4MTUyX2VuYWJsZShzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0K CWlmICh0ZXN0X2JpdChSVEw4MTUyX1VOUExVRywgJnRwLT5mbGFncykpDQoJCXJldHVybiAtRU5P REVWOw0KDQoJc2V0X3R4X3FsZW4odHApOw0KCXJ0bF9zZXRfZWVlX3BsdXModHApOw0KDQoJcmV0 dXJuIHJ0bF9lbmFibGUodHApOw0KfQ0KDQpzdGF0aWMgdm9pZCByODE1M19zZXRfcnhfZWFybHlf dGltZW91dChzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXUzMiBvY3BfZGF0YSA9IHRwLT5jb2FsZXNj ZSAvIDg7DQoNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUlhfRUFSTFlf VElNRU9VVCwgb2NwX2RhdGEpOw0KfQ0KDQpzdGF0aWMgdm9pZCByODE1M19zZXRfcnhfZWFybHlf c2l6ZShzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXUzMiBtdHUgPSB0cC0+bmV0ZGV2LT5tdHU7DQoJ dTMyIG9jcF9kYXRhID0gKGFnZ19idWZfc3ogLSBtdHUgLSBWTEFOX0VUSF9ITEVOIC0gVkxBTl9I TEVOKSAvIDQ7DQoNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUlhfRUFS TFlfU0laRSwgb2NwX2RhdGEpOw0KfQ0KDQpzdGF0aWMgaW50IHJ0bDgxNTNfZW5hYmxlKHN0cnVj dCByODE1MiAqdHApDQp7DQoJaWYgKHRlc3RfYml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdz KSkNCgkJcmV0dXJuIC1FTk9ERVY7DQoNCgl1c2JfZGlzYWJsZV9scG0odHAtPnVkZXYpOw0KCXNl dF90eF9xbGVuKHRwKTsNCglydGxfc2V0X2VlZV9wbHVzKHRwKTsNCglyODE1M19zZXRfcnhfZWFy bHlfdGltZW91dCh0cCk7DQoJcjgxNTNfc2V0X3J4X2Vhcmx5X3NpemUodHApOw0KDQoJcmV0dXJu IHJ0bF9lbmFibGUodHApOw0KfQ0KDQpzdGF0aWMgdm9pZCBydGxfZGlzYWJsZShzdHJ1Y3Qgcjgx NTIgKnRwKQ0Kew0KCXUzMiBvY3BfZGF0YTsNCglpbnQgaTsNCg0KCWlmICh0ZXN0X2JpdChSVEw4 MTUyX1VOUExVRywgJnRwLT5mbGFncykpIHsNCgkJcnRsX2Ryb3BfcXVldWVkX3R4KHRwKTsNCgkJ cmV0dXJuOw0KCX0NCg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfZHdvcmQodHAsIE1DVV9UWVBFX1BM QSwgUExBX1JDUik7DQoJb2NwX2RhdGEgJj0gflJDUl9BQ1BUX0FMTDsNCglvY3Bfd3JpdGVfZHdv cmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JDUiwgb2NwX2RhdGEpOw0KDQoJcnRsX2Ryb3BfcXVl dWVkX3R4KHRwKTsNCg0KCWZvciAoaSA9IDA7IGkgPCBSVEw4MTUyX01BWF9UWDsgaSsrKQ0KCQl1 c2Jfa2lsbF91cmIodHAtPnR4X2luZm9baV0udXJiKTsNCg0KCXJ4ZHlfZ2F0ZWRfZW4odHAsIHRy dWUpOw0KDQoJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgew0KCQlvY3BfZGF0YSA9IG9jcF9y ZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX09PQl9DVFJMKTsNCgkJaWYgKChvY3BfZGF0 YSAmIEZJRk9fRU1QVFkpID09IEZJRk9fRU1QVFkpDQoJCQlicmVhazsNCgkJdXNsZWVwX3Jhbmdl KDEwMDAsIDIwMDApOw0KCX0NCg0KCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsNCgkJaWYg KG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1RDUjApICYgVENSMF9UWF9FTVBU WSkNCgkJCWJyZWFrOw0KCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7DQoJfQ0KDQoJcnRsX3N0 b3BfcngodHApOw0KDQoJcnRsODE1Ml9uaWNfcmVzZXQodHApOw0KfQ0KDQpzdGF0aWMgdm9pZCBy ODE1Ml9wb3dlcl9jdXRfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpDQp7DQoJdTMy IG9jcF9kYXRhOw0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9VU0Is IFVTQl9VUFNfQ1RSTCk7DQoJaWYgKGVuYWJsZSkNCgkJb2NwX2RhdGEgfD0gUE9XRVJfQ1VUOw0K CWVsc2UNCgkJb2NwX2RhdGEgJj0gflBPV0VSX0NVVDsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNV X1RZUEVfVVNCLCBVU0JfVVBTX0NUUkwsIG9jcF9kYXRhKTsNCg0KCW9jcF9kYXRhID0gb2NwX3Jl YWRfd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUE1fQ1RSTF9TVEFUVVMpOw0KCW9jcF9kYXRh ICY9IH5SRVNVTUVfSU5ESUNBVEU7DQoJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1VTQiwg VVNCX1BNX0NUUkxfU1RBVFVTLCBvY3BfZGF0YSk7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bF9yeF92 bGFuX2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQ0Kew0KCXUzMiBvY3BfZGF0YTsN Cg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfQ1BDUik7 DQoJaWYgKGVuYWJsZSkNCgkJb2NwX2RhdGEgfD0gQ1BDUl9SWF9WTEFOOw0KCWVsc2UNCgkJb2Nw X2RhdGEgJj0gfkNQQ1JfUlhfVkxBTjsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExB LCBQTEFfQ1BDUiwgb2NwX2RhdGEpOw0KfQ0KDQpzdGF0aWMgaW50IHJ0bDgxNTJfc2V0X2ZlYXR1 cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsDQoJCQkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVy ZXMpDQp7DQoJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGZlYXR1cmVzIF4gZGV2LT5mZWF0 dXJlczsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsNCglpbnQgcmV0Ow0K DQoJcmV0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHRwLT5pbnRmKTsNCglpZiAocmV0IDwg MCkNCgkJZ290byBvdXQ7DQoNCgltdXRleF9sb2NrKCZ0cC0+Y29udHJvbCk7DQoNCglpZiAoY2hh bmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSB7DQoJCWlmIChmZWF0dXJlcyAmIE5FVElG X0ZfSFdfVkxBTl9DVEFHX1JYKQ0KCQkJcnRsX3J4X3ZsYW5fZW4odHAsIHRydWUpOw0KCQllbHNl DQoJCQlydGxfcnhfdmxhbl9lbih0cCwgZmFsc2UpOw0KCX0NCg0KCW11dGV4X3VubG9jaygmdHAt PmNvbnRyb2wpOw0KDQoJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHRwLT5pbnRmKTsNCg0Kb3V0 Og0KCXJldHVybiByZXQ7DQp9DQoNCiNkZWZpbmUgV0FLRV9BTlkgKFdBS0VfUEhZIHwgV0FLRV9N QUdJQyB8IFdBS0VfVUNBU1QgfCBXQUtFX0JDQVNUIHwgV0FLRV9NQ0FTVCkNCg0Kc3RhdGljIHUz MiBfX3J0bF9nZXRfd29sKHN0cnVjdCByODE1MiAqdHApDQp7DQoJdTMyIG9jcF9kYXRhOw0KCXUz MiB3b2xvcHRzID0gMDsNCg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfYnl0ZSh0cCwgTUNVX1RZUEVf UExBLCBQTEFfQ09ORklHNSk7DQoJaWYgKCEob2NwX2RhdGEgJiBMQU5fV0FLRV9FTikpDQoJCXJl dHVybiAwOw0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBM QV9DT05GSUczNCk7DQoJaWYgKG9jcF9kYXRhICYgTElOS19PTl9XQUtFX0VOKQ0KCQl3b2xvcHRz IHw9IFdBS0VfUEhZOw0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9Q TEEsIFBMQV9DT05GSUc1KTsNCglpZiAob2NwX2RhdGEgJiBVV0ZfRU4pDQoJCXdvbG9wdHMgfD0g V0FLRV9VQ0FTVDsNCglpZiAob2NwX2RhdGEgJiBCV0ZfRU4pDQoJCXdvbG9wdHMgfD0gV0FLRV9C Q0FTVDsNCglpZiAob2NwX2RhdGEgJiBNV0ZfRU4pDQoJCXdvbG9wdHMgfD0gV0FLRV9NQ0FTVDsN Cg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfQ0ZHX1dP TCk7DQoJaWYgKG9jcF9kYXRhICYgTUFHSUNfRU4pDQoJCXdvbG9wdHMgfD0gV0FLRV9NQUdJQzsN Cg0KCXJldHVybiB3b2xvcHRzOw0KfQ0KDQpzdGF0aWMgdm9pZCBfX3J0bF9zZXRfd29sKHN0cnVj dCByODE1MiAqdHAsIHUzMiB3b2xvcHRzKQ0Kew0KCXUzMiBvY3BfZGF0YTsNCg0KCW9jcF93cml0 ZV9ieXRlKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9DUldFQ1IsIENSV0VDUl9DT05GSUcpOw0KDQoJ b2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9DT05GSUczNCk7 DQoJb2NwX2RhdGEgJj0gfkxJTktfT05fV0FLRV9FTjsNCglpZiAod29sb3B0cyAmIFdBS0VfUEhZ KQ0KCQlvY3BfZGF0YSB8PSBMSU5LX09OX1dBS0VfRU47DQoJb2NwX3dyaXRlX3dvcmQodHAsIE1D VV9UWVBFX1BMQSwgUExBX0NPTkZJRzM0LCBvY3BfZGF0YSk7DQoNCglvY3BfZGF0YSA9IG9jcF9y ZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0NPTkZJRzUpOw0KCW9jcF9kYXRhICY9IH4o VVdGX0VOIHwgQldGX0VOIHwgTVdGX0VOIHwgTEFOX1dBS0VfRU4pOw0KCWlmICh3b2xvcHRzICYg V0FLRV9VQ0FTVCkNCgkJb2NwX2RhdGEgfD0gVVdGX0VOOw0KCWlmICh3b2xvcHRzICYgV0FLRV9C Q0FTVCkNCgkJb2NwX2RhdGEgfD0gQldGX0VOOw0KCWlmICh3b2xvcHRzICYgV0FLRV9NQ0FTVCkN CgkJb2NwX2RhdGEgfD0gTVdGX0VOOw0KCWlmICh3b2xvcHRzICYgV0FLRV9BTlkpDQoJCW9jcF9k YXRhIHw9IExBTl9XQUtFX0VOOw0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBM QV9DT05GSUc1LCBvY3BfZGF0YSk7DQoNCglvY3Bfd3JpdGVfYnl0ZSh0cCwgTUNVX1RZUEVfUExB LCBQTEFfQ1JXRUNSLCBDUldFQ1JfTk9SQU1MKTsNCg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfd29y ZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfQ0ZHX1dPTCk7DQoJb2NwX2RhdGEgJj0gfk1BR0lDX0VO Ow0KCWlmICh3b2xvcHRzICYgV0FLRV9NQUdJQykNCgkJb2NwX2RhdGEgfD0gTUFHSUNfRU47DQoJ b2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0NGR19XT0wsIG9jcF9kYXRhKTsN Cg0KCWlmICh3b2xvcHRzICYgV0FLRV9BTlkpDQoJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgm dHAtPnVkZXYtPmRldiwgdHJ1ZSk7DQoJZWxzZQ0KCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUo JnRwLT51ZGV2LT5kZXYsIGZhbHNlKTsNCn0NCg0Kc3RhdGljIHZvaWQgcjgxNTNfdTF1MmVuKHN0 cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQ0Kew0KCXU4IHUxdTJbOF07DQoNCglpZiAoZW5h YmxlKQ0KCQltZW1zZXQodTF1MiwgMHhmZiwgc2l6ZW9mKHUxdTIpKTsNCgllbHNlDQoJCW1lbXNl dCh1MXUyLCAweDAwLCBzaXplb2YodTF1MikpOw0KDQoJdXNiX29jcF93cml0ZSh0cCwgVVNCX1RP TEVSQU5DRSwgQllURV9FTl9TSVhfQllURVMsIHNpemVvZih1MXUyKSwgdTF1Mik7DQp9DQoNCnN0 YXRpYyB2b2lkIHI4MTUzX3UycDNlbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkNCnsN Cgl1MzIgb2NwX2RhdGE7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBF X1VTQiwgVVNCX1UyUDNfQ1RSTCk7DQoJaWYgKGVuYWJsZSAmJiB0cC0+dmVyc2lvbiAhPSBSVExf VkVSXzAzICYmIHRwLT52ZXJzaW9uICE9IFJUTF9WRVJfMDQpDQoJCW9jcF9kYXRhIHw9IFUyUDNf RU5BQkxFOw0KCWVsc2UNCgkJb2NwX2RhdGEgJj0gflUyUDNfRU5BQkxFOw0KCW9jcF93cml0ZV93 b3JkKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9VMlAzX0NUUkwsIG9jcF9kYXRhKTsNCn0NCg0Kc3Rh dGljIHZvaWQgcjgxNTNfcG93ZXJfY3V0X2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxl KQ0Kew0KCXUzMiBvY3BfZGF0YTsNCg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNV X1RZUEVfVVNCLCBVU0JfUE9XRVJfQ1VUKTsNCglpZiAoZW5hYmxlKQ0KCQlvY3BfZGF0YSB8PSBQ V1JfRU4gfCBQSEFTRTJfRU47DQoJZWxzZQ0KCQlvY3BfZGF0YSAmPSB+KFBXUl9FTiB8IFBIQVNF Ml9FTik7DQoJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX1BPV0VSX0NVVCwg b2NwX2RhdGEpOw0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9VU0Is IFVTQl9NSVNDXzApOw0KCW9jcF9kYXRhICY9IH5QQ1VUX1NUQVRVUzsNCglvY3Bfd3JpdGVfd29y ZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfTUlTQ18wLCBvY3BfZGF0YSk7DQp9DQoNCnN0YXRpYyBi b29sIHJ0bF9jYW5fd2FrZXVwKHN0cnVjdCByODE1MiAqdHApDQp7DQoJc3RydWN0IHVzYl9kZXZp Y2UgKnVkZXYgPSB0cC0+dWRldjsNCg0KCXJldHVybiAodWRldi0+YWN0Y29uZmlnLT5kZXNjLmJt QXR0cmlidXRlcyAmIFVTQl9DT05GSUdfQVRUX1dBS0VVUCk7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0 bF9ydW50aW1lX3N1c3BlbmRfZW5hYmxlKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQ0K ew0KCWlmIChlbmFibGUpIHsNCgkJdTMyIG9jcF9kYXRhOw0KDQoJCXI4MTUzX3UxdTJlbih0cCwg ZmFsc2UpOw0KCQlyODE1M191MnAzZW4odHAsIGZhbHNlKTsNCg0KCQlfX3J0bF9zZXRfd29sKHRw LCBXQUtFX0FOWSk7DQoNCgkJb2NwX3dyaXRlX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX0NS V0VDUiwgQ1JXRUNSX0NPTkZJRyk7DQoNCgkJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBN Q1VfVFlQRV9QTEEsIFBMQV9DT05GSUczNCk7DQoJCW9jcF9kYXRhIHw9IExJTktfT0ZGX1dBS0Vf RU47DQoJCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9DT05GSUczNCwgb2Nw X2RhdGEpOw0KDQoJCW9jcF93cml0ZV9ieXRlKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9DUldFQ1Is IENSV0VDUl9OT1JBTUwpOw0KCX0gZWxzZSB7DQoJCV9fcnRsX3NldF93b2wodHAsIHRwLT5zYXZl ZF93b2xvcHRzKTsNCgkJcjgxNTNfdTJwM2VuKHRwLCB0cnVlKTsNCgkJcjgxNTNfdTF1MmVuKHRw LCB0cnVlKTsNCgl9DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bF9waHlfcmVzZXQoc3RydWN0IHI4MTUy ICp0cCkNCnsNCgl1MTYgZGF0YTsNCglpbnQgaTsNCg0KCWNsZWFyX2JpdChQSFlfUkVTRVQsICZ0 cC0+ZmxhZ3MpOw0KDQoJZGF0YSA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0JNQ1IpOw0KDQoJ LyogZG9uJ3QgcmVzZXQgYWdhaW4gYmVmb3JlIHRoZSBwcmV2aW91cyBvbmUgY29tcGxldGUgKi8N CglpZiAoZGF0YSAmIEJNQ1JfUkVTRVQpDQoJCXJldHVybjsNCg0KCWRhdGEgfD0gQk1DUl9SRVNF VDsNCglyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQk1DUiwgZGF0YSk7DQoNCglmb3IgKGkgPSAw OyBpIDwgNTA7IGkrKykgew0KCQltc2xlZXAoMjApOw0KCQlpZiAoKHI4MTUyX21kaW9fcmVhZCh0 cCwgTUlJX0JNQ1IpICYgQk1DUl9SRVNFVCkgPT0gMCkNCgkJCWJyZWFrOw0KCX0NCn0NCg0Kc3Rh dGljIHZvaWQgcjgxNTNfdGVyZWRvX29mZihzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXUzMiBvY3Bf ZGF0YTsNCg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFf VEVSRURPX0NGRyk7DQoJb2NwX2RhdGEgJj0gfihURVJFRE9fU0VMIHwgVEVSRURPX1JTX0VWRU5U X01BU0sgfCBPT0JfVEVSRURPX0VOKTsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExB LCBQTEFfVEVSRURPX0NGRywgb2NwX2RhdGEpOw0KDQoJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9U WVBFX1BMQSwgUExBX1dEVDZfQ1RSTCwgV0RUNl9TRVRfTU9ERSk7DQoJb2NwX3dyaXRlX3dvcmQo dHAsIE1DVV9UWVBFX1BMQSwgUExBX1JFQUxXT1dfVElNRVIsIDApOw0KCW9jcF93cml0ZV9kd29y ZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfVEVSRURPX1RJTUVSLCAwKTsNCn0NCg0Kc3RhdGljIHZv aWQgcjgxNTJiX2Rpc2FibGVfYWxkcHMoc3RydWN0IHI4MTUyICp0cCkNCnsNCglvY3BfcmVnX3dy aXRlKHRwLCBPQ1BfQUxEUFNfQ09ORklHLCBFTlBETlBTIHwgTElOS0VOQSB8IERJU19TRFNBVkUp Ow0KCW1zbGVlcCgyMCk7DQp9DQoNCnN0YXRpYyBpbmxpbmUgdm9pZCByODE1MmJfZW5hYmxlX2Fs ZHBzKHN0cnVjdCByODE1MiAqdHApDQp7DQoJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0FMRFBTX0NP TkZJRywgRU5QV1JTQVZFIHwgRU5QRE5QUyB8DQoJCQkJCSAgICBMSU5LRU5BIHwgRElTX1NEU0FW RSk7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bDgxNTJfZGlzYWJsZShzdHJ1Y3QgcjgxNTIgKnRwKQ0K ew0KCXI4MTUyYl9kaXNhYmxlX2FsZHBzKHRwKTsNCglydGxfZGlzYWJsZSh0cCk7DQoJcjgxNTJi X2VuYWJsZV9hbGRwcyh0cCk7DQp9DQoNCnN0YXRpYyB2b2lkIHI4MTUyYl9od19waHlfY2ZnKHN0 cnVjdCByODE1MiAqdHApDQp7DQoJdTE2IGRhdGE7DQoNCglkYXRhID0gcjgxNTJfbWRpb19yZWFk KHRwLCBNSUlfQk1DUik7DQoJaWYgKGRhdGEgJiBCTUNSX1BET1dOKSB7DQoJCWRhdGEgJj0gfkJN Q1JfUERPV047DQoJCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9CTUNSLCBkYXRhKTsNCgl9DQoN CglzZXRfYml0KFBIWV9SRVNFVCwgJnRwLT5mbGFncyk7DQp9DQoNCnN0YXRpYyB2b2lkIHI4MTUy Yl9leGl0X29vYihzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXUzMiBvY3BfZGF0YTsNCglpbnQgaTsN Cg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JDUik7 DQoJb2NwX2RhdGEgJj0gflJDUl9BQ1BUX0FMTDsNCglvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9U WVBFX1BMQSwgUExBX1JDUiwgb2NwX2RhdGEpOw0KDQoJcnhkeV9nYXRlZF9lbih0cCwgdHJ1ZSk7 DQoJcjgxNTNfdGVyZWRvX29mZih0cCk7DQoJcjgxNTJiX2h3X3BoeV9jZmcodHApOw0KDQoJb2Nw X3dyaXRlX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX0NSV0VDUiwgQ1JXRUNSX05PUkFNTCk7 DQoJb2NwX3dyaXRlX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX0NSLCAweDAwKTsNCg0KCW9j cF9kYXRhID0gb2NwX3JlYWRfYnl0ZSh0cCwgTUNVX1RZUEVfUExBLCBQTEFfT09CX0NUUkwpOw0K CW9jcF9kYXRhICY9IH5OT1dfSVNfT09COw0KCW9jcF93cml0ZV9ieXRlKHRwLCBNQ1VfVFlQRV9Q TEEsIFBMQV9PT0JfQ1RSTCwgb2NwX2RhdGEpOw0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3Jk KHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9TRkZfU1RTXzcpOw0KCW9jcF9kYXRhICY9IH5NQ1VfQk9S V19FTjsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfU0ZGX1NUU183LCBv Y3BfZGF0YSk7DQoNCglmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7DQoJCW9jcF9kYXRhID0g b2NwX3JlYWRfYnl0ZSh0cCwgTUNVX1RZUEVfUExBLCBQTEFfT09CX0NUUkwpOw0KCQlpZiAob2Nw X2RhdGEgJiBMSU5LX0xJU1RfUkVBRFkpDQoJCQlicmVhazsNCgkJdXNsZWVwX3JhbmdlKDEwMDAs IDIwMDApOw0KCX0NCg0KCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExB LCBQTEFfU0ZGX1NUU183KTsNCglvY3BfZGF0YSB8PSBSRV9JTklUX0xMOw0KCW9jcF93cml0ZV93 b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9TRkZfU1RTXzcsIG9jcF9kYXRhKTsNCg0KCWZvciAo aSA9IDA7IGkgPCAxMDAwOyBpKyspIHsNCgkJb2NwX2RhdGEgPSBvY3BfcmVhZF9ieXRlKHRwLCBN Q1VfVFlQRV9QTEEsIFBMQV9PT0JfQ1RSTCk7DQoJCWlmIChvY3BfZGF0YSAmIExJTktfTElTVF9S RUFEWSkNCgkJCWJyZWFrOw0KCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7DQoJfQ0KDQoJcnRs ODE1Ml9uaWNfcmVzZXQodHApOw0KDQoJLyogcnggc2hhcmUgZmlmbyBjcmVkaXQgZnVsbCB0aHJl c2hvbGQgKi8NCglvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JYRklGT19D VFJMMCwgUlhGSUZPX1RIUjFfTk9STUFMKTsNCg0KCWlmICh0cC0+dWRldi0+c3BlZWQgPT0gVVNC X1NQRUVEX0ZVTEwgfHwNCgkgICAgdHAtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9MT1cpIHsN CgkJLyogcnggc2hhcmUgZmlmbyBjcmVkaXQgbmVhciBmdWxsIHRocmVzaG9sZCAqLw0KCQlvY3Bf d3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JYRklGT19DVFJMMSwNCgkJCQlSWEZJ Rk9fVEhSMl9GVUxMKTsNCgkJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9S WEZJRk9fQ1RSTDIsDQoJCQkJUlhGSUZPX1RIUjNfRlVMTCk7DQoJfSBlbHNlIHsNCgkJLyogcngg c2hhcmUgZmlmbyBjcmVkaXQgbmVhciBmdWxsIHRocmVzaG9sZCAqLw0KCQlvY3Bfd3JpdGVfZHdv cmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JYRklGT19DVFJMMSwNCgkJCQlSWEZJRk9fVEhSMl9I SUdIKTsNCgkJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9SWEZJRk9fQ1RS TDIsDQoJCQkJUlhGSUZPX1RIUjNfSElHSCk7DQoJfQ0KDQoJLyogVFggc2hhcmUgZmlmbyBmcmVl IGNyZWRpdCBmdWxsIHRocmVzaG9sZCAqLw0KCW9jcF93cml0ZV9kd29yZCh0cCwgTUNVX1RZUEVf UExBLCBQTEFfVFhGSUZPX0NUUkwsIFRYRklGT19USFJfTk9STUFMKTsNCg0KCW9jcF93cml0ZV9i eXRlKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9UWF9BR0csIFRYX0FHR19NQVhfVEhSRVNIT0xEKTsN CglvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX1JYX0JVRl9USCwgUlhfVEhS X0hJR0gpOw0KCW9jcF93cml0ZV9kd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfVFhfRE1BLA0K CQkJVEVTVF9NT0RFX0RJU0FCTEUgfCBUWF9TSVpFX0FESlVTVDEpOw0KDQoJcnRsX3J4X3ZsYW5f ZW4odHAsIHRwLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpOw0K DQoJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JNUywgUlRMODE1Ml9STVMp Ow0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9UQ1Iw KTsNCglvY3BfZGF0YSB8PSBUQ1IwX0FVVE9fRklGTzsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNV X1RZUEVfUExBLCBQTEFfVENSMCwgb2NwX2RhdGEpOw0KfQ0KDQpzdGF0aWMgdm9pZCByODE1MmJf ZW50ZXJfb29iKHN0cnVjdCByODE1MiAqdHApDQp7DQoJdTMyIG9jcF9kYXRhOw0KCWludCBpOw0K DQoJb2NwX2RhdGEgPSBvY3BfcmVhZF9ieXRlKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9PT0JfQ1RS TCk7DQoJb2NwX2RhdGEgJj0gfk5PV19JU19PT0I7DQoJb2NwX3dyaXRlX2J5dGUodHAsIE1DVV9U WVBFX1BMQSwgUExBX09PQl9DVFJMLCBvY3BfZGF0YSk7DQoNCglvY3Bfd3JpdGVfZHdvcmQodHAs IE1DVV9UWVBFX1BMQSwgUExBX1JYRklGT19DVFJMMCwgUlhGSUZPX1RIUjFfT09CKTsNCglvY3Bf d3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JYRklGT19DVFJMMSwgUlhGSUZPX1RI UjJfT09CKTsNCglvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JYRklGT19D VFJMMiwgUlhGSUZPX1RIUjNfT09CKTsNCg0KCXJ0bF9kaXNhYmxlKHRwKTsNCg0KCWZvciAoaSA9 IDA7IGkgPCAxMDAwOyBpKyspIHsNCgkJb2NwX2RhdGEgPSBvY3BfcmVhZF9ieXRlKHRwLCBNQ1Vf VFlQRV9QTEEsIFBMQV9PT0JfQ1RSTCk7DQoJCWlmIChvY3BfZGF0YSAmIExJTktfTElTVF9SRUFE WSkNCgkJCWJyZWFrOw0KCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7DQoJfQ0KDQoJb2NwX2Rh dGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9TRkZfU1RTXzcpOw0KCW9j cF9kYXRhIHw9IFJFX0lOSVRfTEw7DQoJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwg UExBX1NGRl9TVFNfNywgb2NwX2RhdGEpOw0KDQoJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykg ew0KCQlvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX09PQl9D VFJMKTsNCgkJaWYgKG9jcF9kYXRhICYgTElOS19MSVNUX1JFQURZKQ0KCQkJYnJlYWs7DQoJCXVz bGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsNCgl9DQoNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZ UEVfUExBLCBQTEFfUk1TLCBSVEw4MTUyX1JNUyk7DQoNCglydGxfcnhfdmxhbl9lbih0cCwgdHJ1 ZSk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUEFMX0JE Q19DUik7DQoJb2NwX2RhdGEgfD0gQUxEUFNfUFJPWFlfTU9ERTsNCglvY3Bfd3JpdGVfd29yZCh0 cCwgTUNVX1RZUEVfUExBLCBQQUxfQkRDX0NSLCBvY3BfZGF0YSk7DQoNCglvY3BfZGF0YSA9IG9j cF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX09PQl9DVFJMKTsNCglvY3BfZGF0YSB8 PSBOT1dfSVNfT09CIHwgRElTX01DVV9DTFJPT0I7DQoJb2NwX3dyaXRlX2J5dGUodHAsIE1DVV9U WVBFX1BMQSwgUExBX09PQl9DVFJMLCBvY3BfZGF0YSk7DQoNCglyeGR5X2dhdGVkX2VuKHRwLCBm YWxzZSk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBM QV9SQ1IpOw0KCW9jcF9kYXRhIHw9IFJDUl9BUE0gfCBSQ1JfQU0gfCBSQ1JfQUI7DQoJb2NwX3dy aXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9SQ1IsIG9jcF9kYXRhKTsNCn0NCg0Kc3Rh dGljIHZvaWQgcjgxNTNfaHdfcGh5X2NmZyhzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCXUzMiBvY3Bf ZGF0YTsNCgl1MTYgZGF0YTsNCg0KCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAzIHx8IHRw LT52ZXJzaW9uID09IFJUTF9WRVJfMDQgfHwNCgkgICAgdHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8w NSkNCgkJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0FEQ19DRkcsIENLQURTRUxfTCB8IEFEQ19FTiB8 IEVOX0VNSV9MKTsNCg0KCWRhdGEgPSByODE1Ml9tZGlvX3JlYWQodHAsIE1JSV9CTUNSKTsNCglp ZiAoZGF0YSAmIEJNQ1JfUERPV04pIHsNCgkJZGF0YSAmPSB+Qk1DUl9QRE9XTjsNCgkJcjgxNTJf bWRpb193cml0ZSh0cCwgTUlJX0JNQ1IsIGRhdGEpOw0KCX0NCg0KCWlmICh0cC0+dmVyc2lvbiA9 PSBSVExfVkVSXzAzKSB7DQoJCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ0ZHKTsN CgkJZGF0YSAmPSB+Q1RBUF9TSE9SVF9FTjsNCgkJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9D RkcsIGRhdGEpOw0KCX0NCg0KCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9QT1dFUl9DRkcp Ow0KCWRhdGEgfD0gRUVFX0NMS0RJVl9FTjsNCglvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfUE9XRVJf Q0ZHLCBkYXRhKTsNCg0KCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9ET1dOX1NQRUVEKTsN CglkYXRhIHw9IEVOXzEwTV9CR09GRjsNCglvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRE9XTl9TUEVF RCwgZGF0YSk7DQoJZGF0YSA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX1BPV0VSX0NGRyk7DQoJZGF0 YSB8PSBFTl8xME1fUExMT0ZGOw0KCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9QT1dFUl9DRkcsIGRh dGEpOw0KCXNyYW1fd3JpdGUodHAsIFNSQU1fSU1QRURBTkNFLCAweDBiMTMpOw0KDQoJb2NwX2Rh dGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9QSFlfUFdSKTsNCglvY3Bf ZGF0YSB8PSBQRk1fUFdNX1NXSVRDSDsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExB LCBQTEFfUEhZX1BXUiwgb2NwX2RhdGEpOw0KDQoJLyogRW5hYmxlIExQRiBjb3JuZXIgYXV0byB0 dW5lICovDQoJc3JhbV93cml0ZSh0cCwgU1JBTV9MUEZfQ0ZHLCAweGY3MGYpOw0KDQoJLyogQWRq dXN0IDEwTSBBbXBsaXR1ZGUgKi8NCglzcmFtX3dyaXRlKHRwLCBTUkFNXzEwTV9BTVAxLCAweDAw YWYpOw0KCXNyYW1fd3JpdGUodHAsIFNSQU1fMTBNX0FNUDIsIDB4MDIwOCk7DQoNCglzZXRfYml0 KFBIWV9SRVNFVCwgJnRwLT5mbGFncyk7DQp9DQoNCnN0YXRpYyB2b2lkIHI4MTUzX2ZpcnN0X2lu aXQoc3RydWN0IHI4MTUyICp0cCkNCnsNCgl1MzIgb2NwX2RhdGE7DQoJaW50IGk7DQoNCglyeGR5 X2dhdGVkX2VuKHRwLCB0cnVlKTsNCglyODE1M190ZXJlZG9fb2ZmKHRwKTsNCg0KCW9jcF9kYXRh ID0gb2NwX3JlYWRfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JDUik7DQoJb2NwX2RhdGEg Jj0gflJDUl9BQ1BUX0FMTDsNCglvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExB X1JDUiwgb2NwX2RhdGEpOw0KDQoJcjgxNTNfaHdfcGh5X2NmZyh0cCk7DQoNCglydGw4MTUyX25p Y19yZXNldCh0cCk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BM QSwgUExBX09PQl9DVFJMKTsNCglvY3BfZGF0YSAmPSB+Tk9XX0lTX09PQjsNCglvY3Bfd3JpdGVf Ynl0ZSh0cCwgTUNVX1RZUEVfUExBLCBQTEFfT09CX0NUUkwsIG9jcF9kYXRhKTsNCg0KCW9jcF9k YXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfU0ZGX1NUU183KTsNCglv Y3BfZGF0YSAmPSB+TUNVX0JPUldfRU47DQoJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BM QSwgUExBX1NGRl9TVFNfNywgb2NwX2RhdGEpOw0KDQoJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkr Kykgew0KCQlvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX09P Ql9DVFJMKTsNCgkJaWYgKG9jcF9kYXRhICYgTElOS19MSVNUX1JFQURZKQ0KCQkJYnJlYWs7DQoJ CXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsNCgl9DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dv cmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1NGRl9TVFNfNyk7DQoJb2NwX2RhdGEgfD0gUkVfSU5J VF9MTDsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfU0ZGX1NUU183LCBv Y3BfZGF0YSk7DQoNCglmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7DQoJCW9jcF9kYXRhID0g b2NwX3JlYWRfYnl0ZSh0cCwgTUNVX1RZUEVfUExBLCBQTEFfT09CX0NUUkwpOw0KCQlpZiAob2Nw X2RhdGEgJiBMSU5LX0xJU1RfUkVBRFkpDQoJCQlicmVhazsNCgkJdXNsZWVwX3JhbmdlKDEwMDAs IDIwMDApOw0KCX0NCg0KCXJ0bF9yeF92bGFuX2VuKHRwLCB0cC0+bmV0ZGV2LT5mZWF0dXJlcyAm IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKTsNCg0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQ RV9QTEEsIFBMQV9STVMsIFJUTDgxNTNfUk1TKTsNCglvY3Bfd3JpdGVfYnl0ZSh0cCwgTUNVX1RZ UEVfUExBLCBQTEFfTVRQUywgTVRQU19KVU1CTyk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dv cmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1RDUjApOw0KCW9jcF9kYXRhIHw9IFRDUjBfQVVUT19G SUZPOw0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9UQ1IwLCBvY3BfZGF0 YSk7DQoNCglydGw4MTUyX25pY19yZXNldCh0cCk7DQoNCgkvKiByeCBzaGFyZSBmaWZvIGNyZWRp dCBmdWxsIHRocmVzaG9sZCAqLw0KCW9jcF93cml0ZV9kd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQ TEFfUlhGSUZPX0NUUkwwLCBSWEZJRk9fVEhSMV9OT1JNQUwpOw0KCW9jcF93cml0ZV93b3JkKHRw LCBNQ1VfVFlQRV9QTEEsIFBMQV9SWEZJRk9fQ1RSTDEsIFJYRklGT19USFIyX05PUk1BTCk7DQoJ b2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JYRklGT19DVFJMMiwgUlhGSUZP X1RIUjNfTk9STUFMKTsNCgkvKiBUWCBzaGFyZSBmaWZvIGZyZWUgY3JlZGl0IGZ1bGwgdGhyZXNo b2xkICovDQoJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9UWEZJRk9fQ1RS TCwgVFhGSUZPX1RIUl9OT1JNQUwyKTsNCg0KCS8qIHJ4IGFnZ3JlZ2F0aW9uICovDQoJb2NwX2Rh dGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9VU0JfQ1RSTCk7DQoJb2Nw X2RhdGEgJj0gfihSWF9BR0dfRElTQUJMRSB8IFJYX1pFUk9fRU4pOw0KCW9jcF93cml0ZV93b3Jk KHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9VU0JfQ1RSTCwgb2NwX2RhdGEpOw0KfQ0KDQpzdGF0aWMg dm9pZCByODE1M19lbnRlcl9vb2Ioc3RydWN0IHI4MTUyICp0cCkNCnsNCgl1MzIgb2NwX2RhdGE7 DQoJaW50IGk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwg UExBX09PQl9DVFJMKTsNCglvY3BfZGF0YSAmPSB+Tk9XX0lTX09PQjsNCglvY3Bfd3JpdGVfYnl0 ZSh0cCwgTUNVX1RZUEVfUExBLCBQTEFfT09CX0NUUkwsIG9jcF9kYXRhKTsNCg0KCXJ0bF9kaXNh YmxlKHRwKTsNCg0KCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsNCgkJb2NwX2RhdGEgPSBv Y3BfcmVhZF9ieXRlKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9PT0JfQ1RSTCk7DQoJCWlmIChvY3Bf ZGF0YSAmIExJTktfTElTVF9SRUFEWSkNCgkJCWJyZWFrOw0KCQl1c2xlZXBfcmFuZ2UoMTAwMCwg MjAwMCk7DQoJfQ0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEs IFBMQV9TRkZfU1RTXzcpOw0KCW9jcF9kYXRhIHw9IFJFX0lOSVRfTEw7DQoJb2NwX3dyaXRlX3dv cmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1NGRl9TVFNfNywgb2NwX2RhdGEpOw0KDQoJZm9yIChp ID0gMDsgaSA8IDEwMDA7IGkrKykgew0KCQlvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1D VV9UWVBFX1BMQSwgUExBX09PQl9DVFJMKTsNCgkJaWYgKG9jcF9kYXRhICYgTElOS19MSVNUX1JF QURZKQ0KCQkJYnJlYWs7DQoJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsNCgl9DQoNCglvY3Bf d3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfUk1TLCBSVEw4MTUzX1JNUyk7DQoNCglv Y3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1RFUkVET19DRkcp Ow0KCW9jcF9kYXRhICY9IH5URVJFRE9fV0FLRV9NQVNLOw0KCW9jcF93cml0ZV93b3JkKHRwLCBN Q1VfVFlQRV9QTEEsIFBMQV9URVJFRE9fQ0ZHLCBvY3BfZGF0YSk7DQoNCglydGxfcnhfdmxhbl9l bih0cCwgdHJ1ZSk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BM QSwgUEFMX0JEQ19DUik7DQoJb2NwX2RhdGEgfD0gQUxEUFNfUFJPWFlfTU9ERTsNCglvY3Bfd3Jp dGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQQUxfQkRDX0NSLCBvY3BfZGF0YSk7DQoNCglvY3Bf ZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX09PQl9DVFJMKTsNCglv Y3BfZGF0YSB8PSBOT1dfSVNfT09CIHwgRElTX01DVV9DTFJPT0I7DQoJb2NwX3dyaXRlX2J5dGUo dHAsIE1DVV9UWVBFX1BMQSwgUExBX09PQl9DVFJMLCBvY3BfZGF0YSk7DQoNCglyeGR5X2dhdGVk X2VuKHRwLCBmYWxzZSk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX2R3b3JkKHRwLCBNQ1VfVFlQ RV9QTEEsIFBMQV9SQ1IpOw0KCW9jcF9kYXRhIHw9IFJDUl9BUE0gfCBSQ1JfQU0gfCBSQ1JfQUI7 DQoJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9SQ1IsIG9jcF9kYXRhKTsN Cn0NCg0Kc3RhdGljIHZvaWQgcjgxNTNfZGlzYWJsZV9hbGRwcyhzdHJ1Y3QgcjgxNTIgKnRwKQ0K ew0KCXUxNiBkYXRhOw0KDQoJZGF0YSA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX1BPV0VSX0NGRyk7 DQoJZGF0YSAmPSB+RU5fQUxEUFM7DQoJb2NwX3JlZ193cml0ZSh0cCwgT0NQX1BPV0VSX0NGRywg ZGF0YSk7DQoJbXNsZWVwKDIwKTsNCn0NCg0Kc3RhdGljIHZvaWQgcjgxNTNfZW5hYmxlX2FsZHBz KHN0cnVjdCByODE1MiAqdHApDQp7DQoJdTE2IGRhdGE7DQoNCglkYXRhID0gb2NwX3JlZ19yZWFk KHRwLCBPQ1BfUE9XRVJfQ0ZHKTsNCglkYXRhIHw9IEVOX0FMRFBTOw0KCW9jcF9yZWdfd3JpdGUo dHAsIE9DUF9QT1dFUl9DRkcsIGRhdGEpOw0KfQ0KDQpzdGF0aWMgdm9pZCBydGw4MTUzX2Rpc2Fi bGUoc3RydWN0IHI4MTUyICp0cCkNCnsNCglyODE1M19kaXNhYmxlX2FsZHBzKHRwKTsNCglydGxf ZGlzYWJsZSh0cCk7DQoJcjgxNTNfZW5hYmxlX2FsZHBzKHRwKTsNCgl1c2JfZW5hYmxlX2xwbSh0 cC0+dWRldik7DQp9DQoNCnN0YXRpYyBpbnQgcnRsODE1Ml9zZXRfc3BlZWQoc3RydWN0IHI4MTUy ICp0cCwgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpDQp7DQoJdTE2IGJtY3IsIGFu YXIsIGdiY3I7DQoJaW50IHJldCA9IDA7DQoNCgljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnRw LT5zY2hlZHVsZSk7DQoJYW5hciA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0FEVkVSVElTRSk7 DQoJYW5hciAmPSB+KEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwNCgkJICBB RFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKTsNCglpZiAodHAtPm1paS5zdXBw b3J0c19nbWlpKSB7DQoJCWdiY3IgPSByODE1Ml9tZGlvX3JlYWQodHAsIE1JSV9DVFJMMTAwMCk7 DQoJCWdiY3IgJj0gfihBRFZFUlRJU0VfMTAwMEZVTEwgfCBBRFZFUlRJU0VfMTAwMEhBTEYpOw0K CX0gZWxzZSB7DQoJCWdiY3IgPSAwOw0KCX0NCg0KCWlmIChhdXRvbmVnID09IEFVVE9ORUdfRElT QUJMRSkgew0KCQlpZiAoc3BlZWQgPT0gU1BFRURfMTApIHsNCgkJCWJtY3IgPSAwOw0KCQkJYW5h ciB8PSBBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTDsNCgkJfSBlbHNlIGlmIChz cGVlZCA9PSBTUEVFRF8xMDApIHsNCgkJCWJtY3IgPSBCTUNSX1NQRUVEMTAwOw0KCQkJYW5hciB8 PSBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMOw0KCQl9IGVsc2UgaWYgKHNw ZWVkID09IFNQRUVEXzEwMDAgJiYgdHAtPm1paS5zdXBwb3J0c19nbWlpKSB7DQoJCQlibWNyID0g Qk1DUl9TUEVFRDEwMDA7DQoJCQlnYmNyIHw9IEFEVkVSVElTRV8xMDAwRlVMTCB8IEFEVkVSVElT RV8xMDAwSEFMRjsNCgkJfSBlbHNlIHsNCgkJCXJldCA9IC1FSU5WQUw7DQoJCQlnb3RvIG91dDsN CgkJfQ0KDQoJCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpDQoJCQlibWNyIHw9IEJNQ1JfRlVM TERQTFg7DQoJfSBlbHNlIHsNCgkJaWYgKHNwZWVkID09IFNQRUVEXzEwKSB7DQoJCQlpZiAoZHVw bGV4ID09IERVUExFWF9GVUxMKQ0KCQkJCWFuYXIgfD0gQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVS VElTRV8xMEZVTEw7DQoJCQllbHNlDQoJCQkJYW5hciB8PSBBRFZFUlRJU0VfMTBIQUxGOw0KCQl9 IGVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMCkgew0KCQkJaWYgKGR1cGxleCA9PSBEVVBMRVhf RlVMTCkgew0KCQkJCWFuYXIgfD0gQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEw7 DQoJCQkJYW5hciB8PSBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMOw0KCQkJ fSBlbHNlIHsNCgkJCQlhbmFyIHw9IEFEVkVSVElTRV8xMEhBTEY7DQoJCQkJYW5hciB8PSBBRFZF UlRJU0VfMTAwSEFMRjsNCgkJCX0NCgkJfSBlbHNlIGlmIChzcGVlZCA9PSBTUEVFRF8xMDAwICYm IHRwLT5taWkuc3VwcG9ydHNfZ21paSkgew0KCQkJaWYgKGR1cGxleCA9PSBEVVBMRVhfRlVMTCkg ew0KCQkJCWFuYXIgfD0gQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEw7DQoJCQkJ YW5hciB8PSBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMOw0KCQkJCWdiY3Ig fD0gQURWRVJUSVNFXzEwMDBGVUxMIHwgQURWRVJUSVNFXzEwMDBIQUxGOw0KCQkJfSBlbHNlIHsN CgkJCQlhbmFyIHw9IEFEVkVSVElTRV8xMEhBTEY7DQoJCQkJYW5hciB8PSBBRFZFUlRJU0VfMTAw SEFMRjsNCgkJCQlnYmNyIHw9IEFEVkVSVElTRV8xMDAwSEFMRjsNCgkJCX0NCgkJfSBlbHNlIHsN CgkJCXJldCA9IC1FSU5WQUw7DQoJCQlnb3RvIG91dDsNCgkJfQ0KDQoJCWJtY3IgPSBCTUNSX0FO RU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQ7DQoJfQ0KDQoJaWYgKHRlc3RfYml0KFBIWV9SRVNFVCwg JnRwLT5mbGFncykpDQoJCWJtY3IgfD0gQk1DUl9SRVNFVDsNCg0KCWlmICh0cC0+bWlpLnN1cHBv cnRzX2dtaWkpDQoJCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9DVFJMMTAwMCwgZ2Jjcik7DQoN CglyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQURWRVJUSVNFLCBhbmFyKTsNCglyODE1Ml9tZGlv X3dyaXRlKHRwLCBNSUlfQk1DUiwgYm1jcik7DQoNCglpZiAodGVzdF9iaXQoUEhZX1JFU0VULCAm dHAtPmZsYWdzKSkgew0KCQlpbnQgaTsNCg0KCQljbGVhcl9iaXQoUEhZX1JFU0VULCAmdHAtPmZs YWdzKTsNCgkJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsNCgkJCW1zbGVlcCgyMCk7DQoJCQlp ZiAoKHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0JNQ1IpICYgQk1DUl9SRVNFVCkgPT0gMCkNCgkJ CQlicmVhazsNCgkJfQ0KCX0NCg0Kb3V0Og0KDQoJcmV0dXJuIHJldDsNCn0NCg0Kc3RhdGljIHZv aWQgcnRsODE1Ml91cChzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCWlmICh0ZXN0X2JpdChSVEw4MTUy X1VOUExVRywgJnRwLT5mbGFncykpDQoJCXJldHVybjsNCg0KCXI4MTUyYl9kaXNhYmxlX2FsZHBz KHRwKTsNCglyODE1MmJfZXhpdF9vb2IodHApOw0KCXI4MTUyYl9lbmFibGVfYWxkcHModHApOw0K fQ0KDQpzdGF0aWMgdm9pZCBydGw4MTUyX2Rvd24oc3RydWN0IHI4MTUyICp0cCkNCnsNCglpZiAo dGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKSB7DQoJCXJ0bF9kcm9wX3F1ZXVl ZF90eCh0cCk7DQoJCXJldHVybjsNCgl9DQoNCglyODE1Ml9wb3dlcl9jdXRfZW4odHAsIGZhbHNl KTsNCglyODE1MmJfZGlzYWJsZV9hbGRwcyh0cCk7DQoJcjgxNTJiX2VudGVyX29vYih0cCk7DQoJ cjgxNTJiX2VuYWJsZV9hbGRwcyh0cCk7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bDgxNTNfdXAoc3Ry dWN0IHI4MTUyICp0cCkNCnsNCglpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+Zmxh Z3MpKQ0KCQlyZXR1cm47DQoNCglyODE1M191MXUyZW4odHAsIGZhbHNlKTsNCglyODE1M19kaXNh YmxlX2FsZHBzKHRwKTsNCglyODE1M19maXJzdF9pbml0KHRwKTsNCglyODE1M19lbmFibGVfYWxk cHModHApOw0KCXI4MTUzX3UycDNlbih0cCwgdHJ1ZSk7DQoJcjgxNTNfdTF1MmVuKHRwLCB0cnVl KTsNCgl1c2JfZW5hYmxlX2xwbSh0cC0+dWRldik7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bDgxNTNf ZG93bihzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCWlmICh0ZXN0X2JpdChSVEw4MTUyX1VOUExVRywg JnRwLT5mbGFncykpIHsNCgkJcnRsX2Ryb3BfcXVldWVkX3R4KHRwKTsNCgkJcmV0dXJuOw0KCX0N Cg0KCXI4MTUzX3UxdTJlbih0cCwgZmFsc2UpOw0KCXI4MTUzX3UycDNlbih0cCwgZmFsc2UpOw0K CXI4MTUzX3Bvd2VyX2N1dF9lbih0cCwgZmFsc2UpOw0KCXI4MTUzX2Rpc2FibGVfYWxkcHModHAp Ow0KCXI4MTUzX2VudGVyX29vYih0cCk7DQoJcjgxNTNfZW5hYmxlX2FsZHBzKHRwKTsNCn0NCg0K c3RhdGljIGJvb2wgcnRsODE1Ml9pbl9ud2F5KHN0cnVjdCByODE1MiAqdHApDQp7DQoJdTE2IG53 YXlfc3RhdGU7DQoNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfT0NQX0dQ SFlfQkFTRSwgMHgyMDAwKTsNCgl0cC0+b2NwX2Jhc2UgPSAweDIwMDA7DQoJb2NwX3dyaXRlX2J5 dGUodHAsIE1DVV9UWVBFX1BMQSwgMHhiMDE0LCAweDRjKTsJCS8qIHBoeSBzdGF0ZSAqLw0KCW53 YXlfc3RhdGUgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIDB4YjAxYSk7DQoNCgkv KiBiaXQgMTU6IFRYRElTX1NUQVRFLCBiaXQgMTQ6IEFCRF9TVEFURSAqLw0KCWlmIChud2F5X3N0 YXRlICYgMHhjMDAwKQ0KCQlyZXR1cm4gZmFsc2U7DQoJZWxzZQ0KCQlyZXR1cm4gdHJ1ZTsNCn0N Cg0Kc3RhdGljIGJvb2wgcnRsODE1M19pbl9ud2F5KHN0cnVjdCByODE1MiAqdHApDQp7DQoJdTE2 IHBoeV9zdGF0ZSA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX1BIWV9TVEFURSkgJiAweGZmOw0KDQoJ aWYgKHBoeV9zdGF0ZSA9PSBUWERJU19TVEFURSB8fCBwaHlfc3RhdGUgPT0gQUJEX1NUQVRFKQ0K CQlyZXR1cm4gZmFsc2U7DQoJZWxzZQ0KCQlyZXR1cm4gdHJ1ZTsNCn0NCg0Kc3RhdGljIHZvaWQg c2V0X2NhcnJpZXIoc3RydWN0IHI4MTUyICp0cCkNCnsNCglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0 ZGV2ID0gdHAtPm5ldGRldjsNCgl1OCBzcGVlZDsNCg0KCWNsZWFyX2JpdChSVEw4MTUyX0xJTktf Q0hHLCAmdHAtPmZsYWdzKTsNCglzcGVlZCA9IHJ0bDgxNTJfZ2V0X3NwZWVkKHRwKTsNCg0KCWlm IChzcGVlZCAmIExJTktfU1RBVFVTKSB7DQoJCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRkZXYp KSB7DQoJCQl0cC0+cnRsX29wcy5lbmFibGUodHApOw0KCQkJc2V0X2JpdChSVEw4MTUyX1NFVF9S WF9NT0RFLCAmdHAtPmZsYWdzKTsNCgkJCW5hcGlfZGlzYWJsZSgmdHAtPm5hcGkpOw0KCQkJbmV0 aWZfY2Fycmllcl9vbihuZXRkZXYpOw0KCQkJcnRsX3N0YXJ0X3J4KHRwKTsNCgkJCW5hcGlfZW5h YmxlKCZ0cC0+bmFwaSk7DQoJCX0NCgl9IGVsc2Ugew0KCQlpZiAobmV0aWZfY2Fycmllcl9vayhu ZXRkZXYpKSB7DQoJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOw0KCQkJbmFwaV9kaXNhYmxl KCZ0cC0+bmFwaSk7DQoJCQl0cC0+cnRsX29wcy5kaXNhYmxlKHRwKTsNCgkJCW5hcGlfZW5hYmxl KCZ0cC0+bmFwaSk7DQoJCX0NCgl9DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bF93b3JrX2Z1bmNfdChz dHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IGNvbnRhaW5l cl9vZih3b3JrLCBzdHJ1Y3QgcjgxNTIsIHNjaGVkdWxlLndvcmspOw0KDQoJLyogSWYgdGhlIGRl dmljZSBpcyB1bnBsdWdnZWQgb3IgIW5ldGlmX3J1bm5pbmcoKSwgdGhlIHdvcmtxdWV1ZQ0KCSAq IGRvZXNuJ3QgbmVlZCB0byB3YWtlIHRoZSBkZXZpY2UsIGFuZCBjb3VsZCByZXR1cm4gZGlyZWN0 bHkuDQoJICovDQoJaWYgKHRlc3RfYml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdzKSB8fCAh bmV0aWZfcnVubmluZyh0cC0+bmV0ZGV2KSkNCgkJcmV0dXJuOw0KDQoJaWYgKHVzYl9hdXRvcG1f Z2V0X2ludGVyZmFjZSh0cC0+aW50ZikgPCAwKQ0KCQlyZXR1cm47DQoNCglpZiAoIXRlc3RfYml0 KFdPUktfRU5BQkxFLCAmdHAtPmZsYWdzKSkNCgkJZ290byBvdXQxOw0KDQoJaWYgKCFtdXRleF90 cnlsb2NrKCZ0cC0+Y29udHJvbCkpIHsNCgkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0cC0+c2No ZWR1bGUsIDApOw0KCQlnb3RvIG91dDE7DQoJfQ0KDQoJaWYgKHRlc3RfYml0KFJUTDgxNTJfTElO S19DSEcsICZ0cC0+ZmxhZ3MpKQ0KCQlzZXRfY2Fycmllcih0cCk7DQoNCglpZiAodGVzdF9iaXQo UlRMODE1Ml9TRVRfUlhfTU9ERSwgJnRwLT5mbGFncykpDQoJCV9ydGw4MTUyX3NldF9yeF9tb2Rl KHRwLT5uZXRkZXYpOw0KDQoJLyogZG9uJ3Qgc2NoZWR1bGUgbmFwaSBiZWZvcmUgbGlua2luZyAq Lw0KCWlmICh0ZXN0X2JpdChTQ0hFRFVMRV9OQVBJLCAmdHAtPmZsYWdzKSAmJg0KCSAgICBuZXRp Zl9jYXJyaWVyX29rKHRwLT5uZXRkZXYpKSB7DQoJCWNsZWFyX2JpdChTQ0hFRFVMRV9OQVBJLCAm dHAtPmZsYWdzKTsNCgkJbmFwaV9zY2hlZHVsZSgmdHAtPm5hcGkpOw0KCX0NCg0KCWlmICh0ZXN0 X2JpdChQSFlfUkVTRVQsICZ0cC0+ZmxhZ3MpKQ0KCQlydGxfcGh5X3Jlc2V0KHRwKTsNCg0KCW11 dGV4X3VubG9jaygmdHAtPmNvbnRyb2wpOw0KDQpvdXQxOg0KCXVzYl9hdXRvcG1fcHV0X2ludGVy ZmFjZSh0cC0+aW50Zik7DQp9DQoNCnN0YXRpYyBpbnQgcnRsODE1Ml9vcGVuKHN0cnVjdCBuZXRf ZGV2aWNlICpuZXRkZXYpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IG5ldGRldl9wcml2KG5ldGRl dik7DQoJaW50IHJlcyA9IDA7DQoNCglyZXMgPSBhbGxvY19hbGxfbWVtKHRwKTsNCglpZiAocmVz KQ0KCQlnb3RvIG91dDsNCg0KCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7DQoNCglyZXMgPSB1 c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodHAtPmludGYpOw0KCWlmIChyZXMgPCAwKSB7DQoJCWZy ZWVfYWxsX21lbSh0cCk7DQoJCWdvdG8gb3V0Ow0KCX0NCg0KCW11dGV4X2xvY2soJnRwLT5jb250 cm9sKTsNCg0KCXRwLT5ydGxfb3BzLnVwKHRwKTsNCg0KCXJ0bDgxNTJfc2V0X3NwZWVkKHRwLCBB VVRPTkVHX0VOQUJMRSwNCgkJCSAgdHAtPm1paS5zdXBwb3J0c19nbWlpID8gU1BFRURfMTAwMCA6 IFNQRUVEXzEwMCwNCgkJCSAgRFVQTEVYX0ZVTEwpOw0KCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRl dik7DQoJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsNCglzZXRfYml0KFdPUktfRU5BQkxFLCAm dHAtPmZsYWdzKTsNCg0KCXJlcyA9IHVzYl9zdWJtaXRfdXJiKHRwLT5pbnRyX3VyYiwgR0ZQX0tF Uk5FTCk7DQoJaWYgKHJlcykgew0KCQlpZiAocmVzID09IC1FTk9ERVYpDQoJCQluZXRpZl9kZXZp Y2VfZGV0YWNoKHRwLT5uZXRkZXYpOw0KCQluZXRpZl93YXJuKHRwLCBpZnVwLCBuZXRkZXYsICJp bnRyX3VyYiBzdWJtaXQgZmFpbGVkOiAlZFxuIiwNCgkJCSAgIHJlcyk7DQoJCWZyZWVfYWxsX21l bSh0cCk7DQoJfSBlbHNlIHsNCgkJbmFwaV9lbmFibGUoJnRwLT5uYXBpKTsNCgl9DQoNCgltdXRl eF91bmxvY2soJnRwLT5jb250cm9sKTsNCg0KCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSh0cC0+ aW50Zik7DQoNCm91dDoNCglyZXR1cm4gcmVzOw0KfQ0KDQpzdGF0aWMgaW50IHJ0bDgxNTJfY2xv c2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0 ZGV2X3ByaXYobmV0ZGV2KTsNCglpbnQgcmVzID0gMDsNCg0KCW5hcGlfZGlzYWJsZSgmdHAtPm5h cGkpOw0KCWNsZWFyX2JpdChXT1JLX0VOQUJMRSwgJnRwLT5mbGFncyk7DQoJdXNiX2tpbGxfdXJi KHRwLT5pbnRyX3VyYik7DQoJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0cC0+c2NoZWR1bGUp Ow0KCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsNCg0KCXJlcyA9IHVzYl9hdXRvcG1fZ2V0X2lu dGVyZmFjZSh0cC0+aW50Zik7DQoJaWYgKHJlcyA8IDAgfHwgdGVzdF9iaXQoUlRMODE1Ml9VTlBM VUcsICZ0cC0+ZmxhZ3MpKSB7DQoJCXJ0bF9kcm9wX3F1ZXVlZF90eCh0cCk7DQoJCXJ0bF9zdG9w X3J4KHRwKTsNCgl9IGVsc2Ugew0KCQltdXRleF9sb2NrKCZ0cC0+Y29udHJvbCk7DQoNCgkJdHAt PnJ0bF9vcHMuZG93bih0cCk7DQoNCgkJbXV0ZXhfdW5sb2NrKCZ0cC0+Y29udHJvbCk7DQoNCgkJ dXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHRwLT5pbnRmKTsNCgl9DQoNCglmcmVlX2FsbF9tZW0o dHApOw0KDQoJcmV0dXJuIHJlczsNCn0NCg0Kc3RhdGljIGlubGluZSB2b2lkIHI4MTUyX21tZF9p bmRpcmVjdChzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgZGV2LCB1MTYgcmVnKQ0Kew0KCW9jcF9yZWdf d3JpdGUodHAsIE9DUF9FRUVfQVIsIEZVTl9BRERSIHwgZGV2KTsNCglvY3BfcmVnX3dyaXRlKHRw LCBPQ1BfRUVFX0RBVEEsIHJlZyk7DQoJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgRlVO X0RBVEEgfCBkZXYpOw0KfQ0KDQpzdGF0aWMgdTE2IHI4MTUyX21tZF9yZWFkKHN0cnVjdCByODE1 MiAqdHAsIHUxNiBkZXYsIHUxNiByZWcpDQp7DQoJdTE2IGRhdGE7DQoNCglyODE1Ml9tbWRfaW5k aXJlY3QodHAsIGRldiwgcmVnKTsNCglkYXRhID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0RB VEEpOw0KCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQVIsIDB4MDAwMCk7DQoNCglyZXR1cm4g ZGF0YTsNCn0NCg0Kc3RhdGljIHZvaWQgcjgxNTJfbW1kX3dyaXRlKHN0cnVjdCByODE1MiAqdHAs IHUxNiBkZXYsIHUxNiByZWcsIHUxNiBkYXRhKQ0Kew0KCXI4MTUyX21tZF9pbmRpcmVjdCh0cCwg ZGV2LCByZWcpOw0KCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfREFUQSwgZGF0YSk7DQoJb2Nw X3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgMHgwMDAwKTsNCn0NCg0Kc3RhdGljIHZvaWQgcjgx NTJfZWVlX2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQ0Kew0KCXUxNiBjb25maWcx LCBjb25maWcyLCBjb25maWczOw0KCXUzMiBvY3BfZGF0YTsNCg0KCW9jcF9kYXRhID0gb2NwX3Jl YWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NSKTsNCgljb25maWcxID0gb2NwX3Jl Z19yZWFkKHRwLCBPQ1BfRUVFX0NPTkZJRzEpICYgfnNkX3Jpc2VfdGltZV9tYXNrOw0KCWNvbmZp ZzIgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ09ORklHMik7DQoJY29uZmlnMyA9IG9jcF9y ZWdfcmVhZCh0cCwgT0NQX0VFRV9DT05GSUczKSAmIH5mYXN0X3Nucl9tYXNrOw0KDQoJaWYgKGVu YWJsZSkgew0KCQlvY3BfZGF0YSB8PSBFRUVfUlhfRU4gfCBFRUVfVFhfRU47DQoJCWNvbmZpZzEg fD0gRUVFXzEwX0NBUCB8IEVFRV9OV0FZX0VOIHwgVFhfUVVJRVRfRU4gfCBSWF9RVUlFVF9FTjsN CgkJY29uZmlnMSB8PSBzZF9yaXNlX3RpbWUoMSk7DQoJCWNvbmZpZzIgfD0gUkdfREFDUVVJRVRf RU4gfCBSR19MRFZRVUlFVF9FTjsNCgkJY29uZmlnMyB8PSBmYXN0X3Nucig0Mik7DQoJfSBlbHNl IHsNCgkJb2NwX2RhdGEgJj0gfihFRUVfUlhfRU4gfCBFRUVfVFhfRU4pOw0KCQljb25maWcxICY9 IH4oRUVFXzEwX0NBUCB8IEVFRV9OV0FZX0VOIHwgVFhfUVVJRVRfRU4gfA0KCQkJICAgICBSWF9R VUlFVF9FTik7DQoJCWNvbmZpZzEgfD0gc2RfcmlzZV90aW1lKDcpOw0KCQljb25maWcyICY9IH4o UkdfREFDUVVJRVRfRU4gfCBSR19MRFZRVUlFVF9FTik7DQoJCWNvbmZpZzMgfD0gZmFzdF9zbnIo NTExKTsNCgl9DQoNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NS LCBvY3BfZGF0YSk7DQoJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DT05GSUcxLCBjb25maWcx KTsNCglvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NPTkZJRzIsIGNvbmZpZzIpOw0KCW9jcF9y ZWdfd3JpdGUodHAsIE9DUF9FRUVfQ09ORklHMywgY29uZmlnMyk7DQp9DQoNCnN0YXRpYyB2b2lk IHI4MTUyYl9lbmFibGVfZWVlKHN0cnVjdCByODE1MiAqdHApDQp7DQoJcjgxNTJfZWVlX2VuKHRw LCB0cnVlKTsNCglyODE1Ml9tbWRfd3JpdGUodHAsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0VFRV9B RFYsIE1ESU9fRUVFXzEwMFRYKTsNCn0NCg0Kc3RhdGljIHZvaWQgcjgxNTNfZWVlX2VuKHN0cnVj dCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQ0Kew0KCXUzMiBvY3BfZGF0YTsNCgl1MTYgY29uZmln Ow0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVf Q1IpOw0KCWNvbmZpZyA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DRkcpOw0KDQoJaWYgKGVu YWJsZSkgew0KCQlvY3BfZGF0YSB8PSBFRUVfUlhfRU4gfCBFRUVfVFhfRU47DQoJCWNvbmZpZyB8 PSBFRUUxMF9FTjsNCgl9IGVsc2Ugew0KCQlvY3BfZGF0YSAmPSB+KEVFRV9SWF9FTiB8IEVFRV9U WF9FTik7DQoJCWNvbmZpZyAmPSB+RUVFMTBfRU47DQoJfQ0KDQoJb2NwX3dyaXRlX3dvcmQodHAs IE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUiwgb2NwX2RhdGEpOw0KCW9jcF9yZWdfd3JpdGUodHAs IE9DUF9FRUVfQ0ZHLCBjb25maWcpOw0KfQ0KDQpzdGF0aWMgdm9pZCByODE1M19lbmFibGVfZWVl KHN0cnVjdCByODE1MiAqdHApDQp7DQoJcjgxNTNfZWVlX2VuKHRwLCB0cnVlKTsNCglvY3BfcmVn X3dyaXRlKHRwLCBPQ1BfRUVFX0FEViwgTURJT19FRUVfMTAwMFQgfCBNRElPX0VFRV8xMDBUWCk7 DQp9DQoNCnN0YXRpYyB2b2lkIHI4MTUyYl9lbmFibGVfZmMoc3RydWN0IHI4MTUyICp0cCkNCnsN Cgl1MTYgYW5hcjsNCg0KCWFuYXIgPSByODE1Ml9tZGlvX3JlYWQodHAsIE1JSV9BRFZFUlRJU0Up Ow0KCWFuYXIgfD0gQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNOw0K CXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9BRFZFUlRJU0UsIGFuYXIpOw0KfQ0KDQpzdGF0aWMg dm9pZCBydGxfdGFsbHlfcmVzZXQoc3RydWN0IHI4MTUyICp0cCkNCnsNCgl1MzIgb2NwX2RhdGE7 DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JTVFRB TExZKTsNCglvY3BfZGF0YSB8PSBUQUxMWV9SRVNFVDsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNV X1RZUEVfUExBLCBQTEFfUlNUVEFMTFksIG9jcF9kYXRhKTsNCn0NCg0Kc3RhdGljIHZvaWQgcjgx NTJiX2luaXQoc3RydWN0IHI4MTUyICp0cCkNCnsNCgl1MzIgb2NwX2RhdGE7DQoNCglpZiAodGVz dF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKQ0KCQlyZXR1cm47DQoNCglyODE1MmJf ZGlzYWJsZV9hbGRwcyh0cCk7DQoNCglpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMSkgew0K CQlvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0xFRF9GRUFU VVJFKTsNCgkJb2NwX2RhdGEgJj0gfkxFRF9NT0RFX01BU0s7DQoJCW9jcF93cml0ZV93b3JkKHRw LCBNQ1VfVFlQRV9QTEEsIFBMQV9MRURfRkVBVFVSRSwgb2NwX2RhdGEpOw0KCX0NCg0KCXI4MTUy X3Bvd2VyX2N1dF9lbih0cCwgZmFsc2UpOw0KDQoJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRw LCBNQ1VfVFlQRV9QTEEsIFBMQV9QSFlfUFdSKTsNCglvY3BfZGF0YSB8PSBUWF8xME1fSURMRV9F TiB8IFBGTV9QV01fU1dJVENIOw0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBM QV9QSFlfUFdSLCBvY3BfZGF0YSk7DQoJb2NwX2RhdGEgPSBvY3BfcmVhZF9kd29yZCh0cCwgTUNV X1RZUEVfUExBLCBQTEFfTUFDX1BXUl9DVFJMKTsNCglvY3BfZGF0YSAmPSB+TUNVX0NMS19SQVRJ T19NQVNLOw0KCW9jcF9kYXRhIHw9IE1DVV9DTEtfUkFUSU8gfCBEM19DTEtfR0FURURfRU47DQoJ b2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9NQUNfUFdSX0NUUkwsIG9jcF9k YXRhKTsNCglvY3BfZGF0YSA9IEdQSFlfU1RTX01TSyB8IFNQRUVEX0RPV05fTVNLIHwNCgkJICAg U1BEV05fUlhEVl9NU0sgfCBTUERXTl9MSU5LQ0hHX01TSzsNCglvY3Bfd3JpdGVfd29yZCh0cCwg TUNVX1RZUEVfUExBLCBQTEFfR1BIWV9JTlRSX0lNUiwgb2NwX2RhdGEpOw0KDQoJcjgxNTJiX2Vu YWJsZV9lZWUodHApOw0KCXI4MTUyYl9lbmFibGVfYWxkcHModHApOw0KCXI4MTUyYl9lbmFibGVf ZmModHApOw0KCXJ0bF90YWxseV9yZXNldCh0cCk7DQoNCgkvKiBlbmFibGUgcnggYWdncmVnYXRp b24gKi8NCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX1VT Ql9DVFJMKTsNCglvY3BfZGF0YSAmPSB+KFJYX0FHR19ESVNBQkxFIHwgUlhfWkVST19FTik7DQoJ b2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX1VTQl9DVFJMLCBvY3BfZGF0YSk7 DQp9DQoNCnN0YXRpYyB2b2lkIHI4MTUzX2luaXQoc3RydWN0IHI4MTUyICp0cCkNCnsNCgl1MzIg b2NwX2RhdGE7DQoJaW50IGk7DQoNCglpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ ZmxhZ3MpKQ0KCQlyZXR1cm47DQoNCglyODE1M19kaXNhYmxlX2FsZHBzKHRwKTsNCglyODE1M191 MXUyZW4odHAsIGZhbHNlKTsNCg0KCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgew0KCQlpZiAo b2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfQk9PVF9DVFJMKSAmDQoJCSAgICBB VVRPTE9BRF9ET05FKQ0KCQkJYnJlYWs7DQoJCW1zbGVlcCgyMCk7DQoJfQ0KDQoJZm9yIChpID0g MDsgaSA8IDUwMDsgaSsrKSB7DQoJCW9jcF9kYXRhID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfUEhZ X1NUQVRVUykgJiBQSFlfU1RBVF9NQVNLOw0KCQlpZiAob2NwX2RhdGEgPT0gUEhZX1NUQVRfTEFO X09OIHx8IG9jcF9kYXRhID09IFBIWV9TVEFUX1BXUkROKQ0KCQkJYnJlYWs7DQoJCW1zbGVlcCgy MCk7DQoJfQ0KDQoJdXNiX2Rpc2FibGVfbHBtKHRwLT51ZGV2KTsNCglyODE1M191MnAzZW4odHAs IGZhbHNlKTsNCg0KCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzA0KSB7DQoJCW9jcF9kYXRh ID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfU1NQSFlMSU5LMik7DQoJCW9j cF9kYXRhICY9IH5wd2RfZG5fc2NhbGVfbWFzazsNCgkJb2NwX2RhdGEgfD0gcHdkX2RuX3NjYWxl KDk2KTsNCgkJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX1NTUEhZTElOSzIs IG9jcF9kYXRhKTsNCg0KCQlvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1VT QiwgVVNCX1VTQjJQSFkpOw0KCQlvY3BfZGF0YSB8PSBVU0IyUEhZX0wxIHwgVVNCMlBIWV9TVVNQ RU5EOw0KCQlvY3Bfd3JpdGVfYnl0ZSh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfVVNCMlBIWSwgb2Nw X2RhdGEpOw0KCX0gZWxzZSBpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wNSkgew0KCQlvY3Bf ZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX0RNWV9SRUcwKTsNCgkJ b2NwX2RhdGEgJj0gfkVDTV9BTERQUzsNCgkJb2NwX3dyaXRlX2J5dGUodHAsIE1DVV9UWVBFX1BM QSwgUExBX0RNWV9SRUcwLCBvY3BfZGF0YSk7DQoNCgkJb2NwX2RhdGEgPSBvY3BfcmVhZF9ieXRl KHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9DU1JfRFVNTVkxKTsNCgkJaWYgKG9jcF9yZWFkX3dvcmQo dHAsIE1DVV9UWVBFX1VTQiwgVVNCX0JVUlNUX1NJWkUpID09IDApDQoJCQlvY3BfZGF0YSAmPSB+ RFlOQU1JQ19CVVJTVDsNCgkJZWxzZQ0KCQkJb2NwX2RhdGEgfD0gRFlOQU1JQ19CVVJTVDsNCgkJ b2NwX3dyaXRlX2J5dGUodHAsIE1DVV9UWVBFX1VTQiwgVVNCX0NTUl9EVU1NWTEsIG9jcF9kYXRh KTsNCgl9IGVsc2UgaWYgKHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDYpIHsNCgkJb2NwX2RhdGEg PSBvY3BfcmVhZF9ieXRlKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9DU1JfRFVNTVkxKTsNCgkJaWYg KG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX0JVUlNUX1NJWkUpID09IDApDQoJ CQlvY3BfZGF0YSAmPSB+RFlOQU1JQ19CVVJTVDsNCgkJZWxzZQ0KCQkJb2NwX2RhdGEgfD0gRFlO QU1JQ19CVVJTVDsNCgkJb2NwX3dyaXRlX2J5dGUodHAsIE1DVV9UWVBFX1VTQiwgVVNCX0NTUl9E VU1NWTEsIG9jcF9kYXRhKTsNCgl9DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1D VV9UWVBFX1VTQiwgVVNCX0NTUl9EVU1NWTIpOw0KCW9jcF9kYXRhIHw9IEVQNF9GVUxMX0ZDOw0K CW9jcF93cml0ZV9ieXRlKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9DU1JfRFVNTVkyLCBvY3BfZGF0 YSk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX1dE VDExX0NUUkwpOw0KCW9jcF9kYXRhICY9IH5USU1FUjExX0VOOw0KCW9jcF93cml0ZV93b3JkKHRw LCBNQ1VfVFlQRV9VU0IsIFVTQl9XRFQxMV9DVFJMLCBvY3BfZGF0YSk7DQoNCglvY3BfZGF0YSA9 IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0xFRF9GRUFUVVJFKTsNCglvY3Bf ZGF0YSAmPSB+TEVEX01PREVfTUFTSzsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExB LCBQTEFfTEVEX0ZFQVRVUkUsIG9jcF9kYXRhKTsNCg0KCW9jcF9kYXRhID0gRklGT19FTVBUWV8x RkIgfCBST0tfRVhJVF9MUE07DQoJaWYgKHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDQgJiYgdHAt PnVkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9TVVBFUikNCgkJb2NwX2RhdGEgfD0gTFBNX1RJTUVS XzUwME1TOw0KCWVsc2UNCgkJb2NwX2RhdGEgfD0gTFBNX1RJTUVSXzUwMFVTOw0KCW9jcF93cml0 ZV9ieXRlKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9MUE1fQ1RSTCwgb2NwX2RhdGEpOw0KDQoJb2Nw X2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9BRkVfQ1RSTDIpOw0K CW9jcF9kYXRhICY9IH5TRU5fVkFMX01BU0s7DQoJb2NwX2RhdGEgfD0gU0VOX1ZBTF9OT1JNQUwg fCBTRUxfUlhJRExFOw0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9BRkVf Q1RSTDIsIG9jcF9kYXRhKTsNCg0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9VU0IsIFVT Ql9DT05ORUNUX1RJTUVSLCAweDAwMDEpOw0KDQoJcjgxNTNfcG93ZXJfY3V0X2VuKHRwLCBmYWxz ZSk7DQoJcjgxNTNfdTF1MmVuKHRwLCB0cnVlKTsNCg0KCW9jcF93cml0ZV93b3JkKHRwLCBNQ1Vf VFlQRV9QTEEsIFBMQV9NQUNfUFdSX0NUUkwsIEFMRFBTX1NQRFdOX1JBVElPKTsNCglvY3Bfd3Jp dGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfTUFDX1BXUl9DVFJMMiwgRUVFX1NQRFdOX1JB VElPKTsNCglvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfTUFDX1BXUl9DVFJM MywNCgkJICAgICAgIFBLVF9BVkFJTF9TUERXTl9FTiB8IFNVU1BFTkRfU1BEV05fRU4gfA0KCQkg ICAgICAgVTFVMl9TUERXTl9FTiB8IEwxX1NQRFdOX0VOKTsNCglvY3Bfd3JpdGVfd29yZCh0cCwg TUNVX1RZUEVfUExBLCBQTEFfTUFDX1BXUl9DVFJMNCwNCgkJICAgICAgIFBXUlNBVkVfU1BEV05f RU4gfCBSWERWX1NQRFdOX0VOIHwgVFgxME1JRExFX0VOIHwNCgkJICAgICAgIFRQMTAwX1NQRFdO X0VOIHwgVFA1MDBfU1BEV05fRU4gfCBUUDEwMDBfU1BEV05fRU4gfA0KCQkgICAgICAgRUVFX1NQ RFdOX0VOKTsNCg0KCXI4MTUzX2VuYWJsZV9lZWUodHApOw0KCXI4MTUzX2VuYWJsZV9hbGRwcyh0 cCk7DQoJcjgxNTJiX2VuYWJsZV9mYyh0cCk7DQoJcnRsX3RhbGx5X3Jlc2V0KHRwKTsNCglyODE1 M191MnAzZW4odHAsIHRydWUpOw0KfQ0KDQpzdGF0aWMgaW50IHJ0bDgxNTJfcHJlX3Jlc2V0KHN0 cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQ0Kew0KCXN0cnVjdCByODE1MiAqdHAgPSB1c2JfZ2V0 X2ludGZkYXRhKGludGYpOw0KCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7DQoNCglpZiAoIXRw KQ0KCQlyZXR1cm4gMDsNCg0KCW5ldGRldiA9IHRwLT5uZXRkZXY7DQoJaWYgKCFuZXRpZl9ydW5u aW5nKG5ldGRldikpDQoJCXJldHVybiAwOw0KDQoJbmFwaV9kaXNhYmxlKCZ0cC0+bmFwaSk7DQoJ Y2xlYXJfYml0KFdPUktfRU5BQkxFLCAmdHAtPmZsYWdzKTsNCgl1c2Jfa2lsbF91cmIodHAtPmlu dHJfdXJiKTsNCgljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnRwLT5zY2hlZHVsZSk7DQoJaWYg KG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgew0KCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7 DQoJCW11dGV4X2xvY2soJnRwLT5jb250cm9sKTsNCgkJdHAtPnJ0bF9vcHMuZGlzYWJsZSh0cCk7 DQoJCW11dGV4X3VubG9jaygmdHAtPmNvbnRyb2wpOw0KCX0NCg0KCXJldHVybiAwOw0KfQ0KDQpz dGF0aWMgaW50IHJ0bDgxNTJfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikN CnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsNCglzdHJ1Y3Qg bmV0X2RldmljZSAqbmV0ZGV2Ow0KDQoJaWYgKCF0cCkNCgkJcmV0dXJuIDA7DQoNCgluZXRkZXYg PSB0cC0+bmV0ZGV2Ow0KCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQ0KCQlyZXR1cm4gMDsN Cg0KCXNldF9iaXQoV09SS19FTkFCTEUsICZ0cC0+ZmxhZ3MpOw0KCWlmIChuZXRpZl9jYXJyaWVy X29rKG5ldGRldikpIHsNCgkJbXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOw0KCQl0cC0+cnRsX29w cy5lbmFibGUodHApOw0KCQlydGw4MTUyX3NldF9yeF9tb2RlKG5ldGRldik7DQoJCW11dGV4X3Vu bG9jaygmdHAtPmNvbnRyb2wpOw0KCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7DQoJfQ0KDQoJ bmFwaV9lbmFibGUoJnRwLT5uYXBpKTsNCg0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgYm9vbCBk ZWxheV9hdXRvc3VzcGVuZChzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCWJvb2wgc3dfbGlua2luZyA9 ICEhbmV0aWZfY2Fycmllcl9vayh0cC0+bmV0ZGV2KTsNCglib29sIGh3X2xpbmtpbmcgPSAhIShy dGw4MTUyX2dldF9zcGVlZCh0cCkgJiBMSU5LX1NUQVRVUyk7DQoNCgkvKiBUaGlzIG1lYW5zIGEg bGlua2luZyBjaGFuZ2Ugb2NjdXJzIGFuZCB0aGUgZHJpdmVyIGRvZXNuJ3QgZGV0ZWN0IGl0LA0K CSAqIHlldC4gSWYgdGhlIGRyaXZlciBoYXMgZGlzYWJsZWQgdHgvcnggYW5kIGh3IGlzIGxpbmtp bmcgb24sIHRoZQ0KCSAqIGRldmljZSB3b3VsZG4ndCB3YWtlIHVwIGJ5IHJlY2VpdmluZyBhbnkg cGFja2V0Lg0KCSAqLw0KCWlmICh3b3JrX2J1c3koJnRwLT5zY2hlZHVsZS53b3JrKSB8fCBzd19s aW5raW5nICE9IGh3X2xpbmtpbmcpDQoJCXJldHVybiB0cnVlOw0KDQoJLyogSWYgdGhlIGxpbmtp bmcgZG93biBpcyBvY2N1cnJlZCBieSBud2F5LCB0aGUgZGV2aWNlIG1heSBtaXNzIHRoZQ0KCSAq IGxpbmtpbmcgY2hhbmdlIGV2ZW50LiBBbmQgaXQgd291bGRuJ3Qgd2FrZSB3aGVuIGxpbmtpbmcg b24uDQoJICovDQoJaWYgKCFzd19saW5raW5nICYmIHRwLT5ydGxfb3BzLmluX253YXkodHApKQ0K CQlyZXR1cm4gdHJ1ZTsNCgllbHNlDQoJCXJldHVybiBmYWxzZTsNCn0NCg0Kc3RhdGljIGludCBy dGw4MTUyX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBt ZXNzYWdlKQ0Kew0KCXN0cnVjdCByODE1MiAqdHAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOw0K CXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0cC0+bmV0ZGV2Ow0KCWludCByZXQgPSAwOw0K CXUzMiByY3IgPSAwOw0KDQoJbXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOw0KDQoJaWYgKFBNU0df SVNfQVVUTyhtZXNzYWdlKSkgew0KCQl1MzIgb2NwX2RhdGE7DQoNCgkJaWYgKG5ldGlmX3J1bm5p bmcobmV0ZGV2KSAmJiBkZWxheV9hdXRvc3VzcGVuZCh0cCkpIHsNCgkJCXJldCA9IC1FQlVTWTsN CgkJCWdvdG8gb3V0MTsNCgkJfQ0KDQoJCXJjciA9IG9jcF9yZWFkX2R3b3JkKHRwLCBNQ1VfVFlQ RV9QTEEsIFBMQV9SQ1IpOw0KCQlvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExB X1JDUiwgcmNyICYgflJDUl9BQ1BUX0FMTCk7DQoJCXJ4ZHlfZ2F0ZWRfZW4odHAsIHRydWUpOw0K CQlvY3BfZGF0YSA9IG9jcF9yZWFkX2J5dGUodHAsIE1DVV9UWVBFX1BMQSwgUExBX09PQl9DVFJM KTsNCgkJaWYgKCEob2NwX2RhdGEgJiBSWEZJRk9fRU1QVFkpKSB7DQoJCQlyeGR5X2dhdGVkX2Vu KHRwLCBmYWxzZSk7DQoJCQlvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JD UiwgcmNyKTsNCgkJCXJldCA9IC1FQlVTWTsNCgkJCWdvdG8gb3V0MTsNCgkJfQ0KDQoJCXNldF9i aXQoU0VMRUNUSVZFX1NVU1BFTkQsICZ0cC0+ZmxhZ3MpOw0KCX0gZWxzZSB7DQoJCW5ldGlmX2Rl dmljZV9kZXRhY2gobmV0ZGV2KTsNCgl9DQoNCglpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpICYm IHRlc3RfYml0KFdPUktfRU5BQkxFLCAmdHAtPmZsYWdzKSkgew0KCQljbGVhcl9iaXQoV09SS19F TkFCTEUsICZ0cC0+ZmxhZ3MpOw0KCQl1c2Jfa2lsbF91cmIodHAtPmludHJfdXJiKTsNCgkJbmFw aV9kaXNhYmxlKCZ0cC0+bmFwaSk7DQoJCWlmICh0ZXN0X2JpdChTRUxFQ1RJVkVfU1VTUEVORCwg JnRwLT5mbGFncykpIHsNCgkJCXJ0bF9zdG9wX3J4KHRwKTsNCgkJCXJ0bF9ydW50aW1lX3N1c3Bl bmRfZW5hYmxlKHRwLCB0cnVlKTsNCgkJCXJ4ZHlfZ2F0ZWRfZW4odHAsIGZhbHNlKTsNCgkJCW9j cF93cml0ZV9kd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfUkNSLCByY3IpOw0KCQl9IGVsc2Ug ew0KCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ0cC0+c2NoZWR1bGUpOw0KCQkJdHAtPnJ0 bF9vcHMuZG93bih0cCk7DQoJCX0NCgkJbmFwaV9lbmFibGUoJnRwLT5uYXBpKTsNCgl9DQpvdXQx Og0KCW11dGV4X3VubG9jaygmdHAtPmNvbnRyb2wpOw0KDQoJcmV0dXJuIHJldDsNCn0NCg0Kc3Rh dGljIGludCBydGw4MTUyX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikNCnsNCglz dHJ1Y3QgcjgxNTIgKnRwID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsNCg0KCW11dGV4X2xvY2so JnRwLT5jb250cm9sKTsNCg0KCWlmICghdGVzdF9iaXQoU0VMRUNUSVZFX1NVU1BFTkQsICZ0cC0+ ZmxhZ3MpKSB7DQoJCXRwLT5ydGxfb3BzLmluaXQodHApOw0KCQluZXRpZl9kZXZpY2VfYXR0YWNo KHRwLT5uZXRkZXYpOw0KCX0NCg0KCWlmIChuZXRpZl9ydW5uaW5nKHRwLT5uZXRkZXYpICYmIHRw LT5uZXRkZXYtPmZsYWdzICYgSUZGX1VQKSB7DQoJCWlmICh0ZXN0X2JpdChTRUxFQ1RJVkVfU1VT UEVORCwgJnRwLT5mbGFncykpIHsNCgkJCXJ0bF9ydW50aW1lX3N1c3BlbmRfZW5hYmxlKHRwLCBm YWxzZSk7DQoJCQljbGVhcl9iaXQoU0VMRUNUSVZFX1NVU1BFTkQsICZ0cC0+ZmxhZ3MpOw0KCQkJ bmFwaV9kaXNhYmxlKCZ0cC0+bmFwaSk7DQoJCQlzZXRfYml0KFdPUktfRU5BQkxFLCAmdHAtPmZs YWdzKTsNCgkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHRwLT5uZXRkZXYpKQ0KCQkJCXJ0bF9zdGFy dF9yeCh0cCk7DQoJCQluYXBpX2VuYWJsZSgmdHAtPm5hcGkpOw0KCQl9IGVsc2Ugew0KCQkJdHAt PnJ0bF9vcHMudXAodHApOw0KCQkJcnRsODE1Ml9zZXRfc3BlZWQodHAsIEFVVE9ORUdfRU5BQkxF LA0KCQkJCQkgIHRwLT5taWkuc3VwcG9ydHNfZ21paSA/DQoJCQkJCSAgU1BFRURfMTAwMCA6IFNQ RUVEXzEwMCwNCgkJCQkJICBEVVBMRVhfRlVMTCk7DQoJCQluZXRpZl9jYXJyaWVyX29mZih0cC0+ bmV0ZGV2KTsNCgkJCXNldF9iaXQoV09SS19FTkFCTEUsICZ0cC0+ZmxhZ3MpOw0KCQl9DQoJCXVz Yl9zdWJtaXRfdXJiKHRwLT5pbnRyX3VyYiwgR0ZQX0tFUk5FTCk7DQoJfSBlbHNlIGlmICh0ZXN0 X2JpdChTRUxFQ1RJVkVfU1VTUEVORCwgJnRwLT5mbGFncykpIHsNCgkJaWYgKHRwLT5uZXRkZXYt PmZsYWdzICYgSUZGX1VQKQ0KCQkJcnRsX3J1bnRpbWVfc3VzcGVuZF9lbmFibGUodHAsIGZhbHNl KTsNCgkJY2xlYXJfYml0KFNFTEVDVElWRV9TVVNQRU5ELCAmdHAtPmZsYWdzKTsNCgl9DQoNCglt dXRleF91bmxvY2soJnRwLT5jb250cm9sKTsNCg0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgaW50 IHJ0bDgxNTJfcmVzZXRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQ0Kew0KCXN0 cnVjdCByODE1MiAqdHAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOw0KDQoJY2xlYXJfYml0KFNF TEVDVElWRV9TVVNQRU5ELCAmdHAtPmZsYWdzKTsNCglyZXR1cm4gcnRsODE1Ml9yZXN1bWUoaW50 Zik7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bDgxNTJfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAq ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9 IG5ldGRldl9wcml2KGRldik7DQoNCglpZiAodXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHRwLT5p bnRmKSA8IDApDQoJCXJldHVybjsNCg0KCWlmICghcnRsX2Nhbl93YWtldXAodHApKSB7DQoJCXdv bC0+c3VwcG9ydGVkID0gMDsNCgkJd29sLT53b2xvcHRzID0gMDsNCgl9IGVsc2Ugew0KCQltdXRl eF9sb2NrKCZ0cC0+Y29udHJvbCk7DQoJCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9BTlk7DQoJCXdv bC0+d29sb3B0cyA9IF9fcnRsX2dldF93b2wodHApOw0KCQltdXRleF91bmxvY2soJnRwLT5jb250 cm9sKTsNCgl9DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodHAtPmludGYpOw0KfQ0KDQpz dGF0aWMgaW50IHJ0bDgxNTJfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qg ZXRodG9vbF93b2xpbmZvICp3b2wpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IG5ldGRldl9wcml2 KGRldik7DQoJaW50IHJldDsNCg0KCWlmICghcnRsX2Nhbl93YWtldXAodHApKQ0KCQlyZXR1cm4g LUVPUE5PVFNVUFA7DQoNCglyZXQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodHAtPmludGYp Ow0KCWlmIChyZXQgPCAwKQ0KCQlnb3RvIG91dF9zZXRfd29sOw0KDQoJbXV0ZXhfbG9jaygmdHAt PmNvbnRyb2wpOw0KDQoJX19ydGxfc2V0X3dvbCh0cCwgd29sLT53b2xvcHRzKTsNCgl0cC0+c2F2 ZWRfd29sb3B0cyA9IHdvbC0+d29sb3B0cyAmIFdBS0VfQU5ZOw0KDQoJbXV0ZXhfdW5sb2NrKCZ0 cC0+Y29udHJvbCk7DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodHAtPmludGYpOw0KDQpv dXRfc2V0X3dvbDoNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgdTMyIHJ0bDgxNTJfZ2V0X21z Z2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IG5l dGRldl9wcml2KGRldik7DQoNCglyZXR1cm4gdHAtPm1zZ19lbmFibGU7DQp9DQoNCnN0YXRpYyB2 b2lkIHJ0bDgxNTJfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1 ZSkNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsNCg0KCXRwLT5tc2df ZW5hYmxlID0gdmFsdWU7DQp9DQoNCnN0YXRpYyB2b2lkIHJ0bDgxNTJfZ2V0X2RydmluZm8oc3Ry dWN0IG5ldF9kZXZpY2UgKm5ldGRldiwNCgkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZv KQ0Kew0KCXN0cnVjdCByODE1MiAqdHAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOw0KDQoJc3RybGNw eShpbmZvLT5kcml2ZXIsIE1PRFVMRU5BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsNCglzdHJs Y3B5KGluZm8tPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikp Ow0KCXVzYl9tYWtlX3BhdGgodHAtPnVkZXYsIGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+ YnVzX2luZm8pKTsNCn0NCg0Kc3RhdGljDQppbnQgcnRsODE1Ml9nZXRfc2V0dGluZ3Moc3RydWN0 IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpDQp7DQoJc3RydWN0 IHI4MTUyICp0cCA9IG5ldGRldl9wcml2KG5ldGRldik7DQoJaW50IHJldDsNCg0KCWlmICghdHAt Pm1paS5tZGlvX3JlYWQpDQoJCXJldHVybiAtRU9QTk9UU1VQUDsNCg0KCXJldCA9IHVzYl9hdXRv cG1fZ2V0X2ludGVyZmFjZSh0cC0+aW50Zik7DQoJaWYgKHJldCA8IDApDQoJCWdvdG8gb3V0Ow0K DQoJbXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOw0KDQoJcmV0ID0gbWlpX2V0aHRvb2xfZ3NldCgm dHAtPm1paSwgY21kKTsNCg0KCW11dGV4X3VubG9jaygmdHAtPmNvbnRyb2wpOw0KDQoJdXNiX2F1 dG9wbV9wdXRfaW50ZXJmYWNlKHRwLT5pbnRmKTsNCg0Kb3V0Og0KCXJldHVybiByZXQ7DQp9DQoN CnN0YXRpYyBpbnQgcnRsODE1Ml9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwg c3RydWN0IGV0aHRvb2xfY21kICpjbWQpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IG5ldGRldl9w cml2KGRldik7DQoJaW50IHJldDsNCg0KCXJldCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSh0 cC0+aW50Zik7DQoJaWYgKHJldCA8IDApDQoJCWdvdG8gb3V0Ow0KDQoJbXV0ZXhfbG9jaygmdHAt PmNvbnRyb2wpOw0KDQoJcmV0ID0gcnRsODE1Ml9zZXRfc3BlZWQodHAsIGNtZC0+YXV0b25lZywg Y21kLT5zcGVlZCwgY21kLT5kdXBsZXgpOw0KDQoJbXV0ZXhfdW5sb2NrKCZ0cC0+Y29udHJvbCk7 DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodHAtPmludGYpOw0KDQpvdXQ6DQoJcmV0dXJu IHJldDsNCn0NCg0Kc3RhdGljIGNvbnN0IGNoYXIgcnRsODE1Ml9nc3RyaW5nc1tdW0VUSF9HU1RS SU5HX0xFTl0gPSB7DQoJInR4X3BhY2tldHMiLA0KCSJyeF9wYWNrZXRzIiwNCgkidHhfZXJyb3Jz IiwNCgkicnhfZXJyb3JzIiwNCgkicnhfbWlzc2VkIiwNCgkiYWxpZ25fZXJyb3JzIiwNCgkidHhf c2luZ2xlX2NvbGxpc2lvbnMiLA0KCSJ0eF9tdWx0aV9jb2xsaXNpb25zIiwNCgkicnhfdW5pY2Fz dCIsDQoJInJ4X2Jyb2FkY2FzdCIsDQoJInJ4X211bHRpY2FzdCIsDQoJInR4X2Fib3J0ZWQiLA0K CSJ0eF91bmRlcnJ1biIsDQp9Ow0KDQpzdGF0aWMgaW50IHJ0bDgxNTJfZ2V0X3NzZXRfY291bnQo c3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpDQp7DQoJc3dpdGNoIChzc2V0KSB7DQoJ Y2FzZSBFVEhfU1NfU1RBVFM6DQoJCXJldHVybiBBUlJBWV9TSVpFKHJ0bDgxNTJfZ3N0cmluZ3Mp Ow0KCWRlZmF1bHQ6DQoJCXJldHVybiAtRU9QTk9UU1VQUDsNCgl9DQp9DQoNCnN0YXRpYyB2b2lk IHJ0bDgxNTJfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwNCgkJCQkg ICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkNCnsNCglzdHJ1Y3Qg cjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsNCglzdHJ1Y3QgdGFsbHlfY291bnRlciB0YWxs eTsNCg0KCWlmICh1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodHAtPmludGYpIDwgMCkNCgkJcmV0 dXJuOw0KDQoJZ2VuZXJpY19vY3BfcmVhZCh0cCwgUExBX1RBTExZQ05ULCBzaXplb2YodGFsbHkp LCAmdGFsbHksIE1DVV9UWVBFX1BMQSk7DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodHAt PmludGYpOw0KDQoJZGF0YVswXSA9IGxlNjRfdG9fY3B1KHRhbGx5LnR4X3BhY2tldHMpOw0KCWRh dGFbMV0gPSBsZTY0X3RvX2NwdSh0YWxseS5yeF9wYWNrZXRzKTsNCglkYXRhWzJdID0gbGU2NF90 b19jcHUodGFsbHkudHhfZXJyb3JzKTsNCglkYXRhWzNdID0gbGUzMl90b19jcHUodGFsbHkucnhf ZXJyb3JzKTsNCglkYXRhWzRdID0gbGUxNl90b19jcHUodGFsbHkucnhfbWlzc2VkKTsNCglkYXRh WzVdID0gbGUxNl90b19jcHUodGFsbHkuYWxpZ25fZXJyb3JzKTsNCglkYXRhWzZdID0gbGUzMl90 b19jcHUodGFsbHkudHhfb25lX2NvbGxpc2lvbik7DQoJZGF0YVs3XSA9IGxlMzJfdG9fY3B1KHRh bGx5LnR4X211bHRpX2NvbGxpc2lvbik7DQoJZGF0YVs4XSA9IGxlNjRfdG9fY3B1KHRhbGx5LnJ4 X3VuaWNhc3QpOw0KCWRhdGFbOV0gPSBsZTY0X3RvX2NwdSh0YWxseS5yeF9icm9hZGNhc3QpOw0K CWRhdGFbMTBdID0gbGUzMl90b19jcHUodGFsbHkucnhfbXVsdGljYXN0KTsNCglkYXRhWzExXSA9 IGxlMTZfdG9fY3B1KHRhbGx5LnR4X2Fib3J0ZWQpOw0KCWRhdGFbMTJdID0gbGUxNl90b19jcHUo dGFsbHkudHhfdW5kZXJydW4pOw0KfQ0KDQpzdGF0aWMgdm9pZCBydGw4MTUyX2dldF9zdHJpbmdz KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQ0Kew0KCXN3 aXRjaCAoc3RyaW5nc2V0KSB7DQoJY2FzZSBFVEhfU1NfU1RBVFM6DQoJCW1lbWNweShkYXRhLCAq cnRsODE1Ml9nc3RyaW5ncywgc2l6ZW9mKHJ0bDgxNTJfZ3N0cmluZ3MpKTsNCgkJYnJlYWs7DQoJ fQ0KfQ0KDQpzdGF0aWMgaW50IHI4MTUyX2dldF9lZWUoc3RydWN0IHI4MTUyICp0cCwgc3RydWN0 IGV0aHRvb2xfZWVlICplZWUpDQp7DQoJdTMyIG9jcF9kYXRhLCBscCwgYWR2LCBzdXBwb3J0ZWQg PSAwOw0KCXUxNiB2YWw7DQoNCgl2YWwgPSByODE1Ml9tbWRfcmVhZCh0cCwgTURJT19NTURfUENT LCBNRElPX1BDU19FRUVfQUJMRSk7DQoJc3VwcG9ydGVkID0gbW1kX2VlZV9jYXBfdG9fZXRodG9v bF9zdXBfdCh2YWwpOw0KDQoJdmFsID0gcjgxNTJfbW1kX3JlYWQodHAsIE1ESU9fTU1EX0FOLCBN RElPX0FOX0VFRV9BRFYpOw0KCWFkdiA9IG1tZF9lZWVfYWR2X3RvX2V0aHRvb2xfYWR2X3QodmFs KTsNCg0KCXZhbCA9IHI4MTUyX21tZF9yZWFkKHRwLCBNRElPX01NRF9BTiwgTURJT19BTl9FRUVf TFBBQkxFKTsNCglscCA9IG1tZF9lZWVfYWR2X3RvX2V0aHRvb2xfYWR2X3QodmFsKTsNCg0KCW9j cF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NSKTsNCglv Y3BfZGF0YSAmPSBFRUVfUlhfRU4gfCBFRUVfVFhfRU47DQoNCgllZWUtPmVlZV9lbmFibGVkID0g ISFvY3BfZGF0YTsNCgllZWUtPmVlZV9hY3RpdmUgPSAhIShzdXBwb3J0ZWQgJiBhZHYgJiBscCk7 DQoJZWVlLT5zdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7DQoJZWVlLT5hZHZlcnRpc2VkID0gYWR2Ow0K CWVlZS0+bHBfYWR2ZXJ0aXNlZCA9IGxwOw0KDQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQg cjgxNTJfc2V0X2VlZShzdHJ1Y3QgcjgxNTIgKnRwLCBzdHJ1Y3QgZXRodG9vbF9lZWUgKmVlZSkN CnsNCgl1MTYgdmFsID0gZXRodG9vbF9hZHZfdG9fbW1kX2VlZV9hZHZfdChlZWUtPmFkdmVydGlz ZWQpOw0KDQoJcjgxNTJfZWVlX2VuKHRwLCBlZWUtPmVlZV9lbmFibGVkKTsNCg0KCWlmICghZWVl LT5lZWVfZW5hYmxlZCkNCgkJdmFsID0gMDsNCg0KCXI4MTUyX21tZF93cml0ZSh0cCwgTURJT19N TURfQU4sIE1ESU9fQU5fRUVFX0FEViwgdmFsKTsNCg0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMg aW50IHI4MTUzX2dldF9lZWUoc3RydWN0IHI4MTUyICp0cCwgc3RydWN0IGV0aHRvb2xfZWVlICpl ZWUpDQp7DQoJdTMyIG9jcF9kYXRhLCBscCwgYWR2LCBzdXBwb3J0ZWQgPSAwOw0KCXUxNiB2YWw7 DQoNCgl2YWwgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQUJMRSk7DQoJc3VwcG9ydGVkID0g bW1kX2VlZV9jYXBfdG9fZXRodG9vbF9zdXBfdCh2YWwpOw0KDQoJdmFsID0gb2NwX3JlZ19yZWFk KHRwLCBPQ1BfRUVFX0FEVik7DQoJYWR2ID0gbW1kX2VlZV9hZHZfdG9fZXRodG9vbF9hZHZfdCh2 YWwpOw0KDQoJdmFsID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0xQQUJMRSk7DQoJbHAgPSBt bWRfZWVlX2Fkdl90b19ldGh0b29sX2Fkdl90KHZhbCk7DQoNCglvY3BfZGF0YSA9IG9jcF9yZWFk X3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUik7DQoJb2NwX2RhdGEgJj0gRUVFX1JY X0VOIHwgRUVFX1RYX0VOOw0KDQoJZWVlLT5lZWVfZW5hYmxlZCA9ICEhb2NwX2RhdGE7DQoJZWVl LT5lZWVfYWN0aXZlID0gISEoc3VwcG9ydGVkICYgYWR2ICYgbHApOw0KCWVlZS0+c3VwcG9ydGVk ID0gc3VwcG9ydGVkOw0KCWVlZS0+YWR2ZXJ0aXNlZCA9IGFkdjsNCgllZWUtPmxwX2FkdmVydGlz ZWQgPSBscDsNCg0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgaW50IHI4MTUzX3NldF9lZWUoc3Ry dWN0IHI4MTUyICp0cCwgc3RydWN0IGV0aHRvb2xfZWVlICplZWUpDQp7DQoJdTE2IHZhbCA9IGV0 aHRvb2xfYWR2X3RvX21tZF9lZWVfYWR2X3QoZWVlLT5hZHZlcnRpc2VkKTsNCg0KCXI4MTUzX2Vl ZV9lbih0cCwgZWVlLT5lZWVfZW5hYmxlZCk7DQoNCglpZiAoIWVlZS0+ZWVlX2VuYWJsZWQpDQoJ CXZhbCA9IDA7DQoNCglvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FEViwgdmFsKTsNCg0KCXJl dHVybiAwOw0KfQ0KDQpzdGF0aWMgaW50DQpydGxfZXRodG9vbF9nZXRfZWVlKHN0cnVjdCBuZXRf ZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2VlZSAqZWRhdGEpDQp7DQoJc3RydWN0IHI4MTUy ICp0cCA9IG5ldGRldl9wcml2KG5ldCk7DQoJaW50IHJldDsNCg0KCXJldCA9IHVzYl9hdXRvcG1f Z2V0X2ludGVyZmFjZSh0cC0+aW50Zik7DQoJaWYgKHJldCA8IDApDQoJCWdvdG8gb3V0Ow0KDQoJ bXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOw0KDQoJcmV0ID0gdHAtPnJ0bF9vcHMuZWVlX2dldCh0 cCwgZWRhdGEpOw0KDQoJbXV0ZXhfdW5sb2NrKCZ0cC0+Y29udHJvbCk7DQoNCgl1c2JfYXV0b3Bt X3B1dF9pbnRlcmZhY2UodHAtPmludGYpOw0KDQpvdXQ6DQoJcmV0dXJuIHJldDsNCn0NCg0Kc3Rh dGljIGludA0KcnRsX2V0aHRvb2xfc2V0X2VlZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1 Y3QgZXRodG9vbF9lZWUgKmVkYXRhKQ0Kew0KCXN0cnVjdCByODE1MiAqdHAgPSBuZXRkZXZfcHJp dihuZXQpOw0KCWludCByZXQ7DQoNCglyZXQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodHAt PmludGYpOw0KCWlmIChyZXQgPCAwKQ0KCQlnb3RvIG91dDsNCg0KCW11dGV4X2xvY2soJnRwLT5j b250cm9sKTsNCg0KCXJldCA9IHRwLT5ydGxfb3BzLmVlZV9zZXQodHAsIGVkYXRhKTsNCglpZiAo IXJldCkNCgkJcmV0ID0gbWlpX253YXlfcmVzdGFydCgmdHAtPm1paSk7DQoNCgltdXRleF91bmxv Y2soJnRwLT5jb250cm9sKTsNCg0KCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSh0cC0+aW50Zik7 DQoNCm91dDoNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgaW50IHJ0bDgxNTJfbndheV9yZXNl dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0Kew0KCXN0cnVjdCByODE1MiAqdHAgPSBuZXRkZXZf cHJpdihkZXYpOw0KCWludCByZXQ7DQoNCglyZXQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uo dHAtPmludGYpOw0KCWlmIChyZXQgPCAwKQ0KCQlnb3RvIG91dDsNCg0KCW11dGV4X2xvY2soJnRw LT5jb250cm9sKTsNCg0KCXJldCA9IG1paV9ud2F5X3Jlc3RhcnQoJnRwLT5taWkpOw0KDQoJbXV0 ZXhfdW5sb2NrKCZ0cC0+Y29udHJvbCk7DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodHAt PmludGYpOw0KDQpvdXQ6DQoJcmV0dXJuIHJldDsNCn0NCg0Kc3RhdGljIGludCBydGw4MTUyX2dl dF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LA0KCQkJCXN0cnVjdCBldGh0b29s X2NvYWxlc2NlICpjb2FsZXNjZSkNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYo bmV0ZGV2KTsNCg0KCXN3aXRjaCAodHAtPnZlcnNpb24pIHsNCgljYXNlIFJUTF9WRVJfMDE6DQoJ Y2FzZSBSVExfVkVSXzAyOg0KCQlyZXR1cm4gLUVPUE5PVFNVUFA7DQoJZGVmYXVsdDoNCgkJYnJl YWs7DQoJfQ0KDQoJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzID0gdHAtPmNvYWxlc2NlOw0K DQoJcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQgcnRsODE1Ml9zZXRfY29hbGVzY2Uoc3RydWN0 IG5ldF9kZXZpY2UgKm5ldGRldiwNCgkJCQlzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbGVz Y2UpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IG5ldGRldl9wcml2KG5ldGRldik7DQoJaW50IHJl dDsNCg0KCXN3aXRjaCAodHAtPnZlcnNpb24pIHsNCgljYXNlIFJUTF9WRVJfMDE6DQoJY2FzZSBS VExfVkVSXzAyOg0KCQlyZXR1cm4gLUVPUE5PVFNVUFA7DQoJZGVmYXVsdDoNCgkJYnJlYWs7DQoJ fQ0KDQoJaWYgKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyA+IENPQUxFU0NFX1NMT1cpDQoJ CXJldHVybiAtRUlOVkFMOw0KDQoJcmV0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHRwLT5p bnRmKTsNCglpZiAocmV0IDwgMCkNCgkJcmV0dXJuIHJldDsNCg0KCW11dGV4X2xvY2soJnRwLT5j b250cm9sKTsNCg0KCWlmICh0cC0+Y29hbGVzY2UgIT0gY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3Vz ZWNzKSB7DQoJCXRwLT5jb2FsZXNjZSA9IGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjczsNCg0K CQlpZiAobmV0aWZfcnVubmluZyh0cC0+bmV0ZGV2KSAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRl dikpDQoJCQlyODE1M19zZXRfcnhfZWFybHlfdGltZW91dCh0cCk7DQoJfQ0KDQoJbXV0ZXhfdW5s b2NrKCZ0cC0+Y29udHJvbCk7DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodHAtPmludGYp Ow0KDQoJcmV0dXJuIHJldDsNCn0NCg0Kc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7 DQoJLmdldF9kcnZpbmZvID0gcnRsODE1Ml9nZXRfZHJ2aW5mbywNCgkuZ2V0X3NldHRpbmdzID0g cnRsODE1Ml9nZXRfc2V0dGluZ3MsDQoJLnNldF9zZXR0aW5ncyA9IHJ0bDgxNTJfc2V0X3NldHRp bmdzLA0KCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssDQoJLm53YXlfcmVzZXQgPSBy dGw4MTUyX253YXlfcmVzZXQsDQoJLmdldF9tc2dsZXZlbCA9IHJ0bDgxNTJfZ2V0X21zZ2xldmVs LA0KCS5zZXRfbXNnbGV2ZWwgPSBydGw4MTUyX3NldF9tc2dsZXZlbCwNCgkuZ2V0X3dvbCA9IHJ0 bDgxNTJfZ2V0X3dvbCwNCgkuc2V0X3dvbCA9IHJ0bDgxNTJfc2V0X3dvbCwNCgkuZ2V0X3N0cmlu Z3MgPSBydGw4MTUyX2dldF9zdHJpbmdzLA0KCS5nZXRfc3NldF9jb3VudCA9IHJ0bDgxNTJfZ2V0 X3NzZXRfY291bnQsDQoJLmdldF9ldGh0b29sX3N0YXRzID0gcnRsODE1Ml9nZXRfZXRodG9vbF9z dGF0cywNCgkuZ2V0X2NvYWxlc2NlID0gcnRsODE1Ml9nZXRfY29hbGVzY2UsDQoJLnNldF9jb2Fs ZXNjZSA9IHJ0bDgxNTJfc2V0X2NvYWxlc2NlLA0KCS5nZXRfZWVlID0gcnRsX2V0aHRvb2xfZ2V0 X2VlZSwNCgkuc2V0X2VlZSA9IHJ0bF9ldGh0b29sX3NldF9lZWUsDQp9Ow0KDQpzdGF0aWMgaW50 IHJ0bDgxNTJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICpy cSwgaW50IGNtZCkNCnsNCglzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsN CglzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOw0KCWludCByZXM7DQoN CglpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKQ0KCQlyZXR1cm4gLUVO T0RFVjsNCg0KCXJlcyA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSh0cC0+aW50Zik7DQoJaWYg KHJlcyA8IDApDQoJCWdvdG8gb3V0Ow0KDQoJc3dpdGNoIChjbWQpIHsNCgljYXNlIFNJT0NHTUlJ UEhZOg0KCQlkYXRhLT5waHlfaWQgPSBSODE1Ml9QSFlfSUQ7IC8qIEludGVybmFsIFBIWSAqLw0K CQlicmVhazsNCg0KCWNhc2UgU0lPQ0dNSUlSRUc6DQoJCW11dGV4X2xvY2soJnRwLT5jb250cm9s KTsNCgkJZGF0YS0+dmFsX291dCA9IHI4MTUyX21kaW9fcmVhZCh0cCwgZGF0YS0+cmVnX251bSk7 DQoJCW11dGV4X3VubG9jaygmdHAtPmNvbnRyb2wpOw0KCQlicmVhazsNCg0KCWNhc2UgU0lPQ1NN SUlSRUc6DQoJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgew0KCQkJcmVzID0gLUVQRVJN Ow0KCQkJYnJlYWs7DQoJCX0NCgkJbXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOw0KCQlyODE1Ml9t ZGlvX3dyaXRlKHRwLCBkYXRhLT5yZWdfbnVtLCBkYXRhLT52YWxfaW4pOw0KCQltdXRleF91bmxv Y2soJnRwLT5jb250cm9sKTsNCgkJYnJlYWs7DQoNCglkZWZhdWx0Og0KCQlyZXMgPSAtRU9QTk9U U1VQUDsNCgl9DQoNCgl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodHAtPmludGYpOw0KDQpvdXQ6 DQoJcmV0dXJuIHJlczsNCn0NCg0Kc3RhdGljIGludCBydGw4MTUyX2NoYW5nZV9tdHUoc3RydWN0 IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IG5l dGRldl9wcml2KGRldik7DQoJaW50IHJldDsNCg0KCXN3aXRjaCAodHAtPnZlcnNpb24pIHsNCglj YXNlIFJUTF9WRVJfMDE6DQoJY2FzZSBSVExfVkVSXzAyOg0KCQlyZXR1cm4gZXRoX2NoYW5nZV9t dHUoZGV2LCBuZXdfbXR1KTsNCglkZWZhdWx0Og0KCQlicmVhazsNCgl9DQoNCglpZiAobmV3X210 dSA8IDY4IHx8IG5ld19tdHUgPiBSVEw4MTUzX01BWF9NVFUpDQoJCXJldHVybiAtRUlOVkFMOw0K DQoJcmV0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHRwLT5pbnRmKTsNCglpZiAocmV0IDwg MCkNCgkJcmV0dXJuIHJldDsNCg0KCW11dGV4X2xvY2soJnRwLT5jb250cm9sKTsNCg0KCWRldi0+ bXR1ID0gbmV3X210dTsNCg0KCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgbmV0aWZfY2Fycmll cl9vayhkZXYpKQ0KCQlyODE1M19zZXRfcnhfZWFybHlfc2l6ZSh0cCk7DQoNCgltdXRleF91bmxv Y2soJnRwLT5jb250cm9sKTsNCg0KCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSh0cC0+aW50Zik7 DQoNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3Bz IHJ0bDgxNTJfbmV0ZGV2X29wcyA9IHsNCgkubmRvX29wZW4JCT0gcnRsODE1Ml9vcGVuLA0KCS5u ZG9fc3RvcAkJPSBydGw4MTUyX2Nsb3NlLA0KCS5uZG9fZG9faW9jdGwJCT0gcnRsODE1Ml9pb2N0 bCwNCgkubmRvX3N0YXJ0X3htaXQJCT0gcnRsODE1Ml9zdGFydF94bWl0LA0KCS5uZG9fdHhfdGlt ZW91dAkJPSBydGw4MTUyX3R4X3RpbWVvdXQsDQoJLm5kb19zZXRfZmVhdHVyZXMJPSBydGw4MTUy X3NldF9mZWF0dXJlcywNCgkubmRvX3NldF9yeF9tb2RlCT0gcnRsODE1Ml9zZXRfcnhfbW9kZSwN CgkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHJ0bDgxNTJfc2V0X21hY19hZGRyZXNzLA0KCS5uZG9f Y2hhbmdlX210dQkJPSBydGw4MTUyX2NoYW5nZV9tdHUsDQoJLm5kb192YWxpZGF0ZV9hZGRyCT0g ZXRoX3ZhbGlkYXRlX2FkZHIsDQoJLm5kb19mZWF0dXJlc19jaGVjawk9IHJ0bDgxNTJfZmVhdHVy ZXNfY2hlY2ssDQp9Ow0KDQpzdGF0aWMgdm9pZCByODE1MmJfZ2V0X3ZlcnNpb24oc3RydWN0IHI4 MTUyICp0cCkNCnsNCgl1MzIJb2NwX2RhdGE7DQoJdTE2CXZlcnNpb247DQoNCglvY3BfZGF0YSA9 IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1RDUjEpOw0KCXZlcnNpb24gPSAo dTE2KShvY3BfZGF0YSAmIFZFUlNJT05fTUFTSyk7DQoNCglzd2l0Y2ggKHZlcnNpb24pIHsNCglj YXNlIDB4NGMwMDoNCgkJdHAtPnZlcnNpb24gPSBSVExfVkVSXzAxOw0KCQlicmVhazsNCgljYXNl IDB4NGMxMDoNCgkJdHAtPnZlcnNpb24gPSBSVExfVkVSXzAyOw0KCQlicmVhazsNCgljYXNlIDB4 NWMwMDoNCgkJdHAtPnZlcnNpb24gPSBSVExfVkVSXzAzOw0KCQl0cC0+bWlpLnN1cHBvcnRzX2dt aWkgPSAxOw0KCQlicmVhazsNCgljYXNlIDB4NWMxMDoNCgkJdHAtPnZlcnNpb24gPSBSVExfVkVS XzA0Ow0KCQl0cC0+bWlpLnN1cHBvcnRzX2dtaWkgPSAxOw0KCQlicmVhazsNCgljYXNlIDB4NWMy MDoNCgkJdHAtPnZlcnNpb24gPSBSVExfVkVSXzA1Ow0KCQl0cC0+bWlpLnN1cHBvcnRzX2dtaWkg PSAxOw0KCQlicmVhazsNCgljYXNlIDB4NWMzMDoNCgkJdHAtPnZlcnNpb24gPSBSVExfVkVSXzA2 Ow0KCQl0cC0+bWlpLnN1cHBvcnRzX2dtaWkgPSAxOw0KCQlicmVhazsNCglkZWZhdWx0Og0KCQlu ZXRpZl9pbmZvKHRwLCBwcm9iZSwgdHAtPm5ldGRldiwNCgkJCSAgICJVbmtub3duIHZlcnNpb24g MHglMDR4XG4iLCB2ZXJzaW9uKTsNCgkJYnJlYWs7DQoJfQ0KfQ0KDQpzdGF0aWMgdm9pZCBydGw4 MTUyX3VubG9hZChzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCWlmICh0ZXN0X2JpdChSVEw4MTUyX1VO UExVRywgJnRwLT5mbGFncykpDQoJCXJldHVybjsNCg0KCWlmICh0cC0+dmVyc2lvbiAhPSBSVExf VkVSXzAxKQ0KCQlyODE1Ml9wb3dlcl9jdXRfZW4odHAsIHRydWUpOw0KfQ0KDQpzdGF0aWMgdm9p ZCBydGw4MTUzX3VubG9hZChzdHJ1Y3QgcjgxNTIgKnRwKQ0Kew0KCWlmICh0ZXN0X2JpdChSVEw4 MTUyX1VOUExVRywgJnRwLT5mbGFncykpDQoJCXJldHVybjsNCg0KCXI4MTUzX3Bvd2VyX2N1dF9l bih0cCwgZmFsc2UpOw0KfQ0KDQpzdGF0aWMgaW50IHJ0bF9vcHNfaW5pdChzdHJ1Y3QgcjgxNTIg KnRwKQ0Kew0KCXN0cnVjdCBydGxfb3BzICpvcHMgPSAmdHAtPnJ0bF9vcHM7DQoJaW50IHJldCA9 IDA7DQoNCglzd2l0Y2ggKHRwLT52ZXJzaW9uKSB7DQoJY2FzZSBSVExfVkVSXzAxOg0KCWNhc2Ug UlRMX1ZFUl8wMjoNCgkJb3BzLT5pbml0CQk9IHI4MTUyYl9pbml0Ow0KCQlvcHMtPmVuYWJsZQkJ PSBydGw4MTUyX2VuYWJsZTsNCgkJb3BzLT5kaXNhYmxlCQk9IHJ0bDgxNTJfZGlzYWJsZTsNCgkJ b3BzLT51cAkJCT0gcnRsODE1Ml91cDsNCgkJb3BzLT5kb3duCQk9IHJ0bDgxNTJfZG93bjsNCgkJ b3BzLT51bmxvYWQJCT0gcnRsODE1Ml91bmxvYWQ7DQoJCW9wcy0+ZWVlX2dldAkJPSByODE1Ml9n ZXRfZWVlOw0KCQlvcHMtPmVlZV9zZXQJCT0gcjgxNTJfc2V0X2VlZTsNCgkJb3BzLT5pbl9ud2F5 CQk9IHJ0bDgxNTJfaW5fbndheTsNCgkJYnJlYWs7DQoNCgljYXNlIFJUTF9WRVJfMDM6DQoJY2Fz ZSBSVExfVkVSXzA0Og0KCWNhc2UgUlRMX1ZFUl8wNToNCgljYXNlIFJUTF9WRVJfMDY6DQoJCW9w cy0+aW5pdAkJPSByODE1M19pbml0Ow0KCQlvcHMtPmVuYWJsZQkJPSBydGw4MTUzX2VuYWJsZTsN CgkJb3BzLT5kaXNhYmxlCQk9IHJ0bDgxNTNfZGlzYWJsZTsNCgkJb3BzLT51cAkJCT0gcnRsODE1 M191cDsNCgkJb3BzLT5kb3duCQk9IHJ0bDgxNTNfZG93bjsNCgkJb3BzLT51bmxvYWQJCT0gcnRs ODE1M191bmxvYWQ7DQoJCW9wcy0+ZWVlX2dldAkJPSByODE1M19nZXRfZWVlOw0KCQlvcHMtPmVl ZV9zZXQJCT0gcjgxNTNfc2V0X2VlZTsNCgkJb3BzLT5pbl9ud2F5CQk9IHJ0bDgxNTNfaW5fbndh eTsNCgkJYnJlYWs7DQoNCglkZWZhdWx0Og0KCQlyZXQgPSAtRU5PREVWOw0KCQluZXRpZl9lcnIo dHAsIHByb2JlLCB0cC0+bmV0ZGV2LCAiVW5rbm93biBEZXZpY2VcbiIpOw0KCQlicmVhazsNCgl9 DQoNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgaW50IHJ0bDgxNTJfcHJvYmUoc3RydWN0IHVz Yl9pbnRlcmZhY2UgKmludGYsDQoJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQ0K ew0KCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsN CglzdHJ1Y3QgcjgxNTIgKnRwOw0KCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7DQoJaW50IHJl dDsNCg0KCWlmICh1ZGV2LT5hY3Rjb25maWctPmRlc2MuYkNvbmZpZ3VyYXRpb25WYWx1ZSAhPSAx KSB7DQoJCXVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24odWRldiwgMSk7DQoJCXJldHVybiAt RU5PREVWOw0KCX0NCg0KCXVzYl9yZXNldF9kZXZpY2UodWRldik7DQoJbmV0ZGV2ID0gYWxsb2Nf ZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByODE1MikpOw0KCWlmICghbmV0ZGV2KSB7DQoJCWRldl9l cnIoJmludGYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOw0KCQlyZXR1cm4gLUVOT01FTTsNCgl9 DQoNCglTRVRfTkVUREVWX0RFVihuZXRkZXYsICZpbnRmLT5kZXYpOw0KCXRwID0gbmV0ZGV2X3By aXYobmV0ZGV2KTsNCgl0cC0+bXNnX2VuYWJsZSA9IDB4N0ZGRjsNCg0KCXRwLT51ZGV2ID0gdWRl djsNCgl0cC0+bmV0ZGV2ID0gbmV0ZGV2Ow0KCXRwLT5pbnRmID0gaW50ZjsNCg0KCXI4MTUyYl9n ZXRfdmVyc2lvbih0cCk7DQoJcmV0ID0gcnRsX29wc19pbml0KHRwKTsNCglpZiAocmV0KQ0KCQln b3RvIG91dDsNCg0KCW11dGV4X2luaXQoJnRwLT5jb250cm9sKTsNCglJTklUX0RFTEFZRURfV09S SygmdHAtPnNjaGVkdWxlLCBydGxfd29ya19mdW5jX3QpOw0KDQoJbmV0ZGV2LT5uZXRkZXZfb3Bz ID0gJnJ0bDgxNTJfbmV0ZGV2X29wczsNCgluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gUlRMODE1 Ml9UWF9USU1FT1VUOw0KDQoJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1JYQ1NVTSB8IE5F VElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0cgfA0KCQkJICAgIE5FVElGX0ZfVFNPIHwgTkVUSUZf Rl9GUkFHTElTVCB8IE5FVElGX0ZfSVBWNl9DU1VNIHwNCgkJCSAgICBORVRJRl9GX1RTTzYgfCBO RVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8DQoJCQkgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFg7 DQoJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9JUF9DU1VN IHwgTkVUSUZfRl9TRyB8DQoJCQkgICAgICBORVRJRl9GX1RTTyB8IE5FVElGX0ZfRlJBR0xJU1Qg fA0KCQkJICAgICAgTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX1RTTzYgfA0KCQkJICAgICAg TkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWDsNCgluZXRk ZXYtPnZsYW5fZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZf Rl9UU08gfA0KCQkJCU5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfRlJBR0xJU1QgfA0KCQkJCU5F VElGX0ZfSVBWNl9DU1VNIHwgTkVUSUZfRl9UU082Ow0KDQoJbmV0ZGV2LT5ldGh0b29sX29wcyA9 ICZvcHM7DQoJbmV0aWZfc2V0X2dzb19tYXhfc2l6ZShuZXRkZXYsIFJUTF9MSU1JVEVEX1RTT19T SVpFKTsNCg0KCXRwLT5taWkuZGV2ID0gbmV0ZGV2Ow0KCXRwLT5taWkubWRpb19yZWFkID0gcmVh ZF9taWlfd29yZDsNCgl0cC0+bWlpLm1kaW9fd3JpdGUgPSB3cml0ZV9taWlfd29yZDsNCgl0cC0+ bWlpLnBoeV9pZF9tYXNrID0gMHgzZjsNCgl0cC0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7DQoJ dHAtPm1paS5waHlfaWQgPSBSODE1Ml9QSFlfSUQ7DQoNCglzd2l0Y2ggKHVkZXYtPnNwZWVkKSB7 DQoJY2FzZSBVU0JfU1BFRURfU1VQRVI6DQoJCXRwLT5jb2FsZXNjZSA9IENPQUxFU0NFX1NVUEVS Ow0KCQlicmVhazsNCgljYXNlIFVTQl9TUEVFRF9ISUdIOg0KCQl0cC0+Y29hbGVzY2UgPSBDT0FM RVNDRV9ISUdIOw0KCQlicmVhazsNCglkZWZhdWx0Og0KCQl0cC0+Y29hbGVzY2UgPSBDT0FMRVND RV9TTE9XOw0KCQlicmVhazsNCgl9DQoNCglpbnRmLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMTsN Cg0KCXRwLT5ydGxfb3BzLmluaXQodHApOw0KCXNldF9ldGhlcm5ldF9hZGRyKHRwKTsNCg0KCXVz Yl9zZXRfaW50ZmRhdGEoaW50ZiwgdHApOw0KCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJnRwLT5u YXBpLCByODE1Ml9wb2xsLCBSVEw4MTUyX05BUElfV0VJR0hUKTsNCg0KCXJldCA9IHJlZ2lzdGVy X25ldGRldihuZXRkZXYpOw0KCWlmIChyZXQgIT0gMCkgew0KCQluZXRpZl9lcnIodHAsIHByb2Jl LCBuZXRkZXYsICJjb3VsZG4ndCByZWdpc3RlciB0aGUgZGV2aWNlXG4iKTsNCgkJZ290byBvdXQx Ow0KCX0NCg0KCWlmICghcnRsX2Nhbl93YWtldXAodHApKQ0KCQlfX3J0bF9zZXRfd29sKHRwLCAw KTsNCg0KCXRwLT5zYXZlZF93b2xvcHRzID0gX19ydGxfZ2V0X3dvbCh0cCk7DQoJaWYgKHRwLT5z YXZlZF93b2xvcHRzKQ0KCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJnVkZXYtPmRldiwgdHJ1 ZSk7DQoJZWxzZQ0KCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJnVkZXYtPmRldiwgZmFsc2Up Ow0KDQoJbmV0aWZfaW5mbyh0cCwgcHJvYmUsIG5ldGRldiwgIiVzXG4iLCBEUklWRVJfVkVSU0lP Tik7DQoNCglyZXR1cm4gMDsNCg0Kb3V0MToNCgluZXRpZl9uYXBpX2RlbCgmdHAtPm5hcGkpOw0K CXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7DQpvdXQ6DQoJZnJlZV9uZXRkZXYobmV0ZGV2 KTsNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgdm9pZCBydGw4MTUyX2Rpc2Nvbm5lY3Qoc3Ry dWN0IHVzYl9pbnRlcmZhY2UgKmludGYpDQp7DQoJc3RydWN0IHI4MTUyICp0cCA9IHVzYl9nZXRf aW50ZmRhdGEoaW50Zik7DQoNCgl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOw0KCWlmICh0 cCkgew0KCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHRwLT51ZGV2Ow0KDQoJCWlmICh1ZGV2 LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpDQoJCQlzZXRfYml0KFJUTDgxNTJfVU5Q TFVHLCAmdHAtPmZsYWdzKTsNCg0KCQluZXRpZl9uYXBpX2RlbCgmdHAtPm5hcGkpOw0KCQl1bnJl Z2lzdGVyX25ldGRldih0cC0+bmV0ZGV2KTsNCgkJdHAtPnJ0bF9vcHMudW5sb2FkKHRwKTsNCgkJ ZnJlZV9uZXRkZXYodHAtPm5ldGRldik7DQoJfQ0KfQ0KDQojZGVmaW5lIFJFQUxURUtfVVNCX0RF VklDRSh2ZW5kLCBwcm9kKQlcDQoJLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9E RVZJQ0UgfCBcDQoJCSAgICAgICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9DTEFTUywgXA0KCS5p ZFZlbmRvciA9ICh2ZW5kKSwgXA0KCS5pZFByb2R1Y3QgPSAocHJvZCksIFwNCgkuYkludGVyZmFj ZUNsYXNzID0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDIFwNCn0sIFwNCnsgXA0KCS5tYXRjaF9mbGFn cyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0lORk8gfCBcDQoJCSAgICAgICBVU0JfREVWSUNF X0lEX01BVENIX0RFVklDRSwgXA0KCS5pZFZlbmRvciA9ICh2ZW5kKSwgXA0KCS5pZFByb2R1Y3Qg PSAocHJvZCksIFwNCgkuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX0NPTU0sIFwNCgkuYklu dGVyZmFjZVN1YkNsYXNzID0gVVNCX0NEQ19TVUJDTEFTU19FVEhFUk5FVCwgXA0KCS5iSW50ZXJm YWNlUHJvdG9jb2wgPSBVU0JfQ0RDX1BST1RPX05PTkUNCg0KLyogdGFibGUgb2YgZGV2aWNlcyB0 aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLw0Kc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lk IHJ0bDgxNTJfdGFibGVbXSA9IHsNCgl7UkVBTFRFS19VU0JfREVWSUNFKFZFTkRPUl9JRF9SRUFM VEVLLCAweDgxNTIpfSwNCgl7UkVBTFRFS19VU0JfREVWSUNFKFZFTkRPUl9JRF9SRUFMVEVLLCAw eDgxNTMpfSwNCgl7UkVBTFRFS19VU0JfREVWSUNFKFZFTkRPUl9JRF9TQU1TVU5HLCAweGExMDEp fSwNCgl7UkVBTFRFS19VU0JfREVWSUNFKFZFTkRPUl9JRF9MRU5PVk8sICAweDcyMDUpfSwNCgl7 UkVBTFRFS19VU0JfREVWSUNFKFZFTkRPUl9JRF9MRU5PVk8sICAweDMwNGYpfSwNCgl7UkVBTFRF S19VU0JfREVWSUNFKFZFTkRPUl9JRF9OVklESUEsICAweDA5ZmYpfSwNCgl7fQ0KfTsNCg0KTU9E VUxFX0RFVklDRV9UQUJMRSh1c2IsIHJ0bDgxNTJfdGFibGUpOw0KDQpzdGF0aWMgc3RydWN0IHVz Yl9kcml2ZXIgcnRsODE1Ml9kcml2ZXIgPSB7DQoJLm5hbWUgPQkJTU9EVUxFTkFNRSwNCgkuaWRf dGFibGUgPQlydGw4MTUyX3RhYmxlLA0KCS5wcm9iZSA9CXJ0bDgxNTJfcHJvYmUsDQoJLmRpc2Nv bm5lY3QgPQlydGw4MTUyX2Rpc2Nvbm5lY3QsDQoJLnN1c3BlbmQgPQlydGw4MTUyX3N1c3BlbmQs DQoJLnJlc3VtZSA9CXJ0bDgxNTJfcmVzdW1lLA0KCS5yZXNldF9yZXN1bWUgPQlydGw4MTUyX3Jl c2V0X3Jlc3VtZSwNCgkucHJlX3Jlc2V0ID0JcnRsODE1Ml9wcmVfcmVzZXQsDQoJLnBvc3RfcmVz ZXQgPQlydGw4MTUyX3Bvc3RfcmVzZXQsDQoJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwNCgku ZGlzYWJsZV9odWJfaW5pdGlhdGVkX2xwbSA9IDEsDQp9Ow0KDQptb2R1bGVfdXNiX2RyaXZlcihy dGw4MTUyX2RyaXZlcik7DQoNCk1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7DQpNT0RVTEVf REVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOw0KTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOw0K --_002_0835B3720019904CB8F7AA43166CEEB20105C9EERTITMBSV03realt_--