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=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_PASS 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 106A6C43387 for ; Fri, 11 Jan 2019 20:41:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9DF8121783 for ; Fri, 11 Jan 2019 20:41:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="JrRTC9rj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726438AbfAKUlR (ORCPT ); Fri, 11 Jan 2019 15:41:17 -0500 Received: from mail-eopbgr80137.outbound.protection.outlook.com ([40.107.8.137]:6212 "EHLO EUR04-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726117AbfAKUlQ (ORCPT ); Fri, 11 Jan 2019 15:41:16 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aencm5g0vOPJBYZcJzqKAds7wKwxWYL0NRlujGXOyXo=; b=JrRTC9rj+uzADw6dQGUEXDqeDB5/dTewxTRQLjYAOgoP6PWswRvdQCAX2tjRxsIma6ajWddsPaSzZ79ZkmD8DR0nSs6pRCJhwGwvSgt4iLrTNPoesvHAyx4NIAjYMF75FLRwM57EPVvYeUSjGiWgfZzuPM/5Zb3fUdWXMhfykQk= Received: from DB7PR08MB3771.eurprd08.prod.outlook.com (20.178.47.26) by DB7PR08MB3339.eurprd08.prod.outlook.com (52.134.111.146) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.9; Fri, 11 Jan 2019 20:41:04 +0000 Received: from DB7PR08MB3771.eurprd08.prod.outlook.com ([fe80::83:10e6:94a0:6bb8]) by DB7PR08MB3771.eurprd08.prod.outlook.com ([fe80::83:10e6:94a0:6bb8%4]) with mapi id 15.20.1495.013; Fri, 11 Jan 2019 20:41:04 +0000 From: Kirill Tkhai To: "Eric W. Biederman" , zzoru CC: "davem@davemloft.net" , Andrey Vagin , "dsahern@gmail.com" , "nicolas.dichtel@6wind.com" , "tyhicks@canonical.com" , "netdev@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "syzkaller@googlegroups.com" Subject: Re: net/core: BUG in copy_net_ns() Thread-Topic: net/core: BUG in copy_net_ns() Thread-Index: AQHUqdiMBz+oFRl8Gk6Uz6poKbZ54qWqhlpagAAB2QA= Date: Fri, 11 Jan 2019 20:41:04 +0000 Message-ID: References: <87fttzaq8k.fsf@xmission.com> In-Reply-To: <87fttzaq8k.fsf@xmission.com> Accept-Language: ru-RU, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: HE1PR05CA0172.eurprd05.prod.outlook.com (2603:10a6:3:f8::20) To DB7PR08MB3771.eurprd08.prod.outlook.com (2603:10a6:10:7c::26) authentication-results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [128.69.177.17] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;DB7PR08MB3339;20:ebFuBsNy6AOhiSNplPAIQpcLZs6ctkwlQ1pSWI608f6KqHjz8giCf1CTmmd9fIlJiY6Ch2ZixmfO5Din97VhmU+bu1zvnm+qaM5/dRCRK4FrKPPuwo2Nz6C2Isy0xY1LUMSW8/hAe1hRg0k5UJgQNqz/o9DGObvlRpATL4jLa6k= x-ms-office365-filtering-correlation-id: b2187364-fdfc-4a49-bc1e-08d678051ab6 x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(7168020)(4627221)(201703031133081)(201702281549075)(8990200)(5600109)(711020)(2017052603328)(7153060)(7193020);SRVR:DB7PR08MB3339; x-ms-traffictypediagnostic: DB7PR08MB3339: x-ld-processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr x-microsoft-antispam-prvs: x-forefront-prvs: 09144DB0F7 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(376002)(346002)(396003)(136003)(366004)(39850400004)(189003)(199004)(11346002)(6486002)(229853002)(105586002)(30864003)(31686004)(6116002)(3846002)(39060400002)(6246003)(6436002)(256004)(14444005)(4326008)(6306002)(97736004)(6512007)(53946003)(25786009)(106356001)(53546011)(316002)(76176011)(476003)(8676002)(8936002)(52116002)(6506007)(66066001)(81166006)(31696002)(53936002)(71200400001)(71190400001)(386003)(81156014)(54906003)(478600001)(86362001)(2906002)(575784001)(110136005)(2616005)(4744004)(68736007)(36756003)(966005)(486006)(26005)(7736002)(14454004)(102836004)(186003)(5660300001)(7416002)(99286004)(305945005)(55236004)(446003)(579004)(559001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB7PR08MB3339;H:DB7PR08MB3771.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: iQ4tuIg3/bXSOUApb+HATzjdSRyrT39HdRJJPEoKyiOfJJ6WnUiGbxqkYPuRNaXTKYi9VlFsw+tt2nCzX0+AjMKEY/+18CP2/+EnrKZCW1yDJn8rs2QPyV11iBp+Nsi5oABLeuMOeUFo1CVlu+40OJALwJpq0bZgsJwPeAM8WD43NpTU3gnBX3zAWSKSpWRv75Izfzug0/O0LDgF9Z8MnqSiyAFv54wmuUQWf+mYrw/CUPXDx1/fpmKiV38kdaRcjKd5eM7+jPwu1RNeOjm9PQ0LGlsS79kia4W45F4RfDULcTMQiIKfehHjWjBRJ0/LHoH9XYNos4BfBz0ZoEcMSpXT3vrCuuLB1Gv9Zs5UsKyydkiIZ0Xu6qfcPTOVdGxZ5ERrHqrMxmUGpVPtUG0YahKsdj5MIqFuM28OBoQChb4= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: <483167BA07A40C4882E6AEE71910718E@eurprd08.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: b2187364-fdfc-4a49-bc1e-08d678051ab6 X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Jan 2019 20:41:02.4006 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR08MB3339 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gMTEuMDEuMjAxOSAyMzozMywgRXJpYyBXLiBCaWVkZXJtYW4gd3JvdGU6DQo+IHp6b3J1IDx6 em9ydTAwN0BnbWFpbC5jb20+IHdyaXRlczoNCj4gDQo+PiBuZXQvY29yZTogQlVHIGluIGNvcHlf bmV0X25zKCkgKG5ldF9uYW1lc3BhY2UuYykNCj4gDQo+IEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlz IGZhaWx1cmUgcmVwb3J0IGF0IGFsbC4NCj4gDQo+IEkgZG9uJ3Qgc2VlIHRoZSBjb25uZWN0aW9u IHRvIGNvcHlfbmV0X25zKCkuICBBbmQgSSBkb24ndCBzZWUgaG93IHRoZQ0KPiBzdWdnZXN0ZWQg cGF0Y2ggc2hvcnQgb2YgY292ZXJpbmcgdXAgYSBtZW1vcnkgc3RvbXAgY291bGQgcG9zc2libHkg bWFrZQ0KPiBhIGRpZmZlcmVuY2UuDQo+IA0KPiBXaGF0IGFtIEkgbWlzc2luZz8NCg0KSSByZWNl aXZlZCAzIHNwYW0gbWVzc2FnZXMgZnJvbSB0aGlzIGFkZHJlc3MgdG9kYXkuDQpXZSBjYW4gc2lt cGx5IGlnbm9yZSB0aGlzIHJlcG9ydC4NCg0KPiANCj4gDQo+PiBIZWxsbywNCj4+DQo+PiBJJ3Zl IGdvdCB0aGUgZm9sbG93aW5nIGVycm9yIHJlcG9ydCB3aGlsZSBmdXp6aW5nIHRoZSBrZXJuZWwg d2l0aCBzeXprYWxsZXIuDQo+Pg0KPj4gT24gY29tbWl0IDFiZGJlMjI3NDkyMDc1ZDA1OGUzN2Ni M2Q0MDBlNjQ2OGQwMDk1YjUNCj4+DQo+PiBTeXprYWxsZXIgaGl0ICdXQVJOSU5HIGluIF9fYWxs b2NfcGFnZXNfc2xvd3BhdGgnIGJ1Zy4NCj4+DQo+PiBzeXotZXhlY3V0b3I1NjEgKDE3NDUzKSB1 c2VkIGdyZWF0ZXN0IHN0YWNrIGRlcHRoOiAyNTA1NiBieXRlcyBsZWZ0DQo+PiBXQVJOSU5HOiBD UFU6IDAgUElEOiA2OTIgYXQgbW0vcGFnZV9hbGxvYy5jOjQ0MTUNCj4+IF9fYWxsb2NfcGFnZXNf c2xvd3BhdGgrMHgxY2IxLzB4MjIyMCBtbS9wYWdlX2FsbG9jLmM6NDM4Ng0KPj4gS2VybmVsIHBh bmljIC0gbm90IHN5bmNpbmc6IHBhbmljX29uX3dhcm4gc2V0IC4uLg0KPj4gQ1BVOiAwIFBJRDog NjkyIENvbW06IGtzd2FwZDAgTm90IHRhaW50ZWQgNS4wLjAtcmMxKyAjNA0KPj4gSGFyZHdhcmUg bmFtZTogUUVNVSBTdGFuZGFyZCBQQyAoaTQ0MEZYICsgUElJWCwgMTk5NiksIEJJT1MNCj4+IFVi dW50dS0xLjguMi0xdWJ1bnR1MSAwNC8wMS8yMDE0DQo+PiBDYWxsIFRyYWNlOg0KPj4gwqBfX2R1 bXBfc3RhY2sgbGliL2R1bXBfc3RhY2suYzo3NyBbaW5saW5lXQ0KPj4gwqBkdW1wX3N0YWNrKzB4 Y2EvMHgxM2UgbGliL2R1bXBfc3RhY2suYzoxMTMNCj4+IMKgcGFuaWMrMHgyNzgvMHg1YmYga2Vy bmVsL3BhbmljLmM6MjE0DQo+PiDCoF9fd2Fybi5jb2xkLjEwKzB4MjAvMHg0NSBrZXJuZWwvcGFu aWMuYzo1NzENCj4+IMKgcmVwb3J0X2J1ZysweDI0Ni8weDJkMCBsaWIvYnVnLmM6MTg2DQo+PiDC oGZpeHVwX2J1ZyBhcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYzoxNzggW2lubGluZV0NCj4+IMKgZG9f ZXJyb3JfdHJhcCsweDEyMy8weDFlMCBhcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYzoyNzENCj4+IMKg ZG9faW52YWxpZF9vcCsweDMxLzB4NDAgYXJjaC94ODYva2VybmVsL3RyYXBzLmM6MjkwDQo+PiDC oGludmFsaWRfb3ArMHgxNC8weDIwIGFyY2gveDg2L2VudHJ5L2VudHJ5XzY0LlM6OTczDQo+PiBS SVA6IDAwMTA6X19hbGxvY19wYWdlc19zbG93cGF0aCsweDFjYjEvMHgyMjIwIG1tL3BhZ2VfYWxs b2MuYzo0NDE1DQo+PiBDb2RlOiA4YiA4NCAyNCBhOCAwMCAwMCAwMCBlOSBlYSBmMSBmZiBmZiA4 NSBkMiAwZiA4NSAwYiAwMSAwMCAwMCA0OCBjNw0KPj4gYzcgYzAgNWUgNTUgODQgZTggNzkgZjgg MjMgMDIgZTkgODYgZjkgZmYgZmYgNDQgOGIgNzQgMjQgMGMgPDBmPiAwYiA0OA0KPj4gYjggMDAg MDAgMDAgMDAgMDAgZmMgZmYgZGYgNDggOGIgNTQgMjQgMTggNDggYzEgZWEgMDMgODANCj4+IFJT UDogMDAxODpmZmZmODg4MDY4M2ZlZGI4IEVGTEFHUzogMDAwMTAwNDYNCj4+IFJBWDogMDAwMDAw MDAwMDAwMDAwMCBSQlg6IDAwMDAwMDAwMDAwMDAwMDAgUkNYOiAxZmZmZjExMDBkMDdmZGE0DQo+ PiBSRFg6IDAwMDAwMDAwMDAwMDAwMDAgUlNJOiAwMDAwMDAwMDAwMDAwMDAwIFJESTogZmZmZjg4 ODA3ZmZkZDUyOA0KPj4gUkJQOiBkZmZmZmMwMDAwMDAwMDAwIFIwODogMDAwMDAwMDAwMDAwMDAw MCBSMDk6IDAwMDAwMDAwMDAwMDA2N2ENCj4+IFIxMDogMDAwMDAwMDAwMDAwMDAwMCBSMTE6IGZm ZmY4ODgwN2ZmZGM0ODcgUjEyOiAwMDAwMDAwMDAwMDAwMDAwDQo+PiBSMTM6IGZmZmY4ODgwNjgz ZmYwMTAgUjE0OiAwMDAwMDAwMDAwNDE1YTAwIFIxNTogZmZmZjg4ODA2ODNmZjAxMA0KPj4gwqBf X2FsbG9jX3BhZ2VzX25vZGVtYXNrKzB4NTIxLzB4NWYwIG1tL3BhZ2VfYWxsb2MuYzo0NTU1DQo+ PiDCoF9fYWxsb2NfcGFnZXMgaW5jbHVkZS9saW51eC9nZnAuaDo0NzMgW2lubGluZV0NCj4+IMKg X19hbGxvY19wYWdlc19ub2RlIGluY2x1ZGUvbGludXgvZ2ZwLmg6NDg2IFtpbmxpbmVdDQo+PiDC oGttZW1fZ2V0cGFnZXMgbW0vc2xhYi5jOjEzOTggW2lubGluZV0NCj4+IMKgY2FjaGVfZ3Jvd19i ZWdpbisweDk1LzB4MzAwIG1tL3NsYWIuYzoyNjY2DQo+PiDCoGZhbGxiYWNrX2FsbG9jKzB4MWNl LzB4MjcwIG1tL3NsYWIuYzozMjA4DQo+PiDCoF9fZG9fY2FjaGVfYWxsb2MgbW0vc2xhYi5jOjMz NDUgW2lubGluZV0NCj4+IMKgc2xhYl9hbGxvYyBtbS9zbGFiLmM6MzM3MyBbaW5saW5lXQ0KPj4g wqBrbWVtX2NhY2hlX2FsbG9jKzB4Mjg2LzB4MmYwIG1tL3NsYWIuYzozNTQxDQo+PiDCoGNyZWF0 ZV9vYmplY3QrMHg4My8weDg4MCBtbS9rbWVtbGVhay5jOjU3OA0KPj4gwqBrbWVtbGVha19hbGxv Y19yZWN1cnNpdmUgaW5jbHVkZS9saW51eC9rbWVtbGVhay5oOjU1IFtpbmxpbmVdDQo+PiDCoHNs YWJfcG9zdF9hbGxvY19ob29rIG1tL3NsYWIuaDo0NDIgW2lubGluZV0NCj4+IMKgc2xhYl9hbGxv YyBtbS9zbGFiLmM6MzM4MSBbaW5saW5lXQ0KPj4gwqBrbWVtX2NhY2hlX2FsbG9jKzB4MThmLzB4 MmYwIG1tL3NsYWIuYzozNTQxDQo+PiDCoG1lbXBvb2xfYWxsb2MrMHgxM2UvMHgzNDAgbW0vbWVt cG9vbC5jOjM4NQ0KPj4gwqBiaW9fYWxsb2NfYmlvc2V0KzB4MzZmLzB4NWQwIGJsb2NrL2Jpby5j OjQ4OQ0KPj4gwqBiaW9fYWxsb2MgaW5jbHVkZS9saW51eC9iaW8uaDozOTMgW2lubGluZV0NCj4+ IMKgc3VibWl0X2JoX3diYy5pc3JhLjU3KzB4MTI4LzB4NjgwIGZzL2J1ZmZlci5jOjMwNjENCj4+ IMKgX19ibG9ja193cml0ZV9mdWxsX3BhZ2UrMHg2ZTgvMHhjZDAgZnMvYnVmZmVyLmM6MTc2NQ0K Pj4gwqBibG9ja193cml0ZV9mdWxsX3BhZ2UrMHgyMDIvMHgyNTAgZnMvYnVmZmVyLmM6Mjk1NQ0K Pj4gwqBwYWdlb3V0IG1tL3Ztc2Nhbi5jOjg2NSBbaW5saW5lXQ0KPj4gwqBzaHJpbmtfcGFnZV9s aXN0KzB4MjIwZi8weDM4MDAgbW0vdm1zY2FuLmM6MTM4Mw0KPj4gwqBzaHJpbmtfaW5hY3RpdmVf bGlzdCsweDNjMi8weGFhMCBtbS92bXNjYW4uYzoxOTYxDQo+PiDCoHNocmlua19saXN0IG1tL3Zt c2Nhbi5jOjIyNzMgW2lubGluZV0NCj4+IMKgc2hyaW5rX25vZGVfbWVtY2cuY29uc3Rwcm9wLjgz KzB4NGJmLzB4MTBlMCBtbS92bXNjYW4uYzoyNTM4DQo+PiDCoHNocmlua19ub2RlKzB4MTYyLzB4 ZDEwIG1tL3Ztc2Nhbi5jOjI3NTMNCj4+IMKga3N3YXBkX3Nocmlua19ub2RlIG1tL3Ztc2Nhbi5j OjM1MTYgW2lubGluZV0NCj4+IMKgYmFsYW5jZV9wZ2RhdCsweDQ3Zi8weGMwMCBtbS92bXNjYW4u YzozNjc0DQo+PiDCoGtzd2FwZCsweDU3Yy8weGRlMCBtbS92bXNjYW4uYzozOTI5DQo+PiDCoGt0 aHJlYWQrMHgzNDcvMHg0MTAga2VybmVsL2t0aHJlYWQuYzoyNDYNCj4+IMKgcmV0X2Zyb21fZm9y aysweDNhLzB4NTAgYXJjaC94ODYvZW50cnkvZW50cnlfNjQuUzozNTINCj4+IER1bXBpbmcgZnRy YWNlIGJ1ZmZlcjoNCj4+IMKgwqAgKGZ0cmFjZSBidWZmZXIgZW1wdHkpDQo+PiBLZXJuZWwgT2Zm c2V0OiBkaXNhYmxlZA0KPj4gUmVib290aW5nIGluIDg2NDAwIHNlY29uZHMuLg0KPj4NCj4+DQo+ PiBTeXprYWxsZXIgcmVwcm9kdWNlcjoNCj4+ICMge1RocmVhZGVkOmZhbHNlIENvbGxpZGU6ZmFs c2UgUmVwZWF0OnRydWUgUmVwZWF0VGltZXM6MCBQcm9jczo4DQo+PiBTYW5kYm94Om5vbmUgRmF1 bHQ6ZmFsc2UgRmF1bHRDYWxsOi0xIEZhdWx0TnRoOjAgRW5hYmxlVHVuOmZhbHNlDQo+PiBVc2VU bXBEaXI6dHJ1ZSBFbmFibGVDZ3JvdXBzOmZhbHNlIEVuYWJsZU5ldGRldjp0cnVlIFJlc2V0TmV0 OmZhbHNlDQo+PiBIYW5kbGVTZWd2OmZhbHNlIFJlcHJvOmZhbHNlIFRyYWNlOmZhbHNlfQ0KPj4g dW5zaGFyZSgweDQwMDAwMDAwKQ0KPj4NCj4+DQo+PiBDIHJlcHJvZHVjZXI6DQo+PiAvLyBhdXRv Z2VuZXJhdGVkIGJ5IHN5emthbGxlciAoaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9zeXprYWxs ZXIpDQo+Pg0KPj4gI2RlZmluZSBfR05VX1NPVVJDRQ0KPj4NCj4+ICNpbmNsdWRlIDxhcnBhL2lu ZXQuaD4NCj4+ICNpbmNsdWRlIDxkaXJlbnQuaD4NCj4+ICNpbmNsdWRlIDxlbmRpYW4uaD4NCj4+ ICNpbmNsdWRlIDxlcnJuby5oPg0KPj4gI2luY2x1ZGUgPGZjbnRsLmg+DQo+PiAjaW5jbHVkZSA8 bmV0L2lmLmg+DQo+PiAjaW5jbHVkZSA8bmV0L2lmX2FycC5oPg0KPj4gI2luY2x1ZGUgPG5ldGlu ZXQvaW4uaD4NCj4+ICNpbmNsdWRlIDxzY2hlZC5oPg0KPj4gI2luY2x1ZGUgPHNpZ25hbC5oPg0K Pj4gI2luY2x1ZGUgPHN0ZGFyZy5oPg0KPj4gI2luY2x1ZGUgPHN0ZGJvb2wuaD4NCj4+ICNpbmNs dWRlIDxzdGRpbnQuaD4NCj4+ICNpbmNsdWRlIDxzdGRpby5oPg0KPj4gI2luY2x1ZGUgPHN0ZGxp Yi5oPg0KPj4gI2luY2x1ZGUgPHN0cmluZy5oPg0KPj4gI2luY2x1ZGUgPHN5cy9pb2N0bC5oPg0K Pj4gI2luY2x1ZGUgPHN5cy9tb3VudC5oPg0KPj4gI2luY2x1ZGUgPHN5cy9wcmN0bC5oPg0KPj4g I2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPg0KPj4gI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCj4+ ICNpbmNsdWRlIDxzeXMvc3RhdC5oPg0KPj4gI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+DQo+PiAj aW5jbHVkZSA8c3lzL3RpbWUuaD4NCj4+ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCj4+ICNpbmNs dWRlIDxzeXMvdWlvLmg+DQo+PiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4NCj4+ICNpbmNsdWRlIDx0 aW1lLmg+DQo+PiAjaW5jbHVkZSA8dW5pc3RkLmg+DQo+Pg0KPj4gI2luY2x1ZGUgPGxpbnV4L2lm X2FkZHIuaD4NCj4+ICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPg0KPj4gI2luY2x1ZGUgPGxp bnV4L2lmX2xpbmsuaD4NCj4+ICNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4NCj4+ICNpbmNsdWRl IDxsaW51eC9pbjYuaD4NCj4+ICNpbmNsdWRlIDxsaW51eC9pcC5oPg0KPj4gI2luY2x1ZGUgPGxp bnV4L25laWdoYm91ci5oPg0KPj4gI2luY2x1ZGUgPGxpbnV4L25ldC5oPg0KPj4gI2luY2x1ZGUg PGxpbnV4L25ldGxpbmsuaD4NCj4+ICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4NCj4+ICNp bmNsdWRlIDxsaW51eC90Y3AuaD4NCj4+ICNpbmNsdWRlIDxsaW51eC92ZXRoLmg+DQo+Pg0KPj4g dW5zaWduZWQgbG9uZyBsb25nIHByb2NpZDsNCj4+DQo+PiBzdGF0aWMgdm9pZCBzbGVlcF9tcyh1 aW50NjRfdCBtcykNCj4+IHsNCj4+IMKgIHVzbGVlcChtcyAqIDEwMDApOw0KPj4gfQ0KPj4NCj4+ IHN0YXRpYyB1aW50NjRfdCBjdXJyZW50X3RpbWVfbXModm9pZCkNCj4+IHsNCj4+IMKgIHN0cnVj dCB0aW1lc3BlYyB0czsNCj4+IMKgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywg JnRzKSkNCj4+IMKgwqDCoCBleGl0KDEpOw0KPj4gwqAgcmV0dXJuICh1aW50NjRfdCl0cy50dl9z ZWMgKiAxMDAwICsgKHVpbnQ2NF90KXRzLnR2X25zZWMgLyAxMDAwMDAwOw0KPj4gfQ0KPj4NCj4+ IHN0YXRpYyB2b2lkIHVzZV90ZW1wb3JhcnlfZGlyKHZvaWQpDQo+PiB7DQo+PiDCoCBjaGFyIHRt cGRpcl90ZW1wbGF0ZVtdID0gIi4vc3l6a2FsbGVyLlhYWFhYWCI7DQo+PiDCoCBjaGFyKiB0bXBk aXIgPSBta2R0ZW1wKHRtcGRpcl90ZW1wbGF0ZSk7DQo+PiDCoCBpZiAoIXRtcGRpcikNCj4+IMKg wqDCoCBleGl0KDEpOw0KPj4gwqAgaWYgKGNobW9kKHRtcGRpciwgMDc3NykpDQo+PiDCoMKgwqAg ZXhpdCgxKTsNCj4+IMKgIGlmIChjaGRpcih0bXBkaXIpKQ0KPj4gwqDCoMKgIGV4aXQoMSk7DQo+ PiB9DQo+Pg0KPj4gc3RhdGljIGJvb2wgd3JpdGVfZmlsZShjb25zdCBjaGFyKiBmaWxlLCBjb25z dCBjaGFyKiB3aGF0LCAuLi4pDQo+PiB7DQo+PiDCoCBjaGFyIGJ1ZlsxMDI0XTsNCj4+IMKgIHZh X2xpc3QgYXJnczsNCj4+IMKgIHZhX3N0YXJ0KGFyZ3MsIHdoYXQpOw0KPj4gwqAgdnNucHJpbnRm KGJ1Ziwgc2l6ZW9mKGJ1ZiksIHdoYXQsIGFyZ3MpOw0KPj4gwqAgdmFfZW5kKGFyZ3MpOw0KPj4g wqAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOw0KPj4gwqAgaW50IGxlbiA9IHN0cmxlbihidWYp Ow0KPj4gwqAgaW50IGZkID0gb3BlbihmaWxlLCBPX1dST05MWSB8IE9fQ0xPRVhFQyk7DQo+PiDC oCBpZiAoZmQgPT0gLTEpDQo+PiDCoMKgwqAgcmV0dXJuIGZhbHNlOw0KPj4gwqAgaWYgKHdyaXRl KGZkLCBidWYsIGxlbikgIT0gbGVuKSB7DQo+PiDCoMKgwqAgaW50IGVyciA9IGVycm5vOw0KPj4g wqDCoMKgIGNsb3NlKGZkKTsNCj4+IMKgwqDCoCBlcnJubyA9IGVycjsNCj4+IMKgwqDCoCByZXR1 cm4gZmFsc2U7DQo+PiDCoCB9DQo+PiDCoCBjbG9zZShmZCk7DQo+PiDCoCByZXR1cm4gdHJ1ZTsN Cj4+IH0NCj4+DQo+PiBzdGF0aWMgc3RydWN0IHsNCj4+IMKgIGNoYXIqIHBvczsNCj4+IMKgIGlu dCBuZXN0aW5nOw0KPj4gwqAgc3RydWN0IG5sYXR0ciogbmVzdGVkWzhdOw0KPj4gwqAgY2hhciBi dWZbMTAyNF07DQo+PiB9IG5sbXNnOw0KPj4NCj4+IHN0YXRpYyB2b2lkIG5ldGxpbmtfaW5pdChp bnQgdHlwLCBpbnQgZmxhZ3MsIGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKQ0KPj4gew0KPj4g wqAgbWVtc2V0KCZubG1zZywgMCwgc2l6ZW9mKG5sbXNnKSk7DQo+PiDCoCBzdHJ1Y3Qgbmxtc2do ZHIqIGhkciA9IChzdHJ1Y3Qgbmxtc2doZHIqKW5sbXNnLmJ1ZjsNCj4+IMKgIGhkci0+bmxtc2df dHlwZSA9IHR5cDsNCj4+IMKgIGhkci0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxN X0ZfQUNLIHwgZmxhZ3M7DQo+PiDCoCBtZW1jcHkoaGRyICsgMSwgZGF0YSwgc2l6ZSk7DQo+PiDC oCBubG1zZy5wb3MgPSAoY2hhciopKGhkciArIDEpICsgTkxNU0dfQUxJR04oc2l6ZSk7DQo+PiB9 DQo+Pg0KPj4gc3RhdGljIHZvaWQgbmV0bGlua19hdHRyKGludCB0eXAsIGNvbnN0IHZvaWQqIGRh dGEsIGludCBzaXplKQ0KPj4gew0KPj4gwqAgc3RydWN0IG5sYXR0ciogYXR0ciA9IChzdHJ1Y3Qg bmxhdHRyKilubG1zZy5wb3M7DQo+PiDCoCBhdHRyLT5ubGFfbGVuID0gc2l6ZW9mKCphdHRyKSAr IHNpemU7DQo+PiDCoCBhdHRyLT5ubGFfdHlwZSA9IHR5cDsNCj4+IMKgIG1lbWNweShhdHRyICsg MSwgZGF0YSwgc2l6ZSk7DQo+PiDCoCBubG1zZy5wb3MgKz0gTkxNU0dfQUxJR04oYXR0ci0+bmxh X2xlbik7DQo+PiB9DQo+Pg0KPj4gc3RhdGljIHZvaWQgbmV0bGlua19uZXN0KGludCB0eXApDQo+ PiB7DQo+PiDCoCBzdHJ1Y3QgbmxhdHRyKiBhdHRyID0gKHN0cnVjdCBubGF0dHIqKW5sbXNnLnBv czsNCj4+IMKgIGF0dHItPm5sYV90eXBlID0gdHlwOw0KPj4gwqAgbmxtc2cucG9zICs9IHNpemVv ZigqYXR0cik7DQo+PiDCoCBubG1zZy5uZXN0ZWRbbmxtc2cubmVzdGluZysrXSA9IGF0dHI7DQo+ PiB9DQo+Pg0KPj4gc3RhdGljIHZvaWQgbmV0bGlua19kb25lKHZvaWQpDQo+PiB7DQo+PiDCoCBz dHJ1Y3QgbmxhdHRyKiBhdHRyID0gbmxtc2cubmVzdGVkWy0tbmxtc2cubmVzdGluZ107DQo+PiDC oCBhdHRyLT5ubGFfbGVuID0gbmxtc2cucG9zIC0gKGNoYXIqKWF0dHI7DQo+PiB9DQo+Pg0KPj4g c3RhdGljIGludCBuZXRsaW5rX3NlbmQoaW50IHNvY2spDQo+PiB7DQo+PiDCoCBpZiAobmxtc2cu cG9zID4gbmxtc2cuYnVmICsgc2l6ZW9mKG5sbXNnLmJ1ZikgfHwgbmxtc2cubmVzdGluZykNCj4+ IMKgwqDCoCBleGl0KDEpOw0KPj4gwqAgc3RydWN0IG5sbXNnaGRyKiBoZHIgPSAoc3RydWN0IG5s bXNnaGRyKilubG1zZy5idWY7DQo+PiDCoCBoZHItPm5sbXNnX2xlbiA9IG5sbXNnLnBvcyAtIG5s bXNnLmJ1ZjsNCj4+IMKgIHN0cnVjdCBzb2NrYWRkcl9ubCBhZGRyOw0KPj4gwqAgbWVtc2V0KCZh ZGRyLCAwLCBzaXplb2YoYWRkcikpOw0KPj4gwqAgYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5L Ow0KPj4gwqAgdW5zaWduZWQgbiA9IHNlbmR0byhzb2NrLCBubG1zZy5idWYsIGhkci0+bmxtc2df bGVuLCAwLA0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChz dHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikpOw0KPj4gwqAgaWYgKG4gIT0gaGRy LT5ubG1zZ19sZW4pDQo+PiDCoMKgwqAgZXhpdCgxKTsNCj4+IMKgIG4gPSByZWN2KHNvY2ssIG5s bXNnLmJ1Ziwgc2l6ZW9mKG5sbXNnLmJ1ZiksIDApOw0KPj4gwqAgaWYgKG4gPCBzaXplb2Yoc3Ry dWN0IG5sbXNnaGRyKSArIHNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKQ0KPj4gwqDCoMKgIGV4aXQo MSk7DQo+PiDCoCBpZiAoaGRyLT5ubG1zZ190eXBlICE9IE5MTVNHX0VSUk9SKQ0KPj4gwqDCoMKg IGV4aXQoMSk7DQo+PiDCoCByZXR1cm4gLSgoc3RydWN0IG5sbXNnZXJyKikoaGRyICsgMSkpLT5l cnJvcjsNCj4+IH0NCj4+DQo+PiBzdGF0aWMgdm9pZCBuZXRsaW5rX2FkZF9kZXZpY2VfaW1wbChj b25zdCBjaGFyKiB0eXBlLCBjb25zdCBjaGFyKiBuYW1lKQ0KPj4gew0KPj4gwqAgc3RydWN0IGlm aW5mb21zZyBoZHI7DQo+PiDCoCBtZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOw0KPj4gwqAg bmV0bGlua19pbml0KFJUTV9ORVdMSU5LLCBOTE1fRl9FWENMIHwgTkxNX0ZfQ1JFQVRFLCAmaGRy LCBzaXplb2YoaGRyKSk7DQo+PiDCoCBpZiAobmFtZSkNCj4+IMKgwqDCoCBuZXRsaW5rX2F0dHIo SUZMQV9JRk5BTUUsIG5hbWUsIHN0cmxlbihuYW1lKSk7DQo+PiDCoCBuZXRsaW5rX25lc3QoSUZM QV9MSU5LSU5GTyk7DQo+PiDCoCBuZXRsaW5rX2F0dHIoSUZMQV9JTkZPX0tJTkQsIHR5cGUsIHN0 cmxlbih0eXBlKSk7DQo+PiB9DQo+Pg0KPj4gc3RhdGljIHZvaWQgbmV0bGlua19hZGRfZGV2aWNl KGludCBzb2NrLCBjb25zdCBjaGFyKiB0eXBlLCBjb25zdCBjaGFyKiBuYW1lKQ0KPj4gew0KPj4g wqAgbmV0bGlua19hZGRfZGV2aWNlX2ltcGwodHlwZSwgbmFtZSk7DQo+PiDCoCBuZXRsaW5rX2Rv bmUoKTsNCj4+IMKgIGludCBlcnIgPSBuZXRsaW5rX3NlbmQoc29jayk7DQo+PiDCoCAodm9pZCll cnI7DQo+PiB9DQo+Pg0KPj4gc3RhdGljIHZvaWQgbmV0bGlua19hZGRfdmV0aChpbnQgc29jaywg Y29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogcGVlcikNCj4+IHsNCj4+IMKgIG5ldGxpbmtf YWRkX2RldmljZV9pbXBsKCJ2ZXRoIiwgbmFtZSk7DQo+PiDCoCBuZXRsaW5rX25lc3QoSUZMQV9J TkZPX0RBVEEpOw0KPj4gwqAgbmV0bGlua19uZXN0KFZFVEhfSU5GT19QRUVSKTsNCj4+IMKgIG5s bXNnLnBvcyArPSBzaXplb2Yoc3RydWN0IGlmaW5mb21zZyk7DQo+PiDCoCBuZXRsaW5rX2F0dHIo SUZMQV9JRk5BTUUsIHBlZXIsIHN0cmxlbihwZWVyKSk7DQo+PiDCoCBuZXRsaW5rX2RvbmUoKTsN Cj4+IMKgIG5ldGxpbmtfZG9uZSgpOw0KPj4gwqAgbmV0bGlua19kb25lKCk7DQo+PiDCoCBpbnQg ZXJyID0gbmV0bGlua19zZW5kKHNvY2spOw0KPj4gwqAgKHZvaWQpZXJyOw0KPj4gfQ0KPj4NCj4+ IHN0YXRpYyB2b2lkIG5ldGxpbmtfYWRkX2hzcihpbnQgc29jaywgY29uc3QgY2hhciogbmFtZSwg Y29uc3QgY2hhciogc2xhdmUxLA0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGNoYXIqIHNsYXZlMikNCj4+IHsNCj4+IMKgIG5l dGxpbmtfYWRkX2RldmljZV9pbXBsKCJoc3IiLCBuYW1lKTsNCj4+IMKgIG5ldGxpbmtfbmVzdChJ RkxBX0lORk9fREFUQSk7DQo+PiDCoCBpbnQgaWZpbmRleDEgPSBpZl9uYW1ldG9pbmRleChzbGF2 ZTEpOw0KPj4gwqAgbmV0bGlua19hdHRyKElGTEFfSFNSX1NMQVZFMSwgJmlmaW5kZXgxLCBzaXpl b2YoaWZpbmRleDEpKTsNCj4+IMKgIGludCBpZmluZGV4MiA9IGlmX25hbWV0b2luZGV4KHNsYXZl Mik7DQo+PiDCoCBuZXRsaW5rX2F0dHIoSUZMQV9IU1JfU0xBVkUyLCAmaWZpbmRleDIsIHNpemVv ZihpZmluZGV4MikpOw0KPj4gwqAgbmV0bGlua19kb25lKCk7DQo+PiDCoCBuZXRsaW5rX2RvbmUo KTsNCj4+IMKgIGludCBlcnIgPSBuZXRsaW5rX3NlbmQoc29jayk7DQo+PiDCoCAodm9pZCllcnI7 DQo+PiB9DQo+Pg0KPj4gc3RhdGljIHZvaWQgbmV0bGlua19kZXZpY2VfY2hhbmdlKGludCBzb2Nr LCBjb25zdCBjaGFyKiBuYW1lLCBib29sIHVwLA0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IGNoYXIqIG1h c3RlciwgY29uc3Qgdm9pZCogbWFjLA0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCBtYWNzaXplKQ0KPj4gew0K Pj4gwqAgc3RydWN0IGlmaW5mb21zZyBoZHI7DQo+PiDCoCBtZW1zZXQoJmhkciwgMCwgc2l6ZW9m KGhkcikpOw0KPj4gwqAgaWYgKHVwKQ0KPj4gwqDCoMKgIGhkci5pZmlfZmxhZ3MgPSBoZHIuaWZp X2NoYW5nZSA9IElGRl9VUDsNCj4+IMKgIG5ldGxpbmtfaW5pdChSVE1fTkVXTElOSywgMCwgJmhk ciwgc2l6ZW9mKGhkcikpOw0KPj4gwqAgbmV0bGlua19hdHRyKElGTEFfSUZOQU1FLCBuYW1lLCBz dHJsZW4obmFtZSkpOw0KPj4gwqAgaWYgKG1hc3Rlcikgew0KPj4gwqDCoMKgIGludCBpZmluZGV4 ID0gaWZfbmFtZXRvaW5kZXgobWFzdGVyKTsNCj4+IMKgwqDCoCBuZXRsaW5rX2F0dHIoSUZMQV9N QVNURVIsICZpZmluZGV4LCBzaXplb2YoaWZpbmRleCkpOw0KPj4gwqAgfQ0KPj4gwqAgaWYgKG1h Y3NpemUpDQo+PiDCoMKgwqAgbmV0bGlua19hdHRyKElGTEFfQUREUkVTUywgbWFjLCBtYWNzaXpl KTsNCj4+IMKgIGludCBlcnIgPSBuZXRsaW5rX3NlbmQoc29jayk7DQo+PiDCoCAodm9pZCllcnI7 DQo+PiB9DQo+Pg0KPj4gc3RhdGljIGludCBuZXRsaW5rX2FkZF9hZGRyKGludCBzb2NrLCBjb25z dCBjaGFyKiBkZXYsIGNvbnN0IHZvaWQqIGFkZHIsDQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IGFkZHJzaXplKQ0KPj4gew0KPj4g wqAgc3RydWN0IGlmYWRkcm1zZyBoZHI7DQo+PiDCoCBtZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhk cikpOw0KPj4gwqAgaGRyLmlmYV9mYW1pbHkgPSBhZGRyc2l6ZSA9PSA0ID8gQUZfSU5FVCA6IEFG X0lORVQ2Ow0KPj4gwqAgaGRyLmlmYV9wcmVmaXhsZW4gPSBhZGRyc2l6ZSA9PSA0ID8gMjQgOiAx MjA7DQo+PiDCoCBoZHIuaWZhX3Njb3BlID0gUlRfU0NPUEVfVU5JVkVSU0U7DQo+PiDCoCBoZHIu aWZhX2luZGV4ID0gaWZfbmFtZXRvaW5kZXgoZGV2KTsNCj4+IMKgIG5ldGxpbmtfaW5pdChSVE1f TkVXQUREUiwgTkxNX0ZfQ1JFQVRFIHwgTkxNX0ZfUkVQTEFDRSwgJmhkciwNCj4+IHNpemVvZiho ZHIpKTsNCj4+IMKgIG5ldGxpbmtfYXR0cihJRkFfTE9DQUwsIGFkZHIsIGFkZHJzaXplKTsNCj4+ IMKgIG5ldGxpbmtfYXR0cihJRkFfQUREUkVTUywgYWRkciwgYWRkcnNpemUpOw0KPj4gwqAgcmV0 dXJuIG5ldGxpbmtfc2VuZChzb2NrKTsNCj4+IH0NCj4+DQo+PiBzdGF0aWMgdm9pZCBuZXRsaW5r X2FkZF9hZGRyNChpbnQgc29jaywgY29uc3QgY2hhciogZGV2LCBjb25zdCBjaGFyKiBhZGRyKQ0K Pj4gew0KPj4gwqAgc3RydWN0IGluX2FkZHIgaW5fYWRkcjsNCj4+IMKgIGluZXRfcHRvbihBRl9J TkVULCBhZGRyLCAmaW5fYWRkcik7DQo+PiDCoCBpbnQgZXJyID0gbmV0bGlua19hZGRfYWRkcihz b2NrLCBkZXYsICZpbl9hZGRyLCBzaXplb2YoaW5fYWRkcikpOw0KPj4gwqAgKHZvaWQpZXJyOw0K Pj4gfQ0KPj4NCj4+IHN0YXRpYyB2b2lkIG5ldGxpbmtfYWRkX2FkZHI2KGludCBzb2NrLCBjb25z dCBjaGFyKiBkZXYsIGNvbnN0IGNoYXIqIGFkZHIpDQo+PiB7DQo+PiDCoCBzdHJ1Y3QgaW42X2Fk ZHIgaW42X2FkZHI7DQo+PiDCoCBpbmV0X3B0b24oQUZfSU5FVDYsIGFkZHIsICZpbjZfYWRkcik7 DQo+PiDCoCBpbnQgZXJyID0gbmV0bGlua19hZGRfYWRkcihzb2NrLCBkZXYsICZpbjZfYWRkciwg c2l6ZW9mKGluNl9hZGRyKSk7DQo+PiDCoCAodm9pZCllcnI7DQo+PiB9DQo+Pg0KPj4gI2RlZmlu ZSBERVZfSVBWNCAiMTcyLjIwLjIwLiVkIg0KPj4gI2RlZmluZSBERVZfSVBWNiAiZmU4MDo6JTAy aHgiDQo+PiAjZGVmaW5lIERFVl9NQUMgMHgwMGFhYWFhYWFhYWENCj4+IHN0YXRpYyB2b2lkIGlu aXRpYWxpemVfbmV0ZGV2aWNlcyh2b2lkKQ0KPj4gew0KPj4gwqAgY2hhciBuZXRkZXZzaW1bMTZd Ow0KPj4gwqAgc3ByaW50ZihuZXRkZXZzaW0sICJuZXRkZXZzaW0lZCIsIChpbnQpcHJvY2lkKTsN Cj4+IMKgIHN0cnVjdCB7DQo+PiDCoMKgwqAgY29uc3QgY2hhciogdHlwZTsNCj4+IMKgwqDCoCBj b25zdCBjaGFyKiBkZXY7DQo+PiDCoCB9IGRldnR5cGVzW10gPSB7DQo+PiDCoMKgwqDCoMKgIHsi aXA2Z3JldGFwIiwgImlwNmdyZXRhcDAifSwgeyJicmlkZ2UiLCAiYnJpZGdlMCJ9LA0KPj4gwqDC oMKgwqDCoCB7InZjYW4iLCAidmNhbjAifSzCoMKgwqDCoMKgwqDCoMKgwqDCoCB7ImJvbmQiLCAi Ym9uZDAifSwNCj4+IMKgwqDCoMKgwqAgeyJ0ZWFtIiwgInRlYW0wIn0swqDCoMKgwqDCoMKgwqDC oMKgwqAgeyJkdW1teSIsICJkdW1teTAifSwNCj4+IMKgwqDCoMKgwqAgeyJubG1vbiIsICJubG1v bjAifSzCoMKgwqDCoMKgwqDCoMKgIHsiY2FpZiIsICJjYWlmMCJ9LA0KPj4gwqDCoMKgwqDCoCB7 ImJhdGFkdiIsICJiYXRhZHYwIn0swqDCoMKgwqDCoMKgIHsidnhjYW4iLCAidnhjYW4xIn0sDQo+ PiDCoMKgwqDCoMKgIHsibmV0ZGV2c2ltIiwgbmV0ZGV2c2ltfSzCoMKgwqAgeyJ2ZXRoIiwgMH0s DQo+PiDCoCB9Ow0KPj4gwqAgY29uc3QgY2hhciogZGV2bWFzdGVyc1tdID0geyJicmlkZ2UiLCAi Ym9uZCIsICJ0ZWFtIn07DQo+PiDCoCBzdHJ1Y3Qgew0KPj4gwqDCoMKgIGNvbnN0IGNoYXIqIG5h bWU7DQo+PiDCoMKgwqAgaW50IG1hY3NpemU7DQo+PiDCoMKgwqAgYm9vbCBub2lwdjY7DQo+PiDC oCB9IGRldmljZXNbXSA9IHsNCj4+IMKgwqDCoMKgwqAgeyJsbyIsIEVUSF9BTEVOfSwNCj4+IMKg wqDCoMKgwqAgeyJzaXQwIiwgMH0sDQo+PiDCoMKgwqDCoMKgIHsiYnJpZGdlMCIsIEVUSF9BTEVO fSwNCj4+IMKgwqDCoMKgwqAgeyJ2Y2FuMCIsIDAsIHRydWV9LA0KPj4gwqDCoMKgwqDCoCB7InR1 bmwwIiwgMH0sDQo+PiDCoMKgwqDCoMKgIHsiZ3JlMCIsIDB9LA0KPj4gwqDCoMKgwqDCoCB7Imdy ZXRhcDAiLCBFVEhfQUxFTn0sDQo+PiDCoMKgwqDCoMKgIHsiaXBfdnRpMCIsIDB9LA0KPj4gwqDC oMKgwqDCoCB7ImlwNl92dGkwIiwgMH0sDQo+PiDCoMKgwqDCoMKgIHsiaXA2dG5sMCIsIDB9LA0K Pj4gwqDCoMKgwqDCoCB7ImlwNmdyZTAiLCAwfSwNCj4+IMKgwqDCoMKgwqAgeyJpcDZncmV0YXAw IiwgRVRIX0FMRU59LA0KPj4gwqDCoMKgwqDCoCB7ImVyc3BhbjAiLCBFVEhfQUxFTn0sDQo+PiDC oMKgwqDCoMKgIHsiYm9uZDAiLCBFVEhfQUxFTn0sDQo+PiDCoMKgwqDCoMKgIHsidmV0aDAiLCBF VEhfQUxFTn0sDQo+PiDCoMKgwqDCoMKgIHsidmV0aDEiLCBFVEhfQUxFTn0sDQo+PiDCoMKgwqDC oMKgIHsidGVhbTAiLCBFVEhfQUxFTn0sDQo+PiDCoMKgwqDCoMKgIHsidmV0aDBfdG9fYnJpZGdl IiwgRVRIX0FMRU59LA0KPj4gwqDCoMKgwqDCoCB7InZldGgxX3RvX2JyaWRnZSIsIEVUSF9BTEVO fSwNCj4+IMKgwqDCoMKgwqAgeyJ2ZXRoMF90b19ib25kIiwgRVRIX0FMRU59LA0KPj4gwqDCoMKg wqDCoCB7InZldGgxX3RvX2JvbmQiLCBFVEhfQUxFTn0sDQo+PiDCoMKgwqDCoMKgIHsidmV0aDBf dG9fdGVhbSIsIEVUSF9BTEVOfSwNCj4+IMKgwqDCoMKgwqAgeyJ2ZXRoMV90b190ZWFtIiwgRVRI X0FMRU59LA0KPj4gwqDCoMKgwqDCoCB7InZldGgwX3RvX2hzciIsIEVUSF9BTEVOfSwNCj4+IMKg wqDCoMKgwqAgeyJ2ZXRoMV90b19oc3IiLCBFVEhfQUxFTn0sDQo+PiDCoMKgwqDCoMKgIHsiaHNy MCIsIDB9LA0KPj4gwqDCoMKgwqDCoCB7ImR1bW15MCIsIEVUSF9BTEVOfSwNCj4+IMKgwqDCoMKg wqAgeyJubG1vbjAiLCAwfSwNCj4+IMKgwqDCoMKgwqAgeyJ2eGNhbjEiLCAwLCB0cnVlfSwNCj4+ IMKgwqDCoMKgwqAgeyJjYWlmMCIsIEVUSF9BTEVOfSwNCj4+IMKgwqDCoMKgwqAgeyJiYXRhZHYw IiwgRVRIX0FMRU59LA0KPj4gwqDCoMKgwqDCoCB7bmV0ZGV2c2ltLCBFVEhfQUxFTn0sDQo+PiDC oCB9Ow0KPj4gwqAgaW50IHNvY2sgPSBzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcsIE5FVExJ TktfUk9VVEUpOw0KPj4gwqAgaWYgKHNvY2sgPT0gLTEpDQo+PiDCoMKgwqAgZXhpdCgxKTsNCj4+ IMKgIHVuc2lnbmVkIGk7DQo+PiDCoCBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRldnR5cGVzKSAv IHNpemVvZihkZXZ0eXBlc1swXSk7IGkrKykNCj4+IMKgwqDCoCBuZXRsaW5rX2FkZF9kZXZpY2Uo c29jaywgZGV2dHlwZXNbaV0udHlwZSwgZGV2dHlwZXNbaV0uZGV2KTsNCj4+IMKgIGZvciAoaSA9 IDA7IGkgPCBzaXplb2YoZGV2bWFzdGVycykgLyAoc2l6ZW9mKGRldm1hc3RlcnNbMF0pKTsgaSsr KSB7DQo+PiDCoMKgwqAgY2hhciBtYXN0ZXJbMzJdLCBzbGF2ZTBbMzJdLCB2ZXRoMFszMl0sIHNs YXZlMVszMl0sIHZldGgxWzMyXTsNCj4+IMKgwqDCoCBzcHJpbnRmKHNsYXZlMCwgIiVzX3NsYXZl XzAiLCBkZXZtYXN0ZXJzW2ldKTsNCj4+IMKgwqDCoCBzcHJpbnRmKHZldGgwLCAidmV0aDBfdG9f JXMiLCBkZXZtYXN0ZXJzW2ldKTsNCj4+IMKgwqDCoCBuZXRsaW5rX2FkZF92ZXRoKHNvY2ssIHNs YXZlMCwgdmV0aDApOw0KPj4gwqDCoMKgIHNwcmludGYoc2xhdmUxLCAiJXNfc2xhdmVfMSIsIGRl dm1hc3RlcnNbaV0pOw0KPj4gwqDCoMKgIHNwcmludGYodmV0aDEsICJ2ZXRoMV90b18lcyIsIGRl dm1hc3RlcnNbaV0pOw0KPj4gwqDCoMKgIG5ldGxpbmtfYWRkX3ZldGgoc29jaywgc2xhdmUxLCB2 ZXRoMSk7DQo+PiDCoMKgwqAgc3ByaW50ZihtYXN0ZXIsICIlczAiLCBkZXZtYXN0ZXJzW2ldKTsN Cj4+IMKgwqDCoCBuZXRsaW5rX2RldmljZV9jaGFuZ2Uoc29jaywgc2xhdmUwLCBmYWxzZSwgbWFz dGVyLCAwLCAwKTsNCj4+IMKgwqDCoCBuZXRsaW5rX2RldmljZV9jaGFuZ2Uoc29jaywgc2xhdmUx LCBmYWxzZSwgbWFzdGVyLCAwLCAwKTsNCj4+IMKgIH0NCj4+IMKgIG5ldGxpbmtfZGV2aWNlX2No YW5nZShzb2NrLCAiYnJpZGdlX3NsYXZlXzAiLCB0cnVlLCAwLCAwLCAwKTsNCj4+IMKgIG5ldGxp bmtfZGV2aWNlX2NoYW5nZShzb2NrLCAiYnJpZGdlX3NsYXZlXzEiLCB0cnVlLCAwLCAwLCAwKTsN Cj4+IMKgIG5ldGxpbmtfYWRkX3ZldGgoc29jaywgImhzcl9zbGF2ZV8wIiwgInZldGgwX3RvX2hz ciIpOw0KPj4gwqAgbmV0bGlua19hZGRfdmV0aChzb2NrLCAiaHNyX3NsYXZlXzEiLCAidmV0aDFf dG9faHNyIik7DQo+PiDCoCBuZXRsaW5rX2FkZF9oc3Ioc29jaywgImhzcjAiLCAiaHNyX3NsYXZl XzAiLCAiaHNyX3NsYXZlXzEiKTsNCj4+IMKgIG5ldGxpbmtfZGV2aWNlX2NoYW5nZShzb2NrLCAi aHNyX3NsYXZlXzAiLCB0cnVlLCAwLCAwLCAwKTsNCj4+IMKgIG5ldGxpbmtfZGV2aWNlX2NoYW5n ZShzb2NrLCAiaHNyX3NsYXZlXzEiLCB0cnVlLCAwLCAwLCAwKTsNCj4+IMKgIGZvciAoaSA9IDA7 IGkgPCBzaXplb2YoZGV2aWNlcykgLyAoc2l6ZW9mKGRldmljZXNbMF0pKTsgaSsrKSB7DQo+PiDC oMKgwqAgY2hhciBhZGRyWzMyXTsNCj4+IMKgwqDCoCBzcHJpbnRmKGFkZHIsIERFVl9JUFY0LCBp ICsgMTApOw0KPj4gwqDCoMKgIG5ldGxpbmtfYWRkX2FkZHI0KHNvY2ssIGRldmljZXNbaV0ubmFt ZSwgYWRkcik7DQo+PiDCoMKgwqAgaWYgKCFkZXZpY2VzW2ldLm5vaXB2Nikgew0KPj4gwqDCoMKg wqDCoCBzcHJpbnRmKGFkZHIsIERFVl9JUFY2LCBpICsgMTApOw0KPj4gwqDCoMKgwqDCoCBuZXRs aW5rX2FkZF9hZGRyNihzb2NrLCBkZXZpY2VzW2ldLm5hbWUsIGFkZHIpOw0KPj4gwqDCoMKgIH0N Cj4+IMKgwqDCoCB1aW50NjRfdCBtYWNhZGRyID0gREVWX01BQyArICgoaSArIDEwdWxsKSA8PCA0 MCk7DQo+PiDCoMKgwqAgbmV0bGlua19kZXZpY2VfY2hhbmdlKHNvY2ssIGRldmljZXNbaV0ubmFt ZSwgdHJ1ZSwgMCwgJm1hY2FkZHIsDQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBkZXZpY2VzW2ldLm1hY3NpemUpOw0KPj4gwqAgfQ0KPj4gwqAg Y2xvc2Uoc29jayk7DQo+PiB9DQo+PiBzdGF0aWMgdm9pZCBpbml0aWFsaXplX25ldGRldmljZXNf aW5pdCh2b2lkKQ0KPj4gew0KPj4gwqAgaW50IHNvY2sgPSBzb2NrZXQoQUZfTkVUTElOSywgU09D S19SQVcsIE5FVExJTktfUk9VVEUpOw0KPj4gwqAgaWYgKHNvY2sgPT0gLTEpDQo+PiDCoMKgwqAg ZXhpdCgxKTsNCj4+IMKgIHN0cnVjdCB7DQo+PiDCoMKgwqAgY29uc3QgY2hhciogdHlwZTsNCj4+ IMKgwqDCoCBpbnQgbWFjc2l6ZTsNCj4+IMKgwqDCoCBib29sIG5vaXB2NjsNCj4+IMKgwqDCoCBi b29sIG5vdXA7DQo+PiDCoCB9IGRldnR5cGVzW10gPSB7DQo+PiDCoMKgwqDCoMKgIHsibnIiLCA3 LCB0cnVlfSwgeyJyb3NlIiwgNSwgdHJ1ZSwgdHJ1ZX0sDQo+PiDCoCB9Ow0KPj4gwqAgdW5zaWdu ZWQgaTsNCj4+IMKgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZGV2dHlwZXMpIC8gc2l6ZW9mKGRl dnR5cGVzWzBdKTsgaSsrKSB7DQo+PiDCoMKgwqAgY2hhciBkZXZbMzJdLCBhZGRyWzMyXTsNCj4+ IMKgwqDCoCBzcHJpbnRmKGRldiwgIiVzJWQiLCBkZXZ0eXBlc1tpXS50eXBlLCAoaW50KXByb2Np ZCk7DQo+PiDCoMKgwqAgc3ByaW50ZihhZGRyLCAiMTcyLjMwLiVkLiVkIiwgaSwgKGludClwcm9j aWQgKyAxKTsNCj4+IMKgwqDCoCBuZXRsaW5rX2FkZF9hZGRyNChzb2NrLCBkZXYsIGFkZHIpOw0K Pj4gwqDCoMKgIGlmICghZGV2dHlwZXNbaV0ubm9pcHY2KSB7DQo+PiDCoMKgwqDCoMKgIHNwcmlu dGYoYWRkciwgImZlODg6OiUwMmh4OiUwMmh4IiwgaSwgKGludClwcm9jaWQgKyAxKTsNCj4+IMKg wqDCoMKgwqAgbmV0bGlua19hZGRfYWRkcjYoc29jaywgZGV2LCBhZGRyKTsNCj4+IMKgwqDCoCB9 DQo+PiDCoMKgwqAgaW50IG1hY3NpemUgPSBkZXZ0eXBlc1tpXS5tYWNzaXplOw0KPj4gwqDCoMKg IHVpbnQ2NF90IG1hY2FkZHIgPSAweGJiYmJiYiArDQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoKHVuc2lnbmVkIGxvbmcgbG9uZylpIDw8ICg4ICogKG1h Y3NpemUgLSAyKSkpICsNCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIChwcm9jaWQgPDwgKDggKiAobWFjc2l6ZSAtIDEpKSk7DQo+PiDCoMKgwqAgbmV0bGlu a19kZXZpY2VfY2hhbmdlKHNvY2ssIGRldiwgIWRldnR5cGVzW2ldLm5vdXAsIDAsICZtYWNhZGRy LA0KPj4gbWFjc2l6ZSk7DQo+PiDCoCB9DQo+PiDCoCBjbG9zZShzb2NrKTsNCj4+IH0NCj4+DQo+ PiBzdGF0aWMgdm9pZCBzZXR1cF9jb21tb24oKQ0KPj4gew0KPj4gwqAgaWYgKG1vdW50KDAsICIv c3lzL2ZzL2Z1c2UvY29ubmVjdGlvbnMiLCAiZnVzZWN0bCIsIDAsIDApKSB7DQo+PiDCoCB9DQo+ PiB9DQo+Pg0KPj4gc3RhdGljIHZvaWQgbG9vcCgpOw0KPj4NCj4+IHN0YXRpYyB2b2lkIHNhbmRi b3hfY29tbW9uKCkNCj4+IHsNCj4+IMKgIHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEws IDAsIDAsIDApOw0KPj4gwqAgc2V0cGdycCgpOw0KPj4gwqAgc2V0c2lkKCk7DQo+PiDCoCBzdHJ1 Y3QgcmxpbWl0IHJsaW07DQo+PiDCoCBybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9IDIw MCA8PCAyMDsNCj4+IMKgIHNldHJsaW1pdChSTElNSVRfQVMsICZybGltKTsNCj4+IMKgIHJsaW0u cmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gMzIgPDwgMjA7DQo+PiDCoCBzZXRybGltaXQoUkxJ TUlUX01FTUxPQ0ssICZybGltKTsNCj4+IMKgIHJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4 ID0gMTM2IDw8IDIwOw0KPj4gwqAgc2V0cmxpbWl0KFJMSU1JVF9GU0laRSwgJnJsaW0pOw0KPj4g wqAgcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxpbV9tYXggPSAxIDw8IDIwOw0KPj4gwqAgc2V0cmxp bWl0KFJMSU1JVF9TVEFDSywgJnJsaW0pOw0KPj4gwqAgcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxp bV9tYXggPSAwOw0KPj4gwqAgc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmcmxpbSk7DQo+PiDCoCBy bGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9IDI1NjsNCj4+IMKgIHNldHJsaW1pdChSTElN SVRfTk9GSUxFLCAmcmxpbSk7DQo+PiDCoCBpZiAodW5zaGFyZShDTE9ORV9ORVdOUykpIHsNCj4+ IMKgIH0NCj4+IMKgIGlmICh1bnNoYXJlKENMT05FX05FV0lQQykpIHsNCj4+IMKgIH0NCj4+IMKg IGlmICh1bnNoYXJlKDB4MDIwMDAwMDApKSB7DQo+PiDCoCB9DQo+PiDCoCBpZiAodW5zaGFyZShD TE9ORV9ORVdVVFMpKSB7DQo+PiDCoCB9DQo+PiDCoCBpZiAodW5zaGFyZShDTE9ORV9TWVNWU0VN KSkgew0KPj4gwqAgfQ0KPj4gwqAgdHlwZWRlZiBzdHJ1Y3Qgew0KPj4gwqDCoMKgIGNvbnN0IGNo YXIqIG5hbWU7DQo+PiDCoMKgwqAgY29uc3QgY2hhciogdmFsdWU7DQo+PiDCoCB9IHN5c2N0bF90 Ow0KPj4gwqAgc3RhdGljIGNvbnN0IHN5c2N0bF90IHN5c2N0bHNbXSA9IHsNCj4+IMKgwqDCoMKg wqAgeyIvcHJvYy9zeXMva2VybmVsL3NobW1heCIsICIxNjc3NzIxNiJ9LA0KPj4gwqDCoMKgwqDC oCB7Ii9wcm9jL3N5cy9rZXJuZWwvc2htYWxsIiwgIjUzNjg3MDkxMiJ9LA0KPj4gwqDCoMKgwqDC oCB7Ii9wcm9jL3N5cy9rZXJuZWwvc2htbW5pIiwgIjEwMjQifSwNCj4+IMKgwqDCoMKgwqAgeyIv cHJvYy9zeXMva2VybmVsL21zZ21heCIsICI4MTkyIn0sDQo+PiDCoMKgwqDCoMKgIHsiL3Byb2Mv c3lzL2tlcm5lbC9tc2dtbmkiLCAiMTAyNCJ9LA0KPj4gwqDCoMKgwqDCoCB7Ii9wcm9jL3N5cy9r ZXJuZWwvbXNnbW5iIiwgIjEwMjQifSwNCj4+IMKgwqDCoMKgwqAgeyIvcHJvYy9zeXMva2VybmVs L3NlbSIsICIxMDI0IDEwNDg1NzYgNTAwIDEwMjQifSwNCj4+IMKgIH07DQo+PiDCoCB1bnNpZ25l ZCBpOw0KPj4gwqAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzeXNjdGxzKSAvIHNpemVvZihzeXNj dGxzWzBdKTsgaSsrKQ0KPj4gwqDCoMKgIHdyaXRlX2ZpbGUoc3lzY3Rsc1tpXS5uYW1lLCBzeXNj dGxzW2ldLnZhbHVlKTsNCj4+IH0NCj4+DQo+PiBpbnQgd2FpdF9mb3JfbG9vcChpbnQgcGlkKQ0K Pj4gew0KPj4gwqAgaWYgKHBpZCA8IDApDQo+PiDCoMKgwqAgZXhpdCgxKTsNCj4+IMKgIGludCBz dGF0dXMgPSAwOw0KPj4gwqAgd2hpbGUgKHdhaXRwaWQoLTEsICZzdGF0dXMsIF9fV0FMTCkgIT0g cGlkKSB7DQo+PiDCoCB9DQo+PiDCoCByZXR1cm4gV0VYSVRTVEFUVVMoc3RhdHVzKTsNCj4+IH0N Cj4+DQo+PiBzdGF0aWMgaW50IGRvX3NhbmRib3hfbm9uZSh2b2lkKQ0KPj4gew0KPj4gwqAgaWYg KHVuc2hhcmUoQ0xPTkVfTkVXUElEKSkgew0KPj4gwqAgfQ0KPj4gwqAgaW50IHBpZCA9IGZvcmso KTsNCj4+IMKgIGlmIChwaWQgIT0gMCkNCj4+IMKgwqDCoCByZXR1cm4gd2FpdF9mb3JfbG9vcChw aWQpOw0KPj4gwqAgc2V0dXBfY29tbW9uKCk7DQo+PiDCoCBzYW5kYm94X2NvbW1vbigpOw0KPj4g wqAgaW5pdGlhbGl6ZV9uZXRkZXZpY2VzX2luaXQoKTsNCj4+IMKgIGlmICh1bnNoYXJlKENMT05F X05FV05FVCkpIHsNCj4+IMKgIH0NCj4+IMKgIGluaXRpYWxpemVfbmV0ZGV2aWNlcygpOw0KPj4g wqAgbG9vcCgpOw0KPj4gwqAgZXhpdCgxKTsNCj4+IH0NCj4+DQo+PiAjZGVmaW5lIEZTX0lPQ19T RVRGTEFHUyBfSU9XKCdmJywgMiwgbG9uZykNCj4+IHN0YXRpYyB2b2lkIHJlbW92ZV9kaXIoY29u c3QgY2hhciogZGlyKQ0KPj4gew0KPj4gwqAgRElSKiBkcDsNCj4+IMKgIHN0cnVjdCBkaXJlbnQq IGVwOw0KPj4gwqAgaW50IGl0ZXIgPSAwOw0KPj4gcmV0cnk6DQo+PiDCoCB3aGlsZSAodW1vdW50 MihkaXIsIE1OVF9ERVRBQ0gpID09IDApIHsNCj4+IMKgIH0NCj4+IMKgIGRwID0gb3BlbmRpcihk aXIpOw0KPj4gwqAgaWYgKGRwID09IE5VTEwpIHsNCj4+IMKgwqDCoCBpZiAoZXJybm8gPT0gRU1G SUxFKSB7DQo+PiDCoMKgwqDCoMKgIGV4aXQoMSk7DQo+PiDCoMKgwqAgfQ0KPj4gwqDCoMKgIGV4 aXQoMSk7DQo+PiDCoCB9DQo+PiDCoCB3aGlsZSAoKGVwID0gcmVhZGRpcihkcCkpKSB7DQo+PiDC oMKgwqAgaWYgKHN0cmNtcChlcC0+ZF9uYW1lLCAiLiIpID09IDAgfHwgc3RyY21wKGVwLT5kX25h bWUsICIuLiIpID09IDApDQo+PiDCoMKgwqDCoMKgIGNvbnRpbnVlOw0KPj4gwqDCoMKgIGNoYXIg ZmlsZW5hbWVbRklMRU5BTUVfTUFYXTsNCj4+IMKgwqDCoCBzbnByaW50ZihmaWxlbmFtZSwgc2l6 ZW9mKGZpbGVuYW1lKSwgIiVzLyVzIiwgZGlyLCBlcC0+ZF9uYW1lKTsNCj4+IMKgwqDCoCB3aGls ZSAodW1vdW50MihmaWxlbmFtZSwgTU5UX0RFVEFDSCkgPT0gMCkgew0KPj4gwqDCoMKgIH0NCj4+ IMKgwqDCoCBzdHJ1Y3Qgc3RhdCBzdDsNCj4+IMKgwqDCoCBpZiAobHN0YXQoZmlsZW5hbWUsICZz dCkpDQo+PiDCoMKgwqDCoMKgIGV4aXQoMSk7DQo+PiDCoMKgwqAgaWYgKFNfSVNESVIoc3Quc3Rf bW9kZSkpIHsNCj4+IMKgwqDCoMKgwqAgcmVtb3ZlX2RpcihmaWxlbmFtZSk7DQo+PiDCoMKgwqDC oMKgIGNvbnRpbnVlOw0KPj4gwqDCoMKgIH0NCj4+IMKgwqDCoCBpbnQgaTsNCj4+IMKgwqDCoCBm b3IgKGkgPSAwOzsgaSsrKSB7DQo+PiDCoMKgwqDCoMKgIGlmICh1bmxpbmsoZmlsZW5hbWUpID09 IDApDQo+PiDCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+IMKgwqDCoMKgwqAgaWYgKGVycm5vID09 IEVQRVJNKSB7DQo+PiDCoMKgwqDCoMKgwqDCoCBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JE T05MWSk7DQo+PiDCoMKgwqDCoMKgwqDCoCBpZiAoZmQgIT0gLTEpIHsNCj4+IMKgwqDCoMKgwqDC oMKgwqDCoCBsb25nIGZsYWdzID0gMDsNCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoaW9jdGwo ZmQsIEZTX0lPQ19TRVRGTEFHUywgJmZsYWdzKSA9PSAwKQ0KPj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBjbG9zZShmZCk7DQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7DQo+PiDCoMKg wqDCoMKgwqDCoCB9DQo+PiDCoMKgwqDCoMKgIH0NCj4+IMKgwqDCoMKgwqAgaWYgKGVycm5vID09 IEVST0ZTKSB7DQo+PiDCoMKgwqDCoMKgwqDCoCBicmVhazsNCj4+IMKgwqDCoMKgwqAgfQ0KPj4g wqDCoMKgwqDCoCBpZiAoZXJybm8gIT0gRUJVU1kgfHwgaSA+IDEwMCkNCj4+IMKgwqDCoMKgwqDC oMKgIGV4aXQoMSk7DQo+PiDCoMKgwqDCoMKgIGlmICh1bW91bnQyKGZpbGVuYW1lLCBNTlRfREVU QUNIKSkNCj4+IMKgwqDCoMKgwqDCoMKgIGV4aXQoMSk7DQo+PiDCoMKgwqAgfQ0KPj4gwqAgfQ0K Pj4gwqAgY2xvc2VkaXIoZHApOw0KPj4gwqAgaW50IGk7DQo+PiDCoCBmb3IgKGkgPSAwOzsgaSsr KSB7DQo+PiDCoMKgwqAgaWYgKHJtZGlyKGRpcikgPT0gMCkNCj4+IMKgwqDCoMKgwqAgYnJlYWs7 DQo+PiDCoMKgwqAgaWYgKGkgPCAxMDApIHsNCj4+IMKgwqDCoMKgwqAgaWYgKGVycm5vID09IEVQ RVJNKSB7DQo+PiDCoMKgwqDCoMKgwqDCoCBpbnQgZmQgPSBvcGVuKGRpciwgT19SRE9OTFkpOw0K Pj4gwqDCoMKgwqDCoMKgwqAgaWYgKGZkICE9IC0xKSB7DQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAg bG9uZyBmbGFncyA9IDA7DQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGlvY3RsKGZkLCBGU19J T0NfU0VURkxBR1MsICZmbGFncykgPT0gMCkNCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xv c2UoZmQpOw0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOw0KPj4gwqDCoMKgwqDCoMKg wqAgfQ0KPj4gwqDCoMKgwqDCoCB9DQo+PiDCoMKgwqDCoMKgIGlmIChlcnJubyA9PSBFUk9GUykg ew0KPj4gwqDCoMKgwqDCoMKgwqAgYnJlYWs7DQo+PiDCoMKgwqDCoMKgIH0NCj4+IMKgwqDCoMKg wqAgaWYgKGVycm5vID09IEVCVVNZKSB7DQo+PiDCoMKgwqDCoMKgwqDCoCBpZiAodW1vdW50Mihk aXIsIE1OVF9ERVRBQ0gpKQ0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGV4aXQoMSk7DQo+PiDCoMKg wqDCoMKgwqDCoCBjb250aW51ZTsNCj4+IMKgwqDCoMKgwqAgfQ0KPj4gwqDCoMKgwqDCoCBpZiAo ZXJybm8gPT0gRU5PVEVNUFRZKSB7DQo+PiDCoMKgwqDCoMKgwqDCoCBpZiAoaXRlciA8IDEwMCkg ew0KPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGl0ZXIrKzsNCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBn b3RvIHJldHJ5Ow0KPj4gwqDCoMKgwqDCoMKgwqAgfQ0KPj4gwqDCoMKgwqDCoCB9DQo+PiDCoMKg wqAgfQ0KPj4gwqDCoMKgIGV4aXQoMSk7DQo+PiDCoCB9DQo+PiB9DQo+Pg0KPj4gc3RhdGljIHZv aWQga2lsbF9hbmRfd2FpdChpbnQgcGlkLCBpbnQqIHN0YXR1cykNCj4+IHsNCj4+IMKgIGtpbGwo LXBpZCwgU0lHS0lMTCk7DQo+PiDCoCBraWxsKHBpZCwgU0lHS0lMTCk7DQo+PiDCoCBpbnQgaTsN Cj4+IMKgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgew0KPj4gwqDCoMKgIGlmICh3YWl0cGlk KC0xLCBzdGF0dXMsIFdOT0hBTkcgfCBfX1dBTEwpID09IHBpZCkNCj4+IMKgwqDCoMKgwqAgcmV0 dXJuOw0KPj4gwqDCoMKgIHVzbGVlcCgxMDAwKTsNCj4+IMKgIH0NCj4+IMKgIERJUiogZGlyID0g b3BlbmRpcigiL3N5cy9mcy9mdXNlL2Nvbm5lY3Rpb25zIik7DQo+PiDCoCBpZiAoZGlyKSB7DQo+ PiDCoMKgwqAgZm9yICg7Oykgew0KPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgZGlyZW50KiBlbnQgPSBy ZWFkZGlyKGRpcik7DQo+PiDCoMKgwqDCoMKgIGlmICghZW50KQ0KPj4gwqDCoMKgwqDCoMKgwqAg YnJlYWs7DQo+PiDCoMKgwqDCoMKgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsICIuIikgPT0gMCB8 fCBzdHJjbXAoZW50LT5kX25hbWUsICIuLiIpID09IDApDQo+PiDCoMKgwqDCoMKgwqDCoCBjb250 aW51ZTsNCj4+IMKgwqDCoMKgwqAgY2hhciBhYm9ydFszMDBdOw0KPj4gwqDCoMKgwqDCoCBzbnBy aW50ZihhYm9ydCwgc2l6ZW9mKGFib3J0KSwgIi9zeXMvZnMvZnVzZS9jb25uZWN0aW9ucy8lcy9h Ym9ydCIsDQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudC0+ZF9uYW1lKTsNCj4+ IMKgwqDCoMKgwqAgaW50IGZkID0gb3BlbihhYm9ydCwgT19XUk9OTFkpOw0KPj4gwqDCoMKgwqDC oCBpZiAoZmQgPT0gLTEpIHsNCj4+IMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOw0KPj4gwqDCoMKg wqDCoCB9DQo+PiDCoMKgwqDCoMKgIGlmICh3cml0ZShmZCwgYWJvcnQsIDEpIDwgMCkgew0KPj4g wqDCoMKgwqDCoCB9DQo+PiDCoMKgwqDCoMKgIGNsb3NlKGZkKTsNCj4+IMKgwqDCoCB9DQo+PiDC oMKgwqAgY2xvc2VkaXIoZGlyKTsNCj4+IMKgIH0gZWxzZSB7DQo+PiDCoCB9DQo+PiDCoCB3aGls ZSAod2FpdHBpZCgtMSwgc3RhdHVzLCBfX1dBTEwpICE9IHBpZCkgew0KPj4gwqAgfQ0KPj4gfQ0K Pj4NCj4+ICNkZWZpbmUgU1laX0hBVkVfU0VUVVBfVEVTVCAxDQo+PiBzdGF0aWMgdm9pZCBzZXR1 cF90ZXN0KCkNCj4+IHsNCj4+IMKgIHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwsIDAs IDAsIDApOw0KPj4gwqAgc2V0cGdycCgpOw0KPj4gfQ0KPj4NCj4+ICNkZWZpbmUgU1laX0hBVkVf UkVTRVRfVEVTVCAxDQo+PiBzdGF0aWMgdm9pZCByZXNldF90ZXN0KCkNCj4+IHsNCj4+IMKgIGlu dCBmZDsNCj4+IMKgIGZvciAoZmQgPSAzOyBmZCA8IDMwOyBmZCsrKQ0KPj4gwqDCoMKgIGNsb3Nl KGZkKTsNCj4+IH0NCj4+DQo+PiBzdGF0aWMgdm9pZCBleGVjdXRlX29uZSh2b2lkKTsNCj4+DQo+ PiAjZGVmaW5lIFdBSVRfRkxBR1MgX19XQUxMDQo+Pg0KPj4gc3RhdGljIHZvaWQgbG9vcCh2b2lk KQ0KPj4gew0KPj4gwqAgaW50IGl0ZXI7DQo+PiDCoCBmb3IgKGl0ZXIgPSAwOzsgaXRlcisrKSB7 DQo+PiDCoMKgwqAgY2hhciBjd2RidWZbMzJdOw0KPj4gwqDCoMKgIHNwcmludGYoY3dkYnVmLCAi Li8lZCIsIGl0ZXIpOw0KPj4gwqDCoMKgIGlmIChta2Rpcihjd2RidWYsIDA3NzcpKQ0KPj4gwqDC oMKgwqDCoCBleGl0KDEpOw0KPj4gwqDCoMKgIGludCBwaWQgPSBmb3JrKCk7DQo+PiDCoMKgwqAg aWYgKHBpZCA8IDApDQo+PiDCoMKgwqDCoMKgIGV4aXQoMSk7DQo+PiDCoMKgwqAgaWYgKHBpZCA9 PSAwKSB7DQo+PiDCoMKgwqDCoMKgIGlmIChjaGRpcihjd2RidWYpKQ0KPj4gwqDCoMKgwqDCoMKg wqAgZXhpdCgxKTsNCj4+IMKgwqDCoMKgwqAgc2V0dXBfdGVzdCgpOw0KPj4gwqDCoMKgwqDCoCBl eGVjdXRlX29uZSgpOw0KPj4gwqDCoMKgwqDCoCByZXNldF90ZXN0KCk7DQo+PiDCoMKgwqDCoMKg IGV4aXQoMCk7DQo+PiDCoMKgwqAgfQ0KPj4gwqDCoMKgIGludCBzdGF0dXMgPSAwOw0KPj4gwqDC oMKgIHVpbnQ2NF90IHN0YXJ0ID0gY3VycmVudF90aW1lX21zKCk7DQo+PiDCoMKgwqAgZm9yICg7 Oykgew0KPj4gwqDCoMKgwqDCoCBpZiAod2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORyB8IFdB SVRfRkxBR1MpID09IHBpZCkNCj4+IMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4gwqDCoMKgwqDC oCBzbGVlcF9tcygxKTsNCj4+IMKgwqDCoMKgwqAgaWYgKGN1cnJlbnRfdGltZV9tcygpIC0gc3Rh cnQgPCA1ICogMTAwMCkNCj4+IMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOw0KPj4gwqDCoMKgwqDC oCBraWxsX2FuZF93YWl0KHBpZCwgJnN0YXR1cyk7DQo+PiDCoMKgwqDCoMKgIGJyZWFrOw0KPj4g wqDCoMKgIH0NCj4+IMKgwqDCoCByZW1vdmVfZGlyKGN3ZGJ1Zik7DQo+PiDCoCB9DQo+PiB9DQo+ Pg0KPj4gdm9pZCBleGVjdXRlX29uZSh2b2lkKQ0KPj4gew0KPj4gwqAgc3lzY2FsbChfX05SX3Vu c2hhcmUsIDB4NDAwMDAwMDApOw0KPj4gfQ0KPj4gaW50IG1haW4odm9pZCkNCj4+IHsNCj4+IMKg IHN5c2NhbGwoX19OUl9tbWFwLCAweDIwMDAwMDAwLCAweDEwMDAwMDAsIDMsIDB4MzIsIC0xLCAw KTsNCj4+IMKgIGZvciAocHJvY2lkID0gMDsgcHJvY2lkIDwgODsgcHJvY2lkKyspIHsNCj4+IMKg wqDCoCBpZiAoZm9yaygpID09IDApIHsNCj4+IMKgwqDCoMKgwqAgdXNlX3RlbXBvcmFyeV9kaXIo KTsNCj4+IMKgwqDCoMKgwqAgZG9fc2FuZGJveF9ub25lKCk7DQo+PiDCoMKgwqAgfQ0KPj4gwqAg fQ0KPj4gwqAgc2xlZXAoMTAwMDAwMCk7DQo+PiDCoCByZXR1cm4gMDsNCj4+IH0NCj4+DQo+Pg0K Pj4gSSByZXZpZXdlZCBrZXJuZWwgY29kZSBhbmQgZm91bmQgYSBidWcgdGhhdA0KPj4gbmV0X2Ry b3BfbnMgZnVuYyBkb2Vzbid0IGNhbGwgbmV0X2ZyZWUgZnVuYyB3aGVuIHJlZmNvdW50X2RlY19h bmRfdGVzdCdzDQo+PiByZXR1cm4gdmFsdWUgaXMgemVyby4NCj4gDQo+IFllcy4gIFdlIGRvbid0 IGNhbGwgbmV0X2ZyZWUgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IGRvZXMgbm90IGRlY3JlbWVu dA0KPiB0byB6ZXJvLiAgVGhlIHJlZmVyZW5jZSBjb3VudCBpcyBpbml0aWFsaXplZCB0byAxIGEg ZmV3IGxpbmVzIGFib3ZlIHRoZQ0KPiBzZWN0aW9uIG9mIGNvZGUgaW4geW91ciBwYXRjaCBzbyB0 aGF0IHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLg0KPiANCj4+IG9yDQo+PiB3aGVuIHJ2ID0gZG93 bl9yZWFkX2tpbGxhYmxlKCZwZXJuZXRfb3BzX3J3c2VtKSA8IDAsIGl0IGRvZXNuJ3QgbmVlZCB0 bw0KPj4gY2FsbCByZWZjb3VudF9kZWNfYW5kX3Rlc3QuDQo+IA0KPiBJdCBkb2Vzbid0IG5lZWQg dG8gYnV0IGl0IHNob3VsZCBiZSBoYXJtbGVzcy4NCj4gDQo+PiBodHRwczovL2dpdGh1Yi5jb20v dG9ydmFsZHMvbGludXgvY29tbWl0LzViYTA0OWE1Y2M4ZTI0YTE2NDNkZjc1YmJmNjViNGVmYTA3 MGZhNzQjZGlmZi05MzEyNjQ0ZTI5NjhhNDU1MTBiYWNkZDJiMjg3MmFkMg0KPj4gKEkgY2FuJ3Qg cmVwcm9kdWNlIHRoaXMgYnVnIG9uIHY0LjE1ICwgYW5kDQo+PiAxYmRiZTIyNzQ5MjA3NWQwNThl MzdjYjNkNDAwZTY0NjhkMDA5NWI1IHdpdGggbXkgcGF0Y2guIEJlY2F1c2Ugb2YgdGhlDQo+PiBw cmV2aW91cyB2ZXJzaW9uIG9mIGtlcm5lbCBkb2Vzbid0IGhhdmUgdGhpcyBidWcuKQ0KPj4gVGhp cyBidWcgY2FuIGxlYWQgdG8gbWVtb3J5IGxlYWsgb3IgRE9TLg0KPj4NCj4+IEkgbWFkZSBhIHBh dGNoIGZvciB0aGlzIGJ1Zy4gKGp1c3QgcmV2ZXJ0IHRvIGEgYmVmb3JlIGNvbW1pdCkNCj4gDQo+ IFdoYXQgYW0gSSBtaXNzaW5nPw0KPiANCj4gVGhlIG9ubHkgdGhpbmcgSSBjYW4gc2VlIHlvdXIg cGF0Y2ggZG9pbmcgaXMgY292ZXJpbmcgdXAgYSBtZW1vcnkgc3RvbXANCj4gdGhhdCBoYXMgdGhl IGVmZmVjdCBvZiBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgbmV0LT5wYXNzaXZlLiAgSSBhbSBub3QN Cj4gcmVhbGx5IGtlZW4gb24gaGlkaW5nIGJ1Z3Mgb2YgdGhhdCBraW5kLg0KPiANCj4gDQo+PiBk aWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jIGIvbmV0L2NvcmUvbmV0X25hbWVz cGFjZS5jDQo+PiBpbmRleCBiMDJmYjE5ZGYyY2MuLjlkZTBhZGUxNDk1NiAxMDA2NDQNCj4+IC0t LSBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYw0KPj4gKysrIGIvbmV0L2NvcmUvbmV0X25hbWVz cGFjZS5jDQo+PiBAQCAtNDMxLDE1ICs0MzEsMTggQEAgc3RydWN0IG5ldCAqY29weV9uZXRfbnMo dW5zaWduZWQgbG9uZyBmbGFncywNCj4+IMKgwqDCoMKgwqDCoMKgIGdldF91c2VyX25zKHVzZXJf bnMpOw0KPj4NCj4+IMKgwqDCoMKgwqDCoMKgIHJ2ID0gZG93bl9yZWFkX2tpbGxhYmxlKCZwZXJu ZXRfb3BzX3J3c2VtKTsNCj4+IC3CoMKgwqDCoMKgwqAgaWYgKHJ2IDwgMCkNCj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gcHV0X3VzZXJuczsNCj4+ICvCoMKgwqDCoMKgwqAg aWYgKHJ2IDwgMCl7DQo+PiArwqDCoMKgwqDCoMKgwqAgbmV0X2ZyZWUobmV0KTsNCj4+ICvCoMKg wqDCoMKgwqDCoCBkZWNfbmV0X25hbWVzcGFjZXModWNvdW50cyk7DQo+PiArwqDCoMKgwqDCoMKg wqAgcHV0X3VzZXJfbnModXNlcl9ucyk7DQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEVSUl9Q VFIocnYpOw0KPj4gK8KgwqDCoCB9DQo+Pg0KPj4gwqDCoMKgwqDCoMKgwqAgcnYgPSBzZXR1cF9u ZXQobmV0LCB1c2VyX25zKTsNCj4+DQo+PiDCoMKgwqDCoMKgwqDCoCB1cF9yZWFkKCZwZXJuZXRf b3BzX3J3c2VtKTsNCj4+DQo+PiDCoMKgwqDCoMKgwqDCoCBpZiAocnYgPCAwKSB7DQo+PiAtcHV0 X3VzZXJuczoNCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdXRfdXNlcl9ucyh1 c2VyX25zKTsNCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuZXRfZHJvcF9ucyhu ZXQpOw0KPj4gwqBkZWNfdWNvdW50czoNCj4+DQo+PiBhbmQsIHNvcnJ5IGZvciBteSBlbmNyeXB0 ZWQgbWFpbHMuDQo+IA0KPiBFcmljDQo+IA0KDQo=