From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B09EC433F5 for ; Tue, 22 Feb 2022 17:59:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234815AbiBVSAK (ORCPT ); Tue, 22 Feb 2022 13:00:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232155AbiBVSAI (ORCPT ); Tue, 22 Feb 2022 13:00:08 -0500 Received: from FRA01-MR2-obe.outbound.protection.outlook.com (mail-eopbgr90044.outbound.protection.outlook.com [40.107.9.44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5DB15171846; Tue, 22 Feb 2022 09:59:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=n07vt5GelusFPmf1CXDGhdcBxFq4a0p4fQ2p7H8n7SUsqyBa9EN8LGw/POVxqVDQQatWM+6eKDJtVAFKLRYpJXM/5iCTjYZ9DpwK5tDDKR+oaN1wh5b3c3MNdovQumv0YhBs2eXGxwi+11gI34tMv+4EEED4qMGPn+aRiqAlo5/vnPP6Gy/7I+iq6ffF+UyPl8FVwhxp5DFMRvhRbL6szbna2dkV3zzIBOJfN0sNgl/YJn/RIDKG1PuHG1WTgYA8xRuFobsTucep7A8E/islQrlYuWAFozgpBVGSmcHK6XXAb9gyK7xjQprk5msIM876nvT7VKjz7A9x3PVtRrLa7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GKZ9nUHSq5XgwkhnbZM8UGbRbC9B240SlfqfNaeiBhE=; b=P9PgjuAYpGqmB0lZpFhL08hyvHrY4Lg32KNeMNfarD5Opt/YhdNhGLAkempNjHaR0DOf1rndNr571LgdMeFjxyatOZf/jFX3fXTbV9jWjYg0zZA7zjJ4x9N6bVow7mOIKOtJtnWllwnbQaXVFAkKTtmfiz9VlmEZKN+lUUVZOznb5ZjZ/R/5f7hHZacLdoagG/Sm21eTs5jDh4AfX9YVvZpWHOz8MtMW4mC70A/PB4XJrcCICcoMEjLWXd04VELnoE+rrod/kpC1ZHlhCKffDC+/d9CPZh6NVurfLk6CpOYQycWsrx40/C7aG70r0pwGAM/ndwToV7ykJAvWlQ1/IQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=csgroup.eu; dmarc=pass action=none header.from=csgroup.eu; dkim=pass header.d=csgroup.eu; arc=none Received: from MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:31::15) by MR1P264MB3442.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:26::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5017.21; Tue, 22 Feb 2022 17:59:38 +0000 Received: from MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM ([fe80::8142:2e6f:219b:646d]) by MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM ([fe80::8142:2e6f:219b:646d%5]) with mapi id 15.20.5017.021; Tue, 22 Feb 2022 17:59:38 +0000 From: Christophe Leroy To: Aaron Tomlin , "mcgrof@kernel.org" CC: "cl@linux.com" , "pmladek@suse.com" , "mbenes@suse.cz" , "akpm@linux-foundation.org" , "jeyu@kernel.org" , "linux-kernel@vger.kernel.org" , "linux-modules@vger.kernel.org" , "void@manifault.com" , "atomlin@atomlin.com" , "allen.lkml@gmail.com" , "joe@perches.com" , "msuchanek@suse.de" , "oleksandr@natalenko.name" Subject: Re: [PATCH v8 09/13] module: Move kallsyms support into a separate file Thread-Topic: [PATCH v8 09/13] module: Move kallsyms support into a separate file Thread-Index: AQHYJ/ZZRfC599+XvUO2sDt7Xl3WR6yf2/sA Date: Tue, 22 Feb 2022 17:59:37 +0000 Message-ID: <53e615c1-47ec-237c-7623-3f8995977706@csgroup.eu> References: <20220222141303.1392190-1-atomlin@redhat.com> <20220222141303.1392190-10-atomlin@redhat.com> In-Reply-To: <20220222141303.1392190-10-atomlin@redhat.com> Accept-Language: fr-FR, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=csgroup.eu; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: e0c1cfd1-f33d-45cf-c8ad-08d9f62d17aa x-ms-traffictypediagnostic: MR1P264MB3442:EE_ x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: vtubcOWVoSZKhxccph5+v2dxLki4P9HxNc73UO5HNQiRARJAy9JIODP9mWRKAxapqd4eXwdu7ig/LkZXbkfVvZ9JTf0wpsS+gy4rbaSZHIoj8S6c4O+olh3QaOCBZarRbOao67Noniu6mRIMwC/YDhW/HPf0zJ/r1j78atANmS2e/bVMU0TQNVbC049DDfG6Q4suKeI8g+huAkweAfYkZCbkUkFM+ZrR/TNJfYSoklXJT29zwP/9zk/Pge2VN1llBUM9/9BrLfuh0vJhdSPdhhkZnrT7X68EAQ6zjcS1RITPvHmw/RvC4tam3uN1FPyaq1pVV+Cd4d6xNvc6tKUkac7F0Znt1OnAJjuMP/KrZ4K/rSy35rlAdGYmkS8UBwZ2SMj/nOPNkfpxsARP/4Zl5qcZrfryPMUH8t1QQ9gQ5DxNzgpBzcJ8+BT0MD23IoQGIuZ9Lt7YOHBsTmxDcFIXupyGAML8ZBj3eDbVWyOqTHJ3iahW+C5DR3B27esSuyLMiN2USDUoPzTf61Itne3RIYY05Fty+RlMSAdGKuKG5wnZ4aRcP6gKhgnqLjWIW/X1MHzCfw2734y+CX6SFmjnJ9XMlvjGH10WfXidSWkNIeVCvpLmpgkmhkN6Fmt/RP89ig0B+yBcmPRklWSyxkKyGZvCviHvsDXi9Ur5CMhYxh77TVi6Av3tzBy9ASGw6dFoK7szWXzIQxjwVVy8GAD2Pks9s/Pive3sEAS+J1mH/UyJscO7fmJHJExuL+zxZ0RKzWGbSUeDsFAp6uukcwIA9w== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230001)(4636009)(366004)(5660300002)(30864003)(7416002)(508600001)(6486002)(91956017)(66574015)(66946007)(76116006)(86362001)(66556008)(4326008)(64756008)(31696002)(8676002)(66446008)(316002)(8936002)(71200400001)(44832011)(66476007)(186003)(26005)(38100700002)(36756003)(122000001)(38070700005)(2906002)(2616005)(31686004)(110136005)(6512007)(54906003)(6506007)(83380400001)(45980500001)(43740500002)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?NWZWTHYvdzkrcUZubzhYNHE0S1NHQTdUU2pscUlXV0NsdWl2QTFldCs3OFRU?= =?utf-8?B?WEZzSVFqZG45NStxQnlWQ0hVd0xDL1FYNmdWNUhxWHVLZnpxOXlmKzBnTEh4?= =?utf-8?B?enpiS3prTkNNTWI0dG1yNS9XSnJwUkV3ZDd4WGJ4T1RzaGg0RVR4TW45bm5O?= =?utf-8?B?R1FRTDJUekhXdSswMUtzZThWVWM1WnZSUnJFN0J0RllNSDBRQVREQ1ZFSlRI?= =?utf-8?B?TEF1Q2dRWk5FT1JmblJaUGFac3h6QVMyVFNTcUhUWU5wNlg4YzhrMzd6MHpa?= =?utf-8?B?K0Q5WTYyKytFVDdCckx4VFFiMTdyWEEzaGFyaWViaW1mQlRMVWVqeGE2dFMr?= =?utf-8?B?eVM3YkY3anNLeTAxKy9OWVRoUGF5YmNQMm5hOWNBU2c2OW5CVHJSb1Q1U3kr?= =?utf-8?B?d29qWjlJTm9BRy9pOUZFVlMwSnZRMEVWWTBYOHU0c3UyL3ZvYzYwYlF2cUFR?= =?utf-8?B?MTVlTko4U0dEd1I5ejdCeGpRazkxb1ROWXJtaWtNcXpCaXlnWTZUMm90bjFt?= =?utf-8?B?V3NpdkllbEExZDJTZzNlMHkwdEplME5CRnI2OUJEcXRtQmxKTldOL2p0aVB6?= =?utf-8?B?Ui95V1N5dlRaUmtmcmZ0ZnpmT0dmajBEblJ6ZlpvWWVhMkZQYTdPQzJ2U3hD?= =?utf-8?B?dDFJSURlMUtkOGtyVTM1UERGUVEra1E0K1hsY1BOZS9JbHg5UTZRWExSWHVM?= =?utf-8?B?UThpUGlBaFhOQWMxdTYyS3BIeHJOOU1KRnhWeW80L2ZZdWZObEl2YUxuR3px?= =?utf-8?B?SWg0UFliMmtyZGxqdFBqQXR4YVhiRGw4blVzRVRpM3gzaHRCczJHM2RXYkZR?= =?utf-8?B?WTFubzJWYWxqZThIaklvQnRRRGZ4VFJibERQWFNJV0Q4d1FaclZNVTFHb3M1?= =?utf-8?B?SHpNRTdKcHVBNlkxWCsvNEF2UVdDcDRFKzl1ZDI1YmlVc1RIVVRac1loUGxy?= =?utf-8?B?TncyU1kxdWluOXJsSTNpVklsVHE4a25odlBWVVc2MGtTRlNGQVEvU0E2Vy9O?= =?utf-8?B?VGtDRitGNDdjRXowRDluVW1OOTBxU056U3BOMkNhbVJNL1lud0cxM1BTb2p2?= =?utf-8?B?aExLa29GTHZRMWpUQmoydms0YW1MRFZKQVVvL3BlK0JUMWpRc1BxVTBOUERP?= =?utf-8?B?VWJOMVE0dkJJeDl1OVQwNzR6SVZZaVVFQTZQbm95dFpKSjA1bktoZXFDbEZN?= =?utf-8?B?dU1PTENjenAvY3A5Y0VLZk1UN0NHZytXVENLTDY2RExJenRta1JxMEV4ZUpP?= =?utf-8?B?SnE5NmlEa0NtYUJ4ZitIcndXa0dXQjE1cEs0MnpMQnU1YWtFYk0zcTFXbkIx?= =?utf-8?B?Y3BicFhwZGxVbDZhTWNBKytpYXp4bGJsRDZ0bDBIeFpzWTV1TUxoZmt6ZU9V?= =?utf-8?B?ZFJrNG5WYzFmeE1tZUxnMDNiVzVzZmRvai84S1Z6ajhNajMyY3M0QWd3VVY1?= =?utf-8?B?dXBsVzd5ZmJNekd0Y2Evd29BZ1NjaEZ3d3JsY1RjcVdoL0cxZjV3L2QxRWdl?= =?utf-8?B?azUyWjgzRzAyOGszQWtZaVMySGVTakQ5YVBFc1M4WGphcmlHWWVnUTF6T1dK?= =?utf-8?B?MDRtdS9CRVBxMUc5cWlSZEdCSUphRGtCRm1Tc1ljMTdlQ1pnN3FhZGpsUkps?= =?utf-8?B?ekhKNFpleitPL2VwRkpMbG91MHgxS2x4ZHhZOHpHNWhFb2tkcGJZRU9Jenhq?= =?utf-8?B?WFh2VlVGZXpxMzNXVEJpNjdxdVRqcUYrd3p0QUlvTFpuQ2tSM1Z0S1M5N1lh?= =?utf-8?B?cUkrMlo4eitmMGlZOVBuV0k5VHZ1VXdzOEo2cUxqOTlDWkxRclZLQnVCbExW?= =?utf-8?B?d3d4Um5YWDdrS1pQbGtqVHhmQ2c3a3dydUg2L3lLeTg0ekNDTU54RzhkOUk1?= =?utf-8?B?SUJ6KzVlWUdTalFDRXhKSzdOSW5XcFp5RjJWWEJrZmFNQWYzOHZqcjFmQlB6?= =?utf-8?B?QWt0ZGhJckltejlvTmdGMEdDZi9tUGFNSTRaUUZDOHNid1hSakhIUHUwejdv?= =?utf-8?B?dTVMaEUxZWRqK2ttQjVQU05mVmRDckFGdDhHcDJQMVY4Tjl5MDJMYitxbUkr?= =?utf-8?B?MWFsYXJnaGtNSXFBLzBnRzJ2ZzFwUlVTS0ljZDk5cjhQaWYwd0JTTG42bGVt?= =?utf-8?B?QlNtd2Mrb0cwOU1vTWUxcWtaQmRLdkRpMzdiTlNodGVJUlBIZE5ESlE0MWxm?= =?utf-8?B?akJzSHNUdU5LSENrdjlaQU4wZnpPS0pnNUJvTjRvd001bmNZQ2NUTDRNWGto?= =?utf-8?Q?CMhy6XW8Y7p7R3d/uod4Y41B/iNiob3YMLp/kjrZZE=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: csgroup.eu X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: e0c1cfd1-f33d-45cf-c8ad-08d9f62d17aa X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Feb 2022 17:59:37.9728 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 9914def7-b676-4fda-8815-5d49fb3b45c8 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: j8beBSIT1dzvOXx9FpiSW6EtT0fpe9Sfqptz4/G8zm4Xnc+xjeK87s7ucik50f1vqaIXUDk6A3q4Gesz0e6On7jvuAMwO4i2Jqfq+6ZUBFk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MR1P264MB3442 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org DQoNCkxlIDIyLzAyLzIwMjIgw6AgMTU6MTIsIEFhcm9uIFRvbWxpbiBhIMOpY3JpdMKgOg0KPiBO byBmdW5jdGlvbmFsIGNoYW5nZS4NCj4gDQo+IFRoaXMgcGF0Y2ggbWlncmF0ZXMga2FsbHN5bXMg Y29kZSBvdXQgb2YgY29yZSBtb2R1bGUNCj4gY29kZSBrZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMN Cj4gDQo+IFNpZ25lZC1vZmYtYnk6IEFhcm9uIFRvbWxpbiA8YXRvbWxpbkByZWRoYXQuY29tPg0K DQpSZXZpZXdlZC1ieTogQ2hyaXN0b3BoZSBMZXJveSA8Y2hyaXN0b3BoZS5sZXJveUBjc2dyb3Vw LmV1Pg0KDQo+IC0tLQ0KPiAgIGtlcm5lbC9tb2R1bGUvTWFrZWZpbGUgICB8ICAgMSArDQo+ICAg a2VybmVsL21vZHVsZS9pbnRlcm5hbC5oIHwgIDI5ICsrKw0KPiAgIGtlcm5lbC9tb2R1bGUva2Fs bHN5bXMuYyB8IDUwNiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQo+ICAg a2VybmVsL21vZHVsZS9tYWluLmMgICAgIHwgNTMxICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KPiAgIDQgZmlsZXMgY2hhbmdlZCwgNTQyIGluc2VydGlvbnMoKyksIDUy NSBkZWxldGlvbnMoLSkNCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQga2VybmVsL21vZHVsZS9rYWxs c3ltcy5jDQo+IA0KPiBkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS9NYWtlZmlsZSBiL2tlcm5l bC9tb2R1bGUvTWFrZWZpbGUNCj4gaW5kZXggMTIzODg2Mjc3MjVjLi45OTAxYmVkM2FiNWIgMTAw NjQ0DQo+IC0tLSBhL2tlcm5lbC9tb2R1bGUvTWFrZWZpbGUNCj4gKysrIGIva2VybmVsL21vZHVs ZS9NYWtlZmlsZQ0KPiBAQCAtMTQsMyArMTQsNCBAQCBvYmotJChDT05GSUdfTElWRVBBVENIKSAr PSBsaXZlcGF0Y2gubw0KPiAgIG9iai0kKENPTkZJR19NT0RVTEVTX1RSRUVfTE9PS1VQKSArPSB0 cmVlX2xvb2t1cC5vDQo+ICAgb2JqLSQoQ09ORklHX1NUUklDVF9NT0RVTEVfUldYKSArPSBzdHJp Y3Rfcnd4Lm8NCj4gICBvYmotJChDT05GSUdfREVCVUdfS01FTUxFQUspICs9IGRlYnVnX2ttZW1s ZWFrLm8NCj4gK29iai0kKENPTkZJR19LQUxMU1lNUykgKz0ga2FsbHN5bXMubw0KPiBkaWZmIC0t Z2l0IGEva2VybmVsL21vZHVsZS9pbnRlcm5hbC5oIGIva2VybmVsL21vZHVsZS9pbnRlcm5hbC5o DQo+IGluZGV4IGIwYzM2MDgzOWY2My4uNDRjYTA1YjllYjhmIDEwMDY0NA0KPiAtLS0gYS9rZXJu ZWwvbW9kdWxlL2ludGVybmFsLmgNCj4gKysrIGIva2VybmVsL21vZHVsZS9pbnRlcm5hbC5oDQo+ IEBAIC02OCw2ICs2OCwxOSBAQCBzdHJ1Y3QgbG9hZF9pbmZvIHsNCj4gICB9Ow0KPiAgIA0KPiAg IGludCBtb2RfdmVyaWZ5X3NpZyhjb25zdCB2b2lkICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmlu Zm8pOw0KPiArc3RydWN0IG1vZHVsZSAqZmluZF9tb2R1bGVfYWxsKGNvbnN0IGNoYXIgKm5hbWUs IHNpemVfdCBsZW4sIGJvb2wgZXZlbl91bmZvcm1lZCk7DQo+ICtpbnQgY21wX25hbWUoY29uc3Qg dm9pZCAqbmFtZSwgY29uc3Qgdm9pZCAqc3ltKTsNCj4gK2xvbmcgbW9kdWxlX2dldF9vZmZzZXQo c3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBpbnQgKnNpemUsIEVsZl9TaGRyICpzZWNoZHIs DQo+ICsJCSAgICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbik7DQo+ICsNCj4gK3N0YXRpYyBpbmxp bmUgdW5zaWduZWQgbG9uZyBrZXJuZWxfc3ltYm9sX3ZhbHVlKGNvbnN0IHN0cnVjdCBrZXJuZWxf c3ltYm9sICpzeW0pDQo+ICt7DQo+ICsjaWZkZWYgQ09ORklHX0hBVkVfQVJDSF9QUkVMMzJfUkVM T0NBVElPTlMNCj4gKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpb2Zmc2V0X3RvX3B0cigmc3ltLT52 YWx1ZV9vZmZzZXQpOw0KPiArI2Vsc2UNCj4gKwlyZXR1cm4gc3ltLT52YWx1ZTsNCj4gKyNlbmRp Zg0KPiArfQ0KPiAgIA0KPiAgICNpZmRlZiBDT05GSUdfTElWRVBBVENIDQo+ICAgaW50IGNvcHlf bW9kdWxlX2VsZihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pOw0K PiBAQCAtMTc0LDMgKzE4NywxOSBAQCB2b2lkIGttZW1sZWFrX2xvYWRfbW9kdWxlKGNvbnN0IHN0 cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbw0KPiAgIHN0YXRp YyBpbmxpbmUgdm9pZCBrbWVtbGVha19sb2FkX21vZHVsZShjb25zdCBzdHJ1Y3QgbW9kdWxlICpt b2QsDQo+ICAgCQkJCQljb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKSB7IH0NCj4gICAjZW5k aWYgLyogQ09ORklHX0RFQlVHX0tNRU1MRUFLICovDQo+ICsNCj4gKyNpZmRlZiBDT05GSUdfS0FM TFNZTVMNCj4gK3ZvaWQgaW5pdF9idWlsZF9pZChzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0 cnVjdCBsb2FkX2luZm8gKmluZm8pOw0KPiArdm9pZCBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1 bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbyk7DQo+ICt2b2lkIGFkZF9rYWxsc3ltcyhz dHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pOw0KPiArdW5z aWduZWQgbG9uZyBmaW5kX2thbGxzeW1zX3N5bWJvbF92YWx1ZShzdHJ1Y3QgbW9kdWxlICptb2Qs IGNvbnN0IGNoYXIgKm5hbWUpOw0KPiArDQo+ICtzdGF0aWMgaW5saW5lIGJvb2wgc2VjdF9lbXB0 eShjb25zdCBFbGZfU2hkciAqc2VjdCkNCj4gK3sNCj4gKwlyZXR1cm4gIShzZWN0LT5zaF9mbGFn cyAmIFNIRl9BTExPQykgfHwgc2VjdC0+c2hfc2l6ZSA9PSAwOw0KPiArfQ0KPiArI2Vsc2UgLyog IUNPTkZJR19LQUxMU1lNUyAqLw0KPiArc3RhdGljIGlubGluZSB2b2lkIGluaXRfYnVpbGRfaWQo c3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKSB7IH0NCj4g K3N0YXRpYyBpbmxpbmUgdm9pZCBsYXlvdXRfc3ltdGFiKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3Ry dWN0IGxvYWRfaW5mbyAqaW5mbykgeyB9DQo+ICtzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2thbGxz eW1zKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykgeyB9 DQo+ICsjZW5kaWYgLyogQ09ORklHX0tBTExTWU1TICovDQo+IGRpZmYgLS1naXQgYS9rZXJuZWwv bW9kdWxlL2thbGxzeW1zLmMgYi9rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMNCj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMDAwMDAwLi5iNmQ0OWJiNWFmZWQNCj4gLS0tIC9k ZXYvbnVsbA0KPiArKysgYi9rZXJuZWwvbW9kdWxlL2thbGxzeW1zLmMNCj4gQEAgLTAsMCArMSw1 MDYgQEANCj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyDQo+ ICsvKg0KPiArICogTW9kdWxlIGthbGxzeW1zIHN1cHBvcnQNCj4gKyAqDQo+ICsgKiBDb3B5cmln aHQgKEMpIDIwMTAgUnVzdHkgUnVzc2VsbA0KPiArICovDQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51 eC9tb2R1bGUuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPg0KPiArI2luY2x1ZGUg PGxpbnV4L2J1aWxkaWQuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9ic2VhcmNoLmg+DQo+ICsjaW5j bHVkZSAiaW50ZXJuYWwuaCINCj4gKw0KPiArLyogTG9va3VwIGV4cG9ydGVkIHN5bWJvbCBpbiBn aXZlbiByYW5nZSBvZiBrZXJuZWxfc3ltYm9scyAqLw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBr ZXJuZWxfc3ltYm9sICpsb29rdXBfZXhwb3J0ZWRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsDQo+ ICsJCQkJCQkJICBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqc3RhcnQsDQo+ICsJCQkJCQkJ ICBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqc3RvcCkNCj4gK3sNCj4gKwlyZXR1cm4gYnNl YXJjaChuYW1lLCBzdGFydCwgc3RvcCAtIHN0YXJ0LA0KPiArCQkJc2l6ZW9mKHN0cnVjdCBrZXJu ZWxfc3ltYm9sKSwgY21wX25hbWUpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IGlzX2V4cG9y dGVkKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgdmFsdWUsDQo+ICsJCSAgICAgICBj b25zdCBzdHJ1Y3QgbW9kdWxlICptb2QpDQo+ICt7DQo+ICsJY29uc3Qgc3RydWN0IGtlcm5lbF9z eW1ib2wgKmtzOw0KPiArDQo+ICsJaWYgKCFtb2QpDQo+ICsJCWtzID0gbG9va3VwX2V4cG9ydGVk X3N5bWJvbChuYW1lLCBfX3N0YXJ0X19fa3N5bXRhYiwgX19zdG9wX19fa3N5bXRhYik7DQo+ICsJ ZWxzZQ0KPiArCQlrcyA9IGxvb2t1cF9leHBvcnRlZF9zeW1ib2wobmFtZSwgbW9kLT5zeW1zLCBt b2QtPnN5bXMgKyBtb2QtPm51bV9zeW1zKTsNCj4gKw0KPiArCXJldHVybiBrcyAmJiBrZXJuZWxf c3ltYm9sX3ZhbHVlKGtzKSA9PSB2YWx1ZTsNCj4gK30NCj4gKw0KPiArLyogQXMgcGVyIG5tICov DQo+ICtzdGF0aWMgY2hhciBlbGZfdHlwZShjb25zdCBFbGZfU3ltICpzeW0sIGNvbnN0IHN0cnVj dCBsb2FkX2luZm8gKmluZm8pDQo+ICt7DQo+ICsJY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMgPSBp bmZvLT5zZWNoZHJzOw0KPiArDQo+ICsJaWYgKEVMRl9TVF9CSU5EKHN5bS0+c3RfaW5mbykgPT0g U1RCX1dFQUspIHsNCj4gKwkJaWYgKEVMRl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX09C SkVDVCkNCj4gKwkJCXJldHVybiAndic7DQo+ICsJCWVsc2UNCj4gKwkJCXJldHVybiAndyc7DQo+ ICsJfQ0KPiArCWlmIChzeW0tPnN0X3NobmR4ID09IFNITl9VTkRFRikNCj4gKwkJcmV0dXJuICdV JzsNCj4gKwlpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQUJTIHx8IHN5bS0+c3Rfc2huZHggPT0g aW5mby0+aW5kZXgucGNwdSkNCj4gKwkJcmV0dXJuICdhJzsNCj4gKwlpZiAoc3ltLT5zdF9zaG5k eCA+PSBTSE5fTE9SRVNFUlZFKQ0KPiArCQlyZXR1cm4gJz8nOw0KPiArCWlmIChzZWNoZHJzW3N5 bS0+c3Rfc2huZHhdLnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikNCj4gKwkJcmV0dXJuICd0JzsN Cj4gKwlpZiAoc2VjaGRyc1tzeW0tPnN0X3NobmR4XS5zaF9mbGFncyAmIFNIRl9BTExPQyAmJg0K PiArCSAgICBzZWNoZHJzW3N5bS0+c3Rfc2huZHhdLnNoX3R5cGUgIT0gU0hUX05PQklUUykgew0K PiArCQlpZiAoIShzZWNoZHJzW3N5bS0+c3Rfc2huZHhdLnNoX2ZsYWdzICYgU0hGX1dSSVRFKSkN Cj4gKwkJCXJldHVybiAncic7DQo+ICsJCWVsc2UgaWYgKHNlY2hkcnNbc3ltLT5zdF9zaG5keF0u c2hfZmxhZ3MgJiBBUkNIX1NIRl9TTUFMTCkNCj4gKwkJCXJldHVybiAnZyc7DQo+ICsJCWVsc2UN Cj4gKwkJCXJldHVybiAnZCc7DQo+ICsJfQ0KPiArCWlmIChzZWNoZHJzW3N5bS0+c3Rfc2huZHhd LnNoX3R5cGUgPT0gU0hUX05PQklUUykgew0KPiArCQlpZiAoc2VjaGRyc1tzeW0tPnN0X3NobmR4 XS5zaF9mbGFncyAmIEFSQ0hfU0hGX1NNQUxMKQ0KPiArCQkJcmV0dXJuICdzJzsNCj4gKwkJZWxz ZQ0KPiArCQkJcmV0dXJuICdiJzsNCj4gKwl9DQo+ICsJaWYgKHN0cnN0YXJ0cyhpbmZvLT5zZWNz dHJpbmdzICsgc2VjaGRyc1tzeW0tPnN0X3NobmR4XS5zaF9uYW1lLA0KPiArCQkgICAgICAiLmRl YnVnIikpIHsNCj4gKwkJcmV0dXJuICduJzsNCj4gKwl9DQo+ICsJcmV0dXJuICc/JzsNCj4gK30N Cj4gKw0KPiArc3RhdGljIGJvb2wgaXNfY29yZV9zeW1ib2woY29uc3QgRWxmX1N5bSAqc3JjLCBj b25zdCBFbGZfU2hkciAqc2VjaGRycywNCj4gKwkJCSAgIHVuc2lnbmVkIGludCBzaG51bSwgdW5z aWduZWQgaW50IHBjcHVuZHgpDQo+ICt7DQo+ICsJY29uc3QgRWxmX1NoZHIgKnNlYzsNCj4gKw0K PiArCWlmIChzcmMtPnN0X3NobmR4ID09IFNITl9VTkRFRiB8fA0KPiArCSAgICBzcmMtPnN0X3No bmR4ID49IHNobnVtIHx8DQo+ICsJICAgICFzcmMtPnN0X25hbWUpDQo+ICsJCXJldHVybiBmYWxz ZTsNCj4gKw0KPiArI2lmZGVmIENPTkZJR19LQUxMU1lNU19BTEwNCj4gKwlpZiAoc3JjLT5zdF9z aG5keCA9PSBwY3B1bmR4KQ0KPiArCQlyZXR1cm4gdHJ1ZTsNCj4gKyNlbmRpZg0KPiArDQo+ICsJ c2VjID0gc2VjaGRycyArIHNyYy0+c3Rfc2huZHg7DQo+ICsJaWYgKCEoc2VjLT5zaF9mbGFncyAm IFNIRl9BTExPQykNCj4gKyNpZm5kZWYgQ09ORklHX0tBTExTWU1TX0FMTA0KPiArCSAgICB8fCAh KHNlYy0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKQ0KPiArI2VuZGlmDQo+ICsJICAgIHx8IChz ZWMtPnNoX2VudHNpemUgJiBJTklUX09GRlNFVF9NQVNLKSkNCj4gKwkJcmV0dXJuIGZhbHNlOw0K PiArDQo+ICsJcmV0dXJuIHRydWU7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBXZSBvbmx5IGFs bG9jYXRlIGFuZCBjb3B5IHRoZSBzdHJpbmdzIG5lZWRlZCBieSB0aGUgcGFydHMgb2Ygc3ltdGFi DQo+ICsgKiB3ZSBrZWVwLiAgVGhpcyBpcyBzaW1wbGUsIGJ1dCBoYXMgdGhlIGVmZmVjdCBvZiBt YWtpbmcgbXVsdGlwbGUNCj4gKyAqIGNvcGllcyBvZiBkdXBsaWNhdGVzLiAgV2UgY291bGQgYmUg bW9yZSBzb3BoaXN0aWNhdGVkLCBzZWUNCj4gKyAqIGxpbnV4LWtlcm5lbCB0aHJlYWQgc3RhcnRp bmcgd2l0aA0KPiArICogPDczZGVmYjVlNGJjYTA0YTY0MzEzOTJjYzM0MTExMmIxQGxvY2FsaG9z dD4uDQo+ICsgKi8NCj4gK3ZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0 cnVjdCBsb2FkX2luZm8gKmluZm8pDQo+ICt7DQo+ICsJRWxmX1NoZHIgKnN5bXNlY3QgPSBpbmZv LT5zZWNoZHJzICsgaW5mby0+aW5kZXguc3ltOw0KPiArCUVsZl9TaGRyICpzdHJzZWN0ID0gaW5m by0+c2VjaGRycyArIGluZm8tPmluZGV4LnN0cjsNCj4gKwljb25zdCBFbGZfU3ltICpzcmM7DQo+ ICsJdW5zaWduZWQgaW50IGksIG5zcmMsIG5kc3QsIHN0cnRhYl9zaXplID0gMDsNCj4gKw0KPiAr CS8qIFB1dCBzeW1ib2wgc2VjdGlvbiBhdCBlbmQgb2YgaW5pdCBwYXJ0IG9mIG1vZHVsZS4gKi8N Cj4gKwlzeW1zZWN0LT5zaF9mbGFncyB8PSBTSEZfQUxMT0M7DQo+ICsJc3ltc2VjdC0+c2hfZW50 c2l6ZSA9IG1vZHVsZV9nZXRfb2Zmc2V0KG1vZCwgJm1vZC0+aW5pdF9sYXlvdXQuc2l6ZSwgc3lt c2VjdCwNCj4gKwkJCQkJCWluZm8tPmluZGV4LnN5bSkgfCBJTklUX09GRlNFVF9NQVNLOw0KPiAr CXByX2RlYnVnKCJcdCVzXG4iLCBpbmZvLT5zZWNzdHJpbmdzICsgc3ltc2VjdC0+c2hfbmFtZSk7 DQo+ICsNCj4gKwlzcmMgPSAodm9pZCAqKWluZm8tPmhkciArIHN5bXNlY3QtPnNoX29mZnNldDsN Cj4gKwluc3JjID0gc3ltc2VjdC0+c2hfc2l6ZSAvIHNpemVvZigqc3JjKTsNCj4gKw0KPiArCS8q IENvbXB1dGUgdG90YWwgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBjb3JlIHN5bWJvbHMnIHN0cnRh Yi4gKi8NCj4gKwlmb3IgKG5kc3QgPSBpID0gMDsgaSA8IG5zcmM7IGkrKykgew0KPiArCQlpZiAo aSA9PSAwIHx8IGlzX2xpdmVwYXRjaF9tb2R1bGUobW9kKSB8fA0KPiArCQkgICAgaXNfY29yZV9z eW1ib2woc3JjICsgaSwgaW5mby0+c2VjaGRycywgaW5mby0+aGRyLT5lX3NobnVtLA0KPiArCQkJ CSAgIGluZm8tPmluZGV4LnBjcHUpKSB7DQo+ICsJCQlzdHJ0YWJfc2l6ZSArPSBzdHJsZW4oJmlu Zm8tPnN0cnRhYltzcmNbaV0uc3RfbmFtZV0pICsgMTsNCj4gKwkJCW5kc3QrKzsNCj4gKwkJfQ0K PiArCX0NCj4gKw0KPiArCS8qIEFwcGVuZCByb29tIGZvciBjb3JlIHN5bWJvbHMgYXQgZW5kIG9m IGNvcmUgcGFydC4gKi8NCj4gKwlpbmZvLT5zeW1vZmZzID0gQUxJR04obW9kLT5jb3JlX2xheW91 dC5zaXplLCBzeW1zZWN0LT5zaF9hZGRyYWxpZ24gPzogMSk7DQo+ICsJaW5mby0+c3Ryb2ZmcyA9 IG1vZC0+Y29yZV9sYXlvdXQuc2l6ZSA9IGluZm8tPnN5bW9mZnMgKyBuZHN0ICogc2l6ZW9mKEVs Zl9TeW0pOw0KPiArCW1vZC0+Y29yZV9sYXlvdXQuc2l6ZSArPSBzdHJ0YWJfc2l6ZTsNCj4gKwlp bmZvLT5jb3JlX3R5cGVvZmZzID0gbW9kLT5jb3JlX2xheW91dC5zaXplOw0KPiArCW1vZC0+Y29y ZV9sYXlvdXQuc2l6ZSArPSBuZHN0ICogc2l6ZW9mKGNoYXIpOw0KPiArCW1vZC0+Y29yZV9sYXlv dXQuc2l6ZSA9IGRlYnVnX2FsaWduKG1vZC0+Y29yZV9sYXlvdXQuc2l6ZSk7DQo+ICsNCj4gKwkv KiBQdXQgc3RyaW5nIHRhYmxlIHNlY3Rpb24gYXQgZW5kIG9mIGluaXQgcGFydCBvZiBtb2R1bGUu ICovDQo+ICsJc3Ryc2VjdC0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DOw0KPiArCXN0cnNlY3QtPnNo X2VudHNpemUgPSBtb2R1bGVfZ2V0X29mZnNldChtb2QsICZtb2QtPmluaXRfbGF5b3V0LnNpemUs IHN0cnNlY3QsDQo+ICsJCQkJCQlpbmZvLT5pbmRleC5zdHIpIHwgSU5JVF9PRkZTRVRfTUFTSzsN Cj4gKwlwcl9kZWJ1ZygiXHQlc1xuIiwgaW5mby0+c2Vjc3RyaW5ncyArIHN0cnNlY3QtPnNoX25h bWUpOw0KPiArDQo+ICsJLyogV2UnbGwgdGFjayB0ZW1wb3JhcnkgbW9kX2thbGxzeW1zIG9uIHRo ZSBlbmQuICovDQo+ICsJbW9kLT5pbml0X2xheW91dC5zaXplID0gQUxJR04obW9kLT5pbml0X2xh eW91dC5zaXplLA0KPiArCQkJCSAgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBtb2Rfa2FsbHN5bXMp KTsNCj4gKwlpbmZvLT5tb2Rfa2FsbHN5bXNfaW5pdF9vZmYgPSBtb2QtPmluaXRfbGF5b3V0LnNp emU7DQo+ICsJbW9kLT5pbml0X2xheW91dC5zaXplICs9IHNpemVvZihzdHJ1Y3QgbW9kX2thbGxz eW1zKTsNCj4gKwlpbmZvLT5pbml0X3R5cGVvZmZzID0gbW9kLT5pbml0X2xheW91dC5zaXplOw0K PiArCW1vZC0+aW5pdF9sYXlvdXQuc2l6ZSArPSBuc3JjICogc2l6ZW9mKGNoYXIpOw0KPiArCW1v ZC0+aW5pdF9sYXlvdXQuc2l6ZSA9IGRlYnVnX2FsaWduKG1vZC0+aW5pdF9sYXlvdXQuc2l6ZSk7 DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBXZSB1c2UgdGhlIGZ1bGwgc3ltdGFiIGFuZCBzdHJ0 YWIgd2hpY2ggbGF5b3V0X3N5bXRhYiBhcnJhbmdlZCB0bw0KPiArICogYmUgYXBwZW5kZWQgdG8g dGhlIGluaXQgc2VjdGlvbi4gIExhdGVyIHdlIHN3aXRjaCB0byB0aGUgY3V0LWRvd24NCj4gKyAq IGNvcmUtb25seSBvbmVzLg0KPiArICovDQo+ICt2b2lkIGFkZF9rYWxsc3ltcyhzdHJ1Y3QgbW9k dWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pDQo+ICt7DQo+ICsJdW5zaWdu ZWQgaW50IGksIG5kc3Q7DQo+ICsJY29uc3QgRWxmX1N5bSAqc3JjOw0KPiArCUVsZl9TeW0gKmRz dDsNCj4gKwljaGFyICpzOw0KPiArCUVsZl9TaGRyICpzeW1zZWMgPSAmaW5mby0+c2VjaGRyc1tp bmZvLT5pbmRleC5zeW1dOw0KPiArDQo+ICsJLyogU2V0IHVwIHRvIHBvaW50IGludG8gaW5pdCBz ZWN0aW9uLiAqLw0KPiArCW1vZC0+a2FsbHN5bXMgPSAodm9pZCBfX3JjdSAqKW1vZC0+aW5pdF9s YXlvdXQuYmFzZSArDQo+ICsJCWluZm8tPm1vZF9rYWxsc3ltc19pbml0X29mZjsNCj4gKw0KPiAr CS8qIFRoZSBmb2xsb3dpbmcgaXMgc2FmZSBzaW5jZSB0aGlzIHBvaW50ZXIgY2Fubm90IGNoYW5n ZSAqLw0KPiArCXJjdV9kZXJlZmVyZW5jZV9zY2hlZChtb2QtPmthbGxzeW1zKS0+c3ltdGFiID0g KHZvaWQgKilzeW1zZWMtPnNoX2FkZHI7DQo+ICsJcmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+ a2FsbHN5bXMpLT5udW1fc3ltdGFiID0gc3ltc2VjLT5zaF9zaXplIC8gc2l6ZW9mKEVsZl9TeW0p Ow0KPiArCS8qIE1ha2Ugc3VyZSB3ZSBnZXQgcGVybWFuZW50IHN0cnRhYjogZG9uJ3QgdXNlIGlu Zm8tPnN0cnRhYi4gKi8NCj4gKwlyY3VfZGVyZWZlcmVuY2Vfc2NoZWQobW9kLT5rYWxsc3ltcykt PnN0cnRhYiA9DQo+ICsJCSh2b2lkICopaW5mby0+c2VjaGRyc1tpbmZvLT5pbmRleC5zdHJdLnNo X2FkZHI7DQo+ICsJcmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2FsbHN5bXMpLT50eXBldGFi ID0NCj4gKwkJbW9kLT5pbml0X2xheW91dC5iYXNlICsgaW5mby0+aW5pdF90eXBlb2ZmczsNCj4g Kw0KPiArCS8qDQo+ICsJICogTm93IHBvcHVsYXRlIHRoZSBjdXQgZG93biBjb3JlIGthbGxzeW1z IGZvciBhZnRlciBpbml0DQo+ICsJICogYW5kIHNldCB0eXBlcyB1cCB3aGlsZSB3ZSBzdGlsbCBo YXZlIGFjY2VzcyB0byBzZWN0aW9ucy4NCj4gKwkgKi8NCj4gKwltb2QtPmNvcmVfa2FsbHN5bXMu c3ltdGFiID0gZHN0ID0gbW9kLT5jb3JlX2xheW91dC5iYXNlICsgaW5mby0+c3ltb2ZmczsNCj4g Kwltb2QtPmNvcmVfa2FsbHN5bXMuc3RydGFiID0gcyA9IG1vZC0+Y29yZV9sYXlvdXQuYmFzZSAr IGluZm8tPnN0cm9mZnM7DQo+ICsJbW9kLT5jb3JlX2thbGxzeW1zLnR5cGV0YWIgPSBtb2QtPmNv cmVfbGF5b3V0LmJhc2UgKyBpbmZvLT5jb3JlX3R5cGVvZmZzOw0KPiArCXNyYyA9IHJjdV9kZXJl ZmVyZW5jZV9zY2hlZChtb2QtPmthbGxzeW1zKS0+c3ltdGFiOw0KPiArCWZvciAobmRzdCA9IGkg PSAwOyBpIDwgcmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2FsbHN5bXMpLT5udW1fc3ltdGFi OyBpKyspIHsNCj4gKwkJcmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2FsbHN5bXMpLT50eXBl dGFiW2ldID0gZWxmX3R5cGUoc3JjICsgaSwgaW5mbyk7DQo+ICsJCWlmIChpID09IDAgfHwgaXNf bGl2ZXBhdGNoX21vZHVsZShtb2QpIHx8DQo+ICsJCSAgICBpc19jb3JlX3N5bWJvbChzcmMgKyBp LCBpbmZvLT5zZWNoZHJzLCBpbmZvLT5oZHItPmVfc2hudW0sDQo+ICsJCQkJICAgaW5mby0+aW5k ZXgucGNwdSkpIHsNCj4gKwkJCW1vZC0+Y29yZV9rYWxsc3ltcy50eXBldGFiW25kc3RdID0NCj4g KwkJCSAgICByY3VfZGVyZWZlcmVuY2Vfc2NoZWQobW9kLT5rYWxsc3ltcyktPnR5cGV0YWJbaV07 DQo+ICsJCQlkc3RbbmRzdF0gPSBzcmNbaV07DQo+ICsJCQlkc3RbbmRzdCsrXS5zdF9uYW1lID0g cyAtIG1vZC0+Y29yZV9rYWxsc3ltcy5zdHJ0YWI7DQo+ICsJCQlzICs9IHN0cnNjcHkocywNCj4g KwkJCQkgICAgICZyY3VfZGVyZWZlcmVuY2Vfc2NoZWQobW9kLT5rYWxsc3ltcyktPnN0cnRhYltz cmNbaV0uc3RfbmFtZV0sDQo+ICsJCQkJICAgICBLU1lNX05BTUVfTEVOKSArIDE7DQo+ICsJCX0N Cj4gKwl9DQo+ICsJbW9kLT5jb3JlX2thbGxzeW1zLm51bV9zeW10YWIgPSBuZHN0Ow0KPiArfQ0K PiArDQo+ICsjaWYgSVNfRU5BQkxFRChDT05GSUdfU1RBQ0tUUkFDRV9CVUlMRF9JRCkNCj4gK3Zv aWQgaW5pdF9idWlsZF9pZChzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2lu Zm8gKmluZm8pDQo+ICt7DQo+ICsJY29uc3QgRWxmX1NoZHIgKnNlY2hkcjsNCj4gKwl1bnNpZ25l ZCBpbnQgaTsNCj4gKw0KPiArCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5oZHItPmVfc2hudW07IGkr Kykgew0KPiArCQlzZWNoZHIgPSAmaW5mby0+c2VjaGRyc1tpXTsNCj4gKwkJaWYgKCFzZWN0X2Vt cHR5KHNlY2hkcikgJiYgc2VjaGRyLT5zaF90eXBlID09IFNIVF9OT1RFICYmDQo+ICsJCSAgICAh YnVpbGRfaWRfcGFyc2VfYnVmKCh2b2lkICopc2VjaGRyLT5zaF9hZGRyLCBtb2QtPmJ1aWxkX2lk LA0KPiArCQkJCQlzZWNoZHItPnNoX3NpemUpKQ0KPiArCQkJYnJlYWs7DQo+ICsJfQ0KPiArfQ0K PiArI2Vsc2UNCj4gK3ZvaWQgaW5pdF9idWlsZF9pZChzdHJ1Y3QgbW9kdWxlICptb2QsIGNvbnN0 IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pDQo+ICt7DQo+ICt9DQo+ICsjZW5kaWYNCj4gKw0KPiAr LyoNCj4gKyAqIFRoaXMgaWdub3JlcyB0aGUgaW50ZW5zZWx5IGFubm95aW5nICJtYXBwaW5nIHN5 bWJvbHMiIGZvdW5kDQo+ICsgKiBpbiBBUk0gRUxGIGZpbGVzOiAkYSwgJHQgYW5kICRkLg0KPiAr ICovDQo+ICtzdGF0aWMgaW5saW5lIGludCBpc19hcm1fbWFwcGluZ19zeW1ib2woY29uc3QgY2hh ciAqc3RyKQ0KPiArew0KPiArCWlmIChzdHJbMF0gPT0gJy4nICYmIHN0clsxXSA9PSAnTCcpDQo+ ICsJCXJldHVybiB0cnVlOw0KPiArCXJldHVybiBzdHJbMF0gPT0gJyQnICYmIHN0cmNocigiYXh0 ZCIsIHN0clsxXSkgJiYNCj4gKwkgICAgICAgKHN0clsyXSA9PSAnXDAnIHx8IHN0clsyXSA9PSAn LicpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgY29uc3QgY2hhciAqa2FsbHN5bXNfc3ltYm9sX25h bWUoc3RydWN0IG1vZF9rYWxsc3ltcyAqa2FsbHN5bXMsIHVuc2lnbmVkIGludCBzeW1udW0pDQo+ ICt7DQo+ICsJcmV0dXJuIGthbGxzeW1zLT5zdHJ0YWIgKyBrYWxsc3ltcy0+c3ltdGFiW3N5bW51 bV0uc3RfbmFtZTsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIEdpdmVuIGEgbW9kdWxlIGFuZCBh ZGRyZXNzLCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCBhbmQgcmV0dXJuIGl0cyBuYW1l DQo+ICsgKiB3aGlsZSBwcm92aWRpbmcgaXRzIHNpemUgYW5kIG9mZnNldCBpZiBuZWVkZWQuDQo+ ICsgKi8NCj4gK3N0YXRpYyBjb25zdCBjaGFyICpmaW5kX2thbGxzeW1zX3N5bWJvbChzdHJ1Y3Qg bW9kdWxlICptb2QsDQo+ICsJCQkJCXVuc2lnbmVkIGxvbmcgYWRkciwNCj4gKwkJCQkJdW5zaWdu ZWQgbG9uZyAqc2l6ZSwNCj4gKwkJCQkJdW5zaWduZWQgbG9uZyAqb2Zmc2V0KQ0KPiArew0KPiAr CXVuc2lnbmVkIGludCBpLCBiZXN0ID0gMDsNCj4gKwl1bnNpZ25lZCBsb25nIG5leHR2YWwsIGJl c3R2YWw7DQo+ICsJc3RydWN0IG1vZF9rYWxsc3ltcyAqa2FsbHN5bXMgPSByY3VfZGVyZWZlcmVu Y2Vfc2NoZWQobW9kLT5rYWxsc3ltcyk7DQo+ICsNCj4gKwkvKiBBdCB3b3JzZSwgbmV4dCB2YWx1 ZSBpcyBhdCBlbmQgb2YgbW9kdWxlICovDQo+ICsJaWYgKHdpdGhpbl9tb2R1bGVfaW5pdChhZGRy LCBtb2QpKQ0KPiArCQluZXh0dmFsID0gKHVuc2lnbmVkIGxvbmcpbW9kLT5pbml0X2xheW91dC5i YXNlICsgbW9kLT5pbml0X2xheW91dC50ZXh0X3NpemU7DQo+ICsJZWxzZQ0KPiArCQluZXh0dmFs ID0gKHVuc2lnbmVkIGxvbmcpbW9kLT5jb3JlX2xheW91dC5iYXNlICsgbW9kLT5jb3JlX2xheW91 dC50ZXh0X3NpemU7DQo+ICsNCj4gKwliZXN0dmFsID0ga2FsbHN5bXNfc3ltYm9sX3ZhbHVlKCZr YWxsc3ltcy0+c3ltdGFiW2Jlc3RdKTsNCj4gKw0KPiArCS8qDQo+ICsJICogU2NhbiBmb3IgY2xv c2VzdCBwcmVjZWRpbmcgc3ltYm9sLCBhbmQgbmV4dCBzeW1ib2wuIChFTEYNCj4gKwkgKiBzdGFy dHMgcmVhbCBzeW1ib2xzIGF0IDEpLg0KPiArCSAqLw0KPiArCWZvciAoaSA9IDE7IGkgPCBrYWxs c3ltcy0+bnVtX3N5bXRhYjsgaSsrKSB7DQo+ICsJCWNvbnN0IEVsZl9TeW0gKnN5bSA9ICZrYWxs c3ltcy0+c3ltdGFiW2ldOw0KPiArCQl1bnNpZ25lZCBsb25nIHRoaXN2YWwgPSBrYWxsc3ltc19z eW1ib2xfdmFsdWUoc3ltKTsNCj4gKw0KPiArCQlpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5E RUYpDQo+ICsJCQljb250aW51ZTsNCj4gKw0KPiArCQkvKg0KPiArCQkgKiBXZSBpZ25vcmUgdW5u YW1lZCBzeW1ib2xzOiB0aGV5J3JlIHVuaW5mb3JtYXRpdmUNCj4gKwkJICogYW5kIGluc2VydGVk IGF0IGEgd2hpbS4NCj4gKwkJICovDQo+ICsJCWlmICgqa2FsbHN5bXNfc3ltYm9sX25hbWUoa2Fs bHN5bXMsIGkpID09ICdcMCcgfHwNCj4gKwkJICAgIGlzX2FybV9tYXBwaW5nX3N5bWJvbChrYWxs c3ltc19zeW1ib2xfbmFtZShrYWxsc3ltcywgaSkpKQ0KPiArCQkJY29udGludWU7DQo+ICsNCj4g KwkJaWYgKHRoaXN2YWwgPD0gYWRkciAmJiB0aGlzdmFsID4gYmVzdHZhbCkgew0KPiArCQkJYmVz dCA9IGk7DQo+ICsJCQliZXN0dmFsID0gdGhpc3ZhbDsNCj4gKwkJfQ0KPiArCQlpZiAodGhpc3Zh bCA+IGFkZHIgJiYgdGhpc3ZhbCA8IG5leHR2YWwpDQo+ICsJCQluZXh0dmFsID0gdGhpc3ZhbDsN Cj4gKwl9DQo+ICsNCj4gKwlpZiAoIWJlc3QpDQo+ICsJCXJldHVybiBOVUxMOw0KPiArDQo+ICsJ aWYgKHNpemUpDQo+ICsJCSpzaXplID0gbmV4dHZhbCAtIGJlc3R2YWw7DQo+ICsJaWYgKG9mZnNl dCkNCj4gKwkJKm9mZnNldCA9IGFkZHIgLSBiZXN0dmFsOw0KPiArDQo+ICsJcmV0dXJuIGthbGxz eW1zX3N5bWJvbF9uYW1lKGthbGxzeW1zLCBiZXN0KTsNCj4gK30NCj4gKw0KPiArdm9pZCAqIF9f d2VhayBkZXJlZmVyZW5jZV9tb2R1bGVfZnVuY3Rpb25fZGVzY3JpcHRvcihzdHJ1Y3QgbW9kdWxl ICptb2QsDQo+ICsJCQkJCQkgICAgIHZvaWQgKnB0cikNCj4gK3sNCj4gKwlyZXR1cm4gcHRyOw0K PiArfQ0KPiArDQo+ICsvKg0KPiArICogRm9yIGthbGxzeW1zIHRvIGFzayBmb3IgYWRkcmVzcyBy ZXNvbHV0aW9uLiAgTlVMTCBtZWFucyBub3QgZm91bmQuICBDYXJlZnVsDQo+ICsgKiBub3QgdG8g bG9jayB0byBhdm9pZCBkZWFkbG9jayBvbiBvb3BzZXMsIHNpbXBseSBkaXNhYmxlIHByZWVtcHRp b24uDQo+ICsgKi8NCj4gK2NvbnN0IGNoYXIgKm1vZHVsZV9hZGRyZXNzX2xvb2t1cCh1bnNpZ25l ZCBsb25nIGFkZHIsDQo+ICsJCQkJICB1bnNpZ25lZCBsb25nICpzaXplLA0KPiArCQkJICAgIHVu c2lnbmVkIGxvbmcgKm9mZnNldCwNCj4gKwkJCSAgICBjaGFyICoqbW9kbmFtZSwNCj4gKwkJCSAg ICBjb25zdCB1bnNpZ25lZCBjaGFyICoqbW9kYnVpbGRpZCwNCj4gKwkJCSAgICBjaGFyICpuYW1l YnVmKQ0KPiArew0KPiArCWNvbnN0IGNoYXIgKnJldCA9IE5VTEw7DQo+ICsJc3RydWN0IG1vZHVs ZSAqbW9kOw0KPiArDQo+ICsJcHJlZW1wdF9kaXNhYmxlKCk7DQo+ICsJbW9kID0gX19tb2R1bGVf YWRkcmVzcyhhZGRyKTsNCj4gKwlpZiAobW9kKSB7DQo+ICsJCWlmIChtb2RuYW1lKQ0KPiArCQkJ Km1vZG5hbWUgPSBtb2QtPm5hbWU7DQo+ICsJCWlmIChtb2RidWlsZGlkKSB7DQo+ICsjaWYgSVNf RU5BQkxFRChDT05GSUdfU1RBQ0tUUkFDRV9CVUlMRF9JRCkNCj4gKwkJCSptb2RidWlsZGlkID0g bW9kLT5idWlsZF9pZDsNCj4gKyNlbHNlDQo+ICsJCQkqbW9kYnVpbGRpZCA9IE5VTEw7DQo+ICsj ZW5kaWYNCj4gKwkJfQ0KPiArDQo+ICsJCXJldCA9IGZpbmRfa2FsbHN5bXNfc3ltYm9sKG1vZCwg YWRkciwgc2l6ZSwgb2Zmc2V0KTsNCj4gKwl9DQo+ICsJLyogTWFrZSBhIGNvcHkgaW4gaGVyZSB3 aGVyZSBpdCdzIHNhZmUgKi8NCj4gKwlpZiAocmV0KSB7DQo+ICsJCXN0cm5jcHkobmFtZWJ1Ziwg cmV0LCBLU1lNX05BTUVfTEVOIC0gMSk7DQo+ICsJCXJldCA9IG5hbWVidWY7DQo+ICsJfQ0KPiAr CXByZWVtcHRfZW5hYmxlKCk7DQo+ICsNCj4gKwlyZXR1cm4gcmV0Ow0KPiArfQ0KPiArDQo+ICtp bnQgbG9va3VwX21vZHVsZV9zeW1ib2xfbmFtZSh1bnNpZ25lZCBsb25nIGFkZHIsIGNoYXIgKnN5 bW5hbWUpDQo+ICt7DQo+ICsJc3RydWN0IG1vZHVsZSAqbW9kOw0KPiArDQo+ICsJcHJlZW1wdF9k aXNhYmxlKCk7DQo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlz dCkgew0KPiArCQlpZiAobW9kLT5zdGF0ZSA9PSBNT0RVTEVfU1RBVEVfVU5GT1JNRUQpDQo+ICsJ CQljb250aW51ZTsNCj4gKwkJaWYgKHdpdGhpbl9tb2R1bGUoYWRkciwgbW9kKSkgew0KPiArCQkJ Y29uc3QgY2hhciAqc3ltOw0KPiArDQo+ICsJCQlzeW0gPSBmaW5kX2thbGxzeW1zX3N5bWJvbCht b2QsIGFkZHIsIE5VTEwsIE5VTEwpOw0KPiArCQkJaWYgKCFzeW0pDQo+ICsJCQkJZ290byBvdXQ7 DQo+ICsNCj4gKwkJCXN0cnNjcHkoc3ltbmFtZSwgc3ltLCBLU1lNX05BTUVfTEVOKTsNCj4gKwkJ CXByZWVtcHRfZW5hYmxlKCk7DQo+ICsJCQlyZXR1cm4gMDsNCj4gKwkJfQ0KPiArCX0NCj4gK291 dDoNCj4gKwlwcmVlbXB0X2VuYWJsZSgpOw0KPiArCXJldHVybiAtRVJBTkdFOw0KPiArfQ0KPiAr DQo+ICtpbnQgbG9va3VwX21vZHVsZV9zeW1ib2xfYXR0cnModW5zaWduZWQgbG9uZyBhZGRyLCB1 bnNpZ25lZCBsb25nICpzaXplLA0KPiArCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm9mZnNldCwg Y2hhciAqbW9kbmFtZSwgY2hhciAqbmFtZSkNCj4gK3sNCj4gKwlzdHJ1Y3QgbW9kdWxlICptb2Q7 DQo+ICsNCj4gKwlwcmVlbXB0X2Rpc2FibGUoKTsNCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Jj dShtb2QsICZtb2R1bGVzLCBsaXN0KSB7DQo+ICsJCWlmIChtb2QtPnN0YXRlID09IE1PRFVMRV9T VEFURV9VTkZPUk1FRCkNCj4gKwkJCWNvbnRpbnVlOw0KPiArCQlpZiAod2l0aGluX21vZHVsZShh ZGRyLCBtb2QpKSB7DQo+ICsJCQljb25zdCBjaGFyICpzeW07DQo+ICsNCj4gKwkJCXN5bSA9IGZp bmRfa2FsbHN5bXNfc3ltYm9sKG1vZCwgYWRkciwgc2l6ZSwgb2Zmc2V0KTsNCj4gKwkJCWlmICgh c3ltKQ0KPiArCQkJCWdvdG8gb3V0Ow0KPiArCQkJaWYgKG1vZG5hbWUpDQo+ICsJCQkJc3Ryc2Nw eShtb2RuYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7DQo+ICsJCQlpZiAobmFtZSkN Cj4gKwkJCQlzdHJzY3B5KG5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTik7DQo+ICsJCQlwcmVlbXB0 X2VuYWJsZSgpOw0KPiArCQkJcmV0dXJuIDA7DQo+ICsJCX0NCj4gKwl9DQo+ICtvdXQ6DQo+ICsJ cHJlZW1wdF9lbmFibGUoKTsNCj4gKwlyZXR1cm4gLUVSQU5HRTsNCj4gK30NCj4gKw0KPiAraW50 IG1vZHVsZV9nZXRfa2FsbHN5bSh1bnNpZ25lZCBpbnQgc3ltbnVtLCB1bnNpZ25lZCBsb25nICp2 YWx1ZSwgY2hhciAqdHlwZSwNCj4gKwkJICAgICAgIGNoYXIgKm5hbWUsIGNoYXIgKm1vZHVsZV9u YW1lLCBpbnQgKmV4cG9ydGVkKQ0KPiArew0KPiArCXN0cnVjdCBtb2R1bGUgKm1vZDsNCj4gKw0K PiArCXByZWVtcHRfZGlzYWJsZSgpOw0KPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwg Jm1vZHVsZXMsIGxpc3QpIHsNCj4gKwkJc3RydWN0IG1vZF9rYWxsc3ltcyAqa2FsbHN5bXM7DQo+ ICsNCj4gKwkJaWYgKG1vZC0+c3RhdGUgPT0gTU9EVUxFX1NUQVRFX1VORk9STUVEKQ0KPiArCQkJ Y29udGludWU7DQo+ICsJCWthbGxzeW1zID0gcmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2Fs bHN5bXMpOw0KPiArCQlpZiAoc3ltbnVtIDwga2FsbHN5bXMtPm51bV9zeW10YWIpIHsNCj4gKwkJ CWNvbnN0IEVsZl9TeW0gKnN5bSA9ICZrYWxsc3ltcy0+c3ltdGFiW3N5bW51bV07DQo+ICsNCj4g KwkJCSp2YWx1ZSA9IGthbGxzeW1zX3N5bWJvbF92YWx1ZShzeW0pOw0KPiArCQkJKnR5cGUgPSBr YWxsc3ltcy0+dHlwZXRhYltzeW1udW1dOw0KPiArCQkJc3Ryc2NweShuYW1lLCBrYWxsc3ltc19z eW1ib2xfbmFtZShrYWxsc3ltcywgc3ltbnVtKSwgS1NZTV9OQU1FX0xFTik7DQo+ICsJCQlzdHJz Y3B5KG1vZHVsZV9uYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7DQo+ICsJCQkqZXhw b3J0ZWQgPSBpc19leHBvcnRlZChuYW1lLCAqdmFsdWUsIG1vZCk7DQo+ICsJCQlwcmVlbXB0X2Vu YWJsZSgpOw0KPiArCQkJcmV0dXJuIDA7DQo+ICsJCX0NCj4gKwkJc3ltbnVtIC09IGthbGxzeW1z LT5udW1fc3ltdGFiOw0KPiArCX0NCj4gKwlwcmVlbXB0X2VuYWJsZSgpOw0KPiArCXJldHVybiAt RVJBTkdFOw0KPiArfQ0KPiArDQo+ICsvKiBHaXZlbiBhIG1vZHVsZSBhbmQgbmFtZSBvZiBzeW1i b2wsIGZpbmQgYW5kIHJldHVybiB0aGUgc3ltYm9sJ3MgdmFsdWUgKi8NCj4gK3Vuc2lnbmVkIGxv bmcgZmluZF9rYWxsc3ltc19zeW1ib2xfdmFsdWUoc3RydWN0IG1vZHVsZSAqbW9kLCBjb25zdCBj aGFyICpuYW1lKQ0KPiArew0KPiArCXVuc2lnbmVkIGludCBpOw0KPiArCXN0cnVjdCBtb2Rfa2Fs bHN5bXMgKmthbGxzeW1zID0gcmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2FsbHN5bXMpOw0K PiArDQo+ICsJZm9yIChpID0gMDsgaSA8IGthbGxzeW1zLT5udW1fc3ltdGFiOyBpKyspIHsNCj4g KwkJY29uc3QgRWxmX1N5bSAqc3ltID0gJmthbGxzeW1zLT5zeW10YWJbaV07DQo+ICsNCj4gKwkJ aWYgKHN0cmNtcChuYW1lLCBrYWxsc3ltc19zeW1ib2xfbmFtZShrYWxsc3ltcywgaSkpID09IDAg JiYNCj4gKwkJICAgIHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGKQ0KPiArCQkJcmV0dXJuIGth bGxzeW1zX3N5bWJvbF92YWx1ZShzeW0pOw0KPiArCX0NCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4g Kw0KPiArLyogTG9vayBmb3IgdGhpcyBuYW1lOiBjYW4gYmUgb2YgZm9ybSBtb2R1bGU6bmFtZS4g Ki8NCj4gK3Vuc2lnbmVkIGxvbmcgbW9kdWxlX2thbGxzeW1zX2xvb2t1cF9uYW1lKGNvbnN0IGNo YXIgKm5hbWUpDQo+ICt7DQo+ICsJc3RydWN0IG1vZHVsZSAqbW9kOw0KPiArCWNoYXIgKmNvbG9u Ow0KPiArCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsNCj4gKw0KPiArCS8qIERvbid0IGxvY2s6IHdl J3JlIGluIGVub3VnaCB0cm91YmxlIGFscmVhZHkuICovDQo+ICsJcHJlZW1wdF9kaXNhYmxlKCk7 DQo+ICsJaWYgKChjb2xvbiA9IHN0cm5jaHIobmFtZSwgTU9EVUxFX05BTUVfTEVOLCAnOicpKSAh PSBOVUxMKSB7DQo+ICsJCWlmICgobW9kID0gZmluZF9tb2R1bGVfYWxsKG5hbWUsIGNvbG9uIC0g bmFtZSwgZmFsc2UpKSAhPSBOVUxMKQ0KPiArCQkJcmV0ID0gZmluZF9rYWxsc3ltc19zeW1ib2xf dmFsdWUobW9kLCBjb2xvbiArIDEpOw0KPiArCX0gZWxzZSB7DQo+ICsJCWxpc3RfZm9yX2VhY2hf ZW50cnlfcmN1KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsNCj4gKwkJCWlmIChtb2QtPnN0YXRlID09 IE1PRFVMRV9TVEFURV9VTkZPUk1FRCkNCj4gKwkJCQljb250aW51ZTsNCj4gKwkJCWlmICgocmV0 ID0gZmluZF9rYWxsc3ltc19zeW1ib2xfdmFsdWUobW9kLCBuYW1lKSkgIT0gMCkNCj4gKwkJCQli cmVhazsNCj4gKwkJfQ0KPiArCX0NCj4gKwlwcmVlbXB0X2VuYWJsZSgpOw0KPiArCXJldHVybiBy ZXQ7DQo+ICt9DQo+ICsNCj4gKyNpZmRlZiBDT05GSUdfTElWRVBBVENIDQo+ICtpbnQgbW9kdWxl X2thbGxzeW1zX29uX2VhY2hfc3ltYm9sKGludCAoKmZuKSh2b2lkICosIGNvbnN0IGNoYXIgKiwN Cj4gKwkJCQkJICAgICBzdHJ1Y3QgbW9kdWxlICosIHVuc2lnbmVkIGxvbmcpLA0KPiArCQkJCSAg IHZvaWQgKmRhdGEpDQo+ICt7DQo+ICsJc3RydWN0IG1vZHVsZSAqbW9kOw0KPiArCXVuc2lnbmVk IGludCBpOw0KPiArCWludCByZXQgPSAwOw0KPiArDQo+ICsJbXV0ZXhfbG9jaygmbW9kdWxlX211 dGV4KTsNCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsNCj4g KwkJLyogU3RpbGwgdXNlIHJjdV9kZXJlZmVyZW5jZV9zY2hlZCB0byByZW1haW4gY29tcGxpYW50 IHdpdGggc3BhcnNlICovDQo+ICsJCXN0cnVjdCBtb2Rfa2FsbHN5bXMgKmthbGxzeW1zID0gcmN1 X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2FsbHN5bXMpOw0KPiArDQo+ICsJCWlmIChtb2QtPnN0 YXRlID09IE1PRFVMRV9TVEFURV9VTkZPUk1FRCkNCj4gKwkJCWNvbnRpbnVlOw0KPiArCQlmb3Ig KGkgPSAwOyBpIDwga2FsbHN5bXMtPm51bV9zeW10YWI7IGkrKykgew0KPiArCQkJY29uc3QgRWxm X1N5bSAqc3ltID0gJmthbGxzeW1zLT5zeW10YWJbaV07DQo+ICsNCj4gKwkJCWlmIChzeW0tPnN0 X3NobmR4ID09IFNITl9VTkRFRikNCj4gKwkJCQljb250aW51ZTsNCj4gKw0KPiArCQkJcmV0ID0g Zm4oZGF0YSwga2FsbHN5bXNfc3ltYm9sX25hbWUoa2FsbHN5bXMsIGkpLA0KPiArCQkJCSBtb2Qs IGthbGxzeW1zX3N5bWJvbF92YWx1ZShzeW0pKTsNCj4gKwkJCWlmIChyZXQgIT0gMCkNCj4gKwkJ CQlnb3RvIG91dDsNCj4gKwkJfQ0KPiArCX0NCj4gK291dDoNCj4gKwltdXRleF91bmxvY2soJm1v ZHVsZV9tdXRleCk7DQo+ICsJcmV0dXJuIHJldDsNCj4gK30NCj4gKyNlbmRpZiAvKiBDT05GSUdf TElWRVBBVENIICovDQo+IGRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlL21haW4uYyBiL2tlcm5l bC9tb2R1bGUvbWFpbi5jDQo+IGluZGV4IDdkZDI4Mzk1OWM1Yy4uOTUyMDc5OTg3ZWE0IDEwMDY0 NA0KPiAtLS0gYS9rZXJuZWwvbW9kdWxlL21haW4uYw0KPiArKysgYi9rZXJuZWwvbW9kdWxlL21h aW4uYw0KPiBAQCAtMjg4LDE1ICsyODgsNiBAQCBzdGF0aWMgYm9vbCBjaGVja19leHBvcnRlZF9z eW1ib2woY29uc3Qgc3RydWN0IHN5bXNlYXJjaCAqc3ltcywNCj4gICAJcmV0dXJuIHRydWU7DQo+ ICAgfQ0KPiAgIA0KPiAtc3RhdGljIHVuc2lnbmVkIGxvbmcga2VybmVsX3N5bWJvbF92YWx1ZShj b25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqc3ltKQ0KPiAtew0KPiAtI2lmZGVmIENPTkZJR19I QVZFX0FSQ0hfUFJFTDMyX1JFTE9DQVRJT05TDQo+IC0JcmV0dXJuICh1bnNpZ25lZCBsb25nKW9m ZnNldF90b19wdHIoJnN5bS0+dmFsdWVfb2Zmc2V0KTsNCj4gLSNlbHNlDQo+IC0JcmV0dXJuIHN5 bS0+dmFsdWU7DQo+IC0jZW5kaWYNCj4gLX0NCj4gLQ0KPiAgIHN0YXRpYyBjb25zdCBjaGFyICpr ZXJuZWxfc3ltYm9sX25hbWUoY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKnN5bSkNCj4gICB7 DQo+ICAgI2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfUFJFTDMyX1JFTE9DQVRJT05TDQo+IEBAIC0z MTcsNyArMzA4LDcgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmtlcm5lbF9zeW1ib2xfbmFtZXNwYWNl KGNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sICpzeW0pDQo+ICAgI2VuZGlmDQo+ICAgfQ0KPiAg IA0KPiAtc3RhdGljIGludCBjbXBfbmFtZShjb25zdCB2b2lkICpuYW1lLCBjb25zdCB2b2lkICpz eW0pDQo+ICtpbnQgY21wX25hbWUoY29uc3Qgdm9pZCAqbmFtZSwgY29uc3Qgdm9pZCAqc3ltKQ0K PiAgIHsNCj4gICAJcmV0dXJuIHN0cmNtcChuYW1lLCBrZXJuZWxfc3ltYm9sX25hbWUoc3ltKSk7 DQo+ICAgfQ0KPiBAQCAtMzg3LDggKzM3OCw4IEBAIHN0YXRpYyBib29sIGZpbmRfc3ltYm9sKHN0 cnVjdCBmaW5kX3N5bWJvbF9hcmcgKmZzYSkNCj4gICAgKiBTZWFyY2ggZm9yIG1vZHVsZSBieSBu YW1lOiBtdXN0IGhvbGQgbW9kdWxlX211dGV4IChvciBwcmVlbXB0IGRpc2FibGVkDQo+ICAgICog Zm9yIHJlYWQtb25seSBhY2Nlc3MpLg0KPiAgICAqLw0KPiAtc3RhdGljIHN0cnVjdCBtb2R1bGUg KmZpbmRfbW9kdWxlX2FsbChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuLA0KPiAtCQkJCSAg ICAgIGJvb2wgZXZlbl91bmZvcm1lZCkNCj4gK3N0cnVjdCBtb2R1bGUgKmZpbmRfbW9kdWxlX2Fs bChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuLA0KPiArCQkJICAgICAgIGJvb2wgZXZlbl91 bmZvcm1lZCkNCj4gICB7DQo+ICAgCXN0cnVjdCBtb2R1bGUgKm1vZDsNCj4gICANCj4gQEAgLTEy OTQsMTMgKzEyODUsNiBAQCByZXNvbHZlX3N5bWJvbF93YWl0KHN0cnVjdCBtb2R1bGUgKm1vZCwN Cj4gICAJcmV0dXJuIGtzeW07DQo+ICAgfQ0KPiAgIA0KPiAtI2lmZGVmIENPTkZJR19LQUxMU1lN Uw0KPiAtc3RhdGljIGlubGluZSBib29sIHNlY3RfZW1wdHkoY29uc3QgRWxmX1NoZHIgKnNlY3Qp DQo+IC17DQo+IC0JcmV0dXJuICEoc2VjdC0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpIHx8IHNlY3Qt PnNoX3NpemUgPT0gMDsNCj4gLX0NCj4gLSNlbmRpZg0KPiAtDQo+ICAgLyoNCj4gICAgKiAvc3lz L21vZHVsZS9mb28vc2VjdGlvbnMgc3R1ZmYNCj4gICAgKiBKLiBDb3JiZXQgPGNvcmJldEBsd24u bmV0Pg0KPiBAQCAtMjA2NSw3ICsyMDQ5LDcgQEAgdW5zaWduZWQgaW50IF9fd2VhayBhcmNoX21v ZF9zZWN0aW9uX3ByZXBlbmQoc3RydWN0IG1vZHVsZSAqbW9kLA0KPiAgIH0NCj4gICANCj4gICAv KiBVcGRhdGUgc2l6ZSB3aXRoIHRoaXMgc2VjdGlvbjogcmV0dXJuIG9mZnNldC4gKi8NCj4gLXN0 YXRpYyBsb25nIGdldF9vZmZzZXQoc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBpbnQgKnNp emUsDQo+ICtsb25nIG1vZHVsZV9nZXRfb2Zmc2V0KHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWdu ZWQgaW50ICpzaXplLA0KPiAgIAkJICAgICAgIEVsZl9TaGRyICpzZWNoZHIsIHVuc2lnbmVkIGlu dCBzZWN0aW9uKQ0KPiAgIHsNCj4gICAJbG9uZyByZXQ7DQo+IEBAIC0yMTIxLDcgKzIxMDUsNyBA QCBzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3Qg bG9hZF9pbmZvICppbmZvKQ0KPiAgIAkJCSAgICB8fCBzLT5zaF9lbnRzaXplICE9IH4wVUwNCj4g ICAJCQkgICAgfHwgbW9kdWxlX2luaXRfbGF5b3V0X3NlY3Rpb24oc25hbWUpKQ0KPiAgIAkJCQlj b250aW51ZTsNCj4gLQkJCXMtPnNoX2VudHNpemUgPSBnZXRfb2Zmc2V0KG1vZCwgJm1vZC0+Y29y ZV9sYXlvdXQuc2l6ZSwgcywgaSk7DQo+ICsJCQlzLT5zaF9lbnRzaXplID0gbW9kdWxlX2dldF9v ZmZzZXQobW9kLCAmbW9kLT5jb3JlX2xheW91dC5zaXplLCBzLCBpKTsNCj4gICAJCQlwcl9kZWJ1 ZygiXHQlc1xuIiwgc25hbWUpOw0KPiAgIAkJfQ0KPiAgIAkJc3dpdGNoIChtKSB7DQo+IEBAIC0y MTU0LDcgKzIxMzgsNyBAQCBzdGF0aWMgdm9pZCBsYXlvdXRfc2VjdGlvbnMoc3RydWN0IG1vZHVs ZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQ0KPiAgIAkJCSAgICB8fCBzLT5zaF9lbnRz aXplICE9IH4wVUwNCj4gICAJCQkgICAgfHwgIW1vZHVsZV9pbml0X2xheW91dF9zZWN0aW9uKHNu YW1lKSkNCj4gICAJCQkJY29udGludWU7DQo+IC0JCQlzLT5zaF9lbnRzaXplID0gKGdldF9vZmZz ZXQobW9kLCAmbW9kLT5pbml0X2xheW91dC5zaXplLCBzLCBpKQ0KPiArCQkJcy0+c2hfZW50c2l6 ZSA9IChtb2R1bGVfZ2V0X29mZnNldChtb2QsICZtb2QtPmluaXRfbGF5b3V0LnNpemUsIHMsIGkp DQo+ICAgCQkJCQkgfCBJTklUX09GRlNFVF9NQVNLKTsNCj4gICAJCQlwcl9kZWJ1ZygiXHQlc1xu Iiwgc25hbWUpOw0KPiAgIAkJfQ0KPiBAQCAtMjI2NywyMjggKzIyNTEsNiBAQCBzdGF0aWMgdm9p ZCBmcmVlX21vZGluZm8oc3RydWN0IG1vZHVsZSAqbW9kKQ0KPiAgIAl9DQo+ICAgfQ0KPiAgIA0K PiAtI2lmZGVmIENPTkZJR19LQUxMU1lNUw0KPiAtDQo+IC0vKiBMb29rdXAgZXhwb3J0ZWQgc3lt Ym9sIGluIGdpdmVuIHJhbmdlIG9mIGtlcm5lbF9zeW1ib2xzICovDQo+IC1zdGF0aWMgY29uc3Qg c3RydWN0IGtlcm5lbF9zeW1ib2wgKmxvb2t1cF9leHBvcnRlZF9zeW1ib2woY29uc3QgY2hhciAq bmFtZSwNCj4gLQkJCQkJCQkgIGNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sICpzdGFydCwNCj4g LQkJCQkJCQkgIGNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sICpzdG9wKQ0KPiAtew0KPiAtCXJl dHVybiBic2VhcmNoKG5hbWUsIHN0YXJ0LCBzdG9wIC0gc3RhcnQsDQo+IC0JCQlzaXplb2Yoc3Ry dWN0IGtlcm5lbF9zeW1ib2wpLCBjbXBfbmFtZSk7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbnQg aXNfZXhwb3J0ZWQoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwNCj4gLQkJ ICAgICAgIGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZCkNCj4gLXsNCj4gLQljb25zdCBzdHJ1Y3Qg a2VybmVsX3N5bWJvbCAqa3M7DQo+IC0JaWYgKCFtb2QpDQo+IC0JCWtzID0gbG9va3VwX2V4cG9y dGVkX3N5bWJvbChuYW1lLCBfX3N0YXJ0X19fa3N5bXRhYiwgX19zdG9wX19fa3N5bXRhYik7DQo+ IC0JZWxzZQ0KPiAtCQlrcyA9IGxvb2t1cF9leHBvcnRlZF9zeW1ib2wobmFtZSwgbW9kLT5zeW1z LCBtb2QtPnN5bXMgKyBtb2QtPm51bV9zeW1zKTsNCj4gLQ0KPiAtCXJldHVybiBrcyAhPSBOVUxM ICYmIGtlcm5lbF9zeW1ib2xfdmFsdWUoa3MpID09IHZhbHVlOw0KPiAtfQ0KPiAtDQo+IC0vKiBB cyBwZXIgbm0gKi8NCj4gLXN0YXRpYyBjaGFyIGVsZl90eXBlKGNvbnN0IEVsZl9TeW0gKnN5bSwg Y29uc3Qgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykNCj4gLXsNCj4gLQljb25zdCBFbGZfU2hkciAq c2VjaGRycyA9IGluZm8tPnNlY2hkcnM7DQo+IC0NCj4gLQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5z dF9pbmZvKSA9PSBTVEJfV0VBSykgew0KPiAtCQlpZiAoRUxGX1NUX1RZUEUoc3ltLT5zdF9pbmZv KSA9PSBTVFRfT0JKRUNUKQ0KPiAtCQkJcmV0dXJuICd2JzsNCj4gLQkJZWxzZQ0KPiAtCQkJcmV0 dXJuICd3JzsNCj4gLQl9DQo+IC0JaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQ0KPiAt CQlyZXR1cm4gJ1UnOw0KPiAtCWlmIChzeW0tPnN0X3NobmR4ID09IFNITl9BQlMgfHwgc3ltLT5z dF9zaG5keCA9PSBpbmZvLT5pbmRleC5wY3B1KQ0KPiAtCQlyZXR1cm4gJ2EnOw0KPiAtCWlmIChz eW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpDQo+IC0JCXJldHVybiAnPyc7DQo+IC0JaWYg KHNlY2hkcnNbc3ltLT5zdF9zaG5keF0uc2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKQ0KPiAtCQly ZXR1cm4gJ3QnOw0KPiAtCWlmIChzZWNoZHJzW3N5bS0+c3Rfc2huZHhdLnNoX2ZsYWdzICYgU0hG X0FMTE9DDQo+IC0JICAgICYmIHNlY2hkcnNbc3ltLT5zdF9zaG5keF0uc2hfdHlwZSAhPSBTSFRf Tk9CSVRTKSB7DQo+IC0JCWlmICghKHNlY2hkcnNbc3ltLT5zdF9zaG5keF0uc2hfZmxhZ3MgJiBT SEZfV1JJVEUpKQ0KPiAtCQkJcmV0dXJuICdyJzsNCj4gLQkJZWxzZSBpZiAoc2VjaGRyc1tzeW0t PnN0X3NobmR4XS5zaF9mbGFncyAmIEFSQ0hfU0hGX1NNQUxMKQ0KPiAtCQkJcmV0dXJuICdnJzsN Cj4gLQkJZWxzZQ0KPiAtCQkJcmV0dXJuICdkJzsNCj4gLQl9DQo+IC0JaWYgKHNlY2hkcnNbc3lt LT5zdF9zaG5keF0uc2hfdHlwZSA9PSBTSFRfTk9CSVRTKSB7DQo+IC0JCWlmIChzZWNoZHJzW3N5 bS0+c3Rfc2huZHhdLnNoX2ZsYWdzICYgQVJDSF9TSEZfU01BTEwpDQo+IC0JCQlyZXR1cm4gJ3Mn Ow0KPiAtCQllbHNlDQo+IC0JCQlyZXR1cm4gJ2InOw0KPiAtCX0NCj4gLQlpZiAoc3Ryc3RhcnRz KGluZm8tPnNlY3N0cmluZ3MgKyBzZWNoZHJzW3N5bS0+c3Rfc2huZHhdLnNoX25hbWUsDQo+IC0J CSAgICAgICIuZGVidWciKSkgew0KPiAtCQlyZXR1cm4gJ24nOw0KPiAtCX0NCj4gLQlyZXR1cm4g Jz8nOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgYm9vbCBpc19jb3JlX3N5bWJvbChjb25zdCBFbGZf U3ltICpzcmMsIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLA0KPiAtCQkJdW5zaWduZWQgaW50IHNo bnVtLCB1bnNpZ25lZCBpbnQgcGNwdW5keCkNCj4gLXsNCj4gLQljb25zdCBFbGZfU2hkciAqc2Vj Ow0KPiAtDQo+IC0JaWYgKHNyYy0+c3Rfc2huZHggPT0gU0hOX1VOREVGDQo+IC0JICAgIHx8IHNy Yy0+c3Rfc2huZHggPj0gc2hudW0NCj4gLQkgICAgfHwgIXNyYy0+c3RfbmFtZSkNCj4gLQkJcmV0 dXJuIGZhbHNlOw0KPiAtDQo+IC0jaWZkZWYgQ09ORklHX0tBTExTWU1TX0FMTA0KPiAtCWlmIChz cmMtPnN0X3NobmR4ID09IHBjcHVuZHgpDQo+IC0JCXJldHVybiB0cnVlOw0KPiAtI2VuZGlmDQo+ IC0NCj4gLQlzZWMgPSBzZWNoZHJzICsgc3JjLT5zdF9zaG5keDsNCj4gLQlpZiAoIShzZWMtPnNo X2ZsYWdzICYgU0hGX0FMTE9DKQ0KPiAtI2lmbmRlZiBDT05GSUdfS0FMTFNZTVNfQUxMDQo+IC0J ICAgIHx8ICEoc2VjLT5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIpDQo+IC0jZW5kaWYNCj4gLQkg ICAgfHwgKHNlYy0+c2hfZW50c2l6ZSAmIElOSVRfT0ZGU0VUX01BU0spKQ0KPiAtCQlyZXR1cm4g ZmFsc2U7DQo+IC0NCj4gLQlyZXR1cm4gdHJ1ZTsNCj4gLX0NCj4gLQ0KPiAtLyoNCj4gLSAqIFdl IG9ubHkgYWxsb2NhdGUgYW5kIGNvcHkgdGhlIHN0cmluZ3MgbmVlZGVkIGJ5IHRoZSBwYXJ0cyBv ZiBzeW10YWINCj4gLSAqIHdlIGtlZXAuICBUaGlzIGlzIHNpbXBsZSwgYnV0IGhhcyB0aGUgZWZm ZWN0IG9mIG1ha2luZyBtdWx0aXBsZQ0KPiAtICogY29waWVzIG9mIGR1cGxpY2F0ZXMuICBXZSBj b3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQsIHNlZQ0KPiAtICogbGludXgta2VybmVsIHRocmVh ZCBzdGFydGluZyB3aXRoDQo+IC0gKiA8NzNkZWZiNWU0YmNhMDRhNjQzMTM5MmNjMzQxMTEyYjFA bG9jYWxob3N0Pi4NCj4gLSAqLw0KPiAtc3RhdGljIHZvaWQgbGF5b3V0X3N5bXRhYihzdHJ1Y3Qg bW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pDQo+IC17DQo+IC0JRWxmX1NoZHIg KnN5bXNlY3QgPSBpbmZvLT5zZWNoZHJzICsgaW5mby0+aW5kZXguc3ltOw0KPiAtCUVsZl9TaGRy ICpzdHJzZWN0ID0gaW5mby0+c2VjaGRycyArIGluZm8tPmluZGV4LnN0cjsNCj4gLQljb25zdCBF bGZfU3ltICpzcmM7DQo+IC0JdW5zaWduZWQgaW50IGksIG5zcmMsIG5kc3QsIHN0cnRhYl9zaXpl ID0gMDsNCj4gLQ0KPiAtCS8qIFB1dCBzeW1ib2wgc2VjdGlvbiBhdCBlbmQgb2YgaW5pdCBwYXJ0 IG9mIG1vZHVsZS4gKi8NCj4gLQlzeW1zZWN0LT5zaF9mbGFncyB8PSBTSEZfQUxMT0M7DQo+IC0J c3ltc2VjdC0+c2hfZW50c2l6ZSA9IGdldF9vZmZzZXQobW9kLCAmbW9kLT5pbml0X2xheW91dC5z aXplLCBzeW1zZWN0LA0KPiAtCQkJCQkgaW5mby0+aW5kZXguc3ltKSB8IElOSVRfT0ZGU0VUX01B U0s7DQo+IC0JcHJfZGVidWcoIlx0JXNcbiIsIGluZm8tPnNlY3N0cmluZ3MgKyBzeW1zZWN0LT5z aF9uYW1lKTsNCj4gLQ0KPiAtCXNyYyA9ICh2b2lkICopaW5mby0+aGRyICsgc3ltc2VjdC0+c2hf b2Zmc2V0Ow0KPiAtCW5zcmMgPSBzeW1zZWN0LT5zaF9zaXplIC8gc2l6ZW9mKCpzcmMpOw0KPiAt DQo+IC0JLyogQ29tcHV0ZSB0b3RhbCBzcGFjZSByZXF1aXJlZCBmb3IgdGhlIGNvcmUgc3ltYm9s cycgc3RydGFiLiAqLw0KPiAtCWZvciAobmRzdCA9IGkgPSAwOyBpIDwgbnNyYzsgaSsrKSB7DQo+ IC0JCWlmIChpID09IDAgfHwgaXNfbGl2ZXBhdGNoX21vZHVsZShtb2QpIHx8DQo+IC0JCSAgICBp c19jb3JlX3N5bWJvbChzcmMraSwgaW5mby0+c2VjaGRycywgaW5mby0+aGRyLT5lX3NobnVtLA0K PiAtCQkJCSAgIGluZm8tPmluZGV4LnBjcHUpKSB7DQo+IC0JCQlzdHJ0YWJfc2l6ZSArPSBzdHJs ZW4oJmluZm8tPnN0cnRhYltzcmNbaV0uc3RfbmFtZV0pKzE7DQo+IC0JCQluZHN0Kys7DQo+IC0J CX0NCj4gLQl9DQo+IC0NCj4gLQkvKiBBcHBlbmQgcm9vbSBmb3IgY29yZSBzeW1ib2xzIGF0IGVu ZCBvZiBjb3JlIHBhcnQuICovDQo+IC0JaW5mby0+c3ltb2ZmcyA9IEFMSUdOKG1vZC0+Y29yZV9s YXlvdXQuc2l6ZSwgc3ltc2VjdC0+c2hfYWRkcmFsaWduID86IDEpOw0KPiAtCWluZm8tPnN0cm9m ZnMgPSBtb2QtPmNvcmVfbGF5b3V0LnNpemUgPSBpbmZvLT5zeW1vZmZzICsgbmRzdCAqIHNpemVv ZihFbGZfU3ltKTsNCj4gLQltb2QtPmNvcmVfbGF5b3V0LnNpemUgKz0gc3RydGFiX3NpemU7DQo+ IC0JaW5mby0+Y29yZV90eXBlb2ZmcyA9IG1vZC0+Y29yZV9sYXlvdXQuc2l6ZTsNCj4gLQltb2Qt PmNvcmVfbGF5b3V0LnNpemUgKz0gbmRzdCAqIHNpemVvZihjaGFyKTsNCj4gLQltb2QtPmNvcmVf bGF5b3V0LnNpemUgPSBkZWJ1Z19hbGlnbihtb2QtPmNvcmVfbGF5b3V0LnNpemUpOw0KPiAtDQo+ IC0JLyogUHV0IHN0cmluZyB0YWJsZSBzZWN0aW9uIGF0IGVuZCBvZiBpbml0IHBhcnQgb2YgbW9k dWxlLiAqLw0KPiAtCXN0cnNlY3QtPnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsNCj4gLQlzdHJzZWN0 LT5zaF9lbnRzaXplID0gZ2V0X29mZnNldChtb2QsICZtb2QtPmluaXRfbGF5b3V0LnNpemUsIHN0 cnNlY3QsDQo+IC0JCQkJCSBpbmZvLT5pbmRleC5zdHIpIHwgSU5JVF9PRkZTRVRfTUFTSzsNCj4g LQlwcl9kZWJ1ZygiXHQlc1xuIiwgaW5mby0+c2Vjc3RyaW5ncyArIHN0cnNlY3QtPnNoX25hbWUp Ow0KPiAtDQo+IC0JLyogV2UnbGwgdGFjayB0ZW1wb3JhcnkgbW9kX2thbGxzeW1zIG9uIHRoZSBl bmQuICovDQo+IC0JbW9kLT5pbml0X2xheW91dC5zaXplID0gQUxJR04obW9kLT5pbml0X2xheW91 dC5zaXplLA0KPiAtCQkJCSAgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBtb2Rfa2FsbHN5bXMpKTsN Cj4gLQlpbmZvLT5tb2Rfa2FsbHN5bXNfaW5pdF9vZmYgPSBtb2QtPmluaXRfbGF5b3V0LnNpemU7 DQo+IC0JbW9kLT5pbml0X2xheW91dC5zaXplICs9IHNpemVvZihzdHJ1Y3QgbW9kX2thbGxzeW1z KTsNCj4gLQlpbmZvLT5pbml0X3R5cGVvZmZzID0gbW9kLT5pbml0X2xheW91dC5zaXplOw0KPiAt CW1vZC0+aW5pdF9sYXlvdXQuc2l6ZSArPSBuc3JjICogc2l6ZW9mKGNoYXIpOw0KPiAtCW1vZC0+ aW5pdF9sYXlvdXQuc2l6ZSA9IGRlYnVnX2FsaWduKG1vZC0+aW5pdF9sYXlvdXQuc2l6ZSk7DQo+ IC19DQo+IC0NCj4gLS8qDQo+IC0gKiBXZSB1c2UgdGhlIGZ1bGwgc3ltdGFiIGFuZCBzdHJ0YWIg d2hpY2ggbGF5b3V0X3N5bXRhYiBhcnJhbmdlZCB0bw0KPiAtICogYmUgYXBwZW5kZWQgdG8gdGhl IGluaXQgc2VjdGlvbi4gIExhdGVyIHdlIHN3aXRjaCB0byB0aGUgY3V0LWRvd24NCj4gLSAqIGNv cmUtb25seSBvbmVzLg0KPiAtICovDQo+IC1zdGF0aWMgdm9pZCBhZGRfa2FsbHN5bXMoc3RydWN0 IG1vZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQ0KPiAtew0KPiAtCXVu c2lnbmVkIGludCBpLCBuZHN0Ow0KPiAtCWNvbnN0IEVsZl9TeW0gKnNyYzsNCj4gLQlFbGZfU3lt ICpkc3Q7DQo+IC0JY2hhciAqczsNCj4gLQlFbGZfU2hkciAqc3ltc2VjID0gJmluZm8tPnNlY2hk cnNbaW5mby0+aW5kZXguc3ltXTsNCj4gLQ0KPiAtCS8qIFNldCB1cCB0byBwb2ludCBpbnRvIGlu aXQgc2VjdGlvbi4gKi8NCj4gLQltb2QtPmthbGxzeW1zID0gbW9kLT5pbml0X2xheW91dC5iYXNl ICsgaW5mby0+bW9kX2thbGxzeW1zX2luaXRfb2ZmOw0KPiAtDQo+IC0JbW9kLT5rYWxsc3ltcy0+ c3ltdGFiID0gKHZvaWQgKilzeW1zZWMtPnNoX2FkZHI7DQo+IC0JbW9kLT5rYWxsc3ltcy0+bnVt X3N5bXRhYiA9IHN5bXNlYy0+c2hfc2l6ZSAvIHNpemVvZihFbGZfU3ltKTsNCj4gLQkvKiBNYWtl IHN1cmUgd2UgZ2V0IHBlcm1hbmVudCBzdHJ0YWI6IGRvbid0IHVzZSBpbmZvLT5zdHJ0YWIuICov DQo+IC0JbW9kLT5rYWxsc3ltcy0+c3RydGFiID0gKHZvaWQgKilpbmZvLT5zZWNoZHJzW2luZm8t PmluZGV4LnN0cl0uc2hfYWRkcjsNCj4gLQltb2QtPmthbGxzeW1zLT50eXBldGFiID0gbW9kLT5p bml0X2xheW91dC5iYXNlICsgaW5mby0+aW5pdF90eXBlb2ZmczsNCj4gLQ0KPiAtCS8qDQo+IC0J ICogTm93IHBvcHVsYXRlIHRoZSBjdXQgZG93biBjb3JlIGthbGxzeW1zIGZvciBhZnRlciBpbml0 DQo+IC0JICogYW5kIHNldCB0eXBlcyB1cCB3aGlsZSB3ZSBzdGlsbCBoYXZlIGFjY2VzcyB0byBz ZWN0aW9ucy4NCj4gLQkgKi8NCj4gLQltb2QtPmNvcmVfa2FsbHN5bXMuc3ltdGFiID0gZHN0ID0g bW9kLT5jb3JlX2xheW91dC5iYXNlICsgaW5mby0+c3ltb2ZmczsNCj4gLQltb2QtPmNvcmVfa2Fs bHN5bXMuc3RydGFiID0gcyA9IG1vZC0+Y29yZV9sYXlvdXQuYmFzZSArIGluZm8tPnN0cm9mZnM7 DQo+IC0JbW9kLT5jb3JlX2thbGxzeW1zLnR5cGV0YWIgPSBtb2QtPmNvcmVfbGF5b3V0LmJhc2Ug KyBpbmZvLT5jb3JlX3R5cGVvZmZzOw0KPiAtCXNyYyA9IG1vZC0+a2FsbHN5bXMtPnN5bXRhYjsN Cj4gLQlmb3IgKG5kc3QgPSBpID0gMDsgaSA8IG1vZC0+a2FsbHN5bXMtPm51bV9zeW10YWI7IGkr Kykgew0KPiAtCQltb2QtPmthbGxzeW1zLT50eXBldGFiW2ldID0gZWxmX3R5cGUoc3JjICsgaSwg aW5mbyk7DQo+IC0JCWlmIChpID09IDAgfHwgaXNfbGl2ZXBhdGNoX21vZHVsZShtb2QpIHx8DQo+ IC0JCSAgICBpc19jb3JlX3N5bWJvbChzcmMraSwgaW5mby0+c2VjaGRycywgaW5mby0+aGRyLT5l X3NobnVtLA0KPiAtCQkJCSAgIGluZm8tPmluZGV4LnBjcHUpKSB7DQo+IC0JCQltb2QtPmNvcmVf a2FsbHN5bXMudHlwZXRhYltuZHN0XSA9DQo+IC0JCQkgICAgbW9kLT5rYWxsc3ltcy0+dHlwZXRh YltpXTsNCj4gLQkJCWRzdFtuZHN0XSA9IHNyY1tpXTsNCj4gLQkJCWRzdFtuZHN0KytdLnN0X25h bWUgPSBzIC0gbW9kLT5jb3JlX2thbGxzeW1zLnN0cnRhYjsNCj4gLQkJCXMgKz0gc3RybGNweShz LCAmbW9kLT5rYWxsc3ltcy0+c3RydGFiW3NyY1tpXS5zdF9uYW1lXSwNCj4gLQkJCQkgICAgIEtT WU1fTkFNRV9MRU4pICsgMTsNCj4gLQkJfQ0KPiAtCX0NCj4gLQltb2QtPmNvcmVfa2FsbHN5bXMu bnVtX3N5bXRhYiA9IG5kc3Q7DQo+IC19DQo+IC0jZWxzZQ0KPiAtc3RhdGljIGlubGluZSB2b2lk IGxheW91dF9zeW10YWIoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZv KQ0KPiAtew0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgdm9pZCBhZGRfa2FsbHN5bXMoc3RydWN0IG1v ZHVsZSAqbW9kLCBjb25zdCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQ0KPiAtew0KPiAtfQ0KPiAt I2VuZGlmIC8qIENPTkZJR19LQUxMU1lNUyAqLw0KPiAtDQo+IC0jaWYgSVNfRU5BQkxFRChDT05G SUdfS0FMTFNZTVMpICYmIElTX0VOQUJMRUQoQ09ORklHX1NUQUNLVFJBQ0VfQlVJTERfSUQpDQo+ IC1zdGF0aWMgdm9pZCBpbml0X2J1aWxkX2lkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3Qgc3Ry dWN0IGxvYWRfaW5mbyAqaW5mbykNCj4gLXsNCj4gLQljb25zdCBFbGZfU2hkciAqc2VjaGRyOw0K PiAtCXVuc2lnbmVkIGludCBpOw0KPiAtDQo+IC0JZm9yIChpID0gMDsgaSA8IGluZm8tPmhkci0+ ZV9zaG51bTsgaSsrKSB7DQo+IC0JCXNlY2hkciA9ICZpbmZvLT5zZWNoZHJzW2ldOw0KPiAtCQlp ZiAoIXNlY3RfZW1wdHkoc2VjaGRyKSAmJiBzZWNoZHItPnNoX3R5cGUgPT0gU0hUX05PVEUgJiYN Cj4gLQkJICAgICFidWlsZF9pZF9wYXJzZV9idWYoKHZvaWQgKilzZWNoZHItPnNoX2FkZHIsIG1v ZC0+YnVpbGRfaWQsDQo+IC0JCQkJCXNlY2hkci0+c2hfc2l6ZSkpDQo+IC0JCQlicmVhazsNCj4g LQl9DQo+IC19DQo+IC0jZWxzZQ0KPiAtc3RhdGljIHZvaWQgaW5pdF9idWlsZF9pZChzdHJ1Y3Qg bW9kdWxlICptb2QsIGNvbnN0IHN0cnVjdCBsb2FkX2luZm8gKmluZm8pDQo+IC17DQo+IC19DQo+ IC0jZW5kaWYNCj4gLQ0KPiAgIHN0YXRpYyB2b2lkIGR5bmFtaWNfZGVidWdfc2V0dXAoc3RydWN0 IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgX2RkZWJ1ZyAqZGVidWcsIHVuc2lnbmVkIGludCBudW0pDQo+ ICAgew0KPiAgIAlpZiAoIWRlYnVnKQ0KPiBAQCAtMzc5OSwyODcgKzM1NjEsNiBAQCBzdGF0aWMg aW5saW5lIGludCB3aXRoaW4odW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpzdGFydCwgdW5zaWdu ZWQgbG9uZyBzaXplKQ0KPiAgIAlyZXR1cm4gKCh2b2lkICopYWRkciA+PSBzdGFydCAmJiAodm9p ZCAqKWFkZHIgPCBzdGFydCArIHNpemUpOw0KPiAgIH0NCj4gICANCj4gLSNpZmRlZiBDT05GSUdf S0FMTFNZTVMNCj4gLS8qDQo+IC0gKiBUaGlzIGlnbm9yZXMgdGhlIGludGVuc2VseSBhbm5veWlu ZyAibWFwcGluZyBzeW1ib2xzIiBmb3VuZA0KPiAtICogaW4gQVJNIEVMRiBmaWxlczogJGEsICR0 IGFuZCAkZC4NCj4gLSAqLw0KPiAtc3RhdGljIGlubGluZSBpbnQgaXNfYXJtX21hcHBpbmdfc3lt Ym9sKGNvbnN0IGNoYXIgKnN0cikNCj4gLXsNCj4gLQlpZiAoc3RyWzBdID09ICcuJyAmJiBzdHJb MV0gPT0gJ0wnKQ0KPiAtCQlyZXR1cm4gdHJ1ZTsNCj4gLQlyZXR1cm4gc3RyWzBdID09ICckJyAm JiBzdHJjaHIoImF4dGQiLCBzdHJbMV0pDQo+IC0JICAgICAgICYmIChzdHJbMl0gPT0gJ1wwJyB8 fCBzdHJbMl0gPT0gJy4nKTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGNvbnN0IGNoYXIgKmthbGxz eW1zX3N5bWJvbF9uYW1lKHN0cnVjdCBtb2Rfa2FsbHN5bXMgKmthbGxzeW1zLCB1bnNpZ25lZCBp bnQgc3ltbnVtKQ0KPiAtew0KPiAtCXJldHVybiBrYWxsc3ltcy0+c3RydGFiICsga2FsbHN5bXMt PnN5bXRhYltzeW1udW1dLnN0X25hbWU7DQo+IC19DQo+IC0NCj4gLS8qDQo+IC0gKiBHaXZlbiBh IG1vZHVsZSBhbmQgYWRkcmVzcywgZmluZCB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2wgYW5kIHJl dHVybiBpdHMgbmFtZQ0KPiAtICogd2hpbGUgcHJvdmlkaW5nIGl0cyBzaXplIGFuZCBvZmZzZXQg aWYgbmVlZGVkLg0KPiAtICovDQo+IC1zdGF0aWMgY29uc3QgY2hhciAqZmluZF9rYWxsc3ltc19z eW1ib2woc3RydWN0IG1vZHVsZSAqbW9kLA0KPiAtCQkJCQl1bnNpZ25lZCBsb25nIGFkZHIsDQo+ IC0JCQkJCXVuc2lnbmVkIGxvbmcgKnNpemUsDQo+IC0JCQkJCXVuc2lnbmVkIGxvbmcgKm9mZnNl dCkNCj4gLXsNCj4gLQl1bnNpZ25lZCBpbnQgaSwgYmVzdCA9IDA7DQo+IC0JdW5zaWduZWQgbG9u ZyBuZXh0dmFsLCBiZXN0dmFsOw0KPiAtCXN0cnVjdCBtb2Rfa2FsbHN5bXMgKmthbGxzeW1zID0g cmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2FsbHN5bXMpOw0KPiAtDQo+IC0JLyogQXQgd29y c2UsIG5leHQgdmFsdWUgaXMgYXQgZW5kIG9mIG1vZHVsZSAqLw0KPiAtCWlmICh3aXRoaW5fbW9k dWxlX2luaXQoYWRkciwgbW9kKSkNCj4gLQkJbmV4dHZhbCA9ICh1bnNpZ25lZCBsb25nKW1vZC0+ aW5pdF9sYXlvdXQuYmFzZSttb2QtPmluaXRfbGF5b3V0LnRleHRfc2l6ZTsNCj4gLQllbHNlDQo+ IC0JCW5leHR2YWwgPSAodW5zaWduZWQgbG9uZyltb2QtPmNvcmVfbGF5b3V0LmJhc2UrbW9kLT5j b3JlX2xheW91dC50ZXh0X3NpemU7DQo+IC0NCj4gLQliZXN0dmFsID0ga2FsbHN5bXNfc3ltYm9s X3ZhbHVlKCZrYWxsc3ltcy0+c3ltdGFiW2Jlc3RdKTsNCj4gLQ0KPiAtCS8qDQo+IC0JICogU2Nh biBmb3IgY2xvc2VzdCBwcmVjZWRpbmcgc3ltYm9sLCBhbmQgbmV4dCBzeW1ib2wuIChFTEYNCj4g LQkgKiBzdGFydHMgcmVhbCBzeW1ib2xzIGF0IDEpLg0KPiAtCSAqLw0KPiAtCWZvciAoaSA9IDE7 IGkgPCBrYWxsc3ltcy0+bnVtX3N5bXRhYjsgaSsrKSB7DQo+IC0JCWNvbnN0IEVsZl9TeW0gKnN5 bSA9ICZrYWxsc3ltcy0+c3ltdGFiW2ldOw0KPiAtCQl1bnNpZ25lZCBsb25nIHRoaXN2YWwgPSBr YWxsc3ltc19zeW1ib2xfdmFsdWUoc3ltKTsNCj4gLQ0KPiAtCQlpZiAoc3ltLT5zdF9zaG5keCA9 PSBTSE5fVU5ERUYpDQo+IC0JCQljb250aW51ZTsNCj4gLQ0KPiAtCQkvKg0KPiAtCQkgKiBXZSBp Z25vcmUgdW5uYW1lZCBzeW1ib2xzOiB0aGV5J3JlIHVuaW5mb3JtYXRpdmUNCj4gLQkJICogYW5k IGluc2VydGVkIGF0IGEgd2hpbS4NCj4gLQkJICovDQo+IC0JCWlmICgqa2FsbHN5bXNfc3ltYm9s X25hbWUoa2FsbHN5bXMsIGkpID09ICdcMCcNCj4gLQkJICAgIHx8IGlzX2FybV9tYXBwaW5nX3N5 bWJvbChrYWxsc3ltc19zeW1ib2xfbmFtZShrYWxsc3ltcywgaSkpKQ0KPiAtCQkJY29udGludWU7 DQo+IC0NCj4gLQkJaWYgKHRoaXN2YWwgPD0gYWRkciAmJiB0aGlzdmFsID4gYmVzdHZhbCkgew0K PiAtCQkJYmVzdCA9IGk7DQo+IC0JCQliZXN0dmFsID0gdGhpc3ZhbDsNCj4gLQkJfQ0KPiAtCQlp ZiAodGhpc3ZhbCA+IGFkZHIgJiYgdGhpc3ZhbCA8IG5leHR2YWwpDQo+IC0JCQluZXh0dmFsID0g dGhpc3ZhbDsNCj4gLQl9DQo+IC0NCj4gLQlpZiAoIWJlc3QpDQo+IC0JCXJldHVybiBOVUxMOw0K PiAtDQo+IC0JaWYgKHNpemUpDQo+IC0JCSpzaXplID0gbmV4dHZhbCAtIGJlc3R2YWw7DQo+IC0J aWYgKG9mZnNldCkNCj4gLQkJKm9mZnNldCA9IGFkZHIgLSBiZXN0dmFsOw0KPiAtDQo+IC0JcmV0 dXJuIGthbGxzeW1zX3N5bWJvbF9uYW1lKGthbGxzeW1zLCBiZXN0KTsNCj4gLX0NCj4gLQ0KPiAt dm9pZCAqIF9fd2VhayBkZXJlZmVyZW5jZV9tb2R1bGVfZnVuY3Rpb25fZGVzY3JpcHRvcihzdHJ1 Y3QgbW9kdWxlICptb2QsDQo+IC0JCQkJCQkgICAgIHZvaWQgKnB0cikNCj4gLXsNCj4gLQlyZXR1 cm4gcHRyOw0KPiAtfQ0KPiAtDQo+IC0vKg0KPiAtICogRm9yIGthbGxzeW1zIHRvIGFzayBmb3Ig YWRkcmVzcyByZXNvbHV0aW9uLiAgTlVMTCBtZWFucyBub3QgZm91bmQuICBDYXJlZnVsDQo+IC0g KiBub3QgdG8gbG9jayB0byBhdm9pZCBkZWFkbG9jayBvbiBvb3BzZXMsIHNpbXBseSBkaXNhYmxl IHByZWVtcHRpb24uDQo+IC0gKi8NCj4gLWNvbnN0IGNoYXIgKm1vZHVsZV9hZGRyZXNzX2xvb2t1 cCh1bnNpZ25lZCBsb25nIGFkZHIsDQo+IC0JCQkgICAgdW5zaWduZWQgbG9uZyAqc2l6ZSwNCj4g LQkJCSAgICB1bnNpZ25lZCBsb25nICpvZmZzZXQsDQo+IC0JCQkgICAgY2hhciAqKm1vZG5hbWUs DQo+IC0JCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKm1vZGJ1aWxkaWQsDQo+IC0JCQkgICAg Y2hhciAqbmFtZWJ1ZikNCj4gLXsNCj4gLQljb25zdCBjaGFyICpyZXQgPSBOVUxMOw0KPiAtCXN0 cnVjdCBtb2R1bGUgKm1vZDsNCj4gLQ0KPiAtCXByZWVtcHRfZGlzYWJsZSgpOw0KPiAtCW1vZCA9 IF9fbW9kdWxlX2FkZHJlc3MoYWRkcik7DQo+IC0JaWYgKG1vZCkgew0KPiAtCQlpZiAobW9kbmFt ZSkNCj4gLQkJCSptb2RuYW1lID0gbW9kLT5uYW1lOw0KPiAtCQlpZiAobW9kYnVpbGRpZCkgew0K PiAtI2lmIElTX0VOQUJMRUQoQ09ORklHX1NUQUNLVFJBQ0VfQlVJTERfSUQpDQo+IC0JCQkqbW9k YnVpbGRpZCA9IG1vZC0+YnVpbGRfaWQ7DQo+IC0jZWxzZQ0KPiAtCQkJKm1vZGJ1aWxkaWQgPSBO VUxMOw0KPiAtI2VuZGlmDQo+IC0JCX0NCj4gLQ0KPiAtCQlyZXQgPSBmaW5kX2thbGxzeW1zX3N5 bWJvbChtb2QsIGFkZHIsIHNpemUsIG9mZnNldCk7DQo+IC0JfQ0KPiAtCS8qIE1ha2UgYSBjb3B5 IGluIGhlcmUgd2hlcmUgaXQncyBzYWZlICovDQo+IC0JaWYgKHJldCkgew0KPiAtCQlzdHJuY3B5 KG5hbWVidWYsIHJldCwgS1NZTV9OQU1FX0xFTiAtIDEpOw0KPiAtCQlyZXQgPSBuYW1lYnVmOw0K PiAtCX0NCj4gLQlwcmVlbXB0X2VuYWJsZSgpOw0KPiAtDQo+IC0JcmV0dXJuIHJldDsNCj4gLX0N Cj4gLQ0KPiAtaW50IGxvb2t1cF9tb2R1bGVfc3ltYm9sX25hbWUodW5zaWduZWQgbG9uZyBhZGRy LCBjaGFyICpzeW1uYW1lKQ0KPiAtew0KPiAtCXN0cnVjdCBtb2R1bGUgKm1vZDsNCj4gLQ0KPiAt CXByZWVtcHRfZGlzYWJsZSgpOw0KPiAtCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1v ZHVsZXMsIGxpc3QpIHsNCj4gLQkJaWYgKG1vZC0+c3RhdGUgPT0gTU9EVUxFX1NUQVRFX1VORk9S TUVEKQ0KPiAtCQkJY29udGludWU7DQo+IC0JCWlmICh3aXRoaW5fbW9kdWxlKGFkZHIsIG1vZCkp IHsNCj4gLQkJCWNvbnN0IGNoYXIgKnN5bTsNCj4gLQ0KPiAtCQkJc3ltID0gZmluZF9rYWxsc3lt c19zeW1ib2wobW9kLCBhZGRyLCBOVUxMLCBOVUxMKTsNCj4gLQkJCWlmICghc3ltKQ0KPiAtCQkJ CWdvdG8gb3V0Ow0KPiAtDQo+IC0JCQlzdHJsY3B5KHN5bW5hbWUsIHN5bSwgS1NZTV9OQU1FX0xF Tik7DQo+IC0JCQlwcmVlbXB0X2VuYWJsZSgpOw0KPiAtCQkJcmV0dXJuIDA7DQo+IC0JCX0NCj4g LQl9DQo+IC1vdXQ6DQo+IC0JcHJlZW1wdF9lbmFibGUoKTsNCj4gLQlyZXR1cm4gLUVSQU5HRTsN Cj4gLX0NCj4gLQ0KPiAtaW50IGxvb2t1cF9tb2R1bGVfc3ltYm9sX2F0dHJzKHVuc2lnbmVkIGxv bmcgYWRkciwgdW5zaWduZWQgbG9uZyAqc2l6ZSwNCj4gLQkJCXVuc2lnbmVkIGxvbmcgKm9mZnNl dCwgY2hhciAqbW9kbmFtZSwgY2hhciAqbmFtZSkNCj4gLXsNCj4gLQlzdHJ1Y3QgbW9kdWxlICpt b2Q7DQo+IC0NCj4gLQlwcmVlbXB0X2Rpc2FibGUoKTsNCj4gLQlsaXN0X2Zvcl9lYWNoX2VudHJ5 X3JjdShtb2QsICZtb2R1bGVzLCBsaXN0KSB7DQo+IC0JCWlmIChtb2QtPnN0YXRlID09IE1PRFVM RV9TVEFURV9VTkZPUk1FRCkNCj4gLQkJCWNvbnRpbnVlOw0KPiAtCQlpZiAod2l0aGluX21vZHVs ZShhZGRyLCBtb2QpKSB7DQo+IC0JCQljb25zdCBjaGFyICpzeW07DQo+IC0NCj4gLQkJCXN5bSA9 IGZpbmRfa2FsbHN5bXNfc3ltYm9sKG1vZCwgYWRkciwgc2l6ZSwgb2Zmc2V0KTsNCj4gLQkJCWlm ICghc3ltKQ0KPiAtCQkJCWdvdG8gb3V0Ow0KPiAtCQkJaWYgKG1vZG5hbWUpDQo+IC0JCQkJc3Ry bGNweShtb2RuYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7DQo+IC0JCQlpZiAobmFt ZSkNCj4gLQkJCQlzdHJsY3B5KG5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTik7DQo+IC0JCQlwcmVl bXB0X2VuYWJsZSgpOw0KPiAtCQkJcmV0dXJuIDA7DQo+IC0JCX0NCj4gLQl9DQo+IC1vdXQ6DQo+ IC0JcHJlZW1wdF9lbmFibGUoKTsNCj4gLQlyZXR1cm4gLUVSQU5HRTsNCj4gLX0NCj4gLQ0KPiAt aW50IG1vZHVsZV9nZXRfa2FsbHN5bSh1bnNpZ25lZCBpbnQgc3ltbnVtLCB1bnNpZ25lZCBsb25n ICp2YWx1ZSwgY2hhciAqdHlwZSwNCj4gLQkJCWNoYXIgKm5hbWUsIGNoYXIgKm1vZHVsZV9uYW1l LCBpbnQgKmV4cG9ydGVkKQ0KPiAtew0KPiAtCXN0cnVjdCBtb2R1bGUgKm1vZDsNCj4gLQ0KPiAt CXByZWVtcHRfZGlzYWJsZSgpOw0KPiAtCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1v ZHVsZXMsIGxpc3QpIHsNCj4gLQkJc3RydWN0IG1vZF9rYWxsc3ltcyAqa2FsbHN5bXM7DQo+IC0N Cj4gLQkJaWYgKG1vZC0+c3RhdGUgPT0gTU9EVUxFX1NUQVRFX1VORk9STUVEKQ0KPiAtCQkJY29u dGludWU7DQo+IC0JCWthbGxzeW1zID0gcmN1X2RlcmVmZXJlbmNlX3NjaGVkKG1vZC0+a2FsbHN5 bXMpOw0KPiAtCQlpZiAoc3ltbnVtIDwga2FsbHN5bXMtPm51bV9zeW10YWIpIHsNCj4gLQkJCWNv bnN0IEVsZl9TeW0gKnN5bSA9ICZrYWxsc3ltcy0+c3ltdGFiW3N5bW51bV07DQo+IC0NCj4gLQkJ CSp2YWx1ZSA9IGthbGxzeW1zX3N5bWJvbF92YWx1ZShzeW0pOw0KPiAtCQkJKnR5cGUgPSBrYWxs c3ltcy0+dHlwZXRhYltzeW1udW1dOw0KPiAtCQkJc3RybGNweShuYW1lLCBrYWxsc3ltc19zeW1i b2xfbmFtZShrYWxsc3ltcywgc3ltbnVtKSwgS1NZTV9OQU1FX0xFTik7DQo+IC0JCQlzdHJsY3B5 KG1vZHVsZV9uYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTik7DQo+IC0JCQkqZXhwb3J0 ZWQgPSBpc19leHBvcnRlZChuYW1lLCAqdmFsdWUsIG1vZCk7DQo+IC0JCQlwcmVlbXB0X2VuYWJs ZSgpOw0KPiAtCQkJcmV0dXJuIDA7DQo+IC0JCX0NCj4gLQkJc3ltbnVtIC09IGthbGxzeW1zLT5u dW1fc3ltdGFiOw0KPiAtCX0NCj4gLQlwcmVlbXB0X2VuYWJsZSgpOw0KPiAtCXJldHVybiAtRVJB TkdFOw0KPiAtfQ0KPiAtDQo+IC0vKiBHaXZlbiBhIG1vZHVsZSBhbmQgbmFtZSBvZiBzeW1ib2ws IGZpbmQgYW5kIHJldHVybiB0aGUgc3ltYm9sJ3MgdmFsdWUgKi8NCj4gLXN0YXRpYyB1bnNpZ25l ZCBsb25nIGZpbmRfa2FsbHN5bXNfc3ltYm9sX3ZhbHVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29u c3QgY2hhciAqbmFtZSkNCj4gLXsNCj4gLQl1bnNpZ25lZCBpbnQgaTsNCj4gLQlzdHJ1Y3QgbW9k X2thbGxzeW1zICprYWxsc3ltcyA9IHJjdV9kZXJlZmVyZW5jZV9zY2hlZChtb2QtPmthbGxzeW1z KTsNCj4gLQ0KPiAtCWZvciAoaSA9IDA7IGkgPCBrYWxsc3ltcy0+bnVtX3N5bXRhYjsgaSsrKSB7 DQo+IC0JCWNvbnN0IEVsZl9TeW0gKnN5bSA9ICZrYWxsc3ltcy0+c3ltdGFiW2ldOw0KPiAtDQo+ IC0JCWlmIChzdHJjbXAobmFtZSwga2FsbHN5bXNfc3ltYm9sX25hbWUoa2FsbHN5bXMsIGkpKSA9 PSAwICYmDQo+IC0JCSAgICBzeW0tPnN0X3NobmR4ICE9IFNITl9VTkRFRikNCj4gLQkJCXJldHVy biBrYWxsc3ltc19zeW1ib2xfdmFsdWUoc3ltKTsNCj4gLQl9DQo+IC0JcmV0dXJuIDA7DQo+IC19 DQo+IC0NCj4gLS8qIExvb2sgZm9yIHRoaXMgbmFtZTogY2FuIGJlIG9mIGZvcm0gbW9kdWxlOm5h bWUuICovDQo+IC11bnNpZ25lZCBsb25nIG1vZHVsZV9rYWxsc3ltc19sb29rdXBfbmFtZShjb25z dCBjaGFyICpuYW1lKQ0KPiAtew0KPiAtCXN0cnVjdCBtb2R1bGUgKm1vZDsNCj4gLQljaGFyICpj b2xvbjsNCj4gLQl1bnNpZ25lZCBsb25nIHJldCA9IDA7DQo+IC0NCj4gLQkvKiBEb24ndCBsb2Nr OiB3ZSdyZSBpbiBlbm91Z2ggdHJvdWJsZSBhbHJlYWR5LiAqLw0KPiAtCXByZWVtcHRfZGlzYWJs ZSgpOw0KPiAtCWlmICgoY29sb24gPSBzdHJuY2hyKG5hbWUsIE1PRFVMRV9OQU1FX0xFTiwgJzon KSkgIT0gTlVMTCkgew0KPiAtCQlpZiAoKG1vZCA9IGZpbmRfbW9kdWxlX2FsbChuYW1lLCBjb2xv biAtIG5hbWUsIGZhbHNlKSkgIT0gTlVMTCkNCj4gLQkJCXJldCA9IGZpbmRfa2FsbHN5bXNfc3lt Ym9sX3ZhbHVlKG1vZCwgY29sb24rMSk7DQo+IC0JfSBlbHNlIHsNCj4gLQkJbGlzdF9mb3JfZWFj aF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgew0KPiAtCQkJaWYgKG1vZC0+c3RhdGUg PT0gTU9EVUxFX1NUQVRFX1VORk9STUVEKQ0KPiAtCQkJCWNvbnRpbnVlOw0KPiAtCQkJaWYgKChy ZXQgPSBmaW5kX2thbGxzeW1zX3N5bWJvbF92YWx1ZShtb2QsIG5hbWUpKSAhPSAwKQ0KPiAtCQkJ CWJyZWFrOw0KPiAtCQl9DQo+IC0JfQ0KPiAtCXByZWVtcHRfZW5hYmxlKCk7DQo+IC0JcmV0dXJu IHJldDsNCj4gLX0NCj4gLQ0KPiAtI2lmZGVmIENPTkZJR19MSVZFUEFUQ0gNCj4gLWludCBtb2R1 bGVfa2FsbHN5bXNfb25fZWFjaF9zeW1ib2woaW50ICgqZm4pKHZvaWQgKiwgY29uc3QgY2hhciAq LA0KPiAtCQkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKiwgdW5zaWduZWQgbG9uZyksDQo+IC0JCQkJ ICAgdm9pZCAqZGF0YSkNCj4gLXsNCj4gLQlzdHJ1Y3QgbW9kdWxlICptb2Q7DQo+IC0JdW5zaWdu ZWQgaW50IGk7DQo+IC0JaW50IHJldCA9IDA7DQo+IC0NCj4gLQltdXRleF9sb2NrKCZtb2R1bGVf bXV0ZXgpOw0KPiAtCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kLCAmbW9kdWxlcywgbGlzdCkgew0K PiAtCQkvKiBXZSBob2xkIG1vZHVsZV9tdXRleDogbm8gbmVlZCBmb3IgcmN1X2RlcmVmZXJlbmNl X3NjaGVkICovDQo+IC0JCXN0cnVjdCBtb2Rfa2FsbHN5bXMgKmthbGxzeW1zID0gbW9kLT5rYWxs c3ltczsNCj4gLQ0KPiAtCQlpZiAobW9kLT5zdGF0ZSA9PSBNT0RVTEVfU1RBVEVfVU5GT1JNRUQp DQo+IC0JCQljb250aW51ZTsNCj4gLQkJZm9yIChpID0gMDsgaSA8IGthbGxzeW1zLT5udW1fc3lt dGFiOyBpKyspIHsNCj4gLQkJCWNvbnN0IEVsZl9TeW0gKnN5bSA9ICZrYWxsc3ltcy0+c3ltdGFi W2ldOw0KPiAtDQo+IC0JCQlpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpDQo+IC0JCQkJ Y29udGludWU7DQo+IC0NCj4gLQkJCXJldCA9IGZuKGRhdGEsIGthbGxzeW1zX3N5bWJvbF9uYW1l KGthbGxzeW1zLCBpKSwNCj4gLQkJCQkgbW9kLCBrYWxsc3ltc19zeW1ib2xfdmFsdWUoc3ltKSk7 DQo+IC0JCQlpZiAocmV0ICE9IDApDQo+IC0JCQkJZ290byBvdXQ7DQo+IC0NCj4gLQkJCWNvbmRf cmVzY2hlZCgpOw0KPiAtCQl9DQo+IC0JfQ0KPiAtb3V0Og0KPiAtCW11dGV4X3VubG9jaygmbW9k dWxlX211dGV4KTsNCj4gLQlyZXR1cm4gcmV0Ow0KPiAtfQ0KPiAtI2VuZGlmIC8qIENPTkZJR19M SVZFUEFUQ0ggKi8NCj4gLSNlbmRpZiAvKiBDT05GSUdfS0FMTFNZTVMgKi8NCj4gLQ0KPiAgIHN0 YXRpYyB2b2lkIGNmaV9pbml0KHN0cnVjdCBtb2R1bGUgKm1vZCkNCj4gICB7DQo+ICAgI2lmZGVm IENPTkZJR19DRklfQ0xBTkc=