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 X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5FE00C432C0 for ; Mon, 25 Nov 2019 11:37:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0BE2D2068E for ; Mon, 25 Nov 2019 11:37:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=nxp.com header.i=@nxp.com header.b="bfa/jXnu" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727227AbfKYLhO (ORCPT ); Mon, 25 Nov 2019 06:37:14 -0500 Received: from mail-eopbgr130075.outbound.protection.outlook.com ([40.107.13.75]:15933 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727188AbfKYLhO (ORCPT ); Mon, 25 Nov 2019 06:37:14 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nAyLWqa/A1juVHRmSH/OeB57azaXh8AYOEsuJwRYLyYNPdZST1aOIXw+e7YzK6XhnXPURS35fQqWQjgTBUUOkC1+qiMqZyWij6MGjSrKgTeDM1CQrnawpxEsYZzX4fQcIdQCNGeZbPKfuVIInitUUYprxijzR3FIxfuCTg0Fc/gR7RkB9GagtquT97cCJb5J2pW0jUpRQG+t0YLw4fBpGPA8nB9DbY7Eg6Z0INLmg906iWYHDVKdK5+P6/Izcxber1SE0pZfKm/nFC+YPS4UL9jscUk7P3sd4hCdmCwj1OZuJmsA2TUarC98iCc6ZXFIknyTnC4vzfmKzoKciG/vsA== 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-SenderADCheck; bh=o2lPIupfsWxcl4/OZ2fqb0m5+rWN+hEzpbiwfUvuC5k=; b=BAczvPzXDmHq9eNMUbzP9UpFbFxb0PkayF3CnFlNgi3y8ON9lTsMAq0xPH07PQeZzpS7+yW/iFSQMS978NqvmWTtLTi4YiR6fAqsi7jd06IiafzhFnfkG5Bi9KiQ2yC4MUMV55FRQR4FLQAFzB06a1PE+JqlqHTOxFuBwmtkSTLTOoClhMH2z8I7vKwVqFOT9Qhu3sa0vDp/1wDprsxcSnzN67bAykLSslD2TWXng3F8v/amxysOSu3Lz/Sg+ZnlHsrz+jjx0Gi7wTA5sYlUXPdYSfzP7RPZuGuqvz4jM++QA5IfOvnIG2y4/edyyVjsHNJcxT1sIHPvt6xUsxAI4Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=o2lPIupfsWxcl4/OZ2fqb0m5+rWN+hEzpbiwfUvuC5k=; b=bfa/jXnu+ggAAp3fCgnrrWXuJj+xNoPRpbO/9kWcM3DH7QvhEOGlXvMu2YGrOC5S0feVo7bLt9Jhea/0Mf5FMM1gpwIJhmqKTl7MJOWoC+kOq4t3ZlOKUBLbUzxzdm9ahbme+jT+pJbKjQxU+fJr7RZa1YcipKYOS3h2Low2/bQ= Received: from VI1PR0402MB3918.eurprd04.prod.outlook.com (52.134.16.148) by VI1PR0402MB3630.eurprd04.prod.outlook.com (52.134.6.148) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2474.23; Mon, 25 Nov 2019 11:36:58 +0000 Received: from VI1PR0402MB3918.eurprd04.prod.outlook.com ([fe80::1d41:f7cc:ffa2:270c]) by VI1PR0402MB3918.eurprd04.prod.outlook.com ([fe80::1d41:f7cc:ffa2:270c%6]) with mapi id 15.20.2474.023; Mon, 25 Nov 2019 11:36:58 +0000 From: Mirela Rabulea To: "p.zabel@pengutronix.de" , "linux-media@vger.kernel.org" CC: "s.nawrocki@samsung.com" , "andrzejtp2010@gmail.com" , "jacek.anaszewski@gmail.com" , "mikhail.ulyanov@cogentembedded.com" , "bin.liu@mediatek.com" , "hverkuil-cisco@xs4all.nl" , "ezequiel@collabora.com" , "kernel@pengutronix.de" , "rick.chang@mediatek.com" Subject: Re: [EXT] [PATCH 1/5] media: add v4l2 JPEG helpers Thread-Topic: [EXT] [PATCH 1/5] media: add v4l2 JPEG helpers Thread-Index: AQHVmjPfVphiWqXazkWNQNikF5+RWaeb1OGA Date: Mon, 25 Nov 2019 11:36:58 +0000 Message-ID: <1574681817.19906.28.camel@nxp.com> References: <20191113150538.9807-1-p.zabel@pengutronix.de> <20191113150538.9807-2-p.zabel@pengutronix.de> In-Reply-To: <20191113150538.9807-2-p.zabel@pengutronix.de> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: Evolution 3.18.5.2-0ubuntu3.2 authentication-results: spf=none (sender IP is ) smtp.mailfrom=mirela.rabulea@nxp.com; x-originating-ip: [92.121.36.197] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: c9112c72-218b-41f6-24b1-08d7719bc805 x-ms-traffictypediagnostic: VI1PR0402MB3630: x-ms-exchange-purlcount: 1 x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:10000; x-forefront-prvs: 0232B30BBC x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(4636009)(376002)(346002)(39860400002)(366004)(136003)(396003)(189003)(199004)(4326008)(14454004)(26005)(45080400002)(44832011)(3846002)(6116002)(103116003)(186003)(25786009)(4001150100001)(446003)(76176011)(76116006)(91956017)(5660300002)(2616005)(66946007)(7736002)(305945005)(99286004)(966005)(66556008)(11346002)(66476007)(2906002)(6506007)(478600001)(66446008)(64756008)(6246003)(81166006)(14444005)(256004)(54906003)(81156014)(8676002)(7416002)(2501003)(6436002)(102836004)(36756003)(86362001)(6486002)(6512007)(6306002)(110136005)(66066001)(316002)(8936002)(71200400001)(229853002)(71190400001)(30864003)(50226002)(99106002)(569006);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR0402MB3630;H:VI1PR0402MB3918.eurprd04.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: EpL4ToE5eWgUhhI9QNgpWh9C3XES8WDgrFZpkwpYE//0jaanSzryYrxTQu+CbRSIi+8DM4iEA7KpVbY5st0yABj402WTugzg+oJarvewW4pHLfYbUMs4keQVMgSyUrmO7XG1wMzKMDH3QUP8HWxMgb8cwqnSsLn3uJRHrQ4C4mzLftmH/n0vLtgvuhl2qX2cpgOeXEXlFRSxP6RCMo3/n7lhJsEPDk8ib4GYORPQXQD03n8Sa/XgK9rtSkwFe72OVPwREXOzRs2lZuFOiMJiTWo0SInI8xYx1EFt2lTW6iSpSwc423hol2wicxEbHK7Kt+DT/VY0/rSQ6RHB2DQZBNSjppGVWFerhMfBpylaU1TaRl51DGpxIyVuf9p3iZfQnjcfyf9BmCErgq6W1zHxcKVWGabhKsYNk5JHiCXoKYLoGTFW9SNjRLn1nGJoPKC9 x-ms-exchange-transport-forked: True Content-Type: text/plain; charset="utf-8" Content-ID: <94A31AB457D6FF41A2EFD66CD6374D3A@eurprd04.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: c9112c72-218b-41f6-24b1-08d7719bc805 X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Nov 2019 11:36:58.4205 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: cUSCmwoLIbovW7CKNl9hoG5EDTGt9hRRQghRFPl2nOH4U53bdBG+VpBURyog5kUK+tYLC4vRb+ARyjGmMWvUbw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0402MB3630 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org SGkgUGhpbGlwcCwNCkkgdHJpZWQgdXNpbmcgdGhlc2UgaGVscGVycyBmb3IgaW14OCBqcGVnIGVu Y29kZXIvZGVjb2RlciwgYW5kIHRoZSBtYWluDQppc3N1ZXMgdGhhdCBJIGhhdmUgYXJlOg0KMS4g SXQgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgQVJHQiAoNCBjb21wb25lbnRzKQ0KMi4gSXQgaXMg bmVjZXNzYXJ5IHRvIHN1cHBvcnQgZXh0ZW5kZWQgc2VxdWVudGlhbCAocGFyc2UgU09GMSkNCjMu IEl0IGlzIG5lY2Vzc2FyeSB0byBkaXN0aW5ndWlzaCBzb21laG93IGJldHdlZW4gWVVWIGFuZCBS R0IsIEkgdXNlZA0KQVBQMTQgbWFya2VyIHRvIGRvIHRoYXQNCjQuIEl0IGlzIG5lY2Vzc2FyeSB0 byBiZSBhYmxlIHRvIG1vZGlmeS9wYXRjaCB0aGUgY29tcG9uZW50IElEJ3MgaW5zaWRlDQpTT0Yg JiBTT1Mgc2VnbWVudHM7IHRoaXMgaXMgZHVlIHRvIGEgaGFyZHdhcmUgbGltaXRhdGlvbiB0aGF0 IHRoZQ0KY29tcG9uZW50IElEJ3MgbXVzdCBiZSAwLi4zIG9yIDEuLjQsIGhvd2V2ZXIgaXQgaXMg cG9zc2libGUgdG8gZGVjb2RlIGENCmpwZWcgdGhhdCB2aW9sYXRlcyB0aGlzIGNvbmRpdGlvbiwg aWYgdGhlIGNvbXBvbmVudCBJRCdzIGFyZSBwYXRjaGVkIHRvDQphY2NlcHRlZCB2YWx1ZXMuDQoN CkkgaGF2ZSBhIGNvbmNlcm4gcmVsYXRlZCB0byBwZXJmb3JtYW5jZSwgYWJvdXQgcGFyc2luZyB0 aGUganBlZyBsaWtlDQp0aGF0LCBidXQgSSBkaWQgbm90IGdldCB0byBtZWFzdXJlIGFueXRoaW5n IHlldCwgYXMgSSBjb3VsZCBub3QgZnVsbHkNCmludGVncmF0ZSBpbXg4IGpwZWcgZHJpdmVyIHdp dGggdGhlIGhlbHBlcnMsIEkNCnVzZWTCoHY0bDJfanBlZ19wYXJzZV9oZWFkZXIsIGJ1dCBJIGFs c28gaGFkIHRvIGtlZXAgbXkgb2xkIHN0cnVjdHVyZXMuDQpQbGVhc2UgdGFrZSBhIGxvb2sgaW4g bXkgaW14OCBwYXRjaCwgYXQgbXhjLWpwZWcuaCwgc3RydWN0DQpteGNfanBlZ19zb2Yvc3RydWN0 IG14Y19qcGVnX3NvcywgdGhlc2UgYXJlIF9fcGFja2VkIHN0cnVjdHVyZXMsIHRoZXkNCndvcmsg cXVpdGUgd2VsbCB2aWEgYSBzaW1wbGUgY2FzdCBhbmQgYWxsb3cgbW9kaWZpY2F0aW9ucyB0b28s IHRoZQ0KZG93bnNpZGUgaXMgdGhhdCBmaWVsZHMgYmlnZ2VyIHRoYW4gdTggbWlnaHQgcmVxdWly ZSBzd2FwcGluZy7CoA0KDQpQbGVhc2UgYWxzbyBzZWUgYmVsb3cgbXkgY29tbWVudHMuDQoNCk9u IE1pLCAyMDE5LTExLTEzIGF0IDE2OjA1ICswMTAwLCBQaGlsaXBwIFphYmVsIHdyb3RlOg0KPiBB ZGQgaGVscGVycyBmb3IgSlBFRyBoZWFkZXIgcGFyc2luZy4gVGhleSBhbGxvdyBib3RoIHNjYW5u aW5nIGZvcg0KPiBtYXJrZXINCj4gc2VnbWVudCBwb3NpdGlvbnMgYW5kIGxhdGVyIHBhcnNpbmcg dGhlIHNlZ21lbnRzIGluZGl2aWR1YWxseSwgYXMNCj4gcmVxdWlyZWQgYnkgczVwLWpwZWcsIGFz IHdlbGwgYXMgcGFyc2luZyBhbGwgaGVhZGVycyBpbiBvbmUgZ28sIGFzDQo+IHJlcXVpcmVkIGJ5 IGNvZGEtdnB1LiBUaGUgZnJhbWUgaGVhZGVyIGlzIGFsd2F5cyBwYXJzZWQsIGFzIGJhc2ljYWxs eQ0KPiBhbGwgZGVjb2RlcnMgYXJlIGludGVyZXN0ZWQgaW4gd2lkdGgsIGhlaWdodCwgYW5kIG51 bWJlciBvZg0KPiBjb21wb25lbnRzLg0KPiBGb3IgY29udmVuaWVuY2UsIHRoZSBKUEVHIGNocm9t YSBzdWJzYW1wbGluZyBmYWN0b3JzIGFyZSBkZWNvZGVkIGludG8NCj4gYQ0KPiB2NGwyX2pwZWdf Y2hyb21hX3N1YnNhbXBsaW5nIGVudW0uDQo+IA0KPiBPbmx5IGJhc2VsaW5lIERDVCBlbmNvZGVk IEpQRUdzIHdpdGggOC1iaXQgcHJlY2lzaW9uIGFuZCBlaXRoZXINCj4gZ3JheXNjYWxlICgxIGNv bXBvbmVudCkgb3IgWUNiQ3IgKDMgY29tcG9uZW50cykgZW5jb2RpbmdzIGFyZQ0KPiBzdXBwb3J0 ZWQsDQo+IGFzIGN1cnJlbnQgZHJpdmVycyBkbyBub3Qgc3VwcG9ydCBkaWZmZXJlbnQgZm9ybWF0 cy4NCg0KRm9yIGlteDgganBlZyBlbmMvZGVjLCB0aGVyZSBpcyBhIDQtY29tcG9uZW50IGZvcm1h dCB0aGF0IHNob3VsZCBiZcKgDQpzdXBwb3J0ZWQsIEFSR0IuDQpBbHNvLCBleHRlbmRlZCBzZXF1 ZW50aWFsIERDRiBzaG91bGQgYmUgc3VwcG9ydGVkLg0KDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBQ aGlsaXBwIFphYmVsIDxwLnphYmVsQHBlbmd1dHJvbml4LmRlPg0KPiAtLS0NCj4gwqBkcml2ZXJz L21lZGlhL3Y0bDItY29yZS9LY29uZmlnwqDCoMKgwqDCoHzCoMKgwqA0ICsNCj4gwqBkcml2ZXJz L21lZGlhL3Y0bDItY29yZS9NYWtlZmlsZcKgwqDCoMKgfMKgwqDCoDIgKw0KPiDCoGRyaXZlcnMv bWVkaWEvdjRsMi1jb3JlL3Y0bDItanBlZy5jIHwgNjE0DQo+ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysNCj4gwqBpbmNsdWRlL21lZGlhL3Y0bDItanBlZy5owqDCoMKgwqDCoMKgwqDCoMKg wqDCoHwgMTM1ICsrKysrKw0KPiDCoDQgZmlsZXMgY2hhbmdlZCwgNzU1IGluc2VydGlvbnMoKykN Cj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdjRsMi1qcGVn LmMNCj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9tZWRpYS92NGwyLWpwZWcuaA0KPiAN Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL0tjb25maWcgYi9kcml2ZXJz L21lZGlhL3Y0bDItDQo+IGNvcmUvS2NvbmZpZw0KPiBpbmRleCAzOWUzZmIzMGJhMGIuLjg5ODA5 ZWMyNDc3OSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvS2NvbmZpZw0K PiArKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS9LY29uZmlnDQo+IEBAIC00NSw2ICs0NSwx MCBAQCBjb25maWcgVklERU9fUENJX1NLRUxFVE9ODQo+IMKgY29uZmlnIFZJREVPX1RVTkVSDQo+ IMKgwqDCoMKgwqDCoMKgwqB0cmlzdGF0ZQ0KPiANCj4gKyMgVXNlZCBieSBkcml2ZXJzIHRoYXQg bmVlZCB2NGwyLWpwZWcua28NCj4gK2NvbmZpZyBWNEwyX0pQRUdfSEVMUEVSDQo+ICvCoMKgwqDC oMKgwqDCoHRyaXN0YXRlDQo+ICsNCj4gwqAjIFVzZWQgYnkgZHJpdmVycyB0aGF0IG5lZWQgdjRs Mi1tZW0ybWVtLmtvDQo+IMKgY29uZmlnIFY0TDJfTUVNMk1FTV9ERVYNCj4gwqDCoMKgwqDCoMKg wqDCoHRyaXN0YXRlDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS9NYWtl ZmlsZSBiL2RyaXZlcnMvbWVkaWEvdjRsMi0NCj4gY29yZS9NYWtlZmlsZQ0KPiBpbmRleCA3ODZi ZDFlYzRkMWIuLjE0NDU2NDY1NmQyMiAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tZWRpYS92NGwy LWNvcmUvTWFrZWZpbGUNCj4gKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvTWFrZWZpbGUN Cj4gQEAgLTI0LDYgKzI0LDggQEAgb2JqLSQoQ09ORklHX1Y0TDJfTUVNMk1FTV9ERVYpICs9IHY0 bDItbWVtMm1lbS5vDQo+IA0KPiDCoG9iai0kKENPTkZJR19WNEwyX0ZMQVNIX0xFRF9DTEFTUykg Kz0gdjRsMi1mbGFzaC1sZWQtY2xhc3Mubw0KPiANCj4gK29iai0kKENPTkZJR19WNEwyX0pQRUdf SEVMUEVSKSArPSB2NGwyLWpwZWcubw0KPiArDQo+IMKgb2JqLSQoQ09ORklHX1ZJREVPQlVGX0dF TikgKz0gdmlkZW9idWYtY29yZS5vDQo+IMKgb2JqLSQoQ09ORklHX1ZJREVPQlVGX0RNQV9TRykg Kz0gdmlkZW9idWYtZG1hLXNnLm8NCj4gwqBvYmotJChDT05GSUdfVklERU9CVUZfRE1BX0NPTlRJ RykgKz0gdmlkZW9idWYtZG1hLWNvbnRpZy5vDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlh L3Y0bDItY29yZS92NGwyLWpwZWcuYw0KPiBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDIt anBlZy5jDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+IGluZGV4IDAwMDAwMDAwMDAwMC4uZjFl MWE4MThiNDdjDQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNv cmUvdjRsMi1qcGVnLmMNCj4gQEAgLTAsMCArMSw2MTQgQEANCj4gKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkNCj4gKy8qDQo+ICsgKiBWNEwyIEpQRUcgaGVhZGVyIHBh cnNlciBoZWxwZXJzLg0KPiArICoNCj4gKyAqIENvcHlyaWdodCAoQykgMjAxOSBQZW5ndXRyb25p eCwgUGhpbGlwcCBaYWJlbCA8a2VybmVsQHBlbmd1dHJvbml4DQo+IC5kZT4NCj4gKyAqDQo+ICsg KiBGb3IgcmVmZXJlbmNlLCBzZWUgSlBFRyBJVFUtVC44MSAoSVNPL0lFQyAxMDkxOC0xKSBbMV0N Cj4gKyAqDQo+ICsgKiBbMV0gaHR0cHM6Ly9ldXIwMS5zYWZlbGlua3MucHJvdGVjdGlvbi5vdXRs b29rLmNvbS8/dXJsPWh0dHBzJTNBJQ0KPiAyRiUyRnd3dy53My5vcmclMkZHcmFwaGljcyUyRkpQ RUclMkZpdHUtDQo+IHQ4MS5wZGYmYW1wO2RhdGE9MDIlN0MwMSU3Q21pcmVsYS5yYWJ1bGVhJTQw bnhwLmNvbSU3Qzk1NmUyODA0YzBjYjRiMQ0KPiAxMTVlNTA4ZDc2ODRiMDE1ZCU3QzY4NmVhMWQz YmMyYjRjNmZhOTJjZDk5YzVjMzAxNjM1JTdDMCU3QzAlN0M2MzcwOTINCj4gNTQzNjYwNjc2Mzcz JmFtcDtzZGF0YT11Y1VGTnlFTWlCUnRkOXN5UlB5MjJSQkVpa29Qc3ZlN2olMkJ0QiUyRnRFbiUy DQo+IEZRVSUzRCZhbXA7cmVzZXJ2ZWQ9MA0KPiArICovDQo+ICsNCj4gKyNpbmNsdWRlIDxhc20v dW5hbGlnbmVkLmg+DQo+ICsjaW5jbHVkZSA8bGludXgvZXJybm8uaD4NCj4gKyNpbmNsdWRlIDxs aW51eC9rZXJuZWwuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCj4gKyNpbmNsdWRl IDxsaW51eC90eXBlcy5oPg0KPiArI2luY2x1ZGUgPG1lZGlhL3Y0bDItanBlZy5oPg0KPiArDQo+ ICtNT0RVTEVfREVTQ1JJUFRJT04oIlY0TDIgSlBFRyBoZWFkZXIgcGFyc2VyIGhlbHBlcnMiKTsN Cj4gK01PRFVMRV9BVVRIT1IoIlBoaWxpcHAgWmFiZWwgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4i KTsNCj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsNCj4gKw0KPiArLyogVGFibGUgQi4xIC0gTWFy a2VyIGNvZGUgYXNzaWdubWVudHMgKi8NCj4gKyNkZWZpbmUgU09GMMKgwqDCoDB4ZmZjMMKgwqAv KiBzdGFydCBvZiBmcmFtZSAqLw0KPiArI2RlZmluZSBTT0YxwqDCoMKgMHhmZmMxDQo+ICsjZGVm aW5lIFNPRjPCoMKgwqAweGZmYzMNCj4gKyNkZWZpbmUgU09GNcKgwqDCoDB4ZmZjNQ0KPiArI2Rl ZmluZSBTT0Y3wqDCoMKgMHhmZmM3DQo+ICsjZGVmaW5lIEpQR8KgwqDCoMKgMHhmZmM4wqDCoC8q IGV4dGVuc2lvbnMgKi8NCj4gKyNkZWZpbmUgU09GOcKgwqDCoDB4ZmZjOQ0KPiArI2RlZmluZSBT T0YxMcKgwqAweGZmY2INCj4gKyNkZWZpbmUgU09GMTPCoMKgMHhmZmNkDQo+ICsjZGVmaW5lIFNP RjE1wqDCoDB4ZmZjZg0KPiArI2RlZmluZSBESFTCoMKgwqDCoDB4ZmZjNMKgwqAvKiBodWZmbWFu IHRhYmxlICovDQo+ICsjZGVmaW5lIERBQ8KgwqDCoMKgMHhmZmNjwqDCoC8qIGFyaXRobWV0aWMg Y29kaW5nIGNvbmRpdGlvbmluZyAqLw0KPiArI2RlZmluZSBSU1QwwqDCoMKgMHhmZmQwwqDCoC8q IHJlc3RhcnQgKi8NCj4gKyNkZWZpbmUgUlNUN8KgwqDCoDB4ZmZkNw0KPiArI2RlZmluZSBTT0nC oMKgwqDCoDB4ZmZkOMKgwqAvKiBzdGFydCBvZiBpbWFnZSAqLw0KPiArI2RlZmluZSBFT0nCoMKg wqDCoDB4ZmZkOcKgwqAvKiBlbmQgb2YgaW1hZ2UgKi8NCj4gKyNkZWZpbmUgU09TwqDCoMKgwqAw eGZmZGHCoMKgLyogc3RhcnQgb2Ygc3RyZWFtICovDQo+ICsjZGVmaW5lIERRVMKgwqDCoMKgMHhm ZmRiwqDCoC8qIHF1YW50aXphdGlvbiB0YWJsZSAqLw0KPiArI2RlZmluZSBETkzCoMKgwqDCoDB4 ZmZkY8KgwqAvKiBudW1iZXIgb2YgbGluZXMgKi8NCj4gKyNkZWZpbmUgRFJJwqDCoMKgwqAweGZm ZGTCoMKgLyogcmVzdGFydCBpbnRlcnZhbCAqLw0KPiArI2RlZmluZSBESFDCoMKgwqDCoDB4ZmZk ZcKgwqAvKiBoaWVyYXJjaGljYWwgcHJvZ3Jlc3Npb24gKi8NCj4gKyNkZWZpbmUgRVhQwqDCoMKg wqAweGZmZGbCoMKgLyogZXhwYW5kIHJlZmVyZW5jZSAqLw0KPiArI2RlZmluZSBBUFAwwqDCoMKg MHhmZmUwwqDCoC8qIGFwcGxpY2F0aW9uIGRhdGEgKi8NCg0KQVBQMTQgd291bGQgYmUgbmljZSB0 byBoYXZlLg0KDQo+ICsjZGVmaW5lIEFQUDE1wqDCoDB4ZmZlZg0KPiArI2RlZmluZSBKUEcwwqDC oMKgMHhmZmYwwqDCoC8qIGV4dGVuc2lvbnMgKi8NCj4gKyNkZWZpbmUgSlBHMTPCoMKgMHhmZmZk DQo+ICsjZGVmaW5lIENPTcKgwqDCoMKgMHhmZmZlwqDCoC8qIGNvbW1lbnQgKi8NCj4gKyNkZWZp bmUgVEVNwqDCoMKgwqAweGZmMDHCoMKgLyogdGVtcG9yYXJ5ICovDQo+ICsNCj4gKy8qKg0KPiAr ICogc3RydWN0IGpwZWdfc3RyZWFtIC0gSlBFRyBieXRlIHN0cmVhbQ0KPiArICogQGN1cnI6IGN1 cnJlbnQgcG9zaXRpb24gaW4gc3RyZWFtDQo+ICsgKiBAZW5kOiBlbmQgcG9zaXRpb24sIGFmdGVy IGxhc3QgYnl0ZQ0KPiArICovDQo+ICtzdHJ1Y3QganBlZ19zdHJlYW0gew0KPiArwqDCoMKgwqDC oMKgwqB1OCAqY3VycjsNCj4gK8KgwqDCoMKgwqDCoMKgdTggKmVuZDsNCj4gK307DQo+ICsNCj4g Ky8qIHJldHVybnMgYSB2YWx1ZSB0aGF0IGZpdHMgaW50byB1OCwgb3IgbmVnYXRpdmUgZXJyb3Ig Ki8NCj4gK3N0YXRpYyBpbnQganBlZ19nZXRfYnl0ZShzdHJ1Y3QganBlZ19zdHJlYW0gKnN0cmVh bSkNCj4gK3sNCj4gK8KgwqDCoMKgwqDCoMKgaWYgKHN0cmVhbS0+Y3VyciA+PSBzdHJlYW0tPmVu ZCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOw0KPiAr DQo+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAqc3RyZWFtLT5jdXJyKys7DQo+ICt9DQo+ICsNCj4g Ky8qIHJldHVybnMgYSB2YWx1ZSB0aGF0IGZpdHMgaW50byB1MTYsIG9yIG5lZ2F0aXZlIGVycm9y ICovDQo+ICtzdGF0aWMgaW50IGpwZWdfZ2V0X3dvcmRfYmUoc3RydWN0IGpwZWdfc3RyZWFtICpz dHJlYW0pDQo+ICt7DQo+ICvCoMKgwqDCoMKgwqDCoHUxNiB3b3JkOw0KPiArDQo+ICvCoMKgwqDC oMKgwqDCoGlmIChzdHJlYW0tPmN1cnIgKyBzaXplb2YoX19iZTE2KSA+IHN0cmVhbS0+ZW5kKQ0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4g K8KgwqDCoMKgwqDCoMKgd29yZCA9IGdldF91bmFsaWduZWRfYmUxNihzdHJlYW0tPmN1cnIpOw0K PiArwqDCoMKgwqDCoMKgwqBzdHJlYW0tPmN1cnIgKz0gc2l6ZW9mKF9fYmUxNik7DQo+ICsNCj4g K8KgwqDCoMKgwqDCoMKgcmV0dXJuIHdvcmQ7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQganBl Z19za2lwKHN0cnVjdCBqcGVnX3N0cmVhbSAqc3RyZWFtLCBzaXplX3QgbGVuKQ0KPiArew0KPiAr wqDCoMKgwqDCoMKgwqBpZiAoc3RyZWFtLT5jdXJyICsgbGVuID4gc3RyZWFtLT5lbmQpDQo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDC oMKgwqDCoMKgwqBzdHJlYW0tPmN1cnIgKz0gbGVuOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IGpwZWdfbmV4dF9tYXJrZXIoc3RydWN0 IGpwZWdfc3RyZWFtICpzdHJlYW0pDQo+ICt7DQo+ICvCoMKgwqDCoMKgwqDCoGludCBieXRlOw0K PiArwqDCoMKgwqDCoMKgwqB1MTYgbWFya2VyID0gMDsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqB3 aGlsZSAoKGJ5dGUgPSBqcGVnX2dldF9ieXRlKHN0cmVhbSkpID49IDApIHsNCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1hcmtlciA9IChtYXJrZXIgPDwgOCkgfCBieXRlOw0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogc2tpcCBzdHVmZmluZyBieXRlcyBhbmQg UkVTZXJ2ZWQgbWFya2VycyAqLw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYg KG1hcmtlciA9PSBURU0gfHwgKG1hcmtlciA+IDB4ZmZiZiAmJiBtYXJrZXIgPA0KPiAweGZmZmYp KQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy biBtYXJrZXI7DQo+ICvCoMKgwqDCoMKgwqDCoH0NCj4gKw0KPiArwqDCoMKgwqDCoMKgwqByZXR1 cm4gYnl0ZTsNCj4gK30NCj4gKw0KPiArLyogdGhpcyBkb2VzIG5vdCBhZHZhbmNlIHRoZSBjdXJy ZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gKi8NCj4gK3N0YXRpYyBpbnQganBlZ19yZWZlcmVu Y2Vfc2VnbWVudChzdHJ1Y3QganBlZ19zdHJlYW0gKnN0cmVhbSwNCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVj dCB2NGwyX2pwZWdfcmVmZXJlbmNlDQo+ICpzZWdtZW50KQ0KPiArew0KPiArwqDCoMKgwqDCoMKg wqB1MTYgbGVuOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoGlmIChzdHJlYW0tPmN1cnIgKyBzaXpl b2YoX19iZTE2KSA+IHN0cmVhbS0+ZW5kKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgbGVuID0gZ2V0X3VuYWxp Z25lZF9iZTE2KHN0cmVhbS0+Y3Vycik7DQo+ICvCoMKgwqDCoMKgwqDCoGlmIChzdHJlYW0tPmN1 cnIgKyBsZW4gPiBzdHJlYW0tPmVuZCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiAtRUlOVkFMOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoHNlZ21lbnQtPnN0YXJ0ID0g c3RyZWFtLT5jdXJyOw0KPiArwqDCoMKgwqDCoMKgwqBzZWdtZW50LT5sZW5ndGggPSBsZW47DQo+ ICsNCj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQg djRsMl9qcGVnX2RlY29kZV9zdWJzYW1wbGluZyh1OCBuZiwgdTggaF92KQ0KPiArew0KPiArwqDC oMKgwqDCoMKgwqBpZiAobmYgPT0gMSkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldHVybiBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HX0dSQVk7DQo+ICsNCj4gK8KgwqDC oMKgwqDCoMKgc3dpdGNoIChoX3YpIHsNCj4gK8KgwqDCoMKgwqDCoMKgY2FzZSAweDExOg0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIFY0TDJfSlBFR19DSFJPTUFfU1VC U0FNUExJTkdfNDQ0Ow0KPiArwqDCoMKgwqDCoMKgwqBjYXNlIDB4MjE6DQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gVjRMMl9KUEVHX0NIUk9NQV9TVUJTQU1QTElOR180 MjI7DQo+ICvCoMKgwqDCoMKgwqDCoGNhc2UgMHgyMjoNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHJldHVybiBWNEwyX0pQRUdfQ0hST01BX1NVQlNBTVBMSU5HXzQyMDsNCj4gK8Kg wqDCoMKgwqDCoMKgY2FzZSAweDQxOg0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cmV0dXJuIFY0TDJfSlBFR19DSFJPTUFfU1VCU0FNUExJTkdfNDExOw0KPiArwqDCoMKgwqDCoMKg wqBkZWZhdWx0Og0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FSU5W QUw7DQo+ICvCoMKgwqDCoMKgwqDCoH0NCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBqcGVnX3Bh cnNlX2ZyYW1lX2hlYWRlcihzdHJ1Y3QganBlZ19zdHJlYW0gKnN0cmVhbSwNCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgc3RydWN0IHY0bDJfanBlZ19mcmFtZV9oZWFkZXINCj4gKmZyYW1lX2hlYWRlcikNCj4gK3sN Cj4gK8KgwqDCoMKgwqDCoMKgaW50IGxlbiA9IGpwZWdfZ2V0X3dvcmRfYmUoc3RyZWFtKTsNCj4g Kw0KPiArwqDCoMKgwqDCoMKgwqBpZiAobGVuIDwgMCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHJldHVybiBsZW47DQo+ICvCoMKgwqDCoMKgwqDCoC8qIExmID0gOCArIDMgKiBO ZiwgTmYgPj0gMSAqLw0KPiArwqDCoMKgwqDCoMKgwqBpZiAobGVuIDwgOCArIDMpDQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKg wqDCoMKgwqBpZiAoZnJhbWVfaGVhZGVyKSB7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAvKiBUYWJsZSBCLjIgLSBGcmFtZSBoZWFkZXIgcGFyYW1ldGVyIHNpemVzIGFuZA0KPiB2 YWx1ZXMgKi8NCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGludCBwLCB5LCB4LCBu ZjsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGludCBpOw0KPiArDQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwID0ganBlZ19nZXRfYnl0ZShzdHJlYW0pOw0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHAgPCAwKQ0KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBwOw0KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogYmFzZWxpbmUgRENUIG9ubHkgc3VwcG9ydHMgOC1iaXQg cHJlY2lzaW9uICovDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocCAhPSA4 KQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVy biAtRUlOVkFMOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB5ID0ganBl Z19nZXRfd29yZF9iZShzdHJlYW0pOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgKHkgPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHJldHVybiB5Ow0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHkgPT0g MCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1 cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgeCA9IGpw ZWdfZ2V0X3dvcmRfYmUoc3RyZWFtKTsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmICh4IDwgMCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXR1cm4geDsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICh4ID09 IDApDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuIC1FSU5WQUw7DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5mID0g anBlZ19nZXRfYnl0ZShzdHJlYW0pOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgKG5mIDwgMCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXR1cm4gbmY7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKg0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAqIFRoZSBzcGVjIGFsbG93cyAxIDw9IE5m IDw9IDI1NSwgYnV0IHdlIG9ubHkNCj4gc3VwcG9ydCBZQ2JDcg0KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAqIGFuZCBncmF5c2NhbGUuDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCovDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAobmYg IT0gMSAmJiBuZiAhPSAzKQ0KDQpUaGlzIHdpbGwgYmUgYSBwcm9ibGVtIGZvciBBUkdCICg0IGNv bXBvbmVudHMpDQoNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm IChsZW4gIT0gOCArIDMgKiBuZikNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZnJhbWVfaGVhZGVyLT5wcmVjaXNpb24gPSBwOw0KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZnJhbWVfaGVhZGVyLT5oZWlnaHQgPSB5Ow0KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZnJhbWVfaGVhZGVyLT53aWR0aCA9IHg7DQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmcmFtZV9oZWFkZXItPm51bV9jb21wb25lbnRzID0gbmY7 DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBu ZjsgaSsrKSB7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgc3RydWN0IHY0bDJfanBlZ19mcmFtZV9jb21wb25lbnRfc3BlYw0KPiAqY29tcG9uZW50Ow0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGludCBjLCBo X3YsIHRxOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgYyA9IGpwZWdfZ2V0X2J5dGUoc3RyZWFtKTsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoYyA8IDApDQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBjOw0K PiArDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaF92 ID0ganBlZ19nZXRfYnl0ZShzdHJlYW0pOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGlmIChoX3YgPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gaF92Ow0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChpID09IDAp IHsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaW50IHN1YnM7DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3VicyA9DQo+IHY0bDJfanBlZ19k ZWNvZGVfc3Vic2FtcGxpbmcobmYsIGhfdik7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChzdWJzIDwgMCkNCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBzdWJzOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmcmFtZV9oZWFkZXItPnN1 YnNhbXBsaW5nID0gc3ViczsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqB9IGVsc2UgaWYgKGhfdiAhPSAweDExKSB7DQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIGFsbCBjaHJv bWEgc2FtcGxpbmcgZmFjdG9ycyBtdXN0DQo+IGJlIDEgKi8NCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FSU5W QUw7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQ0K PiArDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHEg PSBqcGVnX2dldF9ieXRlKHN0cmVhbSk7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgaWYgKHRxIDwgMCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHRxOw0KPiArDQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29tcG9uZW50 ID0gJmZyYW1lX2hlYWRlci0+Y29tcG9uZW50W2ldOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNvbXBvbmVudC0+Y29tcG9uZW50X2lkZW50aWZpZXIg PSBjOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNv bXBvbmVudC0+aG9yaXpvbnRhbF9zYW1wbGluZ19mYWN0b3IgPQ0KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAoaF92ID4+IDQp ICYgMHhmOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGNvbXBvbmVudC0+dmVydGljYWxfc2FtcGxpbmdfZmFjdG9yID0gaF92ICYNCj4gMHhmOw0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNvbXBvbmVudC0+ cXVhbnRpemF0aW9uX3RhYmxlX3NlbGVjdG9yID0gdHE7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqB9DQo+ICvCoMKgwqDCoMKgwqDCoH0gZWxzZSB7DQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXR1cm4ganBlZ19za2lwKHN0cmVhbSwgbGVuIC0gMik7DQo+ICvC oMKgwqDCoMKgwqDCoH0NCj4gKw0KPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsNCj4gK30NCj4g Kw0KPiArc3RhdGljIGludCBqcGVnX3BhcnNlX3NjYW5faGVhZGVyKHN0cnVjdCBqcGVnX3N0cmVh bSAqc3RyZWFtLA0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RydWN0IHY0bDJfanBlZ19zY2FuX2hlYWRlcg0KPiAq c2Nhbl9oZWFkZXIpDQo+ICt7DQo+ICvCoMKgwqDCoMKgwqDCoHNpemVfdCBza2lwOw0KPiArwqDC oMKgwqDCoMKgwqBpbnQgbGVuID0ganBlZ19nZXRfd29yZF9iZShzdHJlYW0pOw0KPiArDQo+ICvC oMKgwqDCoMKgwqDCoGlmIChsZW4gPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0dXJuIGxlbjsNCj4gK8KgwqDCoMKgwqDCoMKgLyogTHMgPSA4ICsgMyAqIE5zLCBOcyA+ PSAxICovDQo+ICvCoMKgwqDCoMKgwqDCoGlmIChsZW4gPCA2ICsgMikNCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDC oGlmIChzY2FuX2hlYWRlcikgew0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50 IG5zOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50IGk7DQo+ICsNCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG5zID0ganBlZ19nZXRfYnl0ZShzdHJlYW0pOw0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKG5zIDwgMCkNCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gbnM7DQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAobnMgPCAxIHx8IG5zID4gNCB8fCBsZW4gIT0g NiArIDIgKiBucykNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgc2Nhbl9oZWFkZXItPm51bV9jb21wb25lbnRzID0gbnM7DQo+ICsNCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBuczsgaSsrKSB7DQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RydWN0IHY0bDJfanBlZ19z Y2FuX2NvbXBvbmVudF9zcGVjDQo+ICpjb21wb25lbnQ7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50IGNzLCB0ZF90YTsNCj4gKw0KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNzID0ganBlZ19nZXRfYnl0 ZShzdHJlYW0pOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGlmIChjcyA8IDApDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBjczsNCj4gKw0KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRkX3RhID0ganBlZ19nZXRfYnl0ZShz dHJlYW0pOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmICh0ZF90YSA8IDApDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiB0ZF90YTsNCj4gKw0KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNvbXBvbmVudCA9ICZzY2FuX2hl YWRlci0+Y29tcG9uZW50W2ldOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGNvbXBvbmVudC0+Y29tcG9uZW50X3NlbGVjdG9yID0gY3M7DQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY29tcG9uZW50LT5kY19l bnRyb3B5X2NvZGluZ190YWJsZV9zZWxlY3RvciA9DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCh0ZF90YSA+PiA0KSAmIDB4 ZjsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb21w b25lbnQtPmFjX2VudHJvcHlfY29kaW5nX3RhYmxlX3NlbGVjdG9yID0NCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGRfdGEg JiAweGY7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9DQo+ICsNCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNraXAgPSAzOyAvKiBza2lwIFNzLCBTZSwgQWgsIGFu ZCBBbCAqLw0KPiArwqDCoMKgwqDCoMKgwqB9IGVsc2Ugew0KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgc2tpcCA9IGxlbiAtIDI7DQo+ICvCoMKgwqDCoMKgwqDCoH0NCj4gKw0KPiAr wqDCoMKgwqDCoMKgwqByZXR1cm4ganBlZ19za2lwKHN0cmVhbSwgc2tpcCk7DQo+ICt9DQo+ICsN Cj4gKy8qIEIuMi40LjEgUXVhbnRpemF0aW9uIHRhYmxlLXNwZWNpZmljYXRpb24gc3ludGF4ICov DQo+ICtzdGF0aWMgaW50IGpwZWdfcGFyc2VfcXVhbnRpemF0aW9uX3RhYmxlcyhzdHJ1Y3QganBl Z19zdHJlYW0NCj4gKnN0cmVhbSwNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg djRsMl9qcGVnX3JlZmVyZW5jZQ0KPiAqdGFibGVzKQ0KPiArew0KPiArwqDCoMKgwqDCoMKgwqBp bnQgbGVuID0ganBlZ19nZXRfd29yZF9iZShzdHJlYW0pOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDC oGlmIChsZW4gPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGxl bjsNCj4gK8KgwqDCoMKgwqDCoMKgLyogTHEgPSAyICsgbiAqIDY1IChmb3IgYmFzZWxpbmUgRENU KSwgbiA+PSAxICovDQo+ICvCoMKgwqDCoMKgwqDCoGlmIChsZW4gPCAyICsgNjUpDQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKg wqDCoMKgwqBmb3IgKGxlbiAtPSAyOyBsZW4gPj0gNjU7IGxlbiAtPSA2NSkgew0KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTggcHEsIHRxLCAqcWs7DQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpbnQgcmV0Ow0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgaW50IHBxX3RxID0ganBlZ19nZXRfYnl0ZShzdHJlYW0pOw0KPiArDQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocHFfdHEgPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBwcV90cTsNCj4gKw0KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogcXVhbnRpemF0aW9uIHRhYmxlIGVsZW1lbnQgcHJl Y2lzaW9uICovDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcSA9IChwcV90cSA+ PiA0KSAmIDB4ZjsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIG9ubHkgOC1i aXQgUWsgdmFsdWVzIGZvciBiYXNlbGluZSBEQ1QgKi8NCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIChwcSAhPSAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAvKiBxdWFudGl6YXRpb24gdGFibGUgZGVzdGluYXRpb24gaWRlbnRpZmll ciAqLw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHEgPSBwcV90cSAmIDB4ZjsN Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmICh0cSA+IDMpDQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FSU5WQUw7DQo+ ICsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIHF1YW50aXphdGlvbiB0YWJs ZSBlbGVtZW50ICovDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBxayA9IHN0cmVh bS0+Y3VycjsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IGpwZWdfc2tp cChzdHJlYW0sIDY0KTsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQg PCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiAtRUlOVkFMOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAo dGFibGVzKSB7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgdGFibGVzW3RxXS5zdGFydCA9IHFrOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHRhYmxlc1t0cV0ubGVuZ3RoID0gNjQ7DQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqB9DQo+ICvCoMKgwqDCoMKgwqDCoH0NCj4gKw0KPiArwqDCoMKg wqDCoMKgwqByZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArLyogQi4yLjQuMiBIdWZmbWFuIHRhYmxl LXNwZWNpZmljYXRpb24gc3ludGF4ICovDQo+ICtzdGF0aWMgaW50IGpwZWdfcGFyc2VfaHVmZm1h bl90YWJsZXMoc3RydWN0IGpwZWdfc3RyZWFtICpzdHJlYW0sDQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBz dHJ1Y3QgdjRsMl9qcGVnX3JlZmVyZW5jZQ0KPiAqdGFibGVzKQ0KPiArew0KPiArwqDCoMKgwqDC oMKgwqBpbnQgbXQ7DQo+ICvCoMKgwqDCoMKgwqDCoGludCBsZW4gPSBqcGVnX2dldF93b3JkX2Jl KHN0cmVhbSk7DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgaWYgKGxlbiA8IDApDQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gbGVuOw0KPiArwqDCoMKgwqDCoMKgwqAvKiBU YWJsZSBCLjUgLSBIdWZmbWFuIHRhYmxlIHNwZWNpZmljYXRpb24gcGFyYW1ldGVyIHNpemVzDQo+ IGFuZCB2YWx1ZXMgKi8NCj4gK8KgwqDCoMKgwqDCoMKgaWYgKGxlbiA8IDIgKyAxNykNCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFMOw0KPiArDQo+ICvCoMKg wqDCoMKgwqDCoGZvciAobGVuIC09IDI7IGxlbiA+PSAxNzsgbGVuIC09IDE3ICsgbXQpIHsNCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHU4IHRjLCB0aCwgKnRhYmxlOw0KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50IHRjX3RoID0ganBlZ19nZXRfYnl0ZShzdHJl YW0pOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW50IGksIHJldDsNCj4gKw0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHRjX3RoIDwgMCkNCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gdGNfdGg7DQo+ ICsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIHRhYmxlIGNsYXNzIC0gMCA9 IERDLCAxID0gQUMgKi8NCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRjID0gKHRj X3RoID4+IDQpICYgMHhmOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHRj ID4gMSkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyog aHVmZm1hbiB0YWJsZSBkZXN0aW5hdGlvbiBpZGVudGlmaWVyICovDQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqB0aCA9IHRjX3RoICYgMHhmOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgLyogb25seSB0d28gSHVmZm1hbiB0YWJsZXMgZm9yIGJhc2VsaW5lIERDVCAq Lw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHRoID4gMSkNCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsN Cj4gKw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogQklUUyAtIG51bWJlciBv ZiBIdWZmbWFuIGNvZGVzIHdpdGggbGVuZ3RoIGkgKi8NCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHRhYmxlID0gc3RyZWFtLT5jdXJyOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgbXQgPSAwOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIChp ID0gMDsgaSA8IDE2OyBpKyspIHsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBpbnQgbGk7DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBsaSA9IGpwZWdfZ2V0X2J5dGUoc3RyZWFtKTsNCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAobGkgPCAwKQ0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqByZXR1cm4gbGk7DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBtdCArPSBsaTsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oH0NCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIEhVRkZWQUwgLSB2YWx1ZXMg YXNzb2NpYXRlZCB3aXRoIGVhY2ggSHVmZm1hbiBjb2RlDQo+ICovDQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXQgPSBqcGVnX3NraXAoc3RyZWFtLCBtdCk7DQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Ow0KPiArDQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAodGFibGVzKSB7DQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdGFibGVzWyh0YyA8PCAxKSB8IHRoXS5zdGFy dCA9IHRhYmxlOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHRhYmxlc1sodGMgPDwgMSkgfCB0aF0ubGVuZ3RoID0gc3RyZWFtLT5jdXJyDQo+IC0gdGFi bGU7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9DQo+ICvCoMKgwqDCoMKgwqDC oH0NCj4gKw0KPiArwqDCoMKgwqDCoMKgwqByZXR1cm4ganBlZ19za2lwKHN0cmVhbSwgbGVuIC0g Mik7DQo+ICt9DQo+ICsNCj4gKy8qIEIuMi40LjQgUmVzdGFydCBpbnRlcnZhbCBkZWZpbml0aW9u IHN5bnRheCAqLw0KPiArc3RhdGljIGludCBqcGVnX3BhcnNlX3Jlc3RhcnRfaW50ZXJ2YWwoc3Ry dWN0IGpwZWdfc3RyZWFtICpzdHJlYW0sDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdTE2ICpyZXN0 YXJ0X2ludGVydmFsKQ0KPiArew0KPiArwqDCoMKgwqDCoMKgwqBpbnQgbGVuID0ganBlZ19nZXRf d29yZF9iZShzdHJlYW0pOw0KPiArwqDCoMKgwqDCoMKgwqBpbnQgcmk7DQo+ICsNCj4gK8KgwqDC oMKgwqDCoMKgaWYgKGxlbiA8IDApDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXR1cm4gbGVuOw0KPiArwqDCoMKgwqDCoMKgwqBpZiAobGVuICE9IDQpDQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKgwqDCoMKg wqByaSA9IGpwZWdfZ2V0X3dvcmRfYmUoc3RyZWFtKTsNCj4gK8KgwqDCoMKgwqDCoMKgaWYgKHJp IDwgMCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByaTsNCj4gKw0K PiArwqDCoMKgwqDCoMKgwqAqcmVzdGFydF9pbnRlcnZhbCA9IHJpOw0KPiArDQo+ICvCoMKgwqDC oMKgwqDCoHJldHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IGpwZWdfc2tpcF9zZWdt ZW50KHN0cnVjdCBqcGVnX3N0cmVhbSAqc3RyZWFtKQ0KPiArew0KPiArwqDCoMKgwqDCoMKgwqBp bnQgbGVuID0ganBlZ19nZXRfd29yZF9iZShzdHJlYW0pOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDC oGlmIChsZW4gPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGxl bjsNCj4gK8KgwqDCoMKgwqDCoMKgaWYgKGxlbiA8IDIpDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqByZXR1cm4g anBlZ19za2lwKHN0cmVhbSwgbGVuIC0gMik7DQo+ICt9DQo+ICsNCj4gKy8qKg0KPiArICoganBl Z19wYXJzZV9oZWFkZXIgLSBsb2NhdGUgbWFya2VyIHNlZ21lbnRzIGFuZCBvcHRpb25hbGx5IHBh cnNlDQo+IGhlYWRlcnMNCj4gKyAqIEBidWY6IGFkZHJlc3Mgb2YgdGhlIEpQRUcgYnVmZmVyLCBz aG91bGQgc3RhcnQgd2l0aCBhIFNPSSBtYXJrZXINCj4gKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUg SlBFRyBidWZmZXINCj4gKyAqIEBvdXQ6IHJldHVybnMgbWFya2VyIHNlZ21lbnQgcG9zaXRpb25z IGFuZCBvcHRpb25hbGx5IHBhcnNlZA0KPiBoZWFkZXJzDQo+ICsgKg0KPiArICogVGhlIG91dC0+ c2Nhbl9oZWFkZXIgcG9pbnRlciBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE5VTEwgb3IgcG9pbnQN Cj4gdG8gYSB2YWxpZA0KPiArICogdjRsMl9qcGVnX3NjYW5faGVhZGVyIHN0cnVjdHVyZS4gVGhl IG91dC0+aHVmZm1hbl90YWJsZXMgYW5kDQo+ICsgKiBvdXQtPnF1YW50aXphdGlvbl90YWJsZXMg cG9pbnRlcnMgbXVzdCBiZSBpbml0aWFsaXplZCB0byBOVUxMIG9yDQo+IHBvaW50IHRvIGENCj4g KyAqIHZhbGlkIGFycmF5IG9mIDQgdjRsMl9qcGVnX3JlZmVyZW5jZSBzdHJ1Y3R1cmVzIGVhY2gu DQo+ICsgKg0KPiArICogUmV0dXJucyAwIG9yIG5lZ2F0aXZlIGVycm9yIGlmIHBhcnNpbmcgZmFp bGVkLg0KPiArICovDQo+ICtpbnQgdjRsMl9qcGVnX3BhcnNlX2hlYWRlcih2b2lkICpidWYsIHNp emVfdCBsZW4sIHN0cnVjdA0KPiB2NGwyX2pwZWdfaGVhZGVyICpvdXQpDQo+ICt7DQo+ICvCoMKg wqDCoMKgwqDCoHN0cnVjdCBqcGVnX3N0cmVhbSBzdHJlYW07DQo+ICvCoMKgwqDCoMKgwqDCoGlu dCBtYXJrZXI7DQo+ICvCoMKgwqDCoMKgwqDCoGludCByZXQgPSAwOw0KPiArDQo+ICvCoMKgwqDC oMKgwqDCoHN0cmVhbS5jdXJyID0gYnVmOw0KPiArwqDCoMKgwqDCoMKgwqBzdHJlYW0uZW5kID0g c3RyZWFtLmN1cnIgKyBsZW47DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKgb3V0LT5udW1fZGh0ID0g MDsNCj4gK8KgwqDCoMKgwqDCoMKgb3V0LT5udW1fZHF0ID0gMDsNCj4gKw0KPiArwqDCoMKgwqDC oMKgwqAvKiB0aGUgZmlyc3QgbWFya2VyIG11c3QgYmUgU09JICovDQo+ICvCoMKgwqDCoMKgwqDC oG1hcmtlciA9IGpwZWdfbmV4dF9tYXJrZXIoJnN0cmVhbSk7DQo+ICvCoMKgwqDCoMKgwqDCoGlm IChtYXJrZXIgPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIG1h cmtlcjsNCj4gK8KgwqDCoMKgwqDCoMKgaWYgKG1hcmtlciAhPSBTT0kpDQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArwqDCoMKgwqDCoMKg wqAvKiBsb29wIHRocm91Z2ggbWFya2VyIHNlZ21lbnRzICovDQo+ICvCoMKgwqDCoMKgwqDCoHdo aWxlICgobWFya2VyID0ganBlZ19uZXh0X21hcmtlcigmc3RyZWFtKSkgPj0gMCkgew0KPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3dpdGNoIChtYXJrZXIpIHsNCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIGJhc2VsaW5lIERDVCAqLw0KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgY2FzZSBTT0YwOg0KRm9yIGlteDgganBlZywgZXh0ZW5kZWQgc2Vx dWVudGlhbCBzaG91bGQgYmUgc3VwcG9ydGVkLiBBZGRpbmcgdGhlIFNPRjENCmhlcmUgd291bGQg aGVscCwgYnV0IG1heWJlIG90aGVyIGNoYW5nZXMgYXJlIG5lZWRlZCB0b28uDQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0ganBlZ19yZWZlcmVu Y2Vfc2VnbWVudCgmc3RyZWFtLCAmb3V0LQ0KPiA+c29mKTsNCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0IDwgMCkNCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IHJldDsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXQgPSBqcGVnX3BhcnNlX2ZyYW1lX2hlYWRlcigmc3RyZWFtLCAmb3V0LQ0KPiA+ZnJhbWUpOw0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOw0K PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogZXh0ZW5kZWQgc2VxdWVudGlhbCwg cHJvZ3Jlc3NpdmUsIGxvc3NsZXNzICovDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBjYXNlIFNPRjEgLi4uIFNPRjM6DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAv KiBkaWZmZXJlbnRpYWwgY29kaW5nICovDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBjYXNlIFNPRjUgLi4uIFNPRjc6DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAv KiBhcml0aG1ldGljIGNvZGluZyAqLw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Y2FzZSBTT0Y5IC4uLiBTT0YxMToNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNh c2UgU09GMTMgLi4uIFNPRjE1Og0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoC8qIGZhbGx0aHJvdWdoICovDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBjYXNlIERBQzoNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNhc2Ug VEVNOg0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiAtRUlOVkFMOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjYXNl IERIVDoNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBy ZXQgPSBqcGVnX3JlZmVyZW5jZV9zZWdtZW50KCZzdHJlYW0sDQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAmb3V0LT5kaHRbb3V0LT5udW1fZGh0KysgJQ0KPiA0XSk7DQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCA8IDApDQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJl dHVybiByZXQ7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgcmV0ID0ganBlZ19wYXJzZV9odWZmbWFuX3RhYmxlcygmc3RyZWFtLA0KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvdXQtDQo+ID5odWZm bWFuX3RhYmxlcyk7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgYnJlYWs7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjYXNlIERRVDoN Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBq cGVnX3JlZmVyZW5jZV9zZWdtZW50KCZzdHJlYW0sDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAm b3V0LT5kcXRbb3V0LT5udW1fZHF0KysgJQ0KPiA0XSk7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCA8IDApDQo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBy ZXQ7DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 ID0ganBlZ19wYXJzZV9xdWFudGl6YXRpb25fdGFibGVzKCZzdHJlYW0sDQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBvdXQtPnF1YW50aXphdGlvbl90YWJsZXMpOw0KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOw0KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgY2FzZSBEUkk6DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0ganBlZ19wYXJzZV9yZXN0YXJ0X2ludGVydmFsKCZzdHJl YW0sDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCZvdXQtDQo+ID5yZXN0YXJ0X2ludGVydmFsKTsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgY2FzZSBTT1M6DQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0ganBlZ19yZWZlcmVuY2Vfc2VnbWVudCgmc3RyZWFtLCAm b3V0LQ0KPiA+c29zKTsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAocmV0IDwgMCkNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsNCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBqcGVnX3BhcnNlX3NjYW5f aGVhZGVyKCZzdHJlYW0sIG91dC0NCj4gPnNjYW4pOw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAqIHN0b3AgcGFyc2luZywgdGhlIHNjYW4gaGVhZGVyIG1h cmtzIHRoZQ0KPiBiZWdpbm5pbmcgb2YNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCogdGhlIGVudHJvcHkgY29kZWQgc2VnbWVudA0KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKi8NCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvdXQtPmVjc19vZmZzZXQgPSBz dHJlYW0uY3VyciAtICh1OCAqKWJ1ZjsNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gcmV0Ow0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAvKiBtYXJrZXJzIHdpdGhvdXQgcGFyYW1ldGVycyAqLw0KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgY2FzZSBSU1QwIC4uLiBSU1Q3OiAvKiByZXN0YXJ0ICovDQo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjYXNlIFNPSTogLyogc3RhcnQgb2YgaW1h Z2UgKi8NCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGNhc2UgRU9JOiAvKiBlbmQg b2YgaW1hZ2UgKi8NCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBicmVhazsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogc2tp cCB1bmtub3duIG9yIHVuc3VwcG9ydGVkIG1hcmtlciBzZWdtZW50cyAqLw0KPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZGVmYXVsdDoNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBqcGVnX3NraXBfc2VnbWVudCgmc3RyZWFtKTsN Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsN Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0NCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGlmIChyZXQgPCAwKQ0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7DQo+ICvCoMKgwqDCoMKgwqDCoH0NCj4gKw0K PiArwqDCoMKgwqDCoMKgwqByZXR1cm4gbWFya2VyOw0KPiArfQ0KPiArRVhQT1JUX1NZTUJPTF9H UEwodjRsMl9qcGVnX3BhcnNlX2hlYWRlcik7DQo+ICsNCj4gKy8qKg0KPiArICogdjRsMl9qcGVn X3BhcnNlX2ZyYW1lX2hlYWRlciAtIHBhcnNlIGZyYW1lIGhlYWRlcg0KPiArICogQGJ1ZjogYWRk cmVzcyBvZiB0aGUgZnJhbWUgaGVhZGVyLCBhZnRlciB0aGUgU09GMCBtYXJrZXINCj4gKyAqIEBs ZW46IGxlbmd0aCBvZiB0aGUgZnJhbWUgaGVhZGVyDQo+ICsgKiBAZnJhbWVfaGVhZGVyOiByZXR1 cm5zIHRoZSBwYXJzZWQgZnJhbWUgaGVhZGVyDQo+ICsgKg0KPiArICogUmV0dXJucyAwIG9yIG5l Z2F0aXZlIGVycm9yIGlmIHBhcnNpbmcgZmFpbGVkLg0KPiArICovDQo+ICtpbnQgdjRsMl9qcGVn X3BhcnNlX2ZyYW1lX2hlYWRlcih2b2lkICpidWYsIHNpemVfdCBsZW4sDQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3Ry dWN0IHY0bDJfanBlZ19mcmFtZV9oZWFkZXINCj4gKmZyYW1lX2hlYWRlcikNCj4gK3sNCj4gK8Kg wqDCoMKgwqDCoMKgc3RydWN0IGpwZWdfc3RyZWFtIHN0cmVhbTsNCj4gKw0KPiArwqDCoMKgwqDC oMKgwqBzdHJlYW0uY3VyciA9IGJ1ZjsNCj4gK8KgwqDCoMKgwqDCoMKgc3RyZWFtLmVuZCA9IHN0 cmVhbS5jdXJyICsgbGVuOw0KPiArwqDCoMKgwqDCoMKgwqByZXR1cm4ganBlZ19wYXJzZV9mcmFt ZV9oZWFkZXIoJnN0cmVhbSwgZnJhbWVfaGVhZGVyKTsNCj4gK30NCj4gK0VYUE9SVF9TWU1CT0xf R1BMKHY0bDJfanBlZ19wYXJzZV9mcmFtZV9oZWFkZXIpOw0KPiArDQo+ICsvKioNCj4gKyAqIHY0 bDJfanBlZ19wYXJzZV9zY2FuX2hlYWRlciAtIHBhcnNlIHNjYW4gaGVhZGVyDQo+ICsgKiBAYnVm OiBhZGRyZXNzIG9mIHRoZSBzY2FuIGhlYWRlciwgYWZ0ZXIgdGhlIFNPUyBtYXJrZXINCj4gKyAq IEBsZW46IGxlbmd0aCBvZiB0aGUgc2NhbiBoZWFkZXINCj4gKyAqIEBzY2FuX2hlYWRlcjogcmV0 dXJucyB0aGUgcGFyc2VkIHNjYW4gaGVhZGVyDQo+ICsgKg0KPiArICogUmV0dXJucyAwIG9yIG5l Z2F0aXZlIGVycm9yIGlmIHBhcnNpbmcgZmFpbGVkLg0KPiArICovDQo+ICtpbnQgdjRsMl9qcGVn X3BhcnNlX3NjYW5faGVhZGVyKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwNCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RydWN0 IHY0bDJfanBlZ19zY2FuX2hlYWRlcg0KPiAqc2Nhbl9oZWFkZXIpDQo+ICt7DQo+ICvCoMKgwqDC oMKgwqDCoHN0cnVjdCBqcGVnX3N0cmVhbSBzdHJlYW07DQo+ICsNCj4gK8KgwqDCoMKgwqDCoMKg c3RyZWFtLmN1cnIgPSBidWY7DQo+ICvCoMKgwqDCoMKgwqDCoHN0cmVhbS5lbmQgPSBzdHJlYW0u Y3VyciArIGxlbjsNCj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIGpwZWdfcGFyc2Vfc2Nhbl9oZWFk ZXIoJnN0cmVhbSwgc2Nhbl9oZWFkZXIpOw0KPiArfQ0KPiArRVhQT1JUX1NZTUJPTF9HUEwodjRs Ml9qcGVnX3BhcnNlX3NjYW5faGVhZGVyKTsNCj4gKw0KPiArLyoqDQo+ICsgKiB2NGwyX2pwZWdf cGFyc2VfcXVhbnRpemF0aW9uX3RhYmxlcyAtIHBhcnNlIHF1YW50aXphdGlvbiB0YWJsZXMNCj4g c2VnbWVudA0KPiArICogQGJ1ZjogYWRkcmVzcyBvZiB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIHNl Z21lbnQsIGFmdGVyIHRoZSBEUVQNCj4gbWFya2VyDQo+ICsgKiBAbGVuOiBsZW5ndGggb2YgdGhl IHF1YW50aXphdGlvbiB0YWJsZSBzZWdtZW50DQo+ICsgKiBAcV90YWJsZXM6IHJldHVybnMgZm91 ciByZWZlcmVuY2VzIGludG8gdGhlIGJ1ZmZlciBmb3IgdGhlDQo+ICsgKsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGZvdXIgcG9zc2libGUgcXVhbnRpemF0aW9uIHRhYmxlIGRlc3RpbmF0aW9ucw0K PiArICoNCj4gKyAqIFJldHVybnMgMCBvciBuZWdhdGl2ZSBlcnJvciBpZiBwYXJzaW5nIGZhaWxl ZC4NCj4gKyAqLw0KPiAraW50IHY0bDJfanBlZ19wYXJzZV9xdWFudGl6YXRpb25fdGFibGVzKHZv aWQgKmJ1Ziwgc2l6ZV90IGxlbiwNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwy X2pwZWdfcmVmZXJlbmNlDQo+ICpxX3RhYmxlcykNCj4gK3sNCj4gK8KgwqDCoMKgwqDCoMKgc3Ry dWN0IGpwZWdfc3RyZWFtIHN0cmVhbTsNCj4gKw0KPiArwqDCoMKgwqDCoMKgwqBzdHJlYW0uY3Vy ciA9IGJ1ZjsNCj4gK8KgwqDCoMKgwqDCoMKgc3RyZWFtLmVuZCA9IHN0cmVhbS5jdXJyICsgbGVu Ow0KPiArwqDCoMKgwqDCoMKgwqByZXR1cm4ganBlZ19wYXJzZV9xdWFudGl6YXRpb25fdGFibGVz KCZzdHJlYW0sIHFfdGFibGVzKTsNCj4gK30NCj4gK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfanBl Z19wYXJzZV9xdWFudGl6YXRpb25fdGFibGVzKTsNCj4gKw0KPiArLyoqDQo+ICsgKiB2NGwyX2pw ZWdfcGFyc2VfaHVmZm1hbl90YWJsZXMgLSBwYXJzZSBodWZmbWFuIHRhYmxlcyBzZWdtZW50DQo+ ICsgKiBAYnVmOiBhZGRyZXNzIG9mIHRoZSBIdWZmbWFuIHRhYmxlIHNlZ21lbnQsIGFmdGVyIHRo ZSBESFQgbWFya2VyDQo+ICsgKiBAbGVuOiBsZW5ndGggb2YgdGhlIEh1ZmZtYW4gdGFibGUgc2Vn bWVudA0KPiArICogQGh1ZmZtYW5fdGFibGVzOiByZXR1cm5zIGZvdXIgcmVmZXJlbmNlcyBpbnRv IHRoZSBidWZmZXIgZm9yIHRoZQ0KPiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBmb3VyIHBvc3NpYmxlIEh1ZmZtYW4gdGFibGUgZGVzdGluYXRpb25zLCBpbg0KPiArICrC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0aGUgb3JkZXIgREMwLCBEQzEsIEFD MCwgQUMxDQo+ICsgKg0KPiArICogUmV0dXJucyAwIG9yIG5lZ2F0aXZlIGVycm9yIGlmIHBhcnNp bmcgZmFpbGVkLg0KPiArICovDQo+ICtpbnQgdjRsMl9qcGVnX3BhcnNlX2h1ZmZtYW5fdGFibGVz KHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RydWN0IHY0bDJfanBlZ19y ZWZlcmVuY2UNCj4gKmh1ZmZtYW5fdGFibGVzKQ0KPiArew0KPiArwqDCoMKgwqDCoMKgwqBzdHJ1 Y3QganBlZ19zdHJlYW0gc3RyZWFtOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoHN0cmVhbS5jdXJy ID0gYnVmOw0KPiArwqDCoMKgwqDCoMKgwqBzdHJlYW0uZW5kID0gc3RyZWFtLmN1cnIgKyBsZW47 DQo+ICvCoMKgwqDCoMKgwqDCoHJldHVybiBqcGVnX3BhcnNlX2h1ZmZtYW5fdGFibGVzKCZzdHJl YW0sIGh1ZmZtYW5fdGFibGVzKTsNCj4gK30NCj4gK0VYUE9SVF9TWU1CT0xfR1BMKHY0bDJfanBl Z19wYXJzZV9odWZmbWFuX3RhYmxlcyk7DQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0 bDItanBlZy5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWpwZWcuaA0KPiBuZXcgZmlsZSBtb2RlIDEw MDY0NA0KPiBpbmRleCAwMDAwMDAwMDAwMDAuLjJmNjI5MmM3NTEyMg0KPiAtLS0gL2Rldi9udWxs DQo+ICsrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1qcGVnLmgNCj4gQEAgLTAsMCArMSwxMzUgQEAN Cj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8NCj4gKy8qDQo+ ICsgKiBWNEwyIEpQRUcgaGVscGVycyBoZWFkZXINCj4gKyAqDQo+ICsgKiBDb3B5cmlnaHQgKEMp IDIwMTkgUGVuZ3V0cm9uaXgsIFBoaWxpcHAgWmFiZWwgPGtlcm5lbEBwZW5ndXRyb25peA0KPiAu ZGU+DQo+ICsgKg0KPiArICogRm9yIHJlZmVyZW5jZSwgc2VlIEpQRUcgSVRVLVQuODEgKElTTy9J RUMgMTA5MTgtMSkNCj4gKyAqLw0KPiArDQo+ICsjaWZuZGVmIF9WNEwyX0pQRUdfSA0KPiArI2Rl ZmluZSBfVjRMMl9KUEVHX0gNCj4gKw0KPiArI2luY2x1ZGUgPGxpbnV4L3Y0bDItY29udHJvbHMu aD4NCj4gKw0KPiArI2RlZmluZSBWNEwyX0pQRUdfTUFYX0NPTVBPTkVOVFPCoMKgwqDCoMKgwqDC oDMNCg0KQW5kIFY0TDJfSlBFR19NQVhfQ09NUE9ORU5UUyA0IGlzIG5lY2Nlc2FyeSAoaW14OCwg QVJHQiksIG5vdCBzdXJlIGl0DQpvdGhlciBjaGFuZ2VzIG5lZWRlZC4uLg0KDQo+ICsjZGVmaW5l IFY0TDJfSlBFR19NQVhfVEFCTEVTwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDQNCj4gKw0KPiArLyoq DQo+ICsgKiBzdHJ1Y3QgdjRsMl9qcGVnX3JlZmVyZW5jZSAtIHJlZmVyZW5jZSBpbnRvIHRoZSBK UEVHIGJ1ZmZlcg0KPiArICogQHN0YXJ0OiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVm ZXJlbmNlZCBzZWdtZW50IG9yIHRhYmxlDQo+ICsgKiBAbGVuZ3RoOiBzaXplIG9mIHRoZSByZWZl cmVuY2VkIHNlZ21lbnQgb3IgdGFibGUNCj4gKyAqDQo+ICsgKiBXbmVuIHJlZmVyZW5jaW5nIG1h cmtlciBzZWdtZW50cywgc3RhcnQgcG9pbnRzIHJpZ2h0IGFmdGVyIHRoZQ0KPiBtYXJrZXIgY29k ZSwNCj4gKyAqIGFuZCBsZW5ndGggaXMgdGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgcGFyYW1ldGVy cywgZXhjbHVkaW5nIHRoZQ0KPiBtYXJrZXIgY29kZS4NCj4gKyAqLw0KPiArc3RydWN0IHY0bDJf anBlZ19yZWZlcmVuY2Ugew0KPiArwqDCoMKgwqDCoMKgwqB1OCAqc3RhcnQ7DQo+ICvCoMKgwqDC oMKgwqDCoHNpemVfdCBsZW5ndGg7DQo+ICt9Ow0KPiArDQo+ICsvKiBCLjIuMiBGcmFtZSBoZWFk ZXIgc3ludGF4ICovDQo+ICsNCj4gKy8qKg0KPiArICogc3RydWN0IHY0bDJfanBlZ19mcmFtZV9j b21wb25lbnRfc3BlYyAtIGZyYW1lIGNvbXBvbmVudC0NCj4gc3BlY2lmaWNhdGlvbg0KPiArICog QGNvbXBvbmVudF9pZGVudGlmaWVyOiBDW2ldDQo+ICsgKiBAaG9yaXpvbnRhbF9zYW1wbGluZ19m YWN0b3I6IEhbaV0NCj4gKyAqIEB2ZXJ0aWNhbF9zYW1wbGluZ19mYWN0b3I6IFZbaV0NCj4gKyAq IEBxdWFudGl6YXRpb25fdGFibGVfc2VsZWN0b3I6IHF1YW50aXphdGlvbiB0YWJsZSBkZXN0aW5h dGlvbg0KPiBzZWxlY3RvciBUcVtpXQ0KPiArICovDQo+ICtzdHJ1Y3QgdjRsMl9qcGVnX2ZyYW1l X2NvbXBvbmVudF9zcGVjIHsNCj4gK8KgwqDCoMKgwqDCoMKgdTggY29tcG9uZW50X2lkZW50aWZp ZXI7DQo+ICvCoMKgwqDCoMKgwqDCoHU4IGhvcml6b250YWxfc2FtcGxpbmdfZmFjdG9yOw0KPiAr wqDCoMKgwqDCoMKgwqB1OCB2ZXJ0aWNhbF9zYW1wbGluZ19mYWN0b3I7DQo+ICvCoMKgwqDCoMKg wqDCoHU4IHF1YW50aXphdGlvbl90YWJsZV9zZWxlY3RvcjsNCj4gK307DQo+ICsNCj4gKy8qKg0K PiArICogc3RydWN0IHY0bDJfanBlZ19mcmFtZV9oZWFkZXIgLSBKUEVHIGZyYW1lIGhlYWRlcg0K PiArICogQGhlaWdodDogWQ0KPiArICogQHdpZHRoOiBYDQo+ICsgKiBAcHJlY2lzaW9uOiBQDQo+ ICsgKiBAbnVtX2NvbXBvbmVudHM6IE5mDQo+ICsgKiBAY29tcG9uZW50OiBjb21wb25lbnQtc3Bl Y2lmaWNhdGlvbiwgc2VlDQo+IHY0bDJfanBlZ19mcmFtZV9jb21wb25lbnRfc3BlYw0KPiArICog QHN1YnNhbXBsaW5nOiBkZWNvZGVkIHN1YnNhbXBsaW5nIGZyb20gY29tcG9uZW50LXNwZWNpZmlj YXRpb24NCj4gKyAqLw0KPiArc3RydWN0IHY0bDJfanBlZ19mcmFtZV9oZWFkZXIgew0KPiArwqDC oMKgwqDCoMKgwqB1MTYgaGVpZ2h0Ow0KPiArwqDCoMKgwqDCoMKgwqB1MTYgd2lkdGg7DQo+ICvC oMKgwqDCoMKgwqDCoHU4IHByZWNpc2lvbjsNCj4gK8KgwqDCoMKgwqDCoMKgdTggbnVtX2NvbXBv bmVudHM7DQo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwyX2pwZWdfZnJhbWVfY29tcG9uZW50 X3NwZWMNCj4gY29tcG9uZW50W1Y0TDJfSlBFR19NQVhfQ09NUE9ORU5UU107DQo+ICvCoMKgwqDC oMKgwqDCoGVudW0gdjRsMl9qcGVnX2Nocm9tYV9zdWJzYW1wbGluZyBzdWJzYW1wbGluZzsNCj4g K307DQo+ICsNCj4gKy8qIEIuMi4zIFNjYW4gaGVhZGVyIHN5bnRheCAqLw0KPiArDQo+ICsvKioN Cj4gKyAqIHN0cnVjdCB2NGwyX2pwZWdfc2Nhbl9jb21wb25lbnRfc3BlYyAtIHNjYW4gY29tcG9u ZW50LQ0KPiBzcGVjaWZpY2F0aW9uDQo+ICsgKiBAY29tcG9uZW50X3NlbGVjdG9yOiBDc1tqXQ0K PiArICogQGRjX2VudHJvcHlfY29kaW5nX3RhYmxlX3NlbGVjdG9yOiBUZFtqXQ0KPiArICogQGFj X2VudHJvcHlfY29kaW5nX3RhYmxlX3NlbGVjdG9yOiBUYVtqXQ0KPiArICovDQo+ICtzdHJ1Y3Qg djRsMl9qcGVnX3NjYW5fY29tcG9uZW50X3NwZWMgew0KPiArwqDCoMKgwqDCoMKgwqB1OCBjb21w b25lbnRfc2VsZWN0b3I7DQo+ICvCoMKgwqDCoMKgwqDCoHU4IGRjX2VudHJvcHlfY29kaW5nX3Rh YmxlX3NlbGVjdG9yOw0KPiArwqDCoMKgwqDCoMKgwqB1OCBhY19lbnRyb3B5X2NvZGluZ190YWJs ZV9zZWxlY3RvcjsNCj4gK307DQo+ICsNCj4gKy8qKg0KPiArICogc3RydWN0IHY0bDJfanBlZ19z Y2FuX2hlYWRlciAtIEpQRUcgc2NhbiBoZWFkZXINCj4gKyAqIEBudW1fY29tcG9uZW50czogTnMN Cj4gKyAqIEBjb21wb25lbnQ6IGNvbXBvbmVudC1zcGVjaWZpY2F0aW9uLCBzZWUNCj4gdjRsMl9q cGVnX3NjYW5fY29tcG9uZW50X3NwZWMNCj4gKyAqLw0KPiArc3RydWN0IHY0bDJfanBlZ19zY2Fu X2hlYWRlciB7DQo+ICvCoMKgwqDCoMKgwqDCoHU4IG51bV9jb21wb25lbnRzO8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIE5zICov DQo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwyX2pwZWdfc2Nhbl9jb21wb25lbnRfc3BlYw0K PiBjb21wb25lbnRbVjRMMl9KUEVHX01BWF9DT01QT05FTlRTXTsNCj4gK8KgwqDCoMKgwqDCoMKg LyogU3MsIFNlLCBBaCwgYW5kIEFsIGFyZSBub3QgdXNlZCBieSBhbnkgZHJpdmVyICovDQo+ICt9 Ow0KPiArDQo+ICsvKioNCj4gKyAqIHN0cnVjdCB2NGwyX2pwZWdfaGVhZGVyIC0gcGFyc2VkIEpQ RUcgaGVhZGVyDQo+ICsgKiBAc29mOiBwb2ludGVyIHRvIGZyYW1lIGhlYWRlciBhbmQgc2l6ZQ0K PiArICogQHNvczogcG9pbnRlciB0byBzY2FuIGhlYWRlciBhbmQgc2l6ZQ0KPiArICogQGRodDog cG9pbnRlcnMgdG8gaHVmZm1hbiB0YWJsZXMgYW5kIHNpemVzDQo+ICsgKiBAZHF0OiBwb2ludGVy cyB0byBxdWFudGl6YXRpb24gdGFibGVzIGFuZCBzaXplcw0KPiArICogQGZyYW1lOiBwYXJzZWQg ZnJhbWUgaGVhZGVyDQo+ICsgKiBAc2NhbjogcG9pbnRlciB0byBwYXJzZWQgc2NhbiBoZWFkZXIs IG9wdGlvbmFsDQo+ICsgKiBAcXVhbnRpemF0aW9uX3RhYmxlczogcmVmZXJlbmNlcyB0byBmb3Vy IHF1YW50aXphdGlvbiB0YWJsZXMsDQo+IG9wdGlvbmFsDQo+ICsgKiBAaHVmZm1hbl90YWJsZXM6 IHJlZmVyZW5jZXMgdG8gZm91ciBIdWZmbWFuIHRhYmxlcyBpbiBEQzAsIERDMSwNCj4gQUMwLCBB QzENCj4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb3JkZXIsIG9wdGlv bmFsDQo+ICsgKiBAcmVzdGFydF9pbnRlcnZhbDogbnVtYmVyIG9mIE1DVSBwZXIgcmVzdGFydCBp bnRlcnZhbCwgUmkNCj4gKyAqIEBlY3Nfb2Zmc2V0OiBidWZmZXIgb2Zmc2V0IGluIGJ5dGVzIHRv IHRoZSBlbnRyb3B5IGNvZGVkIHNlZ21lbnQNCj4gKyAqDQo+ICsgKiBXaGVuIHRoaXMgc3RydWN0 dXJlIGlzIHBhc3NlZCB0byB2NGwyX2pwZWdfcGFyc2VfaGVhZGVyLCB0aGUNCj4gb3B0aW9uYWwg c2NhbiwNCj4gKyAqIHF1YW50aXphdGlvbl90YWJsZXMsIGFuZCBodWZmbWFuX3RhYmxlcyBwb2lu dGVycyBtdXN0IGJlDQo+IGluaXRpYWxpemVkIHRvIE5VTEwNCj4gKyAqIG9yIHBvaW50IGF0IHZh bGlkIG1lbW9yeS4NCj4gKyAqLw0KPiArc3RydWN0IHY0bDJfanBlZ19oZWFkZXIgew0KPiArwqDC oMKgwqDCoMKgwqBzdHJ1Y3QgdjRsMl9qcGVnX3JlZmVyZW5jZSBzb2Y7DQo+ICvCoMKgwqDCoMKg wqDCoHN0cnVjdCB2NGwyX2pwZWdfcmVmZXJlbmNlIHNvczsNCj4gK8KgwqDCoMKgwqDCoMKgdW5z aWduZWQgaW50IG51bV9kaHQ7DQo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwyX2pwZWdfcmVm ZXJlbmNlIGRodFtWNEwyX0pQRUdfTUFYX1RBQkxFU107DQo+ICvCoMKgwqDCoMKgwqDCoHVuc2ln bmVkIGludCBudW1fZHF0Ow0KPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgdjRsMl9qcGVnX3JlZmVy ZW5jZSBkcXRbVjRMMl9KUEVHX01BWF9UQUJMRVNdOw0KPiArDQo+ICvCoMKgwqDCoMKgwqDCoHN0 cnVjdCB2NGwyX2pwZWdfZnJhbWVfaGVhZGVyIGZyYW1lOw0KPiArwqDCoMKgwqDCoMKgwqBzdHJ1 Y3QgdjRsMl9qcGVnX3NjYW5faGVhZGVyICpzY2FuOw0KPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qg djRsMl9qcGVnX3JlZmVyZW5jZSAqcXVhbnRpemF0aW9uX3RhYmxlczsNCj4gK8KgwqDCoMKgwqDC oMKgc3RydWN0IHY0bDJfanBlZ19yZWZlcmVuY2UgKmh1ZmZtYW5fdGFibGVzOw0KPiArwqDCoMKg wqDCoMKgwqB1MTYgcmVzdGFydF9pbnRlcnZhbDsNCj4gK8KgwqDCoMKgwqDCoMKgc2l6ZV90IGVj c19vZmZzZXQ7DQo+ICt9Ow0KPiArDQo+ICtpbnQgdjRsMl9qcGVnX3BhcnNlX2hlYWRlcih2b2lk ICpidWYsIHNpemVfdCBsZW4sIHN0cnVjdA0KPiB2NGwyX2pwZWdfaGVhZGVyICpvdXQpOw0KPiAr DQo+ICtpbnQgdjRsMl9qcGVnX3BhcnNlX2ZyYW1lX2hlYWRlcih2b2lkICpidWYsIHNpemVfdCBs ZW4sDQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgc3RydWN0IHY0bDJfanBlZ19mcmFtZV9oZWFkZXINCj4gKmZyYW1lX2hl YWRlcik7DQo+ICtpbnQgdjRsMl9qcGVnX3BhcnNlX3NjYW5faGVhZGVyKHZvaWQgKmJ1Ziwgc2l6 ZV90IGxlbiwNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgc3RydWN0IHY0bDJfanBlZ19zY2FuX2hlYWRlcg0KPiAqc2Nhbl9o ZWFkZXIpOw0KPiAraW50IHY0bDJfanBlZ19wYXJzZV9xdWFudGl6YXRpb25fdGFibGVzKHZvaWQg KmJ1Ziwgc2l6ZV90IGxlbiwNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCB2NGwyX2pw ZWdfcmVmZXJlbmNlDQo+ICpxX3RhYmxlcyk7DQo+ICtpbnQgdjRsMl9qcGVnX3BhcnNlX2h1ZmZt YW5fdGFibGVzKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwNCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RydWN0IHY0 bDJfanBlZ19yZWZlcmVuY2UNCj4gKmh1ZmZtYW5fdGFibGVzKTsNCj4gKw0KPiArI2VuZGlmDQo+ IC0tDQo+IDIuMjAuMQ0KPiA=