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.5 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 9931FC43441 for ; Mon, 12 Nov 2018 21:15:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2F2BE2243E for ; Mon, 12 Nov 2018 21:15:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="iTggIt+J" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2F2BE2243E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730512AbeKMHKU (ORCPT ); Tue, 13 Nov 2018 02:10:20 -0500 Received: from mail-eopbgr730052.outbound.protection.outlook.com ([40.107.73.52]:17347 "EHLO NAM05-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726612AbeKMHKT (ORCPT ); Tue, 13 Nov 2018 02:10:19 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tJB40Ec71lclOF9AXWebc90P2NIbD8TgwJQLNmNP4Qs=; b=iTggIt+JbDLAzO9NNWAB0ICo+9mBQgGBMCUrnA5G+qouZ1qJaWOPShwJujdL32PjcO+zdZUYuRNPhFnQAVIctWOxF8e2Hb07l4uWTA8feeUkjqnzYQO59jMicglscN8N+9Oqsh6UQ/T4ySjI44GCGFvZeJtnCu22pjBlTmzJiuI= Received: from DM5PR12MB2471.namprd12.prod.outlook.com (52.132.141.138) by DM5PR12MB1851.namprd12.prod.outlook.com (10.175.86.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1294.26; Mon, 12 Nov 2018 21:15:15 +0000 Received: from DM5PR12MB2471.namprd12.prod.outlook.com ([fe80::4c23:f551:bc6a:554e]) by DM5PR12MB2471.namprd12.prod.outlook.com ([fe80::4c23:f551:bc6a:554e%4]) with mapi id 15.20.1294.045; Mon, 12 Nov 2018 21:15:15 +0000 From: "Moger, Babu" To: Fenghua Yu , Thomas Gleixner , Ingo Molnar , H Peter Anvin , Tony Luck , Peter Zijlstra , Reinette Chatre , James Morse , Ravi V Shankar , Sai Praneeth Prakhya , Arshiya Hayatkhan Pathan CC: linux-kernel Subject: Re: [PATCH v3 3/8] selftests/resctrl: Read memory bandwidth from perf IMC counter and from resctrl file system Thread-Topic: [PATCH v3 3/8] selftests/resctrl: Read memory bandwidth from perf IMC counter and from resctrl file system Thread-Index: AQHUcV23nMzsTj3hkkmv9+5kPQXJI6VMtt6A Date: Mon, 12 Nov 2018 21:15:15 +0000 Message-ID: References: <1541019754-192204-1-git-send-email-fenghua.yu@intel.com> <1541019754-192204-4-git-send-email-fenghua.yu@intel.com> In-Reply-To: <1541019754-192204-4-git-send-email-fenghua.yu@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: SN6PR15CA0004.namprd15.prod.outlook.com (2603:10b6:805:16::17) To DM5PR12MB2471.namprd12.prod.outlook.com (2603:10b6:4:b5::10) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Babu.Moger@amd.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [165.204.78.1] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;DM5PR12MB1851;20:UOo2KW2R4dKYO2OeLItbExxCXdhGiId9lH5YtYgVuNcOnyC7Jje4w8BWyr80YwNqUPldpcAf8sDPvgsGKsh1sgWlD1FO0l590TnL4QsCnKKNOSsg90F9C4c9DKaMXEBF+xikpm1Czqy8nvGI5zgOyTEx46zezkdI915RWBJfUgBCVu/0nvTewyVYGwFLTeBUEMLJYFbgoFDqI6vdlaAe+Dc1xc/2vQHF5NJjsqjUJ6Ijmkj9QqHIh0NobSi4Ltq1 x-ms-office365-filtering-correlation-id: 3837b308-e634-482c-ea97-08d648e3f0c1 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390040)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);SRVR:DM5PR12MB1851; x-ms-traffictypediagnostic: DM5PR12MB1851: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(72170088055959)(228905959029699); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231382)(944501410)(52105112)(3002001)(10201501046)(93006095)(93001095)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123558120)(20161123562045)(20161123560045)(201708071742011)(7699051)(76991095);SRVR:DM5PR12MB1851;BCL:0;PCL:0;RULEID:;SRVR:DM5PR12MB1851; x-forefront-prvs: 0854128AF0 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(366004)(136003)(346002)(39860400002)(376002)(396003)(189003)(199004)(5660300001)(2900100001)(305945005)(229853002)(4326008)(97736004)(71200400001)(71190400001)(6246003)(2906002)(7736002)(7416002)(256004)(14444005)(66066001)(25786009)(68736007)(36756003)(6116002)(52116002)(106356001)(11346002)(446003)(86362001)(186003)(31696002)(53936002)(105586002)(386003)(6506007)(53546011)(102836004)(478600001)(6486002)(476003)(26005)(316002)(3846002)(6512007)(81166006)(81156014)(486006)(6436002)(8936002)(4744004)(76176011)(31686004)(99286004)(2616005)(14454004)(8676002)(72206003)(110136005)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR12MB1851;H:DM5PR12MB2471.namprd12.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: amd.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: QQA07iSstXyXwz+zkXb+boNQN0pII20IVHvHZoQ6P8esUZKmiRST6sDUB2FweYMezOu2kzzE/CtugkODYkkNUWtTpVzEjcqTyco3Mix7H/3tLDWPrbDsd2+En1AE+i+d3Q4GwvENqdgpNGiqueSfd6TXS7eF0EmnVsdKR06K97gHYpgidqkgqUFMFkKoiPtp52BTu4aC9+rD6rT5vGu+0T9HhVihhy4SxZFU/jn0dORL0IXuVDBBooVNDPD4KTlgEW71Ea35cEXmzcS5YYitw/OTtjCHXrPosU9A8r4CRwMnQYmhU7PcTWIZ6aAGZO24JOA1YocfLSLQVuvLm1LzBRgJRfmbsoy/XCJp2WrDw+s= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: <027D3646692F884B966C99C218A0087A@namprd12.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3837b308-e634-482c-ea97-08d648e3f0c1 X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Nov 2018 21:15:15.6252 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1851 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org DQoNCk9uIDEwLzMxLzE4IDQ6MDIgUE0sIEZlbmdodWEgWXUgd3JvdGU6DQo+IEZyb206IFNhaSBQ cmFuZWV0aCBQcmFraHlhIDxzYWkucHJhbmVldGgucHJha2h5YUBpbnRlbC5jb20+DQo+IA0KPiBU b3RhbCBtZW1vcnkgYmFuZHdpZHRoIGNhbiBiZSBtb25pdG9yZWQgZnJvbSBwZXJmIElNQyBjb3Vu dGVyIGFuZCBmcm9tDQo+IHJlc2N0cmwgZmlsZSBzeXN0ZW0uIExhdGVyIHRoZSB0d28gd2lsbCBi ZSBjb21wYXJlZCB0byB2ZXJpZnkgdGhlIHRvdGFsDQo+IG1lbW9yeSBiYW5kd2lkdGggcmVhZCBm cm9tIHJlc2N0cmwgaXMgY29ycmVjdC4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IFNhaSBQcmFuZWV0 aCBQcmFraHlhIDxzYWkucHJhbmVldGgucHJha2h5YUBpbnRlbC5jb20+DQo+IFNpZ25lZC1vZmYt Ynk6IEFyc2hpeWEgSGF5YXRraGFuIFBhdGhhbiA8YXJzaGl5YS5oYXlhdGtoYW4ucGF0aGFuQGlu dGVsLmNvbT4NCj4gU2lnbmVkLW9mZi1ieTogRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5j b20+DQo+IC0tLQ0KPiAgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9tZW1idy5jIHwg NDMxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQo+ICAxIGZpbGUgY2hhbmdlZCwg NDMxIGluc2VydGlvbnMoKykNCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy90ZXN0aW5nL3Nl bGZ0ZXN0cy9yZXNjdHJsL21lbWJ3LmMNCj4gDQo+IGRpZmYgLS1naXQgYS90b29scy90ZXN0aW5n L3NlbGZ0ZXN0cy9yZXNjdHJsL21lbWJ3LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNj dHJsL21lbWJ3LmMNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMDAwMDAw Li4zMTQ2Y2Y4Yjc0NjgNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi90b29scy90ZXN0aW5nL3Nl bGZ0ZXN0cy9yZXNjdHJsL21lbWJ3LmMNCj4gQEAgLTAsMCArMSw0MzEgQEANCj4gKy8vIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQo+ICsvKg0KPiArICogTWVtb3J5IGJhbmR3aWR0 aCBtb25pdG9yaW5nIGFuZCBhbGxvY2F0aW9uIGxpYnJhcnkNCj4gKyAqDQo+ICsgKiBDb3B5cmln aHQgKEMpIDIwMTggSW50ZWwgQ29ycG9yYXRpb24NCj4gKyAqDQo+ICsgKiBBdXRob3JzOg0KPiAr ICogICAgQXJzaGl5YSBIYXlhdGtoYW4gUGF0aGFuIDxhcnNoaXlhLmhheWF0a2hhbi5wYXRoYW5A aW50ZWwuY29tPg0KPiArICogICAgU2FpIFByYW5lZXRoIFByYWtoeWEgPHNhaS5wcmFuZWV0aC5w cmFraHlhQGludGVsLmNvbT4sDQo+ICsgKiAgICBGZW5naHVhIFl1IDxmZW5naHVhLnl1QGludGVs LmNvbT4NCj4gKyAqLw0KPiArI2luY2x1ZGUgInJlc2N0cmwuaCINCj4gKw0KPiArI2RlZmluZSBV TkNPUkVfSU1DCQkidW5jb3JlX2ltYyINCj4gKyNkZWZpbmUgUkVBRF9GSUxFX05BTUUJCSJldmVu dHMvY2FzX2NvdW50X3JlYWQiDQo+ICsjZGVmaW5lIFdSSVRFX0ZJTEVfTkFNRQkJImV2ZW50cy9j YXNfY291bnRfd3JpdGUiDQo+ICsjZGVmaW5lIERZTl9QTVVfUEFUSAkJIi9zeXMvYnVzL2V2ZW50 X3NvdXJjZS9kZXZpY2VzIg0KPiArI2RlZmluZSBTQ0FMRQkJCTAuMDAwMDYxMDM1MTU2MjUNCj4g KyNkZWZpbmUgTUFYX0lNQ1MJCTIwDQo+ICsjZGVmaW5lIE1BWF9UT0tFTlMJCTUNCj4gKyNkZWZp bmUgUkVBRAkJCTANCj4gKyNkZWZpbmUgV1JJVEUJCQkxDQo+ICsjZGVmaW5lIENPTl9NT05fTUJN X0xPQ0FMX0JZVEVTX1BBVEgJCQkJXA0KPiArCSIlcy8lcy9tb25fZ3JvdXBzLyVzL21vbl9kYXRh L21vbl9MM18wJWMvbWJtX2xvY2FsX2J5dGVzIg0KPiArDQo+ICsjZGVmaW5lIENPTl9NQk1fTE9D QUxfQllURVNfUEFUSAkJXA0KPiArCSIlcy8lcy9tb25fZGF0YS9tb25fTDNfMCVjL21ibV9sb2Nh bF9ieXRlcyINCj4gKw0KPiArI2RlZmluZSBNT05fTUJNX0xPQ0FMX0JZVEVTX1BBVEgJCVwNCj4g KwkiJXMvbW9uX2dyb3Vwcy8lcy9tb25fZGF0YS9tb25fTDNfMCVjL21ibV9sb2NhbF9ieXRlcyIN Cj4gKw0KPiArI2RlZmluZSBNQk1fTE9DQUxfQllURVNfUEFUSAkJCVwNCj4gKwkiJXMvbW9uX2Rh dGEvbW9uX0wzXzAlYy9tYm1fbG9jYWxfYnl0ZXMiDQo+ICsNCj4gK3N0cnVjdCBtZW1id19yZWFk X2Zvcm1hdCB7DQo+ICsJX191NjQgdmFsdWU7ICAgICAgICAgLyogVGhlIHZhbHVlIG9mIHRoZSBl dmVudCAqLw0KPiArCV9fdTY0IHRpbWVfZW5hYmxlZDsgIC8qIGlmIFBFUkZfRk9STUFUX1RPVEFM X1RJTUVfRU5BQkxFRCAqLw0KPiArCV9fdTY0IHRpbWVfcnVubmluZzsgIC8qIGlmIFBFUkZfRk9S TUFUX1RPVEFMX1RJTUVfUlVOTklORyAqLw0KPiArCV9fdTY0IGlkOyAgICAgICAgICAgIC8qIGlm IFBFUkZfRk9STUFUX0lEICovDQo+ICt9Ow0KPiArDQo+ICtzdHJ1Y3QgaW1jX2NvdW50ZXJfY29u ZmlnIHsNCj4gKwlfX3UzMiB0eXBlOw0KPiArCV9fdTY0IGV2ZW50Ow0KPiArCV9fdTY0IHVtYXNr Ow0KPiArCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgcGU7DQo+ICsJc3RydWN0IG1lbWJ3X3JlYWRf Zm9ybWF0IHJldHVybl92YWx1ZTsNCj4gKwlpbnQgZmQ7DQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMg c3RydWN0IGltY19jb3VudGVyX2NvbmZpZyBpbWNfY291bnRlcnNfY29uZmlnW01BWF9JTUNTXVsy XTsNCj4gK3N0YXRpYyBjaGFyIG1ibV90b3RhbF9wYXRoWzEwMjRdOw0KPiArc3RhdGljIGludCBp bWNzOw0KPiArDQo+ICt2b2lkIG1lbWJ3X2luaXRpYWxpemVfcGVyZl9ldmVudF9hdHRyKGludCBp LCBpbnQgaikNCj4gK3sNCj4gKwltZW1zZXQoJmltY19jb3VudGVyc19jb25maWdbaV1bal0ucGUs IDAsDQo+ICsJICAgICAgIHNpemVvZihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyKSk7DQo+ICsJaW1j X2NvdW50ZXJzX2NvbmZpZ1tpXVtqXS5wZS50eXBlID0gaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXVtq XS50eXBlOw0KPiArCWltY19jb3VudGVyc19jb25maWdbaV1bal0ucGUuc2l6ZSA9IHNpemVvZihz dHJ1Y3QgcGVyZl9ldmVudF9hdHRyKTsNCj4gKwlpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLnBl LmRpc2FibGVkID0gMTsNCj4gKwlpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLnBlLmluaGVyaXQg PSAxOw0KPiArCWltY19jb3VudGVyc19jb25maWdbaV1bal0ucGUuZXhjbHVkZV9ndWVzdCA9IDE7 DQo+ICsJaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXVtqXS5wZS5jb25maWcgPQ0KPiArCQlpbWNfY291 bnRlcnNfY29uZmlnW2ldW2pdLnVtYXNrIDw8IDggfA0KPiArCQlpbWNfY291bnRlcnNfY29uZmln W2ldW2pdLmV2ZW50Ow0KPiArCWltY19jb3VudGVyc19jb25maWdbaV1bal0ucGUuc2FtcGxlX3R5 cGUgPSBQRVJGX1NBTVBMRV9JREVOVElGSUVSOw0KPiArCWltY19jb3VudGVyc19jb25maWdbaV1b al0ucGUucmVhZF9mb3JtYXQgPQ0KPiArCQlQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX0VOQUJMRUQg fCBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkc7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBp bnQgb3Blbl9wZXJmX2V2ZW50KGludCBpLCBpbnQgY3B1X25vLCBpbnQgaikNCj4gK3sNCj4gKwlp bWNfY291bnRlcnNfY29uZmlnW2ldW2pdLmZkID0NCj4gKwkJcGVyZl9ldmVudF9vcGVuKCZpbWNf Y291bnRlcnNfY29uZmlnW2ldW2pdLnBlLCAtMSwgY3B1X25vLCAtMSwNCj4gKwkJCQlQRVJGX0ZM QUdfRkRfQ0xPRVhFQyk7DQo+ICsNCj4gKwlpZiAoaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXVtqXS5m ZCA9PSAtMSkgew0KPiArCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgbGVhZGVyICVs bHhcbiIsDQo+ICsJCQlpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLnBlLmNvbmZpZyk7DQo+ICsN Cj4gKwkJcmV0dXJuIC0xOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ ICt2b2lkIG1lbWJ3X2lvY3RsX3BlcmZfZXZlbnRfaW9jX3Jlc2V0X2VuYWJsZShpbnQgaSwgaW50 IGopDQo+ICt7DQo+ICsJaW9jdGwoaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXVtqXS5mZCwgUEVSRl9F VkVOVF9JT0NfUkVTRVQsIDApOw0KPiArCWlvY3RsKGltY19jb3VudGVyc19jb25maWdbaV1bal0u ZmQsIFBFUkZfRVZFTlRfSU9DX0VOQUJMRSwgMCk7DQo+ICt9DQo+ICsNCj4gK3ZvaWQgbWVtYndf aW9jdGxfcGVyZl9ldmVudF9pb2NfZGlzYWJsZShpbnQgaSwgaW50IGopDQo+ICt7DQo+ICsJaW9j dGwoaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXVtqXS5mZCwgUEVSRl9FVkVOVF9JT0NfRElTQUJMRSwg MCk7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBnZXRfZXZlbnRfYW5kX3VtYXNrOglQYXJzZSBj b25maWcgaW50byBldmVudCBhbmQgdW1hc2sNCj4gKyAqIEBjYXNfY291bnRfY2ZnOglDb25maWcN Cj4gKyAqIEBjb3VudDoJCWlNQyBudW1iZXINCj4gKyAqIEBvcDoJCQlPcGVyYXRpb24gKHJlYWQv d3JpdGUpDQo+ICsgKi8NCj4gK3ZvaWQgZ2V0X2V2ZW50X2FuZF91bWFzayhjaGFyICpjYXNfY291 bnRfY2ZnLCBpbnQgY291bnQsIGJvb2wgb3ApDQo+ICt7DQo+ICsJY2hhciAqdG9rZW5bTUFYX1RP S0VOU107DQo+ICsJaW50IGkgPSAwOw0KPiArDQo+ICsJc3RyY2F0KGNhc19jb3VudF9jZmcsICIs Iik7DQo+ICsJdG9rZW5bMF0gPSBzdHJ0b2soY2FzX2NvdW50X2NmZywgIj0sIik7DQo+ICsNCj4g Kwlmb3IgKGkgPSAxOyBpIDwgTUFYX1RPS0VOUzsgaSsrKQ0KPiArCQl0b2tlbltpXSA9IHN0cnRv ayhOVUxMLCAiPSwiKTsNCj4gKw0KPiArCWZvciAoaSA9IDA7IGkgPCBNQVhfVE9LRU5TOyBpKysp IHsNCj4gKwkJaWYgKCF0b2tlbltpXSkNCj4gKwkJCWJyZWFrOw0KPiArCQlpZiAoc3RyY21wKHRv a2VuW2ldLCAiZXZlbnQiKSA9PSAwKSB7DQo+ICsJCQlpZiAob3AgPT0gUkVBRCkNCj4gKwkJCQlp bWNfY291bnRlcnNfY29uZmlnW2NvdW50XVtSRUFEXS5ldmVudCA9DQo+ICsJCQkJc3RydG9sKHRv a2VuW2kgKyAxXSwgTlVMTCwgMTYpOw0KPiArCQkJZWxzZQ0KPiArCQkJCWltY19jb3VudGVyc19j b25maWdbY291bnRdW1dSSVRFXS5ldmVudCA9DQo+ICsJCQkJc3RydG9sKHRva2VuW2kgKyAxXSwg TlVMTCwgMTYpOw0KPiArCQl9DQo+ICsJCWlmIChzdHJjbXAodG9rZW5baV0sICJ1bWFzayIpID09 IDApIHsNCj4gKwkJCWlmIChvcCA9PSBSRUFEKQ0KPiArCQkJCWltY19jb3VudGVyc19jb25maWdb Y291bnRdW1JFQURdLnVtYXNrID0NCj4gKwkJCQlzdHJ0b2wodG9rZW5baSArIDFdLCBOVUxMLCAx Nik7DQo+ICsJCQllbHNlDQo+ICsJCQkJaW1jX2NvdW50ZXJzX2NvbmZpZ1tjb3VudF1bV1JJVEVd LnVtYXNrID0NCj4gKwkJCQlzdHJ0b2wodG9rZW5baSArIDFdLCBOVUxMLCAxNik7DQo+ICsJCX0N Cj4gKwl9DQo+ICt9DQo+ICsNCj4gKy8qIEdldCB0eXBlIGFuZCBjb25maWcgKHJlYWQgYW5kIHdy aXRlKSBvZiBhbiBpTUMgY291bnRlciAqLw0KPiArc3RhdGljIGludCByZWFkX2Zyb21faW1jX2Rp cihjaGFyICppbWNfZGlyLCBpbnQgY291bnQpDQo+ICt7DQo+ICsJY2hhciBjYXNfY291bnRfY2Zn WzEwMjRdLCBpbWNfY291bnRlcl9jZmdbMTAyNF0sIGltY19jb3VudGVyX3R5cGVbMTAyNF07DQo+ ICsJRklMRSAqZnA7DQo+ICsNCj4gKwkvKiBHZXQgdHlwZSBvZiBpTUMgY291bnRlciAqLw0KPiAr CXNwcmludGYoaW1jX2NvdW50ZXJfdHlwZSwgIiVzJXMiLCBpbWNfZGlyLCAidHlwZSIpOw0KPiAr CWZwID0gZm9wZW4oaW1jX2NvdW50ZXJfdHlwZSwgInIiKTsNCj4gKwlpZiAoIWZwKSB7DQo+ICsJ CXBlcnJvcigiRmFpbGVkIHRvIG9wZW4gaW1jIGNvdW50ZXIgdHlwZSBmaWxlIik7DQo+ICsNCj4g KwkJcmV0dXJuIC0xOw0KPiArCX0NCj4gKwlpZiAoZnNjYW5mKGZwLCAiJXUiLCAmaW1jX2NvdW50 ZXJzX2NvbmZpZ1tjb3VudF1bUkVBRF0udHlwZSkgPD0gMCkgew0KPiArCQlwZXJyb3IoIkNvdWxk IG5vdCBnZXQgaW1jIHR5cGUiKTsNCj4gKwkJZmNsb3NlKGZwKTsNCj4gKw0KPiArCQlyZXR1cm4g LTE7DQo+ICsJfQ0KPiArCWZjbG9zZShmcCk7DQo+ICsNCj4gKwlpbWNfY291bnRlcnNfY29uZmln W2NvdW50XVtXUklURV0udHlwZSA9DQo+ICsJCQkJaW1jX2NvdW50ZXJzX2NvbmZpZ1tjb3VudF1b UkVBRF0udHlwZTsNCj4gKw0KPiArCS8qIEdldCByZWFkIGNvbmZpZyAqLw0KPiArCXNwcmludGYo aW1jX2NvdW50ZXJfY2ZnLCAiJXMlcyIsIGltY19kaXIsIFJFQURfRklMRV9OQU1FKTsNCj4gKwlm cCA9IGZvcGVuKGltY19jb3VudGVyX2NmZywgInIiKTsNCj4gKwlpZiAoIWZwKSB7DQo+ICsJCXBl cnJvcigiRmFpbGVkIHRvIG9wZW4gaW1jIGNvbmZpZyBmaWxlIik7DQo+ICsNCj4gKwkJcmV0dXJu IC0xOw0KPiArCX0NCj4gKwlpZiAoZnNjYW5mKGZwLCAiJXMiLCBjYXNfY291bnRfY2ZnKSA8PSAw KSB7DQo+ICsJCXBlcnJvcigiQ291bGQgbm90IGdldCBpbWMgY2FzIGNvdW50IHJlYWQiKTsNCj4g KwkJZmNsb3NlKGZwKTsNCj4gKw0KPiArCQlyZXR1cm4gLTE7DQo+ICsJfQ0KPiArCWZjbG9zZShm cCk7DQo+ICsNCj4gKwlnZXRfZXZlbnRfYW5kX3VtYXNrKGNhc19jb3VudF9jZmcsIGNvdW50LCBS RUFEKTsNCj4gKw0KPiArCS8qIEdldCB3cml0ZSBjb25maWcgKi8NCj4gKwlzcHJpbnRmKGltY19j b3VudGVyX2NmZywgIiVzJXMiLCBpbWNfZGlyLCBXUklURV9GSUxFX05BTUUpOw0KPiArCWZwID0g Zm9wZW4oaW1jX2NvdW50ZXJfY2ZnLCAiciIpOw0KPiArCWlmICghZnApIHsNCj4gKwkJcGVycm9y KCJGYWlsZWQgdG8gb3BlbiBpbWMgY29uZmlnIGZpbGUiKTsNCj4gKw0KPiArCQlyZXR1cm4gLTE7 DQo+ICsJfQ0KPiArCWlmICAoZnNjYW5mKGZwLCAiJXMiLCBjYXNfY291bnRfY2ZnKSA8PSAwKSB7 DQo+ICsJCXBlcnJvcigiQ291bGQgbm90IGdldCBpbWMgY2FzIGNvdW50IHdyaXRlIik7DQo+ICsJ CWZjbG9zZShmcCk7DQo+ICsNCj4gKwkJcmV0dXJuIC0xOw0KPiArCX0NCj4gKwlmY2xvc2UoZnAp Ow0KPiArDQo+ICsJZ2V0X2V2ZW50X2FuZF91bWFzayhjYXNfY291bnRfY2ZnLCBjb3VudCwgV1JJ VEUpOw0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBBIHN5c3Rl bSBjYW4gaGF2ZSAnbicgbnVtYmVyIG9mIGlNQyAoSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxl cikNCj4gKyAqIGNvdW50ZXJzLCBnZXQgdGhhdCAnbicuIEZvciBlYWNoIGlNQyBjb3VudGVyIGdl dCBpdCdzIHR5cGUgYW5kIGNvbmZpZy4NCj4gKyAqIEFsc28sIGVhY2ggY291bnRlciBoYXMgdHdv IGNvbmZpZ3MsIG9uZSBmb3IgcmVhZCBhbmQgdGhlIG90aGVyIGZvciB3cml0ZS4NCj4gKyAqIEEg Y29uZmlnIGFnYWluIGhhcyB0d28gcGFydHMsIGV2ZW50IGFuZCB1bWFzay4NCj4gKyAqIEVudW1l cmF0ZSBhbGwgdGhlc2UgZGV0YWlscyBpbnRvIGFuIGFycmF5IG9mIHN0cnVjdHVyZXMuDQo+ICsg Kg0KPiArICogUmV0dXJuOiA+PSAwIG9uIHN1Y2Nlc3MuIDwgMCBvbiBmYWlsdXJlLg0KPiArICov DQo+ICtzdGF0aWMgaW50IG51bV9vZl9pbWNzKHZvaWQpDQo+ICt7DQo+ICsJdW5zaWduZWQgaW50 IGNvdW50ID0gMDsNCj4gKwljaGFyIGltY19kaXJbMTAyNF07DQo+ICsJc3RydWN0IGRpcmVudCAq ZXA7DQo+ICsJaW50IHJldDsNCj4gKwlESVIgKmRwOw0KPiArDQo+ICsJZHAgPSBvcGVuZGlyKERZ Tl9QTVVfUEFUSCk7DQo+ICsJaWYgKGRwKSB7DQo+ICsJCXdoaWxlICgoZXAgPSByZWFkZGlyKGRw KSkpIHsNCj4gKwkJCWlmIChzdHJzdHIoZXAtPmRfbmFtZSwgVU5DT1JFX0lNQykpIHsNCj4gKwkJ CQlzcHJpbnRmKGltY19kaXIsICIlcy8lcy8iLCBEWU5fUE1VX1BBVEgsDQo+ICsJCQkJCWVwLT5k X25hbWUpOw0KPiArCQkJCXJldCA9IHJlYWRfZnJvbV9pbWNfZGlyKGltY19kaXIsIGNvdW50KTsN Cj4gKwkJCQlpZiAocmV0KSB7DQo+ICsJCQkJCWNsb3NlZGlyKGRwKTsNCj4gKw0KPiArCQkJCQly ZXR1cm4gcmV0Ow0KPiArCQkJCX0NCj4gKwkJCQljb3VudCsrOw0KPiArCQkJfQ0KPiArCQl9DQo+ ICsJCWNsb3NlZGlyKGRwKTsNCj4gKwkJaWYgKGNvdW50ID09IDApIHsNCj4gKwkJCXBlcnJvcigi VW5hYmxlIGZpbmQgaU1DIGNvdW50ZXJzIVxuIik7DQo+ICsNCj4gKwkJCXJldHVybiAtMTsNCj4g KwkJfQ0KPiArCX0gZWxzZSB7DQo+ICsJCXBlcnJvcigiVW5hYmxlIHRvIG9wZW4gUE1VIGRpcmVj dG9yeSFcbiIpOw0KPiArDQo+ICsJCXJldHVybiAtMTsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4g Y291bnQ7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZV9tZW1fYndfaW1jKHZv aWQpDQo+ICt7DQo+ICsJaW50IGltYywgajsNCj4gKw0KPiArCWltY3MgPSBudW1fb2ZfaW1jcygp Ow0KPiArCWlmIChpbWNzIDwgMCkNCg0KSSB0aGluayB0aGlzIGNvbmRpdGlvbiBzaG91bGQgYmUg Ijw9Ii4gUGxzIGNoZWNrLg0KPiArCQlyZXR1cm4gaW1jczsNCj4gKw0KPiArCS8qIEluaXRpYWxp emUgcGVyZl9ldmVudF9hdHRyIHN0cnVjdHVyZXMgZm9yIGFsbCBpTUMncyAqLw0KPiArCWZvciAo aW1jID0gMDsgaW1jIDwgaW1jczsgaW1jKyspIHsNCj4gKwkJZm9yIChqID0gMDsgaiA8IDI7IGor KykNCj4gKwkJCW1lbWJ3X2luaXRpYWxpemVfcGVyZl9ldmVudF9hdHRyKGltYywgaik7DQo+ICsJ fQ0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBnZXRfbWVtX2J3 X2ltYzoJTWVtb3J5IGJhbmQgd2lkdGggYXMgcmVwb3J0ZWQgYnkgaU1DIGNvdW50ZXJzDQo+ICsg KiBAY3B1X25vOgkJQ1BVIG51bWJlciB0aGF0IHRoZSBiZW5jaG1hcmsgUElEIGlzIGJpbmRlZCB0 bw0KPiArICogQGJ3X3JlcG9ydDoJCUJhbmR3aWR0aCByZXBvcnQgdHlwZSAocmVhZHMsIHdyaXRl cykNCj4gKyAqDQo+ICsgKiBNZW1vcnkgQi9XIHV0aWxpemVkIGJ5IGEgcHJvY2VzcyBvbiBhIHNv Y2tldCBjYW4gYmUgY2FsY3VsYXRlZCB1c2luZw0KPiArICogaU1DIGNvdW50ZXJzLiBQZXJmIGV2 ZW50cyBhcmUgdXNlZCB0byByZWFkIHRoZXNlIGNvdW50ZXJzLg0KPiArICoNCj4gKyAqIFJldHVy bjogPj0gMCBvbiBzdWNjZXNzLiA8IDAgb24gZmFpbHVyZS4NCj4gKyAqLw0KPiArc3RhdGljIGZs b2F0IGdldF9tZW1fYndfaW1jKGludCBjcHVfbm8sIGNoYXIgKmJ3X3JlcG9ydCkNCj4gK3sNCj4g KwlmbG9hdCByZWFkcywgd3JpdGVzLCBvZl9tdWxfcmVhZCwgb2ZfbXVsX3dyaXRlOw0KPiArCWlu dCBpbWMsIGosIHJldDsNCj4gKw0KPiArCS8qIFN0YXJ0IGFsbCBpTUMgY291bnRlcnMgdG8gbG9n IHZhbHVlcyAoYm90aCByZWFkIGFuZCB3cml0ZSkgKi8NCj4gKwlyZWFkcyA9IDAsIHdyaXRlcyA9 IDAsIG9mX211bF9yZWFkID0gMSwgb2ZfbXVsX3dyaXRlID0gMTsNCj4gKwlmb3IgKGltYyA9IDA7 IGltYyA8IGltY3M7IGltYysrKSB7DQo+ICsJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsNCj4g KwkJCXJldCA9IG9wZW5fcGVyZl9ldmVudChpbWMsIGNwdV9ubywgaik7DQo+ICsJCQlpZiAocmV0 KQ0KPiArCQkJCXJldHVybiAtMTsNCj4gKwkJfQ0KPiArCQlmb3IgKGogPSAwOyBqIDwgMjsgaisr KQ0KPiArCQkJbWVtYndfaW9jdGxfcGVyZl9ldmVudF9pb2NfcmVzZXRfZW5hYmxlKGltYywgaik7 DQo+ICsJfQ0KPiArDQo+ICsJc2xlZXAoMSk7DQo+ICsNCj4gKwkvKiBTdG9wIGNvdW50ZXJzIGFm dGVyIGEgc2Vjb25kIHRvIGdldCByZXN1bHRzIChib3RoIHJlYWQgYW5kIHdyaXRlKSAqLw0KPiAr CWZvciAoaW1jID0gMDsgaW1jIDwgaW1jczsgaW1jKyspIHsNCj4gKwkJZm9yIChqID0gMDsgaiA8 IDI7IGorKykNCj4gKwkJCW1lbWJ3X2lvY3RsX3BlcmZfZXZlbnRfaW9jX2Rpc2FibGUoaW1jLCBq KTsNCj4gKwl9DQo+ICsNCj4gKwkvKg0KPiArCSAqIEdldCByZXN1bHRzIHdoaWNoIGFyZSBzdG9y ZWQgaW4gc3RydWN0IHR5cGUgaW1jX2NvdW50ZXJfY29uZmlnDQo+ICsJICogVGFrZSBvdmVyIGZs b3cgaW50byBjb25zaWRlcmF0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyB0b3RhbCBiL3cNCj4gKwkg Ki8NCj4gKwlmb3IgKGltYyA9IDA7IGltYyA8IGltY3M7IGltYysrKSB7DQo+ICsJCXN0cnVjdCBp bWNfY291bnRlcl9jb25maWcgKnIgPQ0KPiArCQkJJmltY19jb3VudGVyc19jb25maWdbaW1jXVtS RUFEXTsNCj4gKwkJc3RydWN0IGltY19jb3VudGVyX2NvbmZpZyAqdyA9DQo+ICsJCQkmaW1jX2Nv dW50ZXJzX2NvbmZpZ1tpbWNdW1dSSVRFXTsNCj4gKw0KPiArCQlpZiAocmVhZChyLT5mZCwgJnIt PnJldHVybl92YWx1ZSwNCj4gKwkJCSBzaXplb2Yoc3RydWN0IG1lbWJ3X3JlYWRfZm9ybWF0KSkg PT0gLTEpIHsNCj4gKwkJCXBlcnJvcigiQ291bGRuJ3QgZ2V0IHJlYWQgYi93IHRocm91Z2ggaU1D Iik7DQo+ICsNCj4gKwkJCXJldHVybiAtMTsNCj4gKwkJfQ0KPiArDQo+ICsJCWlmIChyZWFkKHct PmZkLCAmdy0+cmV0dXJuX3ZhbHVlLA0KPiArCQkJIHNpemVvZihzdHJ1Y3QgbWVtYndfcmVhZF9m b3JtYXQpKSA9PSAtMSkgew0KPiArCQkJcGVycm9yKCJDb3VsZG4ndCBnZXQgd3JpdGUgYncgdGhy b3VnaCBpTUMiKTsNCj4gKw0KPiArCQkJcmV0dXJuIC0xOw0KPiArCQl9DQo+ICsNCj4gKwkJX191 NjQgcl90aW1lX2VuYWJsZWQgPSByLT5yZXR1cm5fdmFsdWUudGltZV9lbmFibGVkOw0KPiArCQlf X3U2NCByX3RpbWVfcnVubmluZyA9IHItPnJldHVybl92YWx1ZS50aW1lX3J1bm5pbmc7DQo+ICsN Cj4gKwkJaWYgKHJfdGltZV9lbmFibGVkICE9IHJfdGltZV9ydW5uaW5nKQ0KPiArCQkJb2ZfbXVs X3JlYWQgPSAoZmxvYXQpcl90aW1lX2VuYWJsZWQgLw0KPiArCQkJCQkoZmxvYXQpcl90aW1lX3J1 bm5pbmc7DQo+ICsNCj4gKwkJX191NjQgd190aW1lX2VuYWJsZWQgPSB3LT5yZXR1cm5fdmFsdWUu dGltZV9lbmFibGVkOw0KPiArCQlfX3U2NCB3X3RpbWVfcnVubmluZyA9IHctPnJldHVybl92YWx1 ZS50aW1lX3J1bm5pbmc7DQo+ICsNCj4gKwkJaWYgKHdfdGltZV9lbmFibGVkICE9IHdfdGltZV9y dW5uaW5nKQ0KPiArCQkJb2ZfbXVsX3dyaXRlID0gKGZsb2F0KXdfdGltZV9lbmFibGVkIC8NCj4g KwkJCQkJKGZsb2F0KXdfdGltZV9ydW5uaW5nOw0KPiArCQlyZWFkcyArPSByLT5yZXR1cm5fdmFs dWUudmFsdWUgKiBvZl9tdWxfcmVhZCAqIFNDQUxFOw0KPiArCQl3cml0ZXMgKz0gdy0+cmV0dXJu X3ZhbHVlLnZhbHVlICogb2ZfbXVsX3dyaXRlICogU0NBTEU7DQo+ICsJfQ0KPiArDQo+ICsJZm9y IChpbWMgPSAwOyBpbWMgPCBpbWNzOyBpbWMrKykgew0KPiArCQljbG9zZShpbWNfY291bnRlcnNf Y29uZmlnW2ltY11bUkVBRF0uZmQpOw0KPiArCQljbG9zZShpbWNfY291bnRlcnNfY29uZmlnW2lt Y11bV1JJVEVdLmZkKTsNCj4gKwl9DQo+ICsNCj4gKwlpZiAoc3RyY21wKGJ3X3JlcG9ydCwgInJl YWRzIikgPT0gMCkNCj4gKwkJcmV0dXJuIHJlYWRzOw0KPiArDQo+ICsJaWYgKHN0cmNtcChid19y ZXBvcnQsICJ3cml0ZXMiKSA9PSAwKQ0KPiArCQlyZXR1cm4gd3JpdGVzOw0KPiArDQo+ICsJcmV0 dXJuIChyZWFkcyArIHdyaXRlcyk7DQo+ICt9DQo+ICsNCj4gK3ZvaWQgc2V0X21ibV9wYXRoKGNv bnN0IGNoYXIgKmN0cmxncnAsIGNvbnN0IGNoYXIgKm1vbmdycCwgY2hhciBzb2NrX251bSkNCj4g K3sNCj4gKwlpZiAoY3RybGdycCAmJiBtb25ncnApDQo+ICsJCXNwcmludGYobWJtX3RvdGFsX3Bh dGgsIENPTl9NT05fTUJNX0xPQ0FMX0JZVEVTX1BBVEgsDQo+ICsJCQlSRVNDVFJMX1BBVEgsIGN0 cmxncnAsIG1vbmdycCwgc29ja19udW0pOw0KPiArCWVsc2UgaWYgKCFjdHJsZ3JwICYmIG1vbmdy cCkNCj4gKwkJc3ByaW50ZihtYm1fdG90YWxfcGF0aCwgTU9OX01CTV9MT0NBTF9CWVRFU19QQVRI LCBSRVNDVFJMX1BBVEgsDQo+ICsJCQltb25ncnAsIHNvY2tfbnVtKTsNCj4gKwllbHNlIGlmIChj dHJsZ3JwICYmICFtb25ncnApDQo+ICsJCXNwcmludGYobWJtX3RvdGFsX3BhdGgsIENPTl9NQk1f TE9DQUxfQllURVNfUEFUSCwgUkVTQ1RSTF9QQVRILA0KPiArCQkJY3RybGdycCwgc29ja19udW0p Ow0KPiArCWVsc2UgaWYgKCFjdHJsZ3JwICYmICFtb25ncnApDQo+ICsJCXNwcmludGYobWJtX3Rv dGFsX3BhdGgsIE1CTV9MT0NBTF9CWVRFU19QQVRILCBSRVNDVFJMX1BBVEgsDQo+ICsJCQlzb2Nr X251bSk7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBpbml0aWFsaXplX21lbV9id19yZXNjdHJs OglBcHByb3ByaWF0ZWx5IHBvcHVsYXRlICJtYm1fdG90YWxfcGF0aCINCj4gKyAqIEBjdHJsZ3Jw OgkJCU5hbWUgb2YgdGhlIGNvbnRyb2wgbW9uaXRvciBncm91cCAoY29uX21vbiBncnApDQo+ICsg KiBAbW9uZ3JwOgkJCU5hbWUgb2YgdGhlIG1vbml0b3IgZ3JvdXAgKG1vbiBncnApDQo+ICsgKiBA Y3B1X25vOgkJCUNQVSBudW1iZXIgdGhhdCB0aGUgYmVuY2htYXJrIFBJRCBpcyBiaW5kZWQgdG8N Cj4gKyAqIEByZXNjdHJsX3ZhbDoJCVJlc2N0cmwgZmVhdHVyZSAoRWc6IG1ibSwgbWJhLi4gZXRj KQ0KPiArICovDQo+ICtzdGF0aWMgdm9pZCBpbml0aWFsaXplX21lbV9id19yZXNjdHJsKGNvbnN0 IGNoYXIgKmN0cmxncnAsIGNvbnN0IGNoYXIgKm1vbmdycCwNCj4gKwkJCQkgICAgICBpbnQgY3B1 X25vLCBjaGFyICpyZXNjdHJsX3ZhbCkNCj4gK3sNCj4gKwljaGFyIHNvY2tfbnVtOw0KPiArDQo+ ICsJc29ja19udW0gPSBnZXRfc29ja19udW0oY3B1X25vKTsNCj4gKwlpZiAoc29ja19udW0gPCAw KQ0KPiArCQlyZXR1cm47DQo+ICsNCj4gKwlpZiAoc3RyY21wKHJlc2N0cmxfdmFsLCAibWJtIikg PT0gMCkNCj4gKwkJc2V0X21ibV9wYXRoKGN0cmxncnAsIG1vbmdycCwgc29ja19udW0pOw0KPiAr DQo+ICsJaWYgKChzdHJjbXAocmVzY3RybF92YWwsICJtYmEiKSA9PSAwKSkgew0KPiArCQlpZiAo Y3RybGdycCkNCj4gKwkJCXNwcmludGYobWJtX3RvdGFsX3BhdGgsIENPTl9NQk1fTE9DQUxfQllU RVNfUEFUSCwNCj4gKwkJCQlSRVNDVFJMX1BBVEgsIGN0cmxncnAsIHNvY2tfbnVtKTsNCj4gKwkJ ZWxzZQ0KPiArCQkJc3ByaW50ZihtYm1fdG90YWxfcGF0aCwgTUJNX0xPQ0FMX0JZVEVTX1BBVEgs DQo+ICsJCQkJUkVTQ1RSTF9QQVRILCBzb2NrX251bSk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICsv Kg0KPiArICogR2V0IE1CTSBMb2NhbCBieXRlcyBhcyByZXBvcnRlZCBieSByZXNjdHJsIEZTDQo+ ICsgKiBGb3IgTUJNLA0KPiArICogMS4gSWYgY29uX21vbiBncnAgYW5kIG1vbiBncnAgYXJlIGdp dmVuLCB0aGVuIHJlYWQgZnJvbSBjb25fbW9uIGdycCdzIG1vbiBncnANCj4gKyAqIDIuIElmIG9u bHkgY29uX21vbiBncnAgaXMgZ2l2ZW4sIHRoZW4gcmVhZCBmcm9tIGNvbl9tb24gZ3JwDQo+ICsg KiAzLiBJZiBib3RoIGFyZSBub3QgZ2l2ZW4sIHRoZW4gcmVhZCBmcm9tIHJvb3QgY29uX21vbiBn cnANCj4gKyAqIEZvciBNQkEsDQo+ICsgKiAxLiBJZiBjb25fbW9uIGdycCBpcyBnaXZlbiwgdGhl biByZWFkIGZyb20gaXQNCj4gKyAqIDIuIElmIGNvbl9tb24gZ3JwIGlzIG5vdCBnaXZlbiwgdGhl biByZWFkIGZyb20gcm9vdCBjb25fbW9uIGdycA0KPiArICovDQo+ICtzdGF0aWMgdW5zaWduZWQg bG9uZyBnZXRfbWVtX2J3X3Jlc2N0cmwodm9pZCkNCj4gK3sNCj4gKwl1bnNpZ25lZCBsb25nIG1i bV90b3RhbCA9IDA7DQo+ICsJRklMRSAqZnA7DQo+ICsNCj4gKwlmcCA9IGZvcGVuKG1ibV90b3Rh bF9wYXRoLCAiciIpOw0KPiArCWlmICghZnApIHsNCj4gKwkJcGVycm9yKCJGYWlsZWQgdG8gb3Bl biB0b3RhbCBidyBmaWxlIik7DQo+ICsNCj4gKwkJcmV0dXJuIC0xOw0KPiArCX0NCj4gKwlpZiAo ZnNjYW5mKGZwLCAiJWx1IiwgJm1ibV90b3RhbCkgPD0gMCkgew0KPiArCQlwZXJyb3IoIkNvdWxk IG5vdCBnZXQgbWJtIGxvY2FsIGJ5dGVzIik7DQo+ICsJCWZjbG9zZShmcCk7DQo+ICsNCj4gKwkJ cmV0dXJuIC0xOw0KPiArCX0NCj4gKwlmY2xvc2UoZnApOw0KPiArDQo+ICsJcmV0dXJuIG1ibV90 b3RhbDsNCj4gK30NCj4gDQo=