From owner-freebsd-fs@freebsd.org Thu Jun 22 22:24:07 2017 Return-Path: Delivered-To: freebsd-fs@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 42FFCD95879 for ; Thu, 22 Jun 2017 22:24:07 +0000 (UTC) (envelope-from rmacklem@uoguelph.ca) Received: from CAN01-QB1-obe.outbound.protection.outlook.com (mail-eopbgr660068.outbound.protection.outlook.com [40.107.66.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client CN "mail.protection.outlook.com", Issuer "Microsoft IT SSL SHA2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id BD79B67A34 for ; Thu, 22 Jun 2017 22:24:06 +0000 (UTC) (envelope-from rmacklem@uoguelph.ca) Received: from YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM (10.165.218.133) by YTXPR01MB0190.CANPRD01.PROD.OUTLOOK.COM (10.165.218.134) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1178.14; Thu, 22 Jun 2017 22:24:03 +0000 Received: from YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM ([10.165.218.133]) by YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM ([10.165.218.133]) with mapi id 15.01.1178.023; Thu, 22 Jun 2017 22:24:03 +0000 From: Rick Macklem To: "freebsd-fs@freebsd.org" Subject: patch that adds two additional NFSv4.1 compound RPCs to the client Thread-Topic: patch that adds two additional NFSv4.1 compound RPCs to the client Thread-Index: AQHS66XK/ka2oKFZiUmSwrXkmlPFhw== Date: Thu, 22 Jun 2017 22:24:03 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: authentication-results: freebsd.org; dkim=none (message not signed) header.d=none;freebsd.org; dmarc=none action=none header.from=uoguelph.ca; x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; YTXPR01MB0190; 7:nzFJ3XfO06TX2djaEeO6pE49jAsbu3ESNQL3xX1gEZZ/OD1OYwx7MJ1xfclp56fPRJVMwCWgaZHelh8uLk7Wi+lABDm3B9oQtG9Qr7elSfgEbXVpzkKMxGwRyerUzMQw9maxP+vVV799IW6n090HZfUYjQX6g1V8XWxVq8hDv9QwFA5A5I36fVycSm0L70sX9eEf9wP7PCBCslcDAsAibpc9vWaWe0uROr5UD12o84XW+16xKagtNYkEfzSnDqOcDorhtl551+nDB7mkzWoKAlUp7+5FdC+LvyIHXFPOjbADuBKrmw9pJ+lGroY4b+CSp/1Utx5t6On4k8P/DZ9ra7kK2y7VvViw47tJxBvhiz6kTxvVOYSqQcbPpoDDMq/3LbsvoNSy1QhWbewi8rj902tFbA69vyUury0mAM02YJyBlQNmQHnitvtl8ljUE1385r762pHDMDWHpowJabFDw2agQi4GFvYsdFSeMFULbTDxGL/DV8BUMAkHvakHvkyXtoBPTmdh2tVo4h7bBO7aMO4TUVyo32GJBMrrklyhb5AwhxXEXZtCUfM0JXzxjIMu1Upkf2QnYMuuO4iMnm2tkE0eIBMtzXRjj9k3L2hKAeahHbIX83QIGJTwme2zSCOHsOSxHo7UaKMZJtXJYexXYChJB0tenxVebkqodO+5+ITE8yJpTJ6DW5MJB9jZmD0M2Bz98MZpJRlrXinxdzo8IMJ1VSsBNTiQ0XzEPEMPbLokWikCH/Zn2n1XdaM95YJngvtTpNcTAeC/FG2dACfxgJ7s71mQf9A9ENOYZEI9dsg= x-ms-office365-filtering-correlation-id: 114b4b7f-5af0-4bd7-a387-08d4b9bd636f x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(49563074)(201703131423075)(201703031133081)(201702281549075); SRVR:YTXPR01MB0190; x-ms-traffictypediagnostic: YTXPR01MB0190: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(158342451672863)(5213294742642); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(102415395)(6040450)(2401047)(8121501046)(5005006)(10201501046)(100000703101)(100105400095)(93006095)(93001095)(3002001)(6041248)(20161123560025)(20161123558100)(201703131423075)(201702281529075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123555025)(20161123564025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:YTXPR01MB0190; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:YTXPR01MB0190; x-forefront-prvs: 03468CBA43 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39400400002)(39850400002)(39410400002)(39450400003)(39840400002)(478600001)(5890100001)(2501003)(9686003)(2351001)(305945005)(2900100001)(74482002)(81166006)(2906002)(8936002)(77096006)(122556002)(3280700002)(25786009)(55016002)(53936002)(3660700001)(74316002)(5640700003)(102836003)(6506006)(38730400002)(8676002)(6916009)(6436002)(86362001)(189998001)(99936001)(110136004)(54356999)(5660300001)(7696004)(50986999)(14454004)(33656002); DIR:OUT; SFP:1101; SCL:1; SRVR:YTXPR01MB0190; H:YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM; FPR:; SPF:None; MLV:sfv; LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: multipart/mixed; boundary="_002_YTXPR01MB018901BE4BA7E9780F4B430BDDDB0YTXPR01MB0189CANP_" MIME-Version: 1.0 X-OriginatorOrg: uoguelph.ca X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Jun 2017 22:24:03.3050 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: be62a12b-2cad-49a1-a5fa-85f4f3156a7d X-MS-Exchange-Transport-CrossTenantHeadersStamped: YTXPR01MB0190 X-BeenThere: freebsd-fs@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Filesystems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Jun 2017 22:24:07 -0000 --_002_YTXPR01MB018901BE4BA7E9780F4B430BDDDB0YTXPR01MB0189CANP_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable The attached patch (you can also find it in PR#219550), adds two new compou= nd RPCs to the NFSv4.1/pNFS client. These compounds combine the Open with the LayoutGet, avoiding the need to do additional RPCs for pNFS. The patch is fairly large, but only affects the NFSv4.1 client with the "pn= fs" option. It factors most of the LayoutGet RPC code into separate functions and then = uses those to do RPCs that follow an Open with a LayoutGet. This code has been tested a fair amount by me using my pNFS server (in projects/pnfs-planb-server). Would anyone like to review this? rick= --_002_YTXPR01MB018901BE4BA7E9780F4B430BDDDB0YTXPR01MB0189CANP_ Content-Type: application/octet-stream; name="openlayout.patch" Content-Description: openlayout.patch Content-Disposition: attachment; filename="openlayout.patch"; size=38817; creation-date="Thu, 22 Jun 2017 22:23:56 GMT"; modification-date="Thu, 22 Jun 2017 22:23:56 GMT" Content-Transfer-Encoding: base64 LS0tIHN5cy9mcy9uZnMvbmZzcG9ydC5oLm9yaWcJMjAxNy0wNC0yNyAxMTo1MTo1MS4wMDAwMDAw MDAgLTA0MDAKKysrIHN5cy9mcy9uZnMvbmZzcG9ydC5oCTIwMTctMDUtMTkgMTM6MjI6NDUuNjA0 MjE5MDAwIC0wNDAwCkBAIC0zNTcsMTEgKzM1NywxMyBAQAogI2RlZmluZQlORlNQUk9DX1dSSVRF RFMJCTUxCiAjZGVmaW5lCU5GU1BST0NfUkVBRERTCQk1MgogI2RlZmluZQlORlNQUk9DX0NPTU1J VERTCTUzCisjZGVmaW5lCU5GU1BST0NfT1BFTkxBWUdFVAk1NAorI2RlZmluZQlORlNQUk9DX0NS RUFURUxBWUdFVAk1NQogCiAvKgogICogTXVzdCBiZSBkZWZpbmVkIGFzIG9uZSBoaWdoZXIgdGhh biB0aGUgbGFzdCBORlN2NC4xIFByb2MjIGFib3ZlLgogICovCi0jZGVmaW5lCU5GU1Y0MV9OUFJP Q1MJCTU0CisjZGVmaW5lCU5GU1Y0MV9OUFJPQ1MJCTU2CiAKICNlbmRpZgkvKiBORlNfVjNOUFJP Q1MgKi8KIApAQCAtMzkwLDcgKzM5Miw3IEBAIHN0cnVjdCBuZnNzdGF0c3YxIHsKIAl1aW50NjRf dAlyZWFkbGlua19iaW9zOwogCXVpbnQ2NF90CWJpb2NhY2hlX3JlYWRkaXJzOwogCXVpbnQ2NF90 CXJlYWRkaXJfYmlvczsKLQl1aW50NjRfdAlycGNjbnRbTkZTVjQxX05QUk9DUyArIDE1XTsKKwl1 aW50NjRfdAlycGNjbnRbTkZTVjQxX05QUk9DUyArIDEzXTsKIAl1aW50NjRfdAlycGNyZXRyaWVz OwogCXVpbnQ2NF90CXNydnJwY2NudFtORlNWNDJfTk9QUyArIE5GU1Y0T1BfRkFLRU5PUFNdOwog CXVpbnQ2NF90CXNydnJwY19lcnJzOwotLS0gc3lzL2ZzL25mcy9uZnNwcm90by5oLm9yaWcJMjAx Ny0wNS0xMSAxMTowODowMS42ODEyNTEwMDAgLTA0MDAKKysrIHN5cy9mcy9uZnMvbmZzcHJvdG8u aAkyMDE3LTA1LTE5IDEzOjIzOjIxLjk5MTI5MDAwMCAtMDQwMApAQCAtMzQ2LDExICszNDYsMTMg QEAKICNkZWZpbmUJTkZTUFJPQ19XUklURURTCQk1MQogI2RlZmluZQlORlNQUk9DX1JFQUREUwkJ NTIKICNkZWZpbmUJTkZTUFJPQ19DT01NSVREUwk1MworI2RlZmluZQlORlNQUk9DX09QRU5MQVlH RVQJNTQKKyNkZWZpbmUJTkZTUFJPQ19DUkVBVEVMQVlHRVQJNTUKIAogLyoKICAqIE11c3QgYmUg ZGVmaW5lZCBhcyBvbmUgaGlnaGVyIHRoYW4gdGhlIGxhc3QgTkZTdjQuMSBQcm9jIyBhYm92ZS4K ICAqLwotI2RlZmluZQlORlNWNDFfTlBST0NTCQk1NAorI2RlZmluZQlORlNWNDFfTlBST0NTCQk1 NgogCiAjZW5kaWYJLyogTkZTX1YzTlBST0NTICovCiAKLS0tIHN5cy9mcy9uZnMvbmZzX2NvbW1v bnN1YnMuYy5vcmlnCTIwMTctMDUtMTYgMDk6Mzg6MjEuNzIzMTYzMDAwIC0wNDAwCisrKyBzeXMv ZnMvbmZzL25mc19jb21tb25zdWJzLmMJMjAxNy0wNS0xOSAxMzoyMToyNy44Njc3NzgwMDAgLTA0 MDAKQEAgLTE3Nyw3ICsxNzcsNyBAQCBzdGF0aWMgc3RydWN0IG5mc3J2X2x1Z2hhc2gJKm5mc2dy b3VwbmFtCiAgKi8KIGludCBuZnNfYmlncmVwbHlbTkZTVjQxX05QUk9DU10gPSB7IDAsIDAsIDAs IDEsIDAsIDEsIDEsIDAsIDAsIDAsIDAsCiAgICAgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwg MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAw LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwIH07CisgICAg MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwg MCB9OwogCiAvKiBsb2NhbCBmdW5jdGlvbnMgKi8KIHN0YXRpYyBpbnQgbmZzcnZfc2tpcGFjZShz dHJ1Y3QgbmZzcnZfZGVzY3JpcHQgKm5kLCBpbnQgKmFjZXNpemVwKTsKLS0tIHN5cy9mcy9uZnNj bGllbnQvbmZzX2NsY29tc3Vicy5jLm9yaWcJMjAxNy0wNS0xNiAxMjozNjoxNi4wOTg4NzgwMDAg LTA0MDAKKysrIHN5cy9mcy9uZnNjbGllbnQvbmZzX2NsY29tc3Vicy5jCTIwMTctMDUtMTkgMTM6 MjU6NTkuODIzMDkyMDAwIC0wNDAwCkBAIC0xMTIsNiArMTEyLDggQEAgc3RhdGljIHN0cnVjdCB7 CiAJeyBORlNWNE9QX1dSSVRFLCAxLCAiV3JpdGVEUyIsIDcsIH0sCiAJeyBORlNWNE9QX1JFQUQs IDEsICJSZWFkRFMiLCA2LCB9LAogCXsgTkZTVjRPUF9DT01NSVQsIDEsICJDb21taXREUyIsIDgs IH0sCisJeyBORlNWNE9QX09QRU4sIDMsICJPcGVuTGF5b3V0R2V0IiwgMTMsIH0sCisJeyBORlNW NE9QX09QRU4sIDgsICJDcmVhdGVMYXlHZXQiLCAxMiwgfSwKIH07CiAKIC8qCkBAIC0xMjAsNyAr MTIyLDcgQEAgc3RhdGljIHN0cnVjdCB7CiBzdGF0aWMgaW50IG5mc19iaWdyZXF1ZXN0W05GU1Y0 MV9OUFJPQ1NdID0gewogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDAs IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAw LCAxLCAwLCAwCisJMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMAogfTsKIAogLyoKLS0t IHN5cy9mcy9uZnNjbGllbnQvbmZzX2NscnBjb3BzLmMub3JpZwkyMDE3LTA1LTExIDEwOjUyOjQy LjE2ODcxMTAwMCAtMDQwMAorKysgc3lzL2ZzL25mc2NsaWVudC9uZnNfY2xycGNvcHMuYwkyMDE3 LTA1LTE5IDEzOjI5OjA4LjQwOTA5ODAwMCAtMDQwMApAQCAtMTI3LDYgKzEyNywyOSBAQCBzdGF0 aWMgZW51bSBuZnNjbGRzX3N0YXRlIG5mc2NsX2dldHNhbWVzCiBzdGF0aWMgaW50IG5mc3JwY19j b21taXRkcyh2bm9kZV90LCB1aW50NjRfdCwgaW50LCBzdHJ1Y3QgbmZzY2xkcyAqLAogICAgIHN0 cnVjdCBuZnNmaCAqLCBzdHJ1Y3QgdWNyZWQgKiwgTkZTUFJPQ19UICosIHZvaWQgKik7CiAjZW5k aWYKK3N0YXRpYyB2b2lkIG5mc3J2X3NldHVwbGF5b3V0Z2V0KHN0cnVjdCBuZnNydl9kZXNjcmlw dCAqLCBpbnQsIHVpbnQ2NF90LAorICAgIHVpbnQ2NF90LCB1aW50NjRfdCwgbmZzdjRzdGF0ZWlk X3QgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBuZnNydl9wYXJzZWxheW91dGdldChzdHJ1Y3Qg bmZzcnZfZGVzY3JpcHQgKiwgbmZzdjRzdGF0ZWlkX3QgKiwKKyAgICBpbnQgKiwgc3RydWN0IG5m c2NsZmxheW91dGhlYWQgKik7CitzdGF0aWMgaW50IG5mc3JwY19nZXRvcGVubGF5b3V0KHN0cnVj dCBuZnNtb3VudCAqLCB2bm9kZV90LCB1X2ludDhfdCAqLAorICAgIGludCwgdWludDhfdCAqLCBp bnQsIHVpbnQzMl90LCBzdHJ1Y3QgbmZzY2xvcGVuICosIHVpbnQ4X3QgKiwgaW50LAorICAgIHN0 cnVjdCBuZnNjbGRlbGVnICoqLCBzdHJ1Y3QgdWNyZWQgKiwgTkZTUFJPQ19UICopOworc3RhdGlj IGludCBuZnNycGNfZ2V0Y3JlYXRlbGF5b3V0KHZub2RlX3QsIGNoYXIgKiwgaW50LCBzdHJ1Y3Qg dmF0dHIgKiwKKyAgICBuZnNxdWFkX3QsIGludCwgc3RydWN0IG5mc2Nsb3duZXIgKiwgc3RydWN0 IG5mc2NsZGVsZWcgKiosCisgICAgc3RydWN0IHVjcmVkICosIE5GU1BST0NfVCAqLCBzdHJ1Y3Qg bmZzdmF0dHIgKiwgc3RydWN0IG5mc3ZhdHRyICosCisgICAgc3RydWN0IG5mc2ZoICoqLCBpbnQg KiwgaW50ICosIHZvaWQgKiwgaW50ICopOworc3RhdGljIGludCBuZnNycGNfb3BlbmxheW91dHJw YyhzdHJ1Y3QgbmZzbW91bnQgKiwgdm5vZGVfdCwgdV9pbnQ4X3QgKiwKKyAgICBpbnQsIHVpbnQ4 X3QgKiwgaW50LCB1aW50MzJfdCwgc3RydWN0IG5mc2Nsb3BlbiAqLCB1aW50OF90ICosIGludCwK KyAgICBzdHJ1Y3QgbmZzY2xkZWxlZyAqKiwgbmZzdjRzdGF0ZWlkX3QgKiwgaW50LCBpbnQsIGlu dCAqLAorICAgIHN0cnVjdCBuZnNjbGZsYXlvdXRoZWFkICosIGludCAqLCBzdHJ1Y3QgdWNyZWQg KiwgTkZTUFJPQ19UICopOworc3RhdGljIGludCBuZnNycGNfY3JlYXRlbGF5b3V0KHZub2RlX3Qs IGNoYXIgKiwgaW50LCBzdHJ1Y3QgdmF0dHIgKiwKKyAgICBuZnNxdWFkX3QsIGludCwgc3RydWN0 IG5mc2Nsb3duZXIgKiwgc3RydWN0IG5mc2NsZGVsZWcgKiosCisgICAgc3RydWN0IHVjcmVkICos IE5GU1BST0NfVCAqLCBzdHJ1Y3QgbmZzdmF0dHIgKiwgc3RydWN0IG5mc3ZhdHRyICosCisgICAg c3RydWN0IG5mc2ZoICoqLCBpbnQgKiwgaW50ICosIHZvaWQgKiwgaW50ICosIG5mc3Y0c3RhdGVp ZF90ICosCisgICAgaW50LCBpbnQsIGludCAqLCBzdHJ1Y3QgbmZzY2xmbGF5b3V0aGVhZCAqLCBp bnQgKik7CitzdGF0aWMgaW50IG5mc3JwY19sYXlvdXRnZXRyZXMoc3RydWN0IG5mc21vdW50ICos IHZub2RlX3QsIHVpbnQ4X3QgKiwKKyAgICBpbnQsIG5mc3Y0c3RhdGVpZF90ICosIGludCwgdWlu dDMyX3QgKiwgc3RydWN0IG5mc2NsbGF5b3V0ICoqLAorICAgIHN0cnVjdCBuZnNjbGZsYXlvdXRo ZWFkICosIGludCwgaW50ICosIHN0cnVjdCB1Y3JlZCAqLCBORlNQUk9DX1QgKik7CiAKIC8qCiAg KiBuZnMgbnVsbCBjYWxsIGZyb20gdmZzLgpAQCAtMzAxLDExICszMjQsMjcgQEAgZWxzZSBwcmlu dGYoIiBmaGw9MFxuIik7CiAJCWNsaWRyZXYgPSAwOwogCSAgICBpZiAocmV0ID09IE5GU0NMT1BF Tl9ET09QRU4pIHsKIAkJaWYgKG5wLT5uX3Y0ICE9IE5VTEwpIHsKLQkJCWVycm9yID0gbmZzcnBj X29wZW5ycGMobm1wLCB2cCwgbnAtPm5fdjQtPm40X2RhdGEsCi0JCQkgICBucC0+bl92NC0+bjRf ZmhsZW4sIG5wLT5uX2ZocC0+bmZoX2ZoLAotCQkJICAgbnAtPm5fZmhwLT5uZmhfbGVuLCBtb2Rl LCBvcCwKLQkJCSAgIE5GUzROT0RFTkFNRShucC0+bl92NCksIG5wLT5uX3Y0LT5uNF9uYW1lbGVu LCAmZHAsCi0JCQkgICAwLCAweDAsIGNyZWQsIHAsIDAsIDApOworCQkJLyoKKwkJCSAqIEZvciB0 aGUgZmlyc3QgYXR0ZW1wdCwgdHJ5IGFuZCBnZXQgYSBsYXlvdXQsIGlmCisJCQkgKiBwTkZTIGlz IGVuYWJsZWQgZm9yIHRoZSBtb3VudC4KKwkJCSAqLworCQkJaWYgKCFORlNIQVNQTkZTKG5tcCkg fHwgbmZzY2xfZW5hYmxlY2FsbGIgPT0gMCB8fAorCQkJICAgIG5mc19udW1uZnNjYmQgPT0gMCB8 fAorCQkJICAgIChucC0+bl9mbGFnICYgTk5PTEFZT1VUKSAhPSAwIHx8IHJldHJ5Y250ID4gMCkK KwkJCQllcnJvciA9IG5mc3JwY19vcGVucnBjKG5tcCwgdnAsCisJCQkJICAgIG5wLT5uX3Y0LT5u NF9kYXRhLAorCQkJCSAgICBucC0+bl92NC0+bjRfZmhsZW4sIG5wLT5uX2ZocC0+bmZoX2ZoLAor CQkJCSAgICBucC0+bl9maHAtPm5maF9sZW4sIG1vZGUsIG9wLAorCQkJCSAgICBORlM0Tk9ERU5B TUUobnAtPm5fdjQpLAorCQkJCSAgICBucC0+bl92NC0+bjRfbmFtZWxlbiwKKwkJCQkgICAgJmRw LCAwLCAweDAsIGNyZWQsIHAsIDAsIDApOworCQkJZWxzZQorCQkJCWVycm9yID0gbmZzcnBjX2dl dG9wZW5sYXlvdXQobm1wLCB2cCwKKwkJCQkgICAgbnAtPm5fdjQtPm40X2RhdGEsCisJCQkJICAg IG5wLT5uX3Y0LT5uNF9maGxlbiwgbnAtPm5fZmhwLT5uZmhfZmgsCisJCQkJICAgIG5wLT5uX2Zo cC0+bmZoX2xlbiwgbW9kZSwgb3AsCisJCQkJICAgIE5GUzROT0RFTkFNRShucC0+bl92NCksCisJ CQkJICAgIG5wLT5uX3Y0LT5uNF9uYW1lbGVuLCAmZHAsIGNyZWQsIHApOwogCQkJaWYgKGRwICE9 IE5VTEwpIHsKICNpZmRlZiBBUFBMRQogCQkJCU9TQml0QW5kQXRvbWljKChpbnQzMl90KX5OREVM RUdNT0QsIChVSW50MzIgKikmbnAtPm5fZmxhZyk7CkBAIC0xODk0LDkgKzE5MzMsMTUgQEAgbmZz cnBjX2NyZWF0ZSh2bm9kZV90IGR2cCwgY2hhciAqbmFtZSwgaQogCQkJY2xpZHJldiA9IG5tcC0+ bm1fY2xwLT5uZnNjX2NsaWVudGlkcmV2OwogCQllbHNlCiAJCQljbGlkcmV2ID0gMDsKLQkJZXJy b3IgPSBuZnNycGNfY3JlYXRldjQoZHZwLCBuYW1lLCBuYW1lbGVuLCB2YXAsIGN2ZXJmLCBmbW9k ZSwKLQkJICBvd3AsICZkcCwgY3JlZCwgcCwgZG5hcCwgbm5hcCwgbmZocHAsIGF0dHJmbGFncCwg ZGF0dHJmbGFncCwKLQkJICBkc3R1ZmYsICZ1bmxvY2tlZCk7CisJCWlmICghTkZTSEFTUE5GUyhu bXApIHx8IG5mc2NsX2VuYWJsZWNhbGxiID09IDAgfHwKKwkJICAgIG5mc19udW1uZnNjYmQgPT0g MCB8fCByZXRyeWNudCA+IDApCisJCQllcnJvciA9IG5mc3JwY19jcmVhdGV2NChkdnAsIG5hbWUs IG5hbWVsZW4sIHZhcCwgY3ZlcmYsCisJCQkgIGZtb2RlLCBvd3AsICZkcCwgY3JlZCwgcCwgZG5h cCwgbm5hcCwgbmZocHAsCisJCQkgIGF0dHJmbGFncCwgZGF0dHJmbGFncCwgZHN0dWZmLCAmdW5s b2NrZWQpOworCQllbHNlCisJCQllcnJvciA9IG5mc3JwY19nZXRjcmVhdGVsYXlvdXQoZHZwLCBu YW1lLCBuYW1lbGVuLCB2YXAsCisJCQkgIGN2ZXJmLCBmbW9kZSwgb3dwLCAmZHAsIGNyZWQsIHAs IGRuYXAsIG5uYXAsIG5maHBwLAorCQkJICBhdHRyZmxhZ3AsIGRhdHRyZmxhZ3AsIGRzdHVmZiwg JnVubG9ja2VkKTsKIAkJLyoKIAkJICogVGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGNh Y2hlZCBhdHRyaWJ1dGVzIGhlcmUsCiAJCSAqIHNpbmNlIG5ldyBwb3N0LWRlbGVnYXRpb24gaXNz dWUgYXR0cmlidXRlcyBhcmUgYWx3YXlzCkBAIC00NzY2LDE0OSArNDgxMSwyMiBAQCBuZnNycGNf bGF5b3V0Z2V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB1CiAgICAgbmZzdjRzdGF0ZWlkX3QgKnN0 YXRlaWRwLCBpbnQgKnJldG9uY2xvc2VwLCBzdHJ1Y3QgbmZzY2xmbGF5b3V0aGVhZCAqZmxocCwK ICAgICBzdHJ1Y3QgdWNyZWQgKmNyZWQsIE5GU1BST0NfVCAqcCwgdm9pZCAqc3R1ZmYpCiB7Ci0J dWludDMyX3QgKnRsOwogCXN0cnVjdCBuZnNydl9kZXNjcmlwdCBuZnNkLCAqbmQgPSAmbmZzZDsK LQlzdHJ1Y3QgbmZzZmggKm5maHA7Ci0Jc3RydWN0IG5mc2NsZmxheW91dCAqZmxwLCAqcHJldmZs cCwgKnRmbHA7Ci0JaW50IGNudCwgZXJyb3IsIGdvdGlvbW9kZSwgZmhjbnQsIG5maGxlbiwgaSwg ajsKLQl1aW50OF90ICpjcDsKLQl1aW50NjRfdCByZXRsZW47CisJaW50IGVycm9yOwogCi0JZmxw ID0gTlVMTDsKLQlnb3Rpb21vZGUgPSAtMTsKIAluZnNjbF9yZXFzdGFydChuZCwgTkZTUFJPQ19M QVlPVVRHRVQsIG5tcCwgZmhwLCBmaGxlbiwgTlVMTCwgTlVMTCk7Ci0JTkZTTV9CVUlMRCh0bCwg dWludDMyX3QgKiwgNCAqIE5GU1hfVU5TSUdORUQgKyAzICogTkZTWF9IWVBFUiArCi0JICAgIE5G U1hfU1RBVEVJRCk7Ci0JKnRsKysgPSBuZXduZnNfZmFsc2U7CQkvKiBEb24ndCBzaWduYWwgYXZh aWxhYmlsaXR5LiAqLwotCSp0bCsrID0gdHhkcl91bnNpZ25lZChORlNMQVlPVVRfTkZTVjRfMV9G SUxFUyk7Ci0JKnRsKysgPSB0eGRyX3Vuc2lnbmVkKGlvbW9kZSk7Ci0JdHhkcl9oeXBlcihvZmZz ZXQsIHRsKTsKLQl0bCArPSAyOwotCXR4ZHJfaHlwZXIobGVuLCB0bCk7Ci0JdGwgKz0gMjsKLQl0 eGRyX2h5cGVyKG1pbmxlbiwgdGwpOwotCXRsICs9IDI7Ci0JKnRsKysgPSB0eGRyX3Vuc2lnbmVk KHN0YXRlaWRwLT5zZXFpZCk7Ci0JTkZTQ0xfREVCVUcoNCwgImxheWdldCBzZXE9JWRcbiIsIChp bnQpc3RhdGVpZHAtPnNlcWlkKTsKLQkqdGwrKyA9IHN0YXRlaWRwLT5vdGhlclswXTsKLQkqdGwr KyA9IHN0YXRlaWRwLT5vdGhlclsxXTsKLQkqdGwrKyA9IHN0YXRlaWRwLT5vdGhlclsyXTsKLQkq dGwgPSB0eGRyX3Vuc2lnbmVkKGxheW91dGxlbik7CisJbmZzcnZfc2V0dXBsYXlvdXRnZXQobmQs IGlvbW9kZSwgb2Zmc2V0LCBsZW4sIG1pbmxlbiwgc3RhdGVpZHAsCisJICAgIGxheW91dGxlbiwg MCk7CiAJbmQtPm5kX2ZsYWcgfD0gTkRfVVNFR1NTTkFNRTsKIAllcnJvciA9IG5ld25mc19yZXF1 ZXN0KG5kLCBubXAsIE5VTEwsICZubXAtPm5tX3NvY2tyZXEsIE5VTEwsIHAsIGNyZWQsCiAJICAg IE5GU19QUk9HLCBORlNfVkVSNCwgTlVMTCwgMSwgTlVMTCwgTlVMTCk7CisJTkZTQ0xfREVCVUco NCwgImxheWdldCBlcnI9JWQgc3Q9JWRcbiIsIGVycm9yLCBuZC0+bmRfcmVwc3RhdCk7CiAJaWYg KGVycm9yICE9IDApCiAJCXJldHVybiAoZXJyb3IpOwotCWlmIChuZC0+bmRfcmVwc3RhdCA9PSAw KSB7Ci0JCU5GU01fRElTU0VDVCh0bCwgdWludDMyX3QgKiwgMiAqIE5GU1hfVU5TSUdORUQgKyBO RlNYX1NUQVRFSUQpOwotCQlpZiAoKnRsKysgIT0gMCkKLQkJCSpyZXRvbmNsb3NlcCA9IDE7Ci0J CWVsc2UKLQkJCSpyZXRvbmNsb3NlcCA9IDA7Ci0JCXN0YXRlaWRwLT5zZXFpZCA9IGZ4ZHJfdW5z aWduZWQodWludDMyX3QsICp0bCsrKTsKLQkJTkZTQ0xfREVCVUcoNCwgInJldG9uY2xzPSVkIHN0 c2VxPSVkXG4iLCAqcmV0b25jbG9zZXAsCi0JCSAgICAoaW50KXN0YXRlaWRwLT5zZXFpZCk7Ci0J CXN0YXRlaWRwLT5vdGhlclswXSA9ICp0bCsrOwotCQlzdGF0ZWlkcC0+b3RoZXJbMV0gPSAqdGwr KzsKLQkJc3RhdGVpZHAtPm90aGVyWzJdID0gKnRsKys7Ci0JCWNudCA9IGZ4ZHJfdW5zaWduZWQo aW50LCAqdGwpOwotCQlORlNDTF9ERUJVRyg0LCAibGF5ZyBjbnQ9JWRcbiIsIGNudCk7Ci0JCWlm IChjbnQgPD0gMCB8fCBjbnQgPiAxMDAwMCkgewotCQkJLyogRG9uJ3QgYWNjZXB0IG1vcmUgdGhh biAxMDAwMCBsYXlvdXRzIGluIHJlcGx5LiAqLwotCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOwot CQkJZ290byBuZnNtb3V0OwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQkJ LyogRGlzc2VjdCBhbGwgdGhlIHdheSB0byB0aGUgZmlsZSBoYW5kbGUgY250LiAqLwotCQkJTkZT TV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAzICogTkZTWF9IWVBFUiArCi0JCQkgICAgNiAqIE5G U1hfVU5TSUdORUQgKyBORlNYX1Y0REVWSUNFSUQpOwotCQkJZmhjbnQgPSBmeGRyX3Vuc2lnbmVk KGludCwgKih0bCArIDExICsKLQkJCSAgICBORlNYX1Y0REVWSUNFSUQgLyBORlNYX1VOU0lHTkVE KSk7Ci0JCQlORlNDTF9ERUJVRyg0LCAiZmhjbnQ9JWRcbiIsIGZoY250KTsKLQkJCWlmIChmaGNu dCA8IDAgfHwgZmhjbnQgPiAxMDApIHsKLQkJCQkvKiBEb24ndCBhY2NlcHQgbW9yZSB0aGFuIDEw MCBmaWxlIGhhbmRsZXMuICovCi0JCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOwotCQkJCWdvdG8g bmZzbW91dDsKLQkJCX0KLQkJCWlmIChmaGNudCA+IDEpCi0JCQkJZmxwID0gbWFsbG9jKHNpemVv ZigqZmxwKSArIChmaGNudCAtIDEpICoKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBuZnNmaCAqKSwK LQkJCQkgICAgTV9ORlNGTEFZT1VULCBNX1dBSVRPSyk7Ci0JCQllbHNlCi0JCQkJZmxwID0gbWFs bG9jKHNpemVvZigqZmxwKSwKLQkJCQkgICAgTV9ORlNGTEFZT1VULCBNX1dBSVRPSyk7Ci0JCQlm bHAtPm5mc2ZsX2ZsYWdzID0gMDsKLQkJCWZscC0+bmZzZmxfZmhjbnQgPSAwOwotCQkJZmxwLT5u ZnNmbF9kZXZwID0gTlVMTDsKLQkJCWZscC0+bmZzZmxfb2ZmID0gZnhkcl9oeXBlcih0bCk7IHRs ICs9IDI7Ci0JCQlyZXRsZW4gPSBmeGRyX2h5cGVyKHRsKTsgdGwgKz0gMjsKLQkJCWlmIChmbHAt Pm5mc2ZsX29mZiArIHJldGxlbiA8IGZscC0+bmZzZmxfb2ZmKQotCQkJCWZscC0+bmZzZmxfZW5k ID0gVUlOVDY0X01BWCAtIGZscC0+bmZzZmxfb2ZmOwotCQkJZWxzZQotCQkJCWZscC0+bmZzZmxf ZW5kID0gZmxwLT5uZnNmbF9vZmYgKyByZXRsZW47Ci0JCQlmbHAtPm5mc2ZsX2lvbW9kZSA9IGZ4 ZHJfdW5zaWduZWQoaW50LCAqdGwrKyk7Ci0JCQlpZiAoZ290aW9tb2RlID09IC0xKQotCQkJCWdv dGlvbW9kZSA9IGZscC0+bmZzZmxfaW9tb2RlOwotCQkJTkZTQ0xfREVCVUcoNCwgImxheWcgcmVx aW9tPSVkIHJldGlvbT0lZFxuIiwgaW9tb2RlLAotCQkJICAgIChpbnQpZmxwLT5uZnNmbF9pb21v ZGUpOwotCQkJaWYgKGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwrKykgIT0KLQkJCSAgICBORlNMQVlP VVRfTkZTVjRfMV9GSUxFUykgewotCQkJCXByaW50ZigiTkZTdjQuMTogZ290IG5vbi1maWxlcyBs YXlvdXRcbiIpOwotCQkJCWVycm9yID0gTkZTRVJSX0JBRFhEUjsKLQkJCQlnb3RvIG5mc21vdXQ7 Ci0JCQl9Ci0JCQlORlNCQ09QWSgrK3RsLCBmbHAtPm5mc2ZsX2RldiwgTkZTWF9WNERFVklDRUlE KTsKLQkJCXRsICs9IChORlNYX1Y0REVWSUNFSUQgLyBORlNYX1VOU0lHTkVEKTsKLQkJCWZscC0+ bmZzZmxfdXRpbCA9IGZ4ZHJfdW5zaWduZWQodWludDMyX3QsICp0bCsrKTsKLQkJCU5GU0NMX0RF QlVHKDQsICJmbHV0aWw9MHgleFxuIiwgZmxwLT5uZnNmbF91dGlsKTsKLQkJCWZscC0+bmZzZmxf c3RyaXBlMSA9IGZ4ZHJfdW5zaWduZWQodWludDMyX3QsICp0bCsrKTsKLQkJCWZscC0+bmZzZmxf cGF0b2ZmID0gZnhkcl9oeXBlcih0bCk7IHRsICs9IDI7Ci0JCQlpZiAoZnhkcl91bnNpZ25lZChp bnQsICp0bCkgIT0gZmhjbnQpIHsKLQkJCQlwcmludGYoIkVFSyEgYmFkIGZoY250XG4iKTsKLQkJ CQllcnJvciA9IE5GU0VSUl9CQURYRFI7Ci0JCQkJZ290byBuZnNtb3V0OwotCQkJfQotCQkJZm9y IChqID0gMDsgaiA8IGZoY250OyBqKyspIHsKLQkJCQlORlNNX0RJU1NFQ1QodGwsIHVpbnQzMl90 ICosIE5GU1hfVU5TSUdORUQpOwotCQkJCW5maGxlbiA9IGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwp OwotCQkJCWlmIChuZmhsZW4gPD0gMCB8fCBuZmhsZW4gPiBORlNYX1Y0RkhNQVgpIHsKLQkJCQkJ ZXJyb3IgPSBORlNFUlJfQkFEWERSOwotCQkJCQlnb3RvIG5mc21vdXQ7Ci0JCQkJfQotCQkJCW5m aHAgPSBtYWxsb2Moc2l6ZW9mKCpuZmhwKSArIG5maGxlbiAtIDEsCi0JCQkJICAgIE1fTkZTRkgs IE1fV0FJVE9LKTsKLQkJCQlmbHAtPm5mc2ZsX2ZoW2pdID0gbmZocDsKLQkJCQlmbHAtPm5mc2Zs X2ZoY250Kys7Ci0JCQkJbmZocC0+bmZoX2xlbiA9IG5maGxlbjsKLQkJCQlORlNNX0RJU1NFQ1Qo Y3AsIHVpbnQ4X3QgKiwgTkZTTV9STkRVUChuZmhsZW4pKTsKLQkJCQlORlNCQ09QWShjcCwgbmZo cC0+bmZoX2ZoLCBuZmhsZW4pOwotCQkJfQotCQkJaWYgKGZscC0+bmZzZmxfaW9tb2RlID09IGdv dGlvbW9kZSkgewotCQkJCS8qIEtlZXAgdGhlIGxpc3QgaW4gaW5jcmVhc2luZyBvZmZzZXQgb3Jk ZXIuICovCi0JCQkJdGZscCA9IExJU1RfRklSU1QoZmxocCk7Ci0JCQkJcHJldmZscCA9IE5VTEw7 Ci0JCQkJd2hpbGUgKHRmbHAgIT0gTlVMTCAmJgotCQkJCSAgICB0ZmxwLT5uZnNmbF9vZmYgPCBm bHAtPm5mc2ZsX29mZikgewotCQkJCQlwcmV2ZmxwID0gdGZscDsKLQkJCQkJdGZscCA9IExJU1Rf TkVYVCh0ZmxwLCBuZnNmbF9saXN0KTsKLQkJCQl9Ci0JCQkJaWYgKHByZXZmbHAgPT0gTlVMTCkK LQkJCQkJTElTVF9JTlNFUlRfSEVBRChmbGhwLCBmbHAsIG5mc2ZsX2xpc3QpOwotCQkJCWVsc2UK LQkJCQkJTElTVF9JTlNFUlRfQUZURVIocHJldmZscCwgZmxwLAotCQkJCQkgICAgbmZzZmxfbGlz dCk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ZigibmZzY2xfbGF5b3V0Z2V0KCk6IGdvdCB3cm9u ZyBpb21vZGVcbiIpOwotCQkJCW5mc2NsX2ZyZWVmbGF5b3V0KGZscCk7Ci0JCQl9Ci0JCQlmbHAg PSBOVUxMOwotCQl9Ci0JfQotCWlmIChuZC0+bmRfcmVwc3RhdCAhPSAwICYmIGVycm9yID09IDAp CisJaWYgKG5kLT5uZF9yZXBzdGF0ID09IDApCisJCWVycm9yID0gbmZzcnZfcGFyc2VsYXlvdXRn ZXQobmQsIHN0YXRlaWRwLCByZXRvbmNsb3NlcCwgZmxocCk7CisJaWYgKGVycm9yID09IDAgJiYg bmQtPm5kX3JlcHN0YXQgIT0gMCkKIAkJZXJyb3IgPSBuZC0+bmRfcmVwc3RhdDsKLW5mc21vdXQ6 Ci0JaWYgKGVycm9yICE9IDAgJiYgZmxwICE9IE5VTEwpCi0JCW5mc2NsX2ZyZWVmbGF5b3V0KGZs cCk7CiAJbWJ1Zl9mcmVlbShuZC0+bmRfbXJlcCk7CiAJcmV0dXJuIChlcnJvcik7CiB9CkBAIC01 MjA5LDggKzUxMjcsNyBAQCBuZnNycGNfZ2V0bGF5b3V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB2 CiAgICAgc3RydWN0IG5mc2NsbGF5b3V0ICoqbHlwcCwgc3RydWN0IHVjcmVkICpjcmVkLCBORlNQ Uk9DX1QgKnApCiB7CiAJc3RydWN0IG5mc2NsbGF5b3V0ICpseXA7Ci0Jc3RydWN0IG5mc2NsZmxh eW91dCAqZmxwLCAqdGZscDsKLQlzdHJ1Y3QgbmZzY2xkZXZpbmZvICpkaXA7CisJc3RydWN0IG5m c2NsZmxheW91dCAqZmxwOwogCXN0cnVjdCBuZnNjbGZsYXlvdXRoZWFkIGZsaDsKIAlpbnQgZXJy b3IgPSAwLCBpc2xvY2tlZCwgbGF5b3V0bGVuLCByZWNhbGxlZCwgcmV0b25jbG9zZTsKIAluZnN2 NHN0YXRlaWRfdCBzdGF0ZWlkOwpAQCAtNTI1MiwzNSArNTE2OSwxMyBAQCBuZnNycGNfZ2V0bGF5 b3V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB2CiAJCQkgICAgKHVpbnQ2NF90KTAsIGxheW91dGxl biwgJnN0YXRlaWQsICZyZXRvbmNsb3NlLAogCQkJICAgICZmbGgsIGNyZWQsIHAsIE5VTEwpOwog CQl9CisJCWVycm9yID0gbmZzcnBjX2xheW91dGdldHJlcyhubXAsIHZwLCBuZmhwLT5uZmhfZmgs CisJCSAgICBuZmhwLT5uZmhfbGVuLCAmc3RhdGVpZCwgcmV0b25jbG9zZSwgbm90aWZ5Yml0c3As ICZseXAsCisJCSAgICAmZmxoLCBlcnJvciwgTlVMTCwgY3JlZCwgcCk7CiAJCWlmIChlcnJvciA9 PSAwKQotCQkJTElTVF9GT1JFQUNIKHRmbHAsICZmbGgsIG5mc2ZsX2xpc3QpIHsKLQkJCQllcnJv ciA9IG5mc2NsX2FkZGRldmluZm8obm1wLCBOVUxMLCB0ZmxwKTsKLQkJCQlpZiAoZXJyb3IgIT0g MCkgewotCQkJCQllcnJvciA9IG5mc3JwY19nZXRkZXZpY2VpbmZvKG5tcCwKLQkJCQkJICAgIHRm bHAtPm5mc2ZsX2RldiwKLQkJCQkJICAgIE5GU0xBWU9VVF9ORlNWNF8xX0ZJTEVTLAotCQkJCQkg ICAgbm90aWZ5Yml0c3AsICZkaXAsIGNyZWQsIHApOwotCQkJCQlpZiAoZXJyb3IgIT0gMCkKLQkJ CQkJCWJyZWFrOwotCQkJCQllcnJvciA9IG5mc2NsX2FkZGRldmluZm8obm1wLCBkaXAsCi0JCQkJ CSAgICB0ZmxwKTsKLQkJCQkJaWYgKGVycm9yICE9IDApCi0JCQkJCQlwcmludGYoCi0JCQkJCQkg ICAgImdldGxheW91dDogY2Fubm90IGFkZFxuIik7Ci0JCQkJfQotCQkJfQotCQlpZiAoZXJyb3Ig PT0gMCkgewotCQkJLyoKLQkJCSAqIG5mc2NsX2xheW91dCgpIGFsd2F5cyByZXR1cm5zIHdpdGgg dGhlIG5mc2x5X2xvY2sKLQkJCSAqIHNldCB0byBhIHJlZmNudCAoc2hhcmVkIGxvY2spLgotCQkJ ICovCi0JCQllcnJvciA9IG5mc2NsX2xheW91dChubXAsIHZwLCBuZmhwLT5uZmhfZmgsCi0JCQkg ICAgbmZocC0+bmZoX2xlbiwgJnN0YXRlaWQsIHJldG9uY2xvc2UsICZmbGgsICZseXAsCi0JCQkg ICAgY3JlZCwgcCk7Ci0JCQlpZiAoZXJyb3IgPT0gMCkKLQkJCQkqbHlwcCA9IGx5cDsKLQkJfSBl bHNlIGlmIChpc2xvY2tlZCAhPSAwKQotCQkJbmZzdjRfdW5sb2NrKCZseXAtPm5mc2x5X2xvY2ss IDApOworCQkJKmx5cHAgPSBseXA7CisJCWVsc2UgaWYgKGlzbG9ja2VkICE9IDApCisJCQluZnNj bF9yZWxsYXlvdXQobHlwLCAxKTsKIAl9IGVsc2UKIAkJKmx5cHAgPSBseXA7CiAJcmV0dXJuIChl cnJvcik7CkBAIC02MDAzLDMgKzU4OTgsNzU1IEBAIG5mc21vdXQ6CiB9CiAjZW5kaWYKIAorLyoK KyAqIFNldCB1cCB0aGUgWERSIGFyZ3VtZW50cyBmb3IgdGhlIExheW91dEdldCBvcGVyYXRpb24u CisgKi8KK3N0YXRpYyB2b2lkCituZnNydl9zZXR1cGxheW91dGdldChzdHJ1Y3QgbmZzcnZfZGVz Y3JpcHQgKm5kLCBpbnQgaW9tb2RlLCB1aW50NjRfdCBvZmZzZXQsCisgICAgdWludDY0X3QgbGVu LCB1aW50NjRfdCBtaW5sZW4sIG5mc3Y0c3RhdGVpZF90ICpzdGF0ZWlkcCwgaW50IGxheW91dGxl biwKKyAgICBpbnQgdXNlY3Vyc3RhdGVpZCkKK3sKKwl1aW50MzJfdCAqdGw7CisKKwlORlNNX0JV SUxEKHRsLCB1aW50MzJfdCAqLCA0ICogTkZTWF9VTlNJR05FRCArIDMgKiBORlNYX0hZUEVSICsK KwkgICAgTkZTWF9TVEFURUlEKTsKKwkqdGwrKyA9IG5ld25mc19mYWxzZTsJCS8qIERvbid0IHNp Z25hbCBhdmFpbGFiaWxpdHkuICovCisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKE5GU0xBWU9VVF9O RlNWNF8xX0ZJTEVTKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWduZWQoaW9tb2RlKTsKKwl0eGRyX2h5 cGVyKG9mZnNldCwgdGwpOworCXRsICs9IDI7CisJdHhkcl9oeXBlcihsZW4sIHRsKTsKKwl0bCAr PSAyOworCXR4ZHJfaHlwZXIobWlubGVuLCB0bCk7CisJdGwgKz0gMjsKKwlpZiAodXNlY3Vyc3Rh dGVpZCAhPSAwKSB7CisJCS8qIFNwZWNpYWwgc3RhdGVpZCBmb3IgQ3VycmVudCBzdGF0ZWlkLiAq LworCQkqdGwrKyA9IHR4ZHJfdW5zaWduZWQoMSk7CisJCSp0bCsrID0gMDsKKwkJKnRsKysgPSAw OworCQkqdGwrKyA9IDA7CisJfSBlbHNlIHsKKwkJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKHN0YXRl aWRwLT5zZXFpZCk7CisJCU5GU0NMX0RFQlVHKDQsICJsYXlnZXQgc2VxPSVkXG4iLCAoaW50KXN0 YXRlaWRwLT5zZXFpZCk7CisJCSp0bCsrID0gc3RhdGVpZHAtPm90aGVyWzBdOworCQkqdGwrKyA9 IHN0YXRlaWRwLT5vdGhlclsxXTsKKwkJKnRsKysgPSBzdGF0ZWlkcC0+b3RoZXJbMl07CisJfQor CSp0bCA9IHR4ZHJfdW5zaWduZWQobGF5b3V0bGVuKTsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBy ZXBseSBmb3IgYSBzdWNjZXNzZnVsIExheW91dEdldCBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBp bnQKK25mc3J2X3BhcnNlbGF5b3V0Z2V0KHN0cnVjdCBuZnNydl9kZXNjcmlwdCAqbmQsIG5mc3Y0 c3RhdGVpZF90ICpzdGF0ZWlkcCwKKyAgICBpbnQgKnJldG9uY2xvc2VwLCBzdHJ1Y3QgbmZzY2xm bGF5b3V0aGVhZCAqZmxocCkKK3sKKwl1aW50MzJfdCAqdGw7CisJc3RydWN0IG5mc2NsZmxheW91 dCAqZmxwLCAqcHJldmZscCwgKnRmbHA7CisJaW50IGNudCwgZXJyb3IsIGdvdGlvbW9kZSwgZmhj bnQsIG5maGxlbiwgaSwgajsKKwl1aW50NjRfdCByZXRsZW47CisJc3RydWN0IG5mc2ZoICpuZmhw OworCXVpbnQ4X3QgKmNwOworCisJZXJyb3IgPSAwOworCWZscCA9IE5VTEw7CisJZ290aW9tb2Rl ID0gLTE7CisJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCAr IE5GU1hfU1RBVEVJRCk7CisJaWYgKCp0bCsrICE9IDApCisJCSpyZXRvbmNsb3NlcCA9IDE7CisJ ZWxzZQorCQkqcmV0b25jbG9zZXAgPSAwOworCXN0YXRlaWRwLT5zZXFpZCA9IGZ4ZHJfdW5zaWdu ZWQodWludDMyX3QsICp0bCsrKTsKKwlORlNDTF9ERUJVRyg0LCAicmV0b25jbHM9JWQgc3RzZXE9 JWRcbiIsICpyZXRvbmNsb3NlcCwKKwkgICAgKGludClzdGF0ZWlkcC0+c2VxaWQpOworCXN0YXRl aWRwLT5vdGhlclswXSA9ICp0bCsrOworCXN0YXRlaWRwLT5vdGhlclsxXSA9ICp0bCsrOworCXN0 YXRlaWRwLT5vdGhlclsyXSA9ICp0bCsrOworCWNudCA9IGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwp OworCU5GU0NMX0RFQlVHKDQsICJsYXlnIGNudD0lZFxuIiwgY250KTsKKwlpZiAoY250IDw9IDAg fHwgY250ID4gMTAwMDApIHsKKwkJLyogRG9uJ3QgYWNjZXB0IG1vcmUgdGhhbiAxMDAwMCBsYXlv dXRzIGluIHJlcGx5LiAqLworCQllcnJvciA9IE5GU0VSUl9CQURYRFI7CisJCWdvdG8gbmZzbW91 dDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCS8qIERpc3NlY3QgYWxsIHRo ZSB3YXkgdG8gdGhlIGZpbGUgaGFuZGxlIGNudC4gKi8KKwkJTkZTTV9ESVNTRUNUKHRsLCB1aW50 MzJfdCAqLCAzICogTkZTWF9IWVBFUiArCisJCSAgICA2ICogTkZTWF9VTlNJR05FRCArIE5GU1hf VjRERVZJQ0VJRCk7CisJCWZoY250ID0gZnhkcl91bnNpZ25lZChpbnQsICoodGwgKyAxMSArCisJ CSAgICBORlNYX1Y0REVWSUNFSUQgLyBORlNYX1VOU0lHTkVEKSk7CisJCU5GU0NMX0RFQlVHKDQs ICJmaGNudD0lZFxuIiwgZmhjbnQpOworCQlpZiAoZmhjbnQgPCAwIHx8IGZoY250ID4gMTAwKSB7 CisJCQkvKiBEb24ndCBhY2NlcHQgbW9yZSB0aGFuIDEwMCBmaWxlIGhhbmRsZXMuICovCisJCQll cnJvciA9IE5GU0VSUl9CQURYRFI7CisJCQlnb3RvIG5mc21vdXQ7CisJCX0KKwkJaWYgKGZoY250 ID4gMSkKKwkJCWZscCA9IG1hbGxvYyhzaXplb2YoKmZscCkgKyAoZmhjbnQgLSAxKSAqCisJCQkg ICAgc2l6ZW9mKHN0cnVjdCBuZnNmaCAqKSwgTV9ORlNGTEFZT1VULCBNX1dBSVRPSyk7CisJCWVs c2UKKwkJCWZscCA9IG1hbGxvYyhzaXplb2YoKmZscCksIE1fTkZTRkxBWU9VVCwgTV9XQUlUT0sp OworCQlmbHAtPm5mc2ZsX2ZsYWdzID0gMDsKKwkJZmxwLT5uZnNmbF9maGNudCA9IDA7CisJCWZs cC0+bmZzZmxfZGV2cCA9IE5VTEw7CisJCWZscC0+bmZzZmxfb2ZmID0gZnhkcl9oeXBlcih0bCk7 IHRsICs9IDI7CisJCXJldGxlbiA9IGZ4ZHJfaHlwZXIodGwpOyB0bCArPSAyOworCQlpZiAoZmxw LT5uZnNmbF9vZmYgKyByZXRsZW4gPCBmbHAtPm5mc2ZsX29mZikKKwkJCWZscC0+bmZzZmxfZW5k ID0gVUlOVDY0X01BWCAtIGZscC0+bmZzZmxfb2ZmOworCQllbHNlCisJCQlmbHAtPm5mc2ZsX2Vu ZCA9IGZscC0+bmZzZmxfb2ZmICsgcmV0bGVuOworCQlmbHAtPm5mc2ZsX2lvbW9kZSA9IGZ4ZHJf dW5zaWduZWQoaW50LCAqdGwrKyk7CisJCWlmIChnb3Rpb21vZGUgPT0gLTEpCisJCQlnb3Rpb21v ZGUgPSBmbHAtPm5mc2ZsX2lvbW9kZTsKKwkJaWYgKGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwrKykg IT0gTkZTTEFZT1VUX05GU1Y0XzFfRklMRVMpIHsKKwkJCXByaW50ZigiTkZTdjQuMTogZ290IG5v bi1maWxlcyBsYXlvdXRcbiIpOworCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOworCQkJZ290byBu ZnNtb3V0OworCQl9CisJCU5GU0JDT1BZKCsrdGwsIGZscC0+bmZzZmxfZGV2LCBORlNYX1Y0REVW SUNFSUQpOworCQl0bCArPSAoTkZTWF9WNERFVklDRUlEIC8gTkZTWF9VTlNJR05FRCk7CisJCWZs cC0+bmZzZmxfdXRpbCA9IGZ4ZHJfdW5zaWduZWQodWludDMyX3QsICp0bCsrKTsKKwkJTkZTQ0xf REVCVUcoNCwgImZsdXRpbD0weCV4XG4iLCBmbHAtPm5mc2ZsX3V0aWwpOworCQlmbHAtPm5mc2Zs X3N0cmlwZTEgPSBmeGRyX3Vuc2lnbmVkKHVpbnQzMl90LCAqdGwrKyk7CisJCWZscC0+bmZzZmxf cGF0b2ZmID0gZnhkcl9oeXBlcih0bCk7IHRsICs9IDI7CisJCWlmIChmeGRyX3Vuc2lnbmVkKGlu dCwgKnRsKSAhPSBmaGNudCkgeworCQkJcHJpbnRmKCJFRUshIGJhZCBmaGNudFxuIik7CisJCQll cnJvciA9IE5GU0VSUl9CQURYRFI7CisJCQlnb3RvIG5mc21vdXQ7CisJCX0KKwkJZm9yIChqID0g MDsgaiA8IGZoY250OyBqKyspIHsKKwkJCU5GU01fRElTU0VDVCh0bCwgdWludDMyX3QgKiwgTkZT WF9VTlNJR05FRCk7CisJCQluZmhsZW4gPSBmeGRyX3Vuc2lnbmVkKGludCwgKnRsKTsKKwkJCWlm IChuZmhsZW4gPD0gMCB8fCBuZmhsZW4gPiBORlNYX1Y0RkhNQVgpIHsKKwkJCQllcnJvciA9IE5G U0VSUl9CQURYRFI7CisJCQkJZ290byBuZnNtb3V0OworCQkJfQorCQkJbmZocCA9IG1hbGxvYyhz aXplb2YoKm5maHApICsgbmZobGVuIC0gMSwgTV9ORlNGSCwKKwkJCSAgICBNX1dBSVRPSyk7CisJ CQlmbHAtPm5mc2ZsX2ZoW2pdID0gbmZocDsKKwkJCWZscC0+bmZzZmxfZmhjbnQrKzsKKwkJCW5m aHAtPm5maF9sZW4gPSBuZmhsZW47CisJCQlORlNNX0RJU1NFQ1QoY3AsIHVpbnQ4X3QgKiwgTkZT TV9STkRVUChuZmhsZW4pKTsKKwkJCU5GU0JDT1BZKGNwLCBuZmhwLT5uZmhfZmgsIG5maGxlbik7 CisJCX0KKwkJaWYgKGZscC0+bmZzZmxfaW9tb2RlID09IGdvdGlvbW9kZSkgeworCQkJLyogS2Vl cCB0aGUgbGlzdCBpbiBpbmNyZWFzaW5nIG9mZnNldCBvcmRlci4gKi8KKwkJCXRmbHAgPSBMSVNU X0ZJUlNUKGZsaHApOworCQkJcHJldmZscCA9IE5VTEw7CisJCQl3aGlsZSAodGZscCAhPSBOVUxM ICYmCisJCQkgICAgdGZscC0+bmZzZmxfb2ZmIDwgZmxwLT5uZnNmbF9vZmYpIHsKKwkJCQlwcmV2 ZmxwID0gdGZscDsKKwkJCQl0ZmxwID0gTElTVF9ORVhUKHRmbHAsIG5mc2ZsX2xpc3QpOworCQkJ fQorCQkJaWYgKHByZXZmbHAgPT0gTlVMTCkKKwkJCQlMSVNUX0lOU0VSVF9IRUFEKGZsaHAsIGZs cCwgbmZzZmxfbGlzdCk7CisJCQllbHNlCisJCQkJTElTVF9JTlNFUlRfQUZURVIocHJldmZscCwg ZmxwLAorCQkJCSAgICBuZnNmbF9saXN0KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigibmZzY2xf bGF5b3V0Z2V0KCk6IGdvdCB3cm9uZyBpb21vZGVcbiIpOworCQkJbmZzY2xfZnJlZWZsYXlvdXQo ZmxwKTsKKwkJfQorCQlmbHAgPSBOVUxMOworCX0KK25mc21vdXQ6CisJaWYgKGVycm9yICE9IDAg JiYgZmxwICE9IE5VTEwpCisJCW5mc2NsX2ZyZWVmbGF5b3V0KGZscCk7CisJcmV0dXJuIChlcnJv cik7Cit9CisKKy8qCisgKiBTaW1pbGFyIHRvIG5mc3JwY19nZXRsYXlvdXQoKSwgZXhjZXB0IHRo YXQgaXQgdXNlcyBuZnNycGNfb3BlbmxheWdldCgpLAorICogc28gdGhhdCBpdCBkb2VzIGJvdGgg YW4gT3BlbiBhbmQgYSBMYXlvdXRnZXQuCisgKi8KK3N0YXRpYyBpbnQKK25mc3JwY19nZXRvcGVu bGF5b3V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB2bm9kZV90IHZwLCB1X2ludDhfdCAqbmZocCwK KyAgICBpbnQgZmhsZW4sIHVpbnQ4X3QgKm5ld2ZocCwgaW50IG5ld2ZobGVuLCB1aW50MzJfdCBt b2RlLAorICAgIHN0cnVjdCBuZnNjbG9wZW4gKm9wLCB1aW50OF90ICpuYW1lLCBpbnQgbmFtZWxl biwgc3RydWN0IG5mc2NsZGVsZWcgKipkcHAsCisgICAgc3RydWN0IHVjcmVkICpjcmVkLCBORlNQ Uk9DX1QgKnApCit7CisJc3RydWN0IG5mc2NsbGF5b3V0ICpseXA7CisJc3RydWN0IG5mc2NsZmxh eW91dCAqZmxwOworCXN0cnVjdCBuZnNjbGZsYXlvdXRoZWFkIGZsaDsKKwlpbnQgZXJyb3IsIGlz bG9ja2VkLCBsYXlvdXRsZW4sIHJlY2FsbGVkLCByZXRvbmNsb3NlLCB1c2VjdXJzdGF0ZWlkOwor CWludCBsYXlzdGF0OworCW5mc3Y0c3RhdGVpZF90IHN0YXRlaWQ7CisJc3RydWN0IG5mc2Nsc2Vz c2lvbiAqdHNlcDsKKworCWVycm9yID0gMDsKKwkvKgorCSAqIElmIGx5cCBpcyByZXR1cm5lZCBu b24tTlVMTCwgdGhlcmUgd2lsbCBiZSBhIHJlZmNudCAoc2hhcmVkIGxvY2spCisJICogb24gaXQs IGlmZiBmbHAgIT0gTlVMTCBvciBhIGxvY2sgKGV4Y2x1c2l2ZSBsb2NrKSBvbiBpdCBpZmYKKwkg KiBmbHAgPT0gTlVMTC4KKwkgKi8KKwlseXAgPSBuZnNjbF9nZXRsYXlvdXQobm1wLT5ubV9jbHAs IG5ld2ZocCwgbmV3ZmhsZW4sIDAsICZmbHAsCisJICAgICZyZWNhbGxlZCk7CisJTkZTQ0xfREVC VUcoNCwgIm5mc3JwY19nZXRvcGVubGF5b3V0IG5mc2NsX2dldGxheW91dCBseXA9JXBcbiIsIGx5 cCk7CisJaWYgKGx5cCA9PSBOVUxMKQorCQlpc2xvY2tlZCA9IDA7CisJZWxzZSBpZiAoZmxwICE9 IE5VTEwpCisJCWlzbG9ja2VkID0gMTsKKwllbHNlCisJCWlzbG9ja2VkID0gMjsKKwlpZiAoKGx5 cCA9PSBOVUxMIHx8IGZscCA9PSBOVUxMKSAmJiByZWNhbGxlZCA9PSAwKSB7CisJCUxJU1RfSU5J VCgmZmxoKTsKKwkJdHNlcCA9IG5mc21udF9tZHNzZXNzaW9uKG5tcCk7CisJCWxheW91dGxlbiA9 IHRzZXAtPm5mc2Vzc19tYXhjYWNoZSAtIChORlNYX1NUQVRFSUQgKworCQkgICAgMyAqIE5GU1hf VU5TSUdORUQpOworCQlpZiAobHlwID09IE5VTEwpCisJCQl1c2VjdXJzdGF0ZWlkID0gMTsKKwkJ ZWxzZSB7CisJCQl1c2VjdXJzdGF0ZWlkID0gMDsKKwkJCXN0YXRlaWQuc2VxaWQgPSBseXAtPm5m c2x5X3N0YXRlaWQuc2VxaWQ7CisJCQlzdGF0ZWlkLm90aGVyWzBdID0gbHlwLT5uZnNseV9zdGF0 ZWlkLm90aGVyWzBdOworCQkJc3RhdGVpZC5vdGhlclsxXSA9IGx5cC0+bmZzbHlfc3RhdGVpZC5v dGhlclsxXTsKKwkJCXN0YXRlaWQub3RoZXJbMl0gPSBseXAtPm5mc2x5X3N0YXRlaWQub3RoZXJb Ml07CisJCX0KKwkJZXJyb3IgPSBuZnNycGNfb3BlbmxheW91dHJwYyhubXAsIHZwLCBuZmhwLCBm aGxlbiwKKwkJICAgIG5ld2ZocCwgbmV3ZmhsZW4sIG1vZGUsIG9wLCBuYW1lLCBuYW1lbGVuLAor CQkgICAgZHBwLCAmc3RhdGVpZCwgdXNlY3Vyc3RhdGVpZCwgbGF5b3V0bGVuLAorCQkgICAgJnJl dG9uY2xvc2UsICZmbGgsICZsYXlzdGF0LCBjcmVkLCBwKTsKKwkJTkZTQ0xfREVCVUcoNCwgImFm dCBuZnNycGNfb3BlbmxheW91dHJwYyBsYXlzdGF0PSVkIGVycj0lZFxuIiwKKwkJICAgIGxheXN0 YXQsIGVycm9yKTsKKwkJbGF5c3RhdCA9IG5mc3JwY19sYXlvdXRnZXRyZXMobm1wLCB2cCwgbmV3 ZmhwLCBuZXdmaGxlbiwKKwkJICAgICZzdGF0ZWlkLCByZXRvbmNsb3NlLCBOVUxMLCAmbHlwLCAm ZmxoLCBsYXlzdGF0LCAmaXNsb2NrZWQsCisJCSAgICBjcmVkLCBwKTsKKwl9IGVsc2UKKwkJZXJy b3IgPSBuZnNycGNfb3BlbnJwYyhubXAsIHZwLCBuZmhwLCBmaGxlbiwgbmV3ZmhwLCBuZXdmaGxl biwKKwkJICAgIG1vZGUsIG9wLCBuYW1lLCBuYW1lbGVuLCBkcHAsIDAsIDAsIGNyZWQsIHAsIDAs IDApOworCWlmIChpc2xvY2tlZCA9PSAyKQorCQluZnNjbF9yZWxsYXlvdXQobHlwLCAxKTsKKwll bHNlIGlmIChpc2xvY2tlZCA9PSAxKQorCQluZnNjbF9yZWxsYXlvdXQobHlwLCAwKTsKKwlyZXR1 cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhbiBPcGVuK0xheW91 dEdldCBmb3IgYW4gTkZTdjQuMSBtb3VudCB3aXRoIHBORlMKKyAqIGVuYWJsZWQsIG9ubHkgZm9y IHRoZSBDTEFJTV9OVUxMIGNhc2UuICBBbGwgb3RoZXIgTkZTdjQgT3BlbnMgYXJlCisgKiBoYW5k bGVkIGJ5IG5mc3JwY19vcGVucnBjKCkuCisgKiBGb3IgdGhlIGNhc2Ugd2hlcmUgb3AgPT0gTlVM TCwgZHZwIGlzIHRoZSBkaXJlY3RvcnkuICBXaGVuIG9wICE9IE5VTEwsIGl0CisgKiBjYW4gYmUg TlVMTC4KKyAqLworc3RhdGljIGludAorbmZzcnBjX29wZW5sYXlvdXRycGMoc3RydWN0IG5mc21v dW50ICpubXAsIHZub2RlX3QgdnAsIHVfaW50OF90ICpuZmhwLAorICAgIGludCBmaGxlbiwgdWlu dDhfdCAqbmV3ZmhwLCBpbnQgbmV3ZmhsZW4sIHVpbnQzMl90IG1vZGUsCisgICAgc3RydWN0IG5m c2Nsb3BlbiAqb3AsIHVpbnQ4X3QgKm5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgbmZzY2xkZWxl ZyAqKmRwcCwKKyAgICBuZnN2NHN0YXRlaWRfdCAqc3RhdGVpZHAsIGludCB1c2VjdXJzdGF0ZWlk LAorICAgIGludCBsYXlvdXRsZW4sIGludCAqcmV0b25jbG9zZXAsIHN0cnVjdCBuZnNjbGZsYXlv dXRoZWFkICpmbGhwLAorICAgIGludCAqbGF5c3RhdHAsIHN0cnVjdCB1Y3JlZCAqY3JlZCwgTkZT UFJPQ19UICpwKQoreworCXVpbnQzMl90ICp0bDsKKwlzdHJ1Y3QgbmZzcnZfZGVzY3JpcHQgbmZz ZCwgKm5kID0gJm5mc2Q7CisJc3RydWN0IG5mc2NsZGVsZWcgKm5kcCA9IE5VTEw7CisJc3RydWN0 IG5mc3ZhdHRyIG5mc3ZhOworCXN0cnVjdCBuZnNjbHNlc3Npb24gKnRzZXA7CisJdWludDMyX3Qg cmZsYWdzLCBkZWxlZzsKKwluZnNhdHRyYml0X3QgYXR0cmJpdHM7CisJaW50IGVycm9yLCByZXQs IGFjZXNpemUsIGxpbWl0YnksIGlvbW9kZTsKKworCSpkcHAgPSBOVUxMOworCSpsYXlzdGF0cCA9 IEVOWElPOworCW5mc2NsX3JlcXN0YXJ0KG5kLCBORlNQUk9DX09QRU5MQVlHRVQsIG5tcCwgbmZo cCwgZmhsZW4sIE5VTEwsIE5VTEwpOworCU5GU01fQlVJTEQodGwsIHVpbnQzMl90ICosIDUgKiBO RlNYX1VOU0lHTkVEKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWduZWQob3AtPm5mc29fb3duLT5uZnNv d19zZXFpZCk7CisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKG1vZGUgJiBORlNWNE9QRU5fQUNDRVNT Qk9USCk7CisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKChtb2RlID4+IE5GU0xDS19TSElGVCkgJiBO RlNWNE9QRU5fREVOWUJPVEgpOworCXRzZXAgPSBuZnNtbnRfbWRzc2Vzc2lvbihubXApOworCSp0 bCsrID0gdHNlcC0+bmZzZXNzX2NsaWVudGlkLmx2YWxbMF07CisJKnRsID0gdHNlcC0+bmZzZXNz X2NsaWVudGlkLmx2YWxbMV07CisJbmZzbV9zdHJ0b20obmQsIG9wLT5uZnNvX293bi0+bmZzb3df b3duZXIsIE5GU1Y0Q0xfTE9DS05BTUVMRU4pOworCU5GU01fQlVJTEQodGwsIHVpbnQzMl90ICos IDIgKiBORlNYX1VOU0lHTkVEKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWduZWQoTkZTVjRPUEVOX05P Q1JFQVRFKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0T1BFTl9DTEFJTU5VTEwpOworCW5m c21fc3RydG9tKG5kLCBuYW1lLCBuYW1lbGVuKTsKKwlORlNNX0JVSUxEKHRsLCB1aW50MzJfdCAq LCBORlNYX1VOU0lHTkVEKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0T1BfR0VUQVRUUik7 CisJTkZTWkVST19BVFRSQklUKCZhdHRyYml0cyk7CisJTkZTU0VUQklUX0FUVFJCSVQoJmF0dHJi aXRzLCBORlNBVFRSQklUX0NIQU5HRSk7CisJTkZTU0VUQklUX0FUVFJCSVQoJmF0dHJiaXRzLCBO RlNBVFRSQklUX1RJTUVNT0RJRlkpOworCW5mc3J2X3B1dGF0dHJiaXQobmQsICZhdHRyYml0cyk7 CisJTkZTTV9CVUlMRCh0bCwgdWludDMyX3QgKiwgTkZTWF9VTlNJR05FRCk7CisJKnRsID0gdHhk cl91bnNpZ25lZChORlNWNE9QX0xBWU9VVEdFVCk7CisJaWYgKChtb2RlICYgTkZTVjRPUEVOX0FD Q0VTU1dSSVRFKSAhPSAwKQorCQlpb21vZGUgPSBORlNMQVlPVVRJT01PREVfUlc7CisJZWxzZQor CQlpb21vZGUgPSBORlNMQVlPVVRJT01PREVfUkVBRDsKKwluZnNydl9zZXR1cGxheW91dGdldChu ZCwgaW9tb2RlLCAwLCBVSU5UNjRfTUFYLCAwLCBzdGF0ZWlkcCwKKwkgICAgbGF5b3V0bGVuLCB1 c2VjdXJzdGF0ZWlkKTsKKwllcnJvciA9IG5ld25mc19yZXF1ZXN0KG5kLCBubXAsIE5VTEwsICZu bXAtPm5tX3NvY2tyZXEsIHZwLCBwLCBjcmVkLAorCSAgICBORlNfUFJPRywgTkZTX1ZFUjQsIE5V TEwsIDEsIE5VTEwsIE5VTEwpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsK KwlORlNDTF9JTkNSU0VRSUQob3AtPm5mc29fb3duLT5uZnNvd19zZXFpZCwgbmQpOworCWlmIChu ZC0+bmRfcmVwc3RhdCAhPSAwKQorCQkqbGF5c3RhdHAgPSBuZC0+bmRfcmVwc3RhdDsKKwlpZiAo KG5kLT5uZF9mbGFnICYgTkRfTk9NT1JFREFUQSkgPT0gMCkgeworCQkvKiBORF9OT01PUkVEQVRB IHdpbGwgYmUgc2V0IGlmIHRoZSBPcGVuIG9wZXJhdGlvbiBmYWlsZWQuICovCisJCU5GU01fRElT U0VDVCh0bCwgdV9pbnQzMl90ICosIE5GU1hfU1RBVEVJRCArCisJCSAgICA2ICogTkZTWF9VTlNJ R05FRCk7CisJCW9wLT5uZnNvX3N0YXRlaWQuc2VxaWQgPSAqdGwrKzsKKwkJb3AtPm5mc29fc3Rh dGVpZC5vdGhlclswXSA9ICp0bCsrOworCQlvcC0+bmZzb19zdGF0ZWlkLm90aGVyWzFdID0gKnRs Kys7CisJCW9wLT5uZnNvX3N0YXRlaWQub3RoZXJbMl0gPSAqdGw7CisJCXJmbGFncyA9IGZ4ZHJf dW5zaWduZWQodV9pbnQzMl90LCAqKHRsICsgNikpOworCQllcnJvciA9IG5mc3J2X2dldGF0dHJi aXRzKG5kLCAmYXR0cmJpdHMsIE5VTEwsIE5VTEwpOworCQlpZiAoZXJyb3IgIT0gMCkKKwkJCWdv dG8gbmZzbW91dDsKKwkJTkZTTV9ESVNTRUNUKHRsLCB1X2ludDMyX3QgKiwgTkZTWF9VTlNJR05F RCk7CisJCWRlbGVnID0gZnhkcl91bnNpZ25lZCh1X2ludDMyX3QsICp0bCk7CisJCWlmIChkZWxl ZyA9PSBORlNWNE9QRU5fREVMRUdBVEVSRUFEIHx8CisJCSAgICBkZWxlZyA9PSBORlNWNE9QRU5f REVMRUdBVEVXUklURSkgeworCQkJaWYgKCEob3AtPm5mc29fb3duLT5uZnNvd19jbHAtPm5mc2Nf ZmxhZ3MgJgorCQkJICAgICAgTkZTQ0xGTEFHU19GSVJTVERFTEVHKSkKKwkJCQlvcC0+bmZzb19v d24tPm5mc293X2NscC0+bmZzY19mbGFncyB8PQorCQkJCSAgKE5GU0NMRkxBR1NfRklSU1RERUxF RyB8IE5GU0NMRkxBR1NfR09UREVMRUcpOworCQkJbmRwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qg bmZzY2xkZWxlZykgKyBuZXdmaGxlbiwKKwkJCSAgICBNX05GU0NMREVMRUcsIE1fV0FJVE9LKTsK KwkJCUxJU1RfSU5JVCgmbmRwLT5uZnNkbF9vd25lcik7CisJCQlMSVNUX0lOSVQoJm5kcC0+bmZz ZGxfbG9jayk7CisJCQluZHAtPm5mc2RsX2NscCA9IG9wLT5uZnNvX293bi0+bmZzb3dfY2xwOwor CQkJbmRwLT5uZnNkbF9maGxlbiA9IG5ld2ZobGVuOworCQkJTkZTQkNPUFkobmV3ZmhwLCBuZHAt Pm5mc2RsX2ZoLCBuZXdmaGxlbik7CisJCQluZXduZnNfY29weWluY3JlZChjcmVkLCAmbmRwLT5u ZnNkbF9jcmVkKTsKKwkJCW5mc2NsX2xvY2tpbml0KCZuZHAtPm5mc2RsX3J3bG9jayk7CisJCQlO RlNNX0RJU1NFQ1QodGwsIHVfaW50MzJfdCAqLCBORlNYX1NUQVRFSUQgKworCQkJICAgIE5GU1hf VU5TSUdORUQpOworCQkJbmRwLT5uZnNkbF9zdGF0ZWlkLnNlcWlkID0gKnRsKys7CisJCQluZHAt Pm5mc2RsX3N0YXRlaWQub3RoZXJbMF0gPSAqdGwrKzsKKwkJCW5kcC0+bmZzZGxfc3RhdGVpZC5v dGhlclsxXSA9ICp0bCsrOworCQkJbmRwLT5uZnNkbF9zdGF0ZWlkLm90aGVyWzJdID0gKnRsKys7 CisJCQlyZXQgPSBmeGRyX3Vuc2lnbmVkKGludCwgKnRsKTsKKwkJCWlmIChkZWxlZyA9PSBORlNW NE9QRU5fREVMRUdBVEVXUklURSkgeworCQkJCW5kcC0+bmZzZGxfZmxhZ3MgPSBORlNDTERMX1dS SVRFOworCQkJCS8qCisJCQkJICogSW5kaWNhdGVzIGhvdyBtdWNoIHRoZSBmaWxlIGNhbiBncm93 LgorCQkJCSAqLworCQkJCU5GU01fRElTU0VDVCh0bCwgdV9pbnQzMl90ICosCisJCQkJICAgIDMg KiBORlNYX1VOU0lHTkVEKTsKKwkJCQlsaW1pdGJ5ID0gZnhkcl91bnNpZ25lZChpbnQsICp0bCsr KTsKKwkJCQlzd2l0Y2ggKGxpbWl0YnkpIHsKKwkJCQljYXNlIE5GU1Y0T1BFTl9MSU1JVFNJWkU6 CisJCQkJCW5kcC0+bmZzZGxfc2l6ZWxpbWl0ID0gZnhkcl9oeXBlcih0bCk7CisJCQkJCWJyZWFr OworCQkJCWNhc2UgTkZTVjRPUEVOX0xJTUlUQkxPQ0tTOgorCQkJCQluZHAtPm5mc2RsX3NpemVs aW1pdCA9CisJCQkJCSAgICBmeGRyX3Vuc2lnbmVkKHVfaW50NjRfdCwgKnRsKyspOworCQkJCQlu ZHAtPm5mc2RsX3NpemVsaW1pdCAqPQorCQkJCQkgICAgZnhkcl91bnNpZ25lZCh1X2ludDY0X3Qs ICp0bCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVycm9yID0gTkZTRVJSX0JB RFhEUjsKKwkJCQkJZ290byBuZnNtb3V0OworCQkJCX07CisJCQl9IGVsc2UKKwkJCQluZHAtPm5m c2RsX2ZsYWdzID0gTkZTQ0xETF9SRUFEOworCQkJaWYgKHJldCAhPSAwKQorCQkJCW5kcC0+bmZz ZGxfZmxhZ3MgfD0gTkZTQ0xETF9SRUNBTEw7CisJCQllcnJvciA9IG5mc3J2X2Rpc3NlY3RhY2Uo bmQsICZuZHAtPm5mc2RsX2FjZSwgJnJldCwKKwkJCSAgICAmYWNlc2l6ZSwgcCk7CisJCQlpZiAo ZXJyb3IgIT0gMCkKKwkJCQlnb3RvIG5mc21vdXQ7CisJCX0gZWxzZSBpZiAoZGVsZWcgIT0gTkZT VjRPUEVOX0RFTEVHQVRFTk9ORSkgeworCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOworCQkJZ290 byBuZnNtb3V0OworCQl9CisJCWlmICgocmZsYWdzICYgTkZTVjRPUEVOX0xPQ0tUWVBFUE9TSVgp ICE9IDAgfHwKKwkJICAgIG5mc2NsX2Fzc3VtZXBvc2l4bG9ja3MpCisJCQlvcC0+bmZzb19wb3Np eGxvY2sgPSAxOworCQllbHNlCisJCQlvcC0+bmZzb19wb3NpeGxvY2sgPSAwOworCQlORlNNX0RJ U1NFQ1QodGwsIHVfaW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCk7CisJCS8qIElmIHRoZSAy bmQgZWxlbWVudCA9PSBORlNfT0ssIHRoZSBHZXRhdHRyIHN1Y2NlZWRlZC4gKi8KKwkJaWYgKCor K3RsID09IDApIHsKKwkJCWVycm9yID0gbmZzdjRfbG9hZGF0dHIobmQsIE5VTEwsICZuZnN2YSwg TlVMTCwKKwkJCSAgICBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAor CQkJICAgIE5VTEwsIE5VTEwsIE5VTEwsIHAsIGNyZWQpOworCQkJaWYgKGVycm9yICE9IDApCisJ CQkJZ290byBuZnNtb3V0OworCQkJaWYgKG5kcCAhPSBOVUxMKSB7CisJCQkJbmRwLT5uZnNkbF9j aGFuZ2UgPSBuZnN2YS5uYV9maWxlcmV2OworCQkJCW5kcC0+bmZzZGxfbW9kdGltZSA9IG5mc3Zh Lm5hX210aW1lOworCQkJCW5kcC0+bmZzZGxfZmxhZ3MgfD0gTkZTQ0xETF9NT0RUSU1FU0VUOwor CQkJCSpkcHAgPSBuZHA7CisJCQkJbmRwID0gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgKiBBdCB0 aGlzIHBvaW50LCB0aGUgT3BlbiBoYXMgc3VjY2VlZGVkLCBzbyBzZXQKKwkJCSAqIG5kX3JlcHN0 YXQgPSBORlNfT0suICBJZiB0aGUgTGF5b3V0Z2V0IGZhaWxlZCwKKwkJCSAqIHRoaXMgZnVuY3Rp b24ganVzdCB3b24ndCByZXR1cm4gYSBsYXlvdXQuCisJCQkgKi8KKwkJCWlmIChuZC0+bmRfcmVw c3RhdCA9PSAwKSB7CisJCQkJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICogTkZTWF9V TlNJR05FRCk7CisJCQkJKmxheXN0YXRwID0gZnhkcl91bnNpZ25lZChpbnQsICorK3RsKTsKKwkJ CQlpZiAoKmxheXN0YXRwID09IDApIHsKKwkJCQkJZXJyb3IgPSBuZnNydl9wYXJzZWxheW91dGdl dChuZCwKKwkJCQkJICAgIHN0YXRlaWRwLCByZXRvbmNsb3NlcCwgZmxocCk7CisJCQkJCWlmIChl cnJvciAhPSAwKQorCQkJCQkJKmxheXN0YXRwID0gZXJyb3I7CisJCQkJfQorCQkJfSBlbHNlCisJ CQkJbmQtPm5kX3JlcHN0YXQgPSAwOwkvKiBSZXR1cm4gMCBmb3IgT3Blbi4gKi8KKwkJfQorCX0K KwlpZiAobmQtPm5kX3JlcHN0YXQgIT0gMCAmJiBlcnJvciA9PSAwKQorCQllcnJvciA9IG5kLT5u ZF9yZXBzdGF0OworbmZzbW91dDoKKwlmcmVlKG5kcCwgTV9ORlNDTERFTEVHKTsKKwltYnVmX2Zy ZWVtKG5kLT5uZF9tcmVwKTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFNpbWlsYXIg bmZzcnBjX2NyZWF0ZXY0KCksIGJ1dCBhbHNvIGRvZXMgdGhlIExheW91dEdldCBvcGVyYXRpb24u CisgKiBVc2VkIG9ubHkgZm9yIG1vdW50cyB3aXRoIHBORlMgZW5hYmxlZC4KKyAqLworc3RhdGlj IGludAorbmZzcnBjX2NyZWF0ZWxheW91dCh2bm9kZV90IGR2cCwgY2hhciAqbmFtZSwgaW50IG5h bWVsZW4sIHN0cnVjdCB2YXR0ciAqdmFwLAorICAgIG5mc3F1YWRfdCBjdmVyZiwgaW50IGZtb2Rl LCBzdHJ1Y3QgbmZzY2xvd25lciAqb3dwLCBzdHJ1Y3QgbmZzY2xkZWxlZyAqKmRwcCwKKyAgICBz dHJ1Y3QgdWNyZWQgKmNyZWQsIE5GU1BST0NfVCAqcCwgc3RydWN0IG5mc3ZhdHRyICpkbmFwLAor ICAgIHN0cnVjdCBuZnN2YXR0ciAqbm5hcCwgc3RydWN0IG5mc2ZoICoqbmZocHAsIGludCAqYXR0 cmZsYWdwLAorICAgIGludCAqZGF0dHJmbGFncCwgdm9pZCAqZHN0dWZmLCBpbnQgKnVubG9ja2Vk cCwgbmZzdjRzdGF0ZWlkX3QgKnN0YXRlaWRwLAorICAgIGludCB1c2VjdXJzdGF0ZWlkLCBpbnQg bGF5b3V0bGVuLCBpbnQgKnJldG9uY2xvc2VwLAorICAgIHN0cnVjdCBuZnNjbGZsYXlvdXRoZWFk ICpmbGhwLCBpbnQgKmxheXN0YXRwKQoreworCXVpbnQzMl90ICp0bDsKKwlpbnQgZXJyb3IgPSAw LCBkZWxlZywgbmV3b25lLCByZXQsIGFjZXNpemUsIGxpbWl0Ynk7CisJc3RydWN0IG5mc3J2X2Rl c2NyaXB0IG5mc2QsICpuZCA9ICZuZnNkOworCXN0cnVjdCBuZnNjbG9wZW4gKm9wOworCXN0cnVj dCBuZnNjbGRlbGVnICpkcCA9IE5VTEw7CisJc3RydWN0IG5mc25vZGUgKm5wOworCXN0cnVjdCBu ZnNmaCAqbmZocDsKKwlzdHJ1Y3QgbmZzY2xzZXNzaW9uICp0c2VwOworCW5mc2F0dHJiaXRfdCBh dHRyYml0czsKKwluZnN2NHN0YXRlaWRfdCBzdGF0ZWlkOworCXVpbnQzMl90IHJmbGFnczsKKwlz dHJ1Y3QgbmZzbW91bnQgKm5tcDsKKworCW5tcCA9IFZGU1RPTkZTKGR2cC0+dl9tb3VudCk7CisJ bnAgPSBWVE9ORlMoZHZwKTsKKwkqbGF5c3RhdHAgPSBFTlhJTzsKKwkqdW5sb2NrZWRwID0gMDsK KwkqbmZocHAgPSBOVUxMOworCSpkcHAgPSBOVUxMOworCSphdHRyZmxhZ3AgPSAwOworCSpkYXR0 cmZsYWdwID0gMDsKKwlpZiAobmFtZWxlbiA+IE5GU19NQVhOQU1MRU4pCisJCXJldHVybiAoRU5B TUVUT09MT05HKTsKKwlORlNDTF9SRVFTVEFSVChuZCwgTkZTUFJPQ19DUkVBVEVMQVlHRVQsIGR2 cCk7CisJLyoKKwkgKiBGb3IgVjQsIHRoaXMgaXMgYWN0dWFsbHkgYW4gT3BlbiBvcC4KKwkgKi8K KwlORlNNX0JVSUxEKHRsLCB1X2ludDMyX3QgKiwgNSAqIE5GU1hfVU5TSUdORUQpOworCSp0bCsr ID0gdHhkcl91bnNpZ25lZChvd3AtPm5mc293X3NlcWlkKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWdu ZWQoTkZTVjRPUEVOX0FDQ0VTU1dSSVRFIHwKKwkgICAgTkZTVjRPUEVOX0FDQ0VTU1JFQUQpOwor CSp0bCsrID0gdHhkcl91bnNpZ25lZChORlNWNE9QRU5fREVOWU5PTkUpOworCXRzZXAgPSBuZnNt bnRfbWRzc2Vzc2lvbihubXApOworCSp0bCsrID0gdHNlcC0+bmZzZXNzX2NsaWVudGlkLmx2YWxb MF07CisJKnRsID0gdHNlcC0+bmZzZXNzX2NsaWVudGlkLmx2YWxbMV07CisJbmZzbV9zdHJ0b20o bmQsIG93cC0+bmZzb3dfb3duZXIsIE5GU1Y0Q0xfTE9DS05BTUVMRU4pOworCU5GU01fQlVJTEQo dGwsIHVfaW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCk7CisJKnRsKysgPSB0eGRyX3Vuc2ln bmVkKE5GU1Y0T1BFTl9DUkVBVEUpOworCWlmICgoZm1vZGUgJiBPX0VYQ0wpICE9IDApIHsKKwkJ aWYgKE5GU0hBU1NFU1NQRVJTSVNUKG5tcCkpIHsKKwkJCS8qIFVzZSBHVUFSREVEIGZvciBwZXJz aXN0ZW50IHNlc3Npb25zLiAqLworCQkJKnRsID0gdHhkcl91bnNpZ25lZChORlNDUkVBVEVfR1VB UkRFRCk7CisJCQluZnNjbF9maWxsc2F0dHIobmQsIHZhcCwgZHZwLCAwLCAwKTsKKwkJfSBlbHNl IHsKKwkJCS8qIE90aGVyd2lzZSwgdXNlIEVYQ0xVU0lWRTRfMS4gKi8KKwkJCSp0bCA9IHR4ZHJf dW5zaWduZWQoTkZTQ1JFQVRFX0VYQ0xVU0lWRTQxKTsKKwkJCU5GU01fQlVJTEQodGwsIHVfaW50 MzJfdCAqLCBORlNYX1ZFUkYpOworCQkJKnRsKysgPSBjdmVyZi5sdmFsWzBdOworCQkJKnRsID0g Y3ZlcmYubHZhbFsxXTsKKwkJCW5mc2NsX2ZpbGxzYXR0cihuZCwgdmFwLCBkdnAsIDAsIDApOwor CQl9CisJfSBlbHNlIHsKKwkJKnRsID0gdHhkcl91bnNpZ25lZChORlNDUkVBVEVfVU5DSEVDS0VE KTsKKwkJbmZzY2xfZmlsbHNhdHRyKG5kLCB2YXAsIGR2cCwgMCwgMCk7CisJfQorCU5GU01fQlVJ TEQodGwsIHVfaW50MzJfdCAqLCBORlNYX1VOU0lHTkVEKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVk KE5GU1Y0T1BFTl9DTEFJTU5VTEwpOworCW5mc21fc3RydG9tKG5kLCBuYW1lLCBuYW1lbGVuKTsK KwkvKiBHZXQgdGhlIG5ldyBmaWxlJ3MgaGFuZGxlIGFuZCBhdHRyaWJ1dGVzLCBwbHVzIHNhdmUg dGhlIEZILiAqLworCU5GU01fQlVJTEQodGwsIHVfaW50MzJfdCAqLCAzICogTkZTWF9VTlNJR05F RCk7CisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0T1BfU0FWRUZIKTsKKwkqdGwrKyA9IHR4 ZHJfdW5zaWduZWQoTkZTVjRPUF9HRVRGSCk7CisJKnRsID0gdHhkcl91bnNpZ25lZChORlNWNE9Q X0dFVEFUVFIpOworCU5GU0dFVEFUVFJfQVRUUkJJVCgmYXR0cmJpdHMpOworCW5mc3J2X3B1dGF0 dHJiaXQobmQsICZhdHRyYml0cyk7CisJLyogR2V0IHRoZSBkaXJlY3RvcnkncyBwb3N0LW9wIGF0 dHJpYnV0ZXMuICovCisJTkZTTV9CVUlMRCh0bCwgdV9pbnQzMl90ICosIE5GU1hfVU5TSUdORUQp OworCSp0bCA9IHR4ZHJfdW5zaWduZWQoTkZTVjRPUF9QVVRGSCk7CisJbmZzbV9maHRvbShuZCwg bnAtPm5fZmhwLT5uZmhfZmgsIG5wLT5uX2ZocC0+bmZoX2xlbiwgMCk7CisJTkZTTV9CVUlMRCh0 bCwgdV9pbnQzMl90ICosIE5GU1hfVU5TSUdORUQpOworCSp0bCA9IHR4ZHJfdW5zaWduZWQoTkZT VjRPUF9HRVRBVFRSKTsKKwluZnNydl9wdXRhdHRyYml0KG5kLCAmYXR0cmJpdHMpOworCU5GU01f QlVJTEQodGwsIHVfaW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCk7CisJKnRsKysgPSB0eGRy X3Vuc2lnbmVkKE5GU1Y0T1BfUkVTVE9SRUZIKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0 T1BfTEFZT1VUR0VUKTsKKwluZnNydl9zZXR1cGxheW91dGdldChuZCwgTkZTTEFZT1VUSU9NT0RF X1JXLCAwLCBVSU5UNjRfTUFYLCAwLCBzdGF0ZWlkcCwKKwkgICAgbGF5b3V0bGVuLCB1c2VjdXJz dGF0ZWlkKTsKKwllcnJvciA9IG5mc2NsX3JlcXVlc3QobmQsIGR2cCwgcCwgY3JlZCwgZHN0dWZm KTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisJTkZTQ0xfREVCVUcoNCwg Im5mc3JwY19jcmVhdGVsYXlvdXQgc3RhdD0lZCBlcnI9JWRcbiIsIG5kLT5uZF9yZXBzdGF0LAor CSAgICBlcnJvcik7CisJaWYgKG5kLT5uZF9yZXBzdGF0ICE9IDApCisJCSpsYXlzdGF0cCA9IG5k LT5uZF9yZXBzdGF0OworCU5GU0NMX0lOQ1JTRVFJRChvd3AtPm5mc293X3NlcWlkLCBuZCk7CisJ aWYgKChuZC0+bmRfZmxhZyAmIE5EX05PTU9SRURBVEEpID09IDApIHsKKwkJTkZTQ0xfREVCVUco NCwgIm5mc3JwY19jcmVhdGVsYXlvdXQgb3BlbiBzdWNjZWVkZWRcbiIpOworCQlORlNNX0RJU1NF Q1QodGwsIHVfaW50MzJfdCAqLCBORlNYX1NUQVRFSUQgKworCQkgICAgNiAqIE5GU1hfVU5TSUdO RUQpOworCQlzdGF0ZWlkLnNlcWlkID0gKnRsKys7CisJCXN0YXRlaWQub3RoZXJbMF0gPSAqdGwr KzsKKwkJc3RhdGVpZC5vdGhlclsxXSA9ICp0bCsrOworCQlzdGF0ZWlkLm90aGVyWzJdID0gKnRs OworCQlyZmxhZ3MgPSBmeGRyX3Vuc2lnbmVkKHVfaW50MzJfdCwgKih0bCArIDYpKTsKKwkJbmZz cnZfZ2V0YXR0cmJpdHMobmQsICZhdHRyYml0cywgTlVMTCwgTlVMTCk7CisJCU5GU01fRElTU0VD VCh0bCwgdV9pbnQzMl90ICosIE5GU1hfVU5TSUdORUQpOworCQlkZWxlZyA9IGZ4ZHJfdW5zaWdu ZWQoaW50LCAqdGwpOworCQlpZiAoZGVsZWcgPT0gTkZTVjRPUEVOX0RFTEVHQVRFUkVBRCB8fAor CQkgICAgZGVsZWcgPT0gTkZTVjRPUEVOX0RFTEVHQVRFV1JJVEUpIHsKKwkJCWlmICghKG93cC0+ bmZzb3dfY2xwLT5uZnNjX2ZsYWdzICYKKwkJCSAgICAgIE5GU0NMRkxBR1NfRklSU1RERUxFRykp CisJCQkJb3dwLT5uZnNvd19jbHAtPm5mc2NfZmxhZ3MgfD0KKwkJCQkgIChORlNDTEZMQUdTX0ZJ UlNUREVMRUcgfCBORlNDTEZMQUdTX0dPVERFTEVHKTsKKwkJCWRwID0gbWFsbG9jKHNpemVvZihz dHJ1Y3QgbmZzY2xkZWxlZykgKyBORlNYX1Y0RkhNQVgsCisJCQkgICAgTV9ORlNDTERFTEVHLCBN X1dBSVRPSyk7CisJCQlMSVNUX0lOSVQoJmRwLT5uZnNkbF9vd25lcik7CisJCQlMSVNUX0lOSVQo JmRwLT5uZnNkbF9sb2NrKTsKKwkJCWRwLT5uZnNkbF9jbHAgPSBvd3AtPm5mc293X2NscDsKKwkJ CW5ld25mc19jb3B5aW5jcmVkKGNyZWQsICZkcC0+bmZzZGxfY3JlZCk7CisJCQluZnNjbF9sb2Nr aW5pdCgmZHAtPm5mc2RsX3J3bG9jayk7CisJCQlORlNNX0RJU1NFQ1QodGwsIHVfaW50MzJfdCAq LCBORlNYX1NUQVRFSUQgKworCQkJICAgIE5GU1hfVU5TSUdORUQpOworCQkJZHAtPm5mc2RsX3N0 YXRlaWQuc2VxaWQgPSAqdGwrKzsKKwkJCWRwLT5uZnNkbF9zdGF0ZWlkLm90aGVyWzBdID0gKnRs Kys7CisJCQlkcC0+bmZzZGxfc3RhdGVpZC5vdGhlclsxXSA9ICp0bCsrOworCQkJZHAtPm5mc2Rs X3N0YXRlaWQub3RoZXJbMl0gPSAqdGwrKzsKKwkJCXJldCA9IGZ4ZHJfdW5zaWduZWQoaW50LCAq dGwpOworCQkJaWYgKGRlbGVnID09IE5GU1Y0T1BFTl9ERUxFR0FURVdSSVRFKSB7CisJCQkJZHAt Pm5mc2RsX2ZsYWdzID0gTkZTQ0xETF9XUklURTsKKwkJCQkvKgorCQkJCSAqIEluZGljYXRlcyBo b3cgbXVjaCB0aGUgZmlsZSBjYW4gZ3Jvdy4KKwkJCQkgKi8KKwkJCQlORlNNX0RJU1NFQ1QodGws IHVfaW50MzJfdCAqLAorCQkJCSAgICAzICogTkZTWF9VTlNJR05FRCk7CisJCQkJbGltaXRieSA9 IGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwrKyk7CisJCQkJc3dpdGNoIChsaW1pdGJ5KSB7CisJCQkJ Y2FzZSBORlNWNE9QRU5fTElNSVRTSVpFOgorCQkJCQlkcC0+bmZzZGxfc2l6ZWxpbWl0ID0gZnhk cl9oeXBlcih0bCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTkZTVjRPUEVOX0xJTUlUQkxPQ0tT OgorCQkJCQlkcC0+bmZzZGxfc2l6ZWxpbWl0ID0KKwkJCQkJICAgIGZ4ZHJfdW5zaWduZWQodV9p bnQ2NF90LCAqdGwrKyk7CisJCQkJCWRwLT5uZnNkbF9zaXplbGltaXQgKj0KKwkJCQkJICAgIGZ4 ZHJfdW5zaWduZWQodV9pbnQ2NF90LCAqdGwpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0Ogor CQkJCQllcnJvciA9IE5GU0VSUl9CQURYRFI7CisJCQkJCWdvdG8gbmZzbW91dDsKKwkJCQl9Owor CQkJfSBlbHNlIHsKKwkJCQlkcC0+bmZzZGxfZmxhZ3MgPSBORlNDTERMX1JFQUQ7CisJCQl9CisJ CQlpZiAocmV0ICE9IDApCisJCQkJZHAtPm5mc2RsX2ZsYWdzIHw9IE5GU0NMRExfUkVDQUxMOwor CQkJZXJyb3IgPSBuZnNydl9kaXNzZWN0YWNlKG5kLCAmZHAtPm5mc2RsX2FjZSwgJnJldCwKKwkJ CSAgICAmYWNlc2l6ZSwgcCk7CisJCQlpZiAoZXJyb3IgIT0gMCkKKwkJCQlnb3RvIG5mc21vdXQ7 CisJCX0gZWxzZSBpZiAoZGVsZWcgIT0gTkZTVjRPUEVOX0RFTEVHQVRFTk9ORSkgeworCQkJZXJy b3IgPSBORlNFUlJfQkFEWERSOworCQkJZ290byBuZnNtb3V0OworCQl9CisKKwkJLyogTm93LCB3 ZSBzaG91bGQgaGF2ZSB0aGUgc3RhdHVzIGZvciB0aGUgU2F2ZUZILiAqLworCQlORlNNX0RJU1NF Q1QodGwsIHVpbnQzMl90ICosIDIgKiBORlNYX1VOU0lHTkVEKTsKKwkJaWYgKCorK3RsID09IDAp IHsKKwkJCU5GU0NMX0RFQlVHKDQsICJuZnNycGNfY3JlYXRlbGF5b3V0IFNhdmVGSCBva1xuIik7 CisJCQkvKgorCQkJICogTm93LCBwcm9jZXNzIHRoZSBHZXRGSCBhbmQgR2V0YXR0ciBmb3IgdGhl IG5ld2x5CisJCQkgKiBjcmVhdGVkIGZpbGUuIG5mc2NsX210b2ZoKCkgd2lsbCBzZXQKKwkJCSAq IE5EX05PTU9SRURBVEEgaWYgdGhlc2Ugd2VyZW4ndCBzdWNjZXNzZnVsLgorCQkJICovCisJCQll cnJvciA9IG5mc2NsX210b2ZoKG5kLCBuZmhwcCwgbm5hcCwgYXR0cmZsYWdwKTsKKwkJCU5GU0NM X0RFQlVHKDQsICJhZnQgbmZzY2xfbXRvZmggZXJyPSVkXG4iLCBlcnJvcik7CisJCQlpZiAoZXJy b3IgIT0gMCkKKwkJCQlnb3RvIG5mc21vdXQ7CisJCX0gZWxzZQorCQkJbmQtPm5kX2ZsYWcgfD0g TkRfTk9NT1JFREFUQTsKKwkJLyogTm93IHdlIGhhdmUgdGhlIFB1dEZIIGFuZCBHZXRhdHRyIGZv ciB0aGUgZGlyZWN0b3J5LiAqLworCQlpZiAoKG5kLT5uZF9mbGFnICYgTkRfTk9NT1JFREFUQSkg PT0gMCkgeworCQkJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05F RCk7CisJCQlpZiAoKisrdGwgIT0gMCkKKwkJCQluZC0+bmRfZmxhZyB8PSBORF9OT01PUkVEQVRB OworCQkJZWxzZSB7CisJCQkJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICoKKwkJCQkg ICAgTkZTWF9VTlNJR05FRCk7CisJCQkJaWYgKCorK3RsICE9IDApCisJCQkJCW5kLT5uZF9mbGFn IHw9IE5EX05PTU9SRURBVEE7CisJCQl9CisJCX0KKwkJaWYgKChuZC0+bmRfZmxhZyAmIE5EX05P TU9SRURBVEEpID09IDApIHsKKwkJCS8qIExvYWQgdGhlIGRpcmVjdG9yeSBhdHRyaWJ1dGVzLiAq LworCQkJZXJyb3IgPSBuZnNtX2xvYWRhdHRyKG5kLCBkbmFwKTsKKwkJCU5GU0NMX0RFQlVHKDQs ICJhZnQgbmZzbV9sb2FkYXR0ciBlcnI9JWRcbiIsIGVycm9yKTsKKwkJCWlmIChlcnJvciAhPSAw KQorCQkJCWdvdG8gbmZzbW91dDsKKwkJCSpkYXR0cmZsYWdwID0gMTsKKwkJCWlmIChkcCAhPSBO VUxMICYmICphdHRyZmxhZ3AgIT0gMCkgeworCQkJCWRwLT5uZnNkbF9jaGFuZ2UgPSBubmFwLT5u YV9maWxlcmV2OworCQkJCWRwLT5uZnNkbF9tb2R0aW1lID0gbm5hcC0+bmFfbXRpbWU7CisJCQkJ ZHAtPm5mc2RsX2ZsYWdzIHw9IE5GU0NMRExfTU9EVElNRVNFVDsKKwkJCX0KKwkJCS8qCisJCQkg KiBXZSBjYW4gbm93IGNvbXBsZXRlIHRoZSBPcGVuIHN0YXRlLgorCQkJICovCisJCQluZmhwID0g Km5maHBwOworCQkJaWYgKGRwICE9IE5VTEwpIHsKKwkJCQlkcC0+bmZzZGxfZmhsZW4gPSBuZmhw LT5uZmhfbGVuOworCQkJCU5GU0JDT1BZKG5maHAtPm5maF9maCwgZHAtPm5mc2RsX2ZoLAorCQkJ CSAgICBuZmhwLT5uZmhfbGVuKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBHZXQgYW4gT3BlbiBzdHJ1 Y3R1cmUgdGhhdCB3aWxsIGJlCisJCQkgKiBhdHRhY2hlZCB0byB0aGUgT3Blbk93bmVyLCBhY3F1 aXJlZCBhbHJlYWR5LgorCQkJICovCisJCQllcnJvciA9IG5mc2NsX29wZW4oZHZwLCBuZmhwLT5u ZmhfZmgsIG5maHAtPm5maF9sZW4sIAorCQkJICAgIChORlNWNE9QRU5fQUNDRVNTV1JJVEUgfCBO RlNWNE9QRU5fQUNDRVNTUkVBRCksIDAsCisJCQkgICAgY3JlZCwgcCwgTlVMTCwgJm9wLCAmbmV3 b25lLCBOVUxMLCAwKTsKKwkJCWlmIChlcnJvciAhPSAwKQorCQkJCWdvdG8gbmZzbW91dDsKKwkJ CW9wLT5uZnNvX3N0YXRlaWQgPSBzdGF0ZWlkOworCQkJbmV3bmZzX2NvcHlpbmNyZWQoY3JlZCwg Jm9wLT5uZnNvX2NyZWQpOworCQorCQkJbmZzY2xfb3BlbnJlbGVhc2Uobm1wLCBvcCwgZXJyb3Is IG5ld29uZSk7CisJCQkqdW5sb2NrZWRwID0gMTsKKworCQkJLyogTm93LCBoYW5kbGUgdGhlIFJl c3RvcmVGSCBhbmQgTGF5b3V0R2V0LiAqLworCQkJaWYgKG5kLT5uZF9yZXBzdGF0ID09IDApIHsK KwkJCQlORlNNX0RJU1NFQ1QodGwsIHVpbnQzMl90ICosIDQgKiBORlNYX1VOU0lHTkVEKTsKKwkJ CQkqbGF5c3RhdHAgPSBmeGRyX3Vuc2lnbmVkKGludCwgKih0bCArIDMpKTsKKwkJCQlpZiAoKmxh eXN0YXRwID09IDApIHsKKwkJCQkJZXJyb3IgPSBuZnNydl9wYXJzZWxheW91dGdldChuZCwKKwkJ CQkJICAgIHN0YXRlaWRwLCByZXRvbmNsb3NlcCwgZmxocCk7CisJCQkJCWlmIChlcnJvciAhPSAw KQorCQkJCQkJKmxheXN0YXRwID0gZXJyb3I7CisJCQkJfQorCQkJCU5GU0NMX0RFQlVHKDQsICJh ZnQgbmZzcnZfcGFyc2VsYXlvdXQgZXJyPSVkXG4iLAorCQkJCSAgICBlcnJvcik7CisJCQl9IGVs c2UKKwkJCQluZC0+bmRfcmVwc3RhdCA9IDA7CisJCX0KKwl9CisJaWYgKG5kLT5uZF9yZXBzdGF0 ICE9IDAgJiYgZXJyb3IgPT0gMCkKKwkJZXJyb3IgPSBuZC0+bmRfcmVwc3RhdDsKKwlpZiAoZXJy b3IgPT0gTkZTRVJSX1NUQUxFQ0xJRU5USUQgfHwgZXJyb3IgPT0gTkZTRVJSX0JBRFNFU1NJT04p CisJCW5mc2NsX2luaXRpYXRlX3JlY292ZXJ5KG93cC0+bmZzb3dfY2xwKTsKK25mc21vdXQ6CisJ TkZTQ0xfREVCVUcoNCwgImVvIG5mc3JwY19jcmVhdGVsYXlvdXQgZXJyPSVkXG4iLCBlcnJvcik7 CisJaWYgKGVycm9yID09IDApCisJCSpkcHAgPSBkcDsKKwllbHNlCisJCWZyZWUoZHAsIE1fTkZT Q0xERUxFRyk7CisJbWJ1Zl9mcmVlbShuZC0+bmRfbXJlcCk7CisJcmV0dXJuIChlcnJvcik7Cit9 CisKKy8qCisgKiBTaW1pbGFyIHRvIG5mc3JwY19nZXRvcGVubGF5b3V0KCksIGV4Y2VwdCB0aGF0 IGl0IHVzZWQgZm9yIHRoZSBDcmVhdGUgY2FzZS4KKyAqLworc3RhdGljIGludAorbmZzcnBjX2dl dGNyZWF0ZWxheW91dCh2bm9kZV90IGR2cCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVj dCB2YXR0ciAqdmFwLAorICAgIG5mc3F1YWRfdCBjdmVyZiwgaW50IGZtb2RlLCBzdHJ1Y3QgbmZz Y2xvd25lciAqb3dwLCBzdHJ1Y3QgbmZzY2xkZWxlZyAqKmRwcCwKKyAgICBzdHJ1Y3QgdWNyZWQg KmNyZWQsIE5GU1BST0NfVCAqcCwgc3RydWN0IG5mc3ZhdHRyICpkbmFwLAorICAgIHN0cnVjdCBu ZnN2YXR0ciAqbm5hcCwgc3RydWN0IG5mc2ZoICoqbmZocHAsIGludCAqYXR0cmZsYWdwLAorICAg IGludCAqZGF0dHJmbGFncCwgdm9pZCAqZHN0dWZmLCBpbnQgKnVubG9ja2VkcCkKK3sKKwlzdHJ1 Y3QgbmZzY2xsYXlvdXQgKmx5cDsKKwlzdHJ1Y3QgbmZzY2xmbGF5b3V0aGVhZCBmbGg7CisJc3Ry dWN0IG5mc2ZoICpuZmhwOworCXN0cnVjdCBuZnNjbHNlc3Npb24gKnRzZXA7CisJc3RydWN0IG5m c21vdW50ICpubXA7CisJbmZzdjRzdGF0ZWlkX3Qgc3RhdGVpZDsKKwlpbnQgZXJyb3IsIGxheW91 dGxlbiwgcmV0b25jbG9zZSwgbGF5c3RhdDsKKworCWVycm9yID0gMDsKKwlubXAgPSBWRlNUT05G UyhkdnAtPnZfbW91bnQpOworCUxJU1RfSU5JVCgmZmxoKTsKKwl0c2VwID0gbmZzbW50X21kc3Nl c3Npb24obm1wKTsKKwlsYXlvdXRsZW4gPSB0c2VwLT5uZnNlc3NfbWF4Y2FjaGUgLSAoTkZTWF9T VEFURUlEICsgMyAqIE5GU1hfVU5TSUdORUQpOworCWVycm9yID0gbmZzcnBjX2NyZWF0ZWxheW91 dChkdnAsIG5hbWUsIG5hbWVsZW4sIHZhcCwgY3ZlcmYsIGZtb2RlLAorCSAgICBvd3AsIGRwcCwg Y3JlZCwgcCwgZG5hcCwgbm5hcCwgbmZocHAsIGF0dHJmbGFncCwgZGF0dHJmbGFncCwKKwkgICAg ZHN0dWZmLCB1bmxvY2tlZHAsICZzdGF0ZWlkLCAxLCBsYXlvdXRsZW4sICZyZXRvbmNsb3NlLCAm ZmxoLAorCSAgICAmbGF5c3RhdCk7CisJTkZTQ0xfREVCVUcoNCwgImFmdCBuZnNycGNfY3JlYXRl bGF5b3V0cnBjIGxheXN0YXQ9JWQgZXJyPSVkXG4iLAorCSAgICBsYXlzdGF0LCBlcnJvcik7CisJ bHlwID0gTlVMTDsKKwluZmhwID0gKm5maHBwOworCWxheXN0YXQgPSBuZnNycGNfbGF5b3V0Z2V0 cmVzKG5tcCwgZHZwLCBuZmhwLT5uZmhfZmgsIG5maHAtPm5maF9sZW4sCisJICAgICZzdGF0ZWlk LCByZXRvbmNsb3NlLCBOVUxMLCAmbHlwLCAmZmxoLCBsYXlzdGF0LCBOVUxMLCBjcmVkLCBwKTsK KwlpZiAobGF5c3RhdCA9PSAwKQorCQluZnNjbF9yZWxsYXlvdXQobHlwLCAwKTsKKwlyZXR1cm4g KGVycm9yKTsKK30KKworLyoKKyAqIFByb2Nlc3MgdGhlIHJlc3VsdHMgb2YgYSBsYXlvdXRnZXQo KSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK25mc3JwY19sYXlvdXRnZXRyZXMoc3RydWN0 IG5mc21vdW50ICpubXAsIHZub2RlX3QgdnAsIHVpbnQ4X3QgKm5ld2ZocCwKKyAgICBpbnQgbmV3 ZmhsZW4sIG5mc3Y0c3RhdGVpZF90ICpzdGF0ZWlkcCwgaW50IHJldG9uY2xvc2UsIHVpbnQzMl90 ICpub3RpZnliaXQsCisgICAgc3RydWN0IG5mc2NsbGF5b3V0ICoqbHlwcCwgc3RydWN0IG5mc2Ns ZmxheW91dGhlYWQgKmZsaHAsCisgICAgaW50IGxheXN0YXQsIGludCAqaXNsb2NrZWRwLCBzdHJ1 Y3QgdWNyZWQgKmNyZWQsIE5GU1BST0NfVCAqcCkKK3sKKwlzdHJ1Y3QgbmZzY2xmbGF5b3V0ICp0 ZmxwOworCXN0cnVjdCBuZnNjbGRldmluZm8gKmRpcDsKKworCWlmIChsYXlzdGF0ID09IE5GU0VS Ul9VTktOTEFZT1VUVFlQRSkgeworCQkvKiBEaXNhYmxlIFBORlMuICovCisJCU5GU0NMX0RFQlVH KDEsICJkaXNhYmxlIFBORlNcbiIpOworCQlORlNMT0NLTU5UKG5tcCk7CisJCW5tcC0+bm1fc3Rh dGUgJj0gfk5GU1NUQV9QTkZTOworCQlORlNVTkxPQ0tNTlQobm1wKTsKKwl9CisJaWYgKGxheXN0 YXQgPT0gMCkgeworCQlORlNDTF9ERUJVRyg0LCAibmZzcnBjX2xheW91dGdldHJlcyBhdCBGT1JF QUNIXG4iKTsKKwkJTElTVF9GT1JFQUNIKHRmbHAsIGZsaHAsIG5mc2ZsX2xpc3QpIHsKKwkJCWxh eXN0YXQgPSBuZnNjbF9hZGRkZXZpbmZvKG5tcCwgTlVMTCwgdGZscCk7CisJCQlORlNDTF9ERUJV Ryg0LCAiYWZ0IGFkZGRldj0lZFxuIiwgbGF5c3RhdCk7CisJCQlpZiAobGF5c3RhdCAhPSAwKSB7 CisJCQkJbGF5c3RhdCA9IG5mc3JwY19nZXRkZXZpY2VpbmZvKG5tcCwKKwkJCQkgICAgdGZscC0+ bmZzZmxfZGV2LCBORlNMQVlPVVRfTkZTVjRfMV9GSUxFUywKKwkJCQkgICAgbm90aWZ5Yml0LCAm ZGlwLCBjcmVkLCBwKTsKKwkJCQlORlNDTF9ERUJVRyg0LCAiYWZ0IG5mc3JwY19nZGk9JWRcbiIs CisJCQkJICAgIGxheXN0YXQpOworCQkJCWlmIChsYXlzdGF0ICE9IDApCisJCQkJCWJyZWFrOwor CQkJCWxheXN0YXQgPSBuZnNjbF9hZGRkZXZpbmZvKG5tcCwgZGlwLCB0ZmxwKTsKKwkJCQlpZiAo bGF5c3RhdCAhPSAwKQorCQkJCQlwcmludGYoImdldGxheW91dDogY2Fubm90IGFkZFxuIik7CisJ CQl9CisJCX0KKwl9CisJaWYgKGxheXN0YXQgPT0gMCkgeworCQkvKgorCQkgKiBuZnNjbF9sYXlv dXQoKSBhbHdheXMgcmV0dXJucyB3aXRoIHRoZSBuZnNseV9sb2NrCisJCSAqIHNldCB0byBhIHJl ZmNudCAoc2hhcmVkIGxvY2spLgorCQkgKiBQYXNzaW5nIGluIGR2cCBpcyBzdWZmaWNpZW50LCBz aW5jZSBpdCBpcyBvbmx5IHVzZWQgdG8KKwkJICogZ2V0IHRoZSBmc2lkIGZvciB0aGUgZmlsZSBz eXN0ZW0uCisJCSAqLworCQlsYXlzdGF0ID0gbmZzY2xfbGF5b3V0KG5tcCwgdnAsIG5ld2ZocCwg bmV3ZmhsZW4sIHN0YXRlaWRwLAorCQkgICAgcmV0b25jbG9zZSwgZmxocCwgbHlwcCwgY3JlZCwg cCk7CisJCU5GU0NMX0RFQlVHKDQsICJuZnNycGNfbGF5b3V0Z2V0cmVzOiBhZnQgbmZzY2xfbGF5 b3V0PSVkXG4iLAorCQkgICAgbGF5c3RhdCk7CisJCWlmIChsYXlzdGF0ID09IDAgJiYgaXNsb2Nr ZWRwICE9IE5VTEwpCisJCQkqaXNsb2NrZWRwID0gMTsKKwl9CisJcmV0dXJuIChsYXlzdGF0KTsK K30KKwotLS0gdXNyLmJpbi9uZnNzdGF0L25mc3N0YXQuYy5vcmlnCTIwMTctMDUtMTkgMTQ6MDI6 MjIuMzM2MzU4MDAwIC0wNDAwCisrKyB1c3IuYmluL25mc3N0YXQvbmZzc3RhdC5jCTIwMTctMDUt MTkgMTQ6MDI6MjIuMzM3MDQ1MDAwIC0wNDAwCkBAIC05MjYsNiArOTI2LDEzIEBAIGV4cDQxX2lu dHByKGludCBjbGllbnRPbmx5LCBpbnQgc2VydmVyT24KIAkJICAgICh1aW50bWF4X3QpZXh0X25m c3N0YXRzLnJwY2NudFtORlNQUk9DX0NPTU1JVERTXSk7CiAJCWlmIChwcmludHRpdGxlKQogCQkJ cHJpbnRmKAorCQkJICAgICIlMTIuMTJzICUxMi4xMnNcbiIsCisJCQkgICAgIk9wZW5MYXlvdXQi LCAiQ3JlYXRlTGF5b3V0Iik7CisJCXByaW50ZigiJTEyanUgJTEyanVcbiIsCisJCSAgICAodWlu dG1heF90KWV4dF9uZnNzdGF0cy5ycGNjbnRbTkZTUFJPQ19PUEVOTEFZR0VUXSwKKwkJICAgICh1 aW50bWF4X3QpZXh0X25mc3N0YXRzLnJwY2NudFtORlNQUk9DX0NSRUFURUxBWUdFVF0pOworCQlp ZiAocHJpbnR0aXRsZSkKKwkJCXByaW50ZigKIAkJCSAgICAiJTEyLjEycyAlMTIuMTJzICUxMi4x MnMgJTEyLjEycyAlMTIuMTJzICUxMi4xMnNcbiIsCiAJCQkgICAgIk9wZW5Pd25lciIsICJPcGVu cyIsICJMb2NrT3duZXIiLCAiTG9ja3MiLAogCQkJICAgICJEZWxlZ3MiLCAiTG9jYWxPd24iKTsK --_002_YTXPR01MB018901BE4BA7E9780F4B430BDDDB0YTXPR01MB0189CANP_--