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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,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 92276C433E6 for ; Tue, 19 Jan 2021 14:55:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 73B3B2312E for ; Tue, 19 Jan 2021 14:55:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391670AbhASOyu convert rfc822-to-8bit (ORCPT ); Tue, 19 Jan 2021 09:54:50 -0500 Received: from relay2-d.mail.gandi.net ([217.70.183.194]:59767 "EHLO relay2-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2392013AbhASL5Z (ORCPT ); Tue, 19 Jan 2021 06:57:25 -0500 X-Originating-IP: 86.201.233.230 Received: from xps13 (lfbn-tou-1-151-230.w86-201.abo.wanadoo.fr [86.201.233.230]) (Authenticated sender: miquel.raynal@bootlin.com) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id D9F244000C; Tue, 19 Jan 2021 11:56:35 +0000 (UTC) Date: Tue, 19 Jan 2021 12:56:34 +0100 From: Miquel Raynal To: Adam Ford Cc: Richard Weinberger , Vignesh Raghavendra , Tudor Ambarus , linux-mtd@lists.infradead.org, Julien Su , ycllin@mxic.com.tw, Thomas Petazzoni , Linux-OMAP Subject: Re: [PATCH 04/20] mtd: nand: ecc-bch: Stop exporting the private structure Message-ID: <20210119125634.6d4c5c1e@xps13> In-Reply-To: References: <20200929230124.31491-1-miquel.raynal@bootlin.com> <20200929230124.31491-5-miquel.raynal@bootlin.com> <20210111112027.7cbda0ba@xps13> <20210112153534.5ba93cde@xps13> <20210114164224.5d21c170@xps13> <20210115171736.1c837c29@xps13> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org Hi Adam, Thank you very much for troubleshooting this, here is my proposal. > > > I appear to have the NAND flash working with the following patch: > > > > > > @@ -247,11 +253,21 @@ int nand_ecc_sw_bch_init_ctx(struct nand_device *nand) > > > nand->ecc.ctx.priv = engine_conf; > > > nand->ecc.ctx.total = nsteps * code_size; > > > > > > + struct nand_chip *chip = mtd_to_nand(mtd); > > > + chip->ecc.steps = nsteps; > > > + chip->ecc.size = conf->step_size; I was fearing that many boards would be affected by this issue but it appears that the problem will only show up here because the OMAP driver makes a strange use of the BCH library: it initializes it itself because it only needs it for a single operation while usually, the core is in charge of doing that. During the initialization, the OOB layout is verified. Usually, the BCH driver is used with one of the generic OOB layouts, while here the OMAP driver uses its own, which reads raw NAND chip entries. I recently moved the BCH driver to only use "generic" NAND bits, which produced the bug because the entries derived by the layout helpers have not been updated yet. So using raw NAND bits in the BCH driver is not an option here. Instead, I think the best way to address this is to export the declaration of the BCH internal configuration structure to the OMAP driver and use the right values, recently derived by the driver: ---8<--- Author: Miquel Raynal Date: Tue Jan 19 12:27:07 2021 +0100 wip: fix omap Signed-off-by: Miquel Raynal diff --git a/drivers/mtd/nand/raw/omap2.c b/drivers/mtd/nand/raw/omap2.c index fbb9955f2467..2c3e65cb68f3 100644 --- a/drivers/mtd/nand/raw/omap2.c +++ b/drivers/mtd/nand/raw/omap2.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -1866,18 +1867,19 @@ static const struct mtd_ooblayout_ops omap_ooblayout_ops = { static int omap_sw_ooblayout_ecc(struct mtd_info *mtd, int section, struct mtd_oob_region *oobregion) { - struct nand_chip *chip = mtd_to_nand(mtd); + struct nand_device *nand = mtd_to_nanddev(mtd); + const struct nand_ecc_sw_bch_conf *engine_conf = nand->ecc.ctx.priv; int off = BADBLOCK_MARKER_LENGTH; - if (section >= chip->ecc.steps) + if (section >= engine_conf->nsteps) return -ERANGE; /* * When SW correction is employed, one OMAP specific marker byte is * reserved after each ECC step. */ - oobregion->offset = off + (section * (chip->ecc.bytes + 1)); - oobregion->length = chip->ecc.bytes; + oobregion->offset = off + (section * (engine_conf->code_size + 1)); + oobregion->length = engine_conf->code_size; return 0; } @@ -1885,7 +1887,8 @@ static int omap_sw_ooblayout_ecc(struct mtd_info *mtd, int section, static int omap_sw_ooblayout_free(struct mtd_info *mtd, int section, struct mtd_oob_region *oobregion) { - struct nand_chip *chip = mtd_to_nand(mtd); + struct nand_device *nand = mtd_to_nanddev(mtd); + const struct nand_ecc_sw_bch_conf *engine_conf = nand->ecc.ctx.priv; int off = BADBLOCK_MARKER_LENGTH; if (section) @@ -1895,7 +1898,7 @@ static int omap_sw_ooblayout_free(struct mtd_info *mtd, int section, * When SW correction is employed, one OMAP specific marker byte is * reserved after each ECC step. */ - off += ((chip->ecc.bytes + 1) * chip->ecc.steps); + off += ((engine_conf->code_size + 1) * engine_conf->nsteps); if (off >= mtd->oobsize) return -ERANGE; --->8--- Can you please try this patch and compare the values between your hack and mine of: - chip->ecc.bytes vs. engine_conf->code_size - chip->ecc.steps vs. engine_conf->nsteps The values should be the same, but I prefer to be sure. Thanks, Miquèl 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=-15.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,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 05FC5C433DB for ; Tue, 19 Jan 2021 11:57:57 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4E2DB23104 for ; Tue, 19 Jan 2021 11:57:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4E2DB23104 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Hh1qO2vUfSet4LskNwcGvrFGSuzUVuFZLx6AmP2sgZM=; b=rvV/89OM8fg17nKxfTIlw52Wi HhTqtSxmALLpxa0Mv82KBeO3lOA13UxnVI6cyn3W2j9csnY0/4SP6lMjEPSqi+zO8lcwQyWlDlqxm VgEFBUaerTYLqfMw8QSmkkzhQ93LqlBclWor7cxZwDhS8D32m/y3imsYMeG2HLK2YyysrkJit3W5C Q37jS0kSKLioYouuhDt5z+eztIGc+8+4hkJCAa3tNXcMGHGkAm+tWdojYZmPFl7qUYNxy3dCNEr6t 7UPOnyw4K8H8w3mUpa6/Qd0T+3W7ZBJCAbPgXFniI1gll8CFn4xRViLRIkkjud3EGWhYuyPKWjIM2 uhvyTFfhQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1pcs-0006Y7-AT; Tue, 19 Jan 2021 11:56:46 +0000 Received: from relay2-d.mail.gandi.net ([217.70.183.194]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1pcp-0006X3-IS for linux-mtd@lists.infradead.org; Tue, 19 Jan 2021 11:56:44 +0000 X-Originating-IP: 86.201.233.230 Received: from xps13 (lfbn-tou-1-151-230.w86-201.abo.wanadoo.fr [86.201.233.230]) (Authenticated sender: miquel.raynal@bootlin.com) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id D9F244000C; Tue, 19 Jan 2021 11:56:35 +0000 (UTC) Date: Tue, 19 Jan 2021 12:56:34 +0100 From: Miquel Raynal To: Adam Ford Subject: Re: [PATCH 04/20] mtd: nand: ecc-bch: Stop exporting the private structure Message-ID: <20210119125634.6d4c5c1e@xps13> In-Reply-To: References: <20200929230124.31491-1-miquel.raynal@bootlin.com> <20200929230124.31491-5-miquel.raynal@bootlin.com> <20210111112027.7cbda0ba@xps13> <20210112153534.5ba93cde@xps13> <20210114164224.5d21c170@xps13> <20210115171736.1c837c29@xps13> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210119_065643_831582_7CD568F9 X-CRM114-Status: GOOD ( 21.03 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vignesh Raghavendra , Tudor Ambarus , Julien Su , Richard Weinberger , ycllin@mxic.com.tw, linux-mtd@lists.infradead.org, Thomas Petazzoni , Linux-OMAP Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgQWRhbSwKClRoYW5rIHlvdSB2ZXJ5IG11Y2ggZm9yIHRyb3VibGVzaG9vdGluZyB0aGlzLCBo ZXJlIGlzIG15IHByb3Bvc2FsLgoKPiA+ID4gSSBhcHBlYXIgdG8gaGF2ZSB0aGUgTkFORCBmbGFz aCB3b3JraW5nIHdpdGggdGhlIGZvbGxvd2luZyBwYXRjaDoKPiA+ID4KPiA+ID4gQEAgLTI0Nywx MSArMjUzLDIxIEBAIGludCBuYW5kX2VjY19zd19iY2hfaW5pdF9jdHgoc3RydWN0IG5hbmRfZGV2 aWNlICpuYW5kKQo+ID4gPiAgICAgICAgIG5hbmQtPmVjYy5jdHgucHJpdiA9IGVuZ2luZV9jb25m Owo+ID4gPiAgICAgICAgIG5hbmQtPmVjYy5jdHgudG90YWwgPSBuc3RlcHMgKiBjb2RlX3NpemU7 Cj4gPiA+Cj4gPiA+ICsgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5k KG10ZCk7Cj4gPiA+ICsgICAgICAgY2hpcC0+ZWNjLnN0ZXBzID0gbnN0ZXBzOwo+ID4gPiArICAg ICAgIGNoaXAtPmVjYy5zaXplID0gIGNvbmYtPnN0ZXBfc2l6ZTsKCkkgd2FzIGZlYXJpbmcgdGhh dCBtYW55IGJvYXJkcyB3b3VsZCBiZSBhZmZlY3RlZCBieSB0aGlzIGlzc3VlIGJ1dCBpdAphcHBl YXJzIHRoYXQgdGhlIHByb2JsZW0gd2lsbCBvbmx5IHNob3cgdXAgaGVyZSBiZWNhdXNlIHRoZSBP TUFQIGRyaXZlcgptYWtlcyBhIHN0cmFuZ2UgdXNlIG9mIHRoZSBCQ0ggbGlicmFyeTogaXQgaW5p dGlhbGl6ZXMgaXQgaXRzZWxmCmJlY2F1c2UgaXQgb25seSBuZWVkcyBpdCBmb3IgYSBzaW5nbGUg b3BlcmF0aW9uIHdoaWxlIHVzdWFsbHksIHRoZSBjb3JlCmlzIGluIGNoYXJnZSBvZiBkb2luZyB0 aGF0LiBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCB0aGUgT09CIGxheW91dAppcyB2ZXJpZmll ZC4gVXN1YWxseSwgdGhlIEJDSCBkcml2ZXIgaXMgdXNlZCB3aXRoIG9uZSBvZiB0aGUgZ2VuZXJp YyBPT0IKbGF5b3V0cywgd2hpbGUgaGVyZSB0aGUgT01BUCBkcml2ZXIgdXNlcyBpdHMgb3duLCB3 aGljaCByZWFkcyByYXcgTkFORApjaGlwIGVudHJpZXMuCgpJIHJlY2VudGx5IG1vdmVkIHRoZSBC Q0ggZHJpdmVyIHRvIG9ubHkgdXNlICJnZW5lcmljIiBOQU5EIGJpdHMsIHdoaWNoCnByb2R1Y2Vk IHRoZSBidWcgYmVjYXVzZSB0aGUgZW50cmllcyBkZXJpdmVkIGJ5IHRoZSBsYXlvdXQgaGVscGVy cwpoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgeWV0LgoKU28gdXNpbmcgcmF3IE5BTkQgYml0cyBpbiB0 aGUgQkNIIGRyaXZlciBpcyBub3QgYW4gb3B0aW9uIGhlcmUuCkluc3RlYWQsIEkgdGhpbmsgdGhl IGJlc3Qgd2F5IHRvIGFkZHJlc3MgdGhpcyBpcyB0byBleHBvcnQgdGhlCmRlY2xhcmF0aW9uIG9m IHRoZSBCQ0ggaW50ZXJuYWwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgdG8gdGhlIE9NQVAKZHJp dmVyIGFuZCB1c2UgdGhlIHJpZ2h0IHZhbHVlcywgcmVjZW50bHkgZGVyaXZlZCBieSB0aGUgZHJp dmVyOgoKLS0tODwtLS0KCkF1dGhvcjogTWlxdWVsIFJheW5hbCA8bWlxdWVsLnJheW5hbEBib290 bGluLmNvbT4KRGF0ZTogICBUdWUgSmFuIDE5IDEyOjI3OjA3IDIwMjEgKzAxMDAKCiAgICB3aXA6 IGZpeCBvbWFwCiAgICAKICAgIFNpZ25lZC1vZmYtYnk6IE1pcXVlbCBSYXluYWwgPG1pcXVlbC5y YXluYWxAYm9vdGxpbi5jb20+CgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvb21h cDIuYyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L29tYXAyLmMKaW5kZXggZmJiOTk1NWYyNDY3Li4y YzNlNjVjYjY4ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L29tYXAyLmMKKysr IGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvb21hcDIuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1 ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUg PGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC1lY2Mtc3ctYmNoLmg+ CiAjaW5jbHVkZSA8bGludXgvbXRkL3Jhd25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFy dGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L29tYXAtZG1hLmg+CkBAIC0xODY2LDE4ICsxODY3 LDE5IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgb21hcF9vb2JsYXlv dXRfb3BzID0gewogc3RhdGljIGludCBvbWFwX3N3X29vYmxheW91dF9lY2Moc3RydWN0IG10ZF9p bmZvICptdGQsIGludCBzZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYnJlZ2lvbikKIHsKLSAgICAgICBzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsKKyAgICAgICBzdHJ1Y3QgbmFuZF9kZXZpY2Ug Km5hbmQgPSBtdGRfdG9fbmFuZGRldihtdGQpOworICAgICAgIGNvbnN0IHN0cnVjdCBuYW5kX2Vj Y19zd19iY2hfY29uZiAqZW5naW5lX2NvbmYgPSBuYW5kLT5lY2MuY3R4LnByaXY7CiAgICAgICAg aW50IG9mZiA9IEJBREJMT0NLX01BUktFUl9MRU5HVEg7CiAKLSAgICAgICBpZiAoc2VjdGlvbiA+ PSBjaGlwLT5lY2Muc3RlcHMpCisgICAgICAgaWYgKHNlY3Rpb24gPj0gZW5naW5lX2NvbmYtPm5z dGVwcykKICAgICAgICAgICAgICAgIHJldHVybiAtRVJBTkdFOwogCiAgICAgICAgLyoKICAgICAg ICAgKiBXaGVuIFNXIGNvcnJlY3Rpb24gaXMgZW1wbG95ZWQsIG9uZSBPTUFQIHNwZWNpZmljIG1h cmtlciBieXRlIGlzCiAgICAgICAgICogcmVzZXJ2ZWQgYWZ0ZXIgZWFjaCBFQ0Mgc3RlcC4KICAg ICAgICAgKi8KLSAgICAgICBvb2JyZWdpb24tPm9mZnNldCA9IG9mZiArIChzZWN0aW9uICogKGNo aXAtPmVjYy5ieXRlcyArIDEpKTsKLSAgICAgICBvb2JyZWdpb24tPmxlbmd0aCA9IGNoaXAtPmVj Yy5ieXRlczsKKyAgICAgICBvb2JyZWdpb24tPm9mZnNldCA9IG9mZiArIChzZWN0aW9uICogKGVu Z2luZV9jb25mLT5jb2RlX3NpemUgKyAxKSk7CisgICAgICAgb29icmVnaW9uLT5sZW5ndGggPSBl bmdpbmVfY29uZi0+Y29kZV9zaXplOwogCiAgICAgICAgcmV0dXJuIDA7CiB9CkBAIC0xODg1LDcg KzE4ODcsOCBAQCBzdGF0aWMgaW50IG9tYXBfc3dfb29ibGF5b3V0X2VjYyhzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCwgaW50IHNlY3Rpb24sCiBzdGF0aWMgaW50IG9tYXBfc3dfb29ibGF5b3V0X2ZyZWUo c3RydWN0IG10ZF9pbmZvICptdGQsIGludCBzZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IG10ZF9vb2JfcmVnaW9uICpvb2JyZWdpb24pCiB7Ci0gICAgICAg c3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5kKG10ZCk7CisgICAgICAgc3RydWN0 IG5hbmRfZGV2aWNlICpuYW5kID0gbXRkX3RvX25hbmRkZXYobXRkKTsKKyAgICAgICBjb25zdCBz dHJ1Y3QgbmFuZF9lY2Nfc3dfYmNoX2NvbmYgKmVuZ2luZV9jb25mID0gbmFuZC0+ZWNjLmN0eC5w cml2OwogICAgICAgIGludCBvZmYgPSBCQURCTE9DS19NQVJLRVJfTEVOR1RIOwogCiAgICAgICAg aWYgKHNlY3Rpb24pCkBAIC0xODk1LDcgKzE4OTgsNyBAQCBzdGF0aWMgaW50IG9tYXBfc3dfb29i bGF5b3V0X2ZyZWUoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBzZWN0aW9uLAogICAgICAgICAq IFdoZW4gU1cgY29ycmVjdGlvbiBpcyBlbXBsb3llZCwgb25lIE9NQVAgc3BlY2lmaWMgbWFya2Vy IGJ5dGUgaXMKICAgICAgICAgKiByZXNlcnZlZCBhZnRlciBlYWNoIEVDQyBzdGVwLgogICAgICAg ICAqLwotICAgICAgIG9mZiArPSAoKGNoaXAtPmVjYy5ieXRlcyArIDEpICogY2hpcC0+ZWNjLnN0 ZXBzKTsKKyAgICAgICBvZmYgKz0gKChlbmdpbmVfY29uZi0+Y29kZV9zaXplICsgMSkgKiBlbmdp bmVfY29uZi0+bnN0ZXBzKTsKICAgICAgICBpZiAob2ZmID49IG10ZC0+b29ic2l6ZSkKICAgICAg ICAgICAgICAgIHJldHVybiAtRVJBTkdFOwogCi0tLT44LS0tCgpDYW4geW91IHBsZWFzZSB0cnkg dGhpcyBwYXRjaCBhbmQgY29tcGFyZSB0aGUgdmFsdWVzIGJldHdlZW4geW91ciBoYWNrCmFuZCBt aW5lIG9mOgotIGNoaXAtPmVjYy5ieXRlcyB2cy4gZW5naW5lX2NvbmYtPmNvZGVfc2l6ZQotIGNo aXAtPmVjYy5zdGVwcyB2cy4gZW5naW5lX2NvbmYtPm5zdGVwcwpUaGUgdmFsdWVzIHNob3VsZCBi ZSB0aGUgc2FtZSwgYnV0IEkgcHJlZmVyIHRvIGJlIHN1cmUuCgpUaGFua3MsCk1pcXXDqGwKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51 eCBNVEQgZGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1tdGQvCg==