From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 354D4C6FD1C for ; Thu, 9 Mar 2023 01:50:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229732AbjCIBuN (ORCPT ); Wed, 8 Mar 2023 20:50:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35706 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229692AbjCIBuM (ORCPT ); Wed, 8 Mar 2023 20:50:12 -0500 Received: from mg.richtek.com (mg.richtek.com [220.130.44.152]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 6767D8537E; Wed, 8 Mar 2023 17:50:03 -0800 (PST) X-MailGates: (flag:4,DYNAMIC,BADHELO,RELAY,NOHOST:PASS)(compute_score:DE LIVER,40,3) Received: from 192.168.10.46 by mg.richtek.com with MailGates ESMTP Server V5.0(20041:0:AUTH_RELAY) (envelope-from ); Thu, 09 Mar 2023 09:49:28 +0800 (CST) Received: from ex3.rt.l (192.168.10.46) by ex3.rt.l (192.168.10.46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.25; Thu, 9 Mar 2023 09:49:27 +0800 Received: from linuxcarl2.richtek.com (192.168.10.154) by ex3.rt.l (192.168.10.45) with Microsoft SMTP Server id 15.2.1118.25 via Frontend Transport; Thu, 9 Mar 2023 09:49:27 +0800 Date: Thu, 9 Mar 2023 09:49:27 +0800 From: ChiYuan Huang To: Lee Jones CC: ChiaEn Wu , , , , , , , , , , , , , Subject: Re: [PATCH v17 RESEND 2/3] leds: flash: mt6370: Add MediaTek MT6370 flashlight support Message-ID: <20230309014927.GA12537@linuxcarl2.richtek.com> References: <20230305100608.GD2574592@google.com> <20230307034433.GA10739@linuxcarl2.richtek.com> <20230308135433.GL9667@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230308135433.GL9667@google.com> User-Agent: Mutt/1.5.21 (2010-09-15) Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org On Wed, Mar 08, 2023 at 01:54:33PM +0000, Lee Jones wrote: Hi, Lee: > On Tue, 07 Mar 2023, ChiYuan Huang wrote: > > > Hi, Lee: > > Reply below the comments. > > > > On Sun, Mar 05, 2023 at 10:06:08AM +0000, Lee Jones wrote: > > > On Thu, 23 Feb 2023, ChiaEn Wu wrote: > > > > > > > From: ChiYuan Huang > > > > > > > > The MediaTek MT6370 is a highly-integrated smart power management IC, > > > > which includes a single cell Li-Ion/Li-Polymer switching battery > > > > charger, a USB Type-C & Power Delivery (PD) controller, dual Flash > > > > LED current sources, a RGB LED driver, a backlight WLED driver, > > > > a display bias driver and a general LDO for portable devices. > > > > > > > > Add support for the MT6370 Flash LED driver. Flash LED in MT6370 > > > > has 2 channels and support torch/strobe mode. > > > > > > > > Acked-by: Jacek Anaszewski > > > > Co-developed-by: Alice Chen > > > > Signed-off-by: Alice Chen > > > > Signed-off-by: ChiYuan Huang > > > > Signed-off-by: ChiaEn Wu > > > > --- > > > > v17 > > > > - Update the year of Copyright from 2022 to 2023 > > > > > > > > --- > > > > drivers/leds/flash/Kconfig | 13 + > > > > drivers/leds/flash/Makefile | 1 + > > > > drivers/leds/flash/leds-mt6370-flash.c | 596 +++++++++++++++++++++++++++++++++ > > > > 3 files changed, 610 insertions(+) > > > > create mode 100644 drivers/leds/flash/leds-mt6370-flash.c > > [...] > > > > > +static int _mt6370_flash_brightness_set(struct led_classdev_flash *fl_cdev, > > > > + u32 brightness) > > > > +{ > > > > + struct mt6370_led *led = to_mt6370_led(fl_cdev, flash); > > > > + struct mt6370_priv *priv = led->priv; > > > > + struct led_flash_setting *setting = &fl_cdev->brightness; > > > > + u32 val = (brightness - setting->min) / setting->step; > > > > + int ret, i; > > > > + > > > > + if (led->led_no == MT6370_LED_JOINT) { > > > > > > What is a "JOINT"? > > > > > Since MT6370 has two flash led channels. Per channel can drive the current up to 1.5A. > > 'JOINT' case is used if 1.5A driving current is not enough, like as flash current 2A. > > They can use two channels to drive 'one' flash led by the HW application. > > This will make the driving current larger than the capability of one channel. > > Is "joint" the term used in the datasheet? > Nope, this term is not clearly defined in the datasheet. but this kind of HW application is allowed. > Please make this definition clear in the code. > > If I'm asking, others are likely to too. > Thanks, I'll add more comments to clearly describe what the 'JOINT' code did. > [...] > > > > > +static int mt6370_init_flash_properties(struct device *dev, > > > > + struct mt6370_led *led, > > > > + struct fwnode_handle *fwnode) > > > > +{ > > > > + struct led_classdev_flash *flash = &led->flash; > > > > + struct led_classdev *lcdev = &flash->led_cdev; > > > > + struct mt6370_priv *priv = led->priv; > > > > + struct led_flash_setting *s; > > > > + u32 sources[MT6370_MAX_LEDS]; > > > > + u32 max_ua, val; > > > > + int i, ret, num; > > > > + > > > > + num = fwnode_property_count_u32(fwnode, "led-sources"); > > > > + if (num < 1) > > > > + return dev_err_probe(dev, -EINVAL, > > > > + "Not specified or wrong number of led-sources\n"); > > > > + > > > > + ret = fwnode_property_read_u32_array(fwnode, "led-sources", sources, num); > > > > + if (ret) > > > > + return ret; > > > > + > > > > + for (i = 0; i < num; i++) { > > > > + if (sources[i] >= MT6370_MAX_LEDS) > > > > + return -EINVAL; > > > > + if (priv->leds_active & BIT(sources[i])) > > > > + return -EINVAL; > > > > + priv->leds_active |= BIT(sources[i]); > > > > + } > > > > + > > > > + led->led_no = num == 2 ? MT6370_LED_JOINT : sources[0]; > > > > + > > > > + max_ua = num == 2 ? MT6370_ITORCH_DOUBLE_MAX_uA : MT6370_ITORCH_MAX_uA; > > > > + val = MT6370_ITORCH_MIN_uA; > > > > > > In what scenario does this not get overwritten? > > > > > Only if the property is missing. This will make the value keep in minimum. > > If the property is missing, fwnode_property_read_u32() returns an errno, no? > > If that's the case, val will be over-written in the if() clause? > In this funciton, three properties needs to be paresed from DT. Each one need to clamp the value. There're two ways to write the code. [Option 1] ret = fwnode_property_read_u32(...) if (ret) val = MIM_uA; val = mt6370_clamp(val, MIN, MAX); [Option 2] val = MIN_uA; if (!ret) val = mt6370_clamp(val, MIN, MAX); >From the above, the sencond one can save more LOC, no? But it seems the first one is more preferable by you, right? > -- > Lee Jones [李琼斯] From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 59C62C64EC4 for ; Thu, 9 Mar 2023 01:51:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:CC: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=/OHba4i3t/sqx30I5USb/TFCIU30gZz3cOhZd0hmE3Y=; b=MysfPFY74T68t/ W/O5Obp42PKlMjNg67p/QKrY3Ba2zqJSEHkrzQn5fCMP3YKy0uulaTiREkTqcl/ldgiCumJ+1rQ9w 0+2tU+Ska8N3WdRGX5L+Kek8YKPUwTzzTtZCsr+bTjnVvc0+v0rWkSwjHigZXkj6bqiUnLfPDHS1f AoEnf81A1+D+PvBTEdZU1swwAV0IacmFAJWMLc6z8G5GdUU/pmmvIH0gf5KR9gGhpHNT81ExNt0T9 yW0SmCY+wIpMT4qd+bi9QS+JYd38N6tSekGnhG/+YXUG7Uk3oIyc0FCGwLc7OQRtZ5PasimKO7njD np4heiogpo8qFa9EGFlA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pa5QL-007SSr-7Q; Thu, 09 Mar 2023 01:50:29 +0000 Received: from mg.richtek.com ([220.130.44.152]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pa5QF-007SQL-PQ; Thu, 09 Mar 2023 01:50:26 +0000 X-MailGates: (flag:4,DYNAMIC,BADHELO,RELAY,NOHOST:PASS)(compute_score:DE LIVER,40,3) Received: from 192.168.10.46 by mg.richtek.com with MailGates ESMTP Server V5.0(20041:0:AUTH_RELAY) (envelope-from ); Thu, 09 Mar 2023 09:49:28 +0800 (CST) Received: from ex3.rt.l (192.168.10.46) by ex3.rt.l (192.168.10.46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.25; Thu, 9 Mar 2023 09:49:27 +0800 Received: from linuxcarl2.richtek.com (192.168.10.154) by ex3.rt.l (192.168.10.45) with Microsoft SMTP Server id 15.2.1118.25 via Frontend Transport; Thu, 9 Mar 2023 09:49:27 +0800 Date: Thu, 9 Mar 2023 09:49:27 +0800 From: ChiYuan Huang To: Lee Jones CC: ChiaEn Wu , , , , , , , , , , , , , Subject: Re: [PATCH v17 RESEND 2/3] leds: flash: mt6370: Add MediaTek MT6370 flashlight support Message-ID: <20230309014927.GA12537@linuxcarl2.richtek.com> References: <20230305100608.GD2574592@google.com> <20230307034433.GA10739@linuxcarl2.richtek.com> <20230308135433.GL9667@google.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20230308135433.GL9667@google.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230308_175024_279175_8EF1A93D X-CRM114-Status: GOOD ( 35.30 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBNYXIgMDgsIDIwMjMgYXQgMDE6NTQ6MzNQTSArMDAwMCwgTGVlIEpvbmVzIHdyb3Rl OgpIaSwgTGVlOgo+IE9uIFR1ZSwgMDcgTWFyIDIwMjMsIENoaVl1YW4gSHVhbmcgd3JvdGU6Cj4g Cj4gPiBIaSwgTGVlOgo+ID4gICAgUmVwbHkgYmVsb3cgdGhlIGNvbW1lbnRzLgo+ID4KPiA+IE9u IFN1biwgTWFyIDA1LCAyMDIzIGF0IDEwOjA2OjA4QU0gKzAwMDAsIExlZSBKb25lcyB3cm90ZToK PiA+ID4gT24gVGh1LCAyMyBGZWIgMjAyMywgQ2hpYUVuIFd1IHdyb3RlOgo+ID4gPgo+ID4gPiA+ IEZyb206IENoaVl1YW4gSHVhbmcgPGN5X2h1YW5nQHJpY2h0ZWsuY29tPgo+ID4gPiA+Cj4gPiA+ ID4gVGhlIE1lZGlhVGVrIE1UNjM3MCBpcyBhIGhpZ2hseS1pbnRlZ3JhdGVkIHNtYXJ0IHBvd2Vy IG1hbmFnZW1lbnQgSUMsCj4gPiA+ID4gd2hpY2ggaW5jbHVkZXMgYSBzaW5nbGUgY2VsbCBMaS1J b24vTGktUG9seW1lciBzd2l0Y2hpbmcgYmF0dGVyeQo+ID4gPiA+IGNoYXJnZXIsIGEgVVNCIFR5 cGUtQyAmIFBvd2VyIERlbGl2ZXJ5IChQRCkgY29udHJvbGxlciwgZHVhbCBGbGFzaAo+ID4gPiA+ IExFRCBjdXJyZW50IHNvdXJjZXMsIGEgUkdCIExFRCBkcml2ZXIsIGEgYmFja2xpZ2h0IFdMRUQg ZHJpdmVyLAo+ID4gPiA+IGEgZGlzcGxheSBiaWFzIGRyaXZlciBhbmQgYSBnZW5lcmFsIExETyBm b3IgcG9ydGFibGUgZGV2aWNlcy4KPiA+ID4gPgo+ID4gPiA+IEFkZCBzdXBwb3J0IGZvciB0aGUg TVQ2MzcwIEZsYXNoIExFRCBkcml2ZXIuIEZsYXNoIExFRCBpbiBNVDYzNzAKPiA+ID4gPiBoYXMg MiBjaGFubmVscyBhbmQgc3VwcG9ydCB0b3JjaC9zdHJvYmUgbW9kZS4KPiA+ID4gPgo+ID4gPiA+ IEFja2VkLWJ5OiBKYWNlayBBbmFzemV3c2tpIDxqYWNlay5hbmFzemV3c2tpQGdtYWlsLmNvbT4K PiA+ID4gPiBDby1kZXZlbG9wZWQtYnk6IEFsaWNlIENoZW4gPGFsaWNlX2NoZW5AcmljaHRlay5j b20+Cj4gPiA+ID4gU2lnbmVkLW9mZi1ieTogQWxpY2UgQ2hlbiA8YWxpY2VfY2hlbkByaWNodGVr LmNvbT4KPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBDaGlZdWFuIEh1YW5nIDxjeV9odWFuZ0ByaWNo dGVrLmNvbT4KPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBDaGlhRW4gV3UgPGNoaWFlbl93dUByaWNo dGVrLmNvbT4KPiA+ID4gPiAtLS0KPiA+ID4gPiB2MTcKPiA+ID4gPiAtIFVwZGF0ZSB0aGUgeWVh ciBvZiBDb3B5cmlnaHQgZnJvbSAyMDIyIHRvIDIwMjMKPiA+ID4gPgo+ID4gPiA+IC0tLQo+ID4g PiA+ICBkcml2ZXJzL2xlZHMvZmxhc2gvS2NvbmZpZyAgICAgICAgICAgICB8ICAxMyArCj4gPiA+ ID4gIGRyaXZlcnMvbGVkcy9mbGFzaC9NYWtlZmlsZSAgICAgICAgICAgIHwgICAxICsKPiA+ID4g PiAgZHJpdmVycy9sZWRzL2ZsYXNoL2xlZHMtbXQ2MzcwLWZsYXNoLmMgfCA1OTYgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCj4gPiA+ID4gIDMgZmlsZXMgY2hhbmdlZCwgNjEwIGlu c2VydGlvbnMoKykKPiA+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbGVkcy9mbGFz aC9sZWRzLW10NjM3MC1mbGFzaC5jCj4gCj4gWy4uLl0KPiAKPiA+ID4gPiArc3RhdGljIGludCBf bXQ2MzcwX2ZsYXNoX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZs X2NkZXYsCj4gPiA+ID4gKwkJCQkJdTMyIGJyaWdodG5lc3MpCj4gPiA+ID4gK3sKPiA+ID4gPiAr CXN0cnVjdCBtdDYzNzBfbGVkICpsZWQgPSB0b19tdDYzNzBfbGVkKGZsX2NkZXYsIGZsYXNoKTsK PiA+ID4gPiArCXN0cnVjdCBtdDYzNzBfcHJpdiAqcHJpdiA9IGxlZC0+cHJpdjsKPiA+ID4gPiAr CXN0cnVjdCBsZWRfZmxhc2hfc2V0dGluZyAqc2V0dGluZyA9ICZmbF9jZGV2LT5icmlnaHRuZXNz Owo+ID4gPiA+ICsJdTMyIHZhbCA9IChicmlnaHRuZXNzIC0gc2V0dGluZy0+bWluKSAvIHNldHRp bmctPnN0ZXA7Cj4gPiA+ID4gKwlpbnQgcmV0LCBpOwo+ID4gPiA+ICsKPiA+ID4gPiArCWlmIChs ZWQtPmxlZF9ubyA9PSBNVDYzNzBfTEVEX0pPSU5UKSB7Cj4gPiA+Cj4gPiA+IFdoYXQgaXMgYSAi Sk9JTlQiPwo+ID4gPgo+ID4gU2luY2UgTVQ2MzcwIGhhcyB0d28gZmxhc2ggbGVkIGNoYW5uZWxz LiBQZXIgY2hhbm5lbCBjYW4gZHJpdmUgdGhlIGN1cnJlbnQgdXAgdG8gMS41QS4KPiA+ICdKT0lO VCcgY2FzZSBpcyB1c2VkIGlmIDEuNUEgZHJpdmluZyBjdXJyZW50IGlzIG5vdCBlbm91Z2gsIGxp a2UgYXMgZmxhc2ggY3VycmVudCAyQS4KPiA+IFRoZXkgY2FuIHVzZSB0d28gY2hhbm5lbHMgdG8g ZHJpdmUgJ29uZScgZmxhc2ggbGVkIGJ5IHRoZSBIVyBhcHBsaWNhdGlvbi4KPiA+IFRoaXMgd2ls bCBtYWtlIHRoZSBkcml2aW5nIGN1cnJlbnQgbGFyZ2VyIHRoYW4gdGhlIGNhcGFiaWxpdHkgb2Yg b25lIGNoYW5uZWwuCj4gCj4gSXMgImpvaW50IiB0aGUgdGVybSB1c2VkIGluIHRoZSBkYXRhc2hl ZXQ/Cj4KTm9wZSwgdGhpcyB0ZXJtIGlzIG5vdCBjbGVhcmx5IGRlZmluZWQgaW4gdGhlIGRhdGFz aGVldC4gYnV0IHRoaXMga2luZCBvZiBIVyBhcHBsaWNhdGlvbiBpcwphbGxvd2VkLiAKPiBQbGVh c2UgbWFrZSB0aGlzIGRlZmluaXRpb24gY2xlYXIgaW4gdGhlIGNvZGUuCj4gCj4gSWYgSSdtIGFz a2luZywgb3RoZXJzIGFyZSBsaWtlbHkgdG8gdG9vLgo+IApUaGFua3MsIEknbGwgYWRkIG1vcmUg Y29tbWVudHMgdG8gY2xlYXJseSBkZXNjcmliZSB3aGF0IHRoZSAnSk9JTlQnIGNvZGUgZGlkLgo+ IFsuLi5dCj4gCj4gPiA+ID4gK3N0YXRpYyBpbnQgbXQ2MzcwX2luaXRfZmxhc2hfcHJvcGVydGll cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiA+ID4gKwkJCQkJc3RydWN0IG10NjM3MF9sZWQgKmxl ZCwKPiA+ID4gPiArCQkJCQlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKQo+ID4gPiA+ICt7 Cj4gPiA+ID4gKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmbGFzaCA9ICZsZWQtPmZsYXNo Owo+ID4gPiA+ICsJc3RydWN0IGxlZF9jbGFzc2RldiAqbGNkZXYgPSAmZmxhc2gtPmxlZF9jZGV2 Owo+ID4gPiA+ICsJc3RydWN0IG10NjM3MF9wcml2ICpwcml2ID0gbGVkLT5wcml2Owo+ID4gPiA+ ICsJc3RydWN0IGxlZF9mbGFzaF9zZXR0aW5nICpzOwo+ID4gPiA+ICsJdTMyIHNvdXJjZXNbTVQ2 MzcwX01BWF9MRURTXTsKPiA+ID4gPiArCXUzMiBtYXhfdWEsIHZhbDsKPiA+ID4gPiArCWludCBp LCByZXQsIG51bTsKPiA+ID4gPiArCj4gPiA+ID4gKwludW0gPSBmd25vZGVfcHJvcGVydHlfY291 bnRfdTMyKGZ3bm9kZSwgImxlZC1zb3VyY2VzIik7Cj4gPiA+ID4gKwlpZiAobnVtIDwgMSkKPiA+ ID4gPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FSU5WQUwsCj4gPiA+ID4gKwkJCQkg ICAgICJOb3Qgc3BlY2lmaWVkIG9yIHdyb25nIG51bWJlciBvZiBsZWQtc291cmNlc1xuIik7Cj4g PiA+ID4gKwo+ID4gPiA+ICsJcmV0ID0gZndub2RlX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGZ3 bm9kZSwgImxlZC1zb3VyY2VzIiwgc291cmNlcywgbnVtKTsKPiA+ID4gPiArCWlmIChyZXQpCj4g PiA+ID4gKwkJcmV0dXJuIHJldDsKPiA+ID4gPiArCj4gPiA+ID4gKwlmb3IgKGkgPSAwOyBpIDwg bnVtOyBpKyspIHsKPiA+ID4gPiArCQlpZiAoc291cmNlc1tpXSA+PSBNVDYzNzBfTUFYX0xFRFMp Cj4gPiA+ID4gKwkJCXJldHVybiAtRUlOVkFMOwo+ID4gPiA+ICsJCWlmIChwcml2LT5sZWRzX2Fj dGl2ZSAmIEJJVChzb3VyY2VzW2ldKSkKPiA+ID4gPiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ ID4gKwkJcHJpdi0+bGVkc19hY3RpdmUgfD0gQklUKHNvdXJjZXNbaV0pOwo+ID4gPiA+ICsJfQo+ ID4gPiA+ICsKPiA+ID4gPiArCWxlZC0+bGVkX25vID0gbnVtID09IDIgPyBNVDYzNzBfTEVEX0pP SU5UIDogc291cmNlc1swXTsKPiA+ID4gPiArCj4gPiA+ID4gKwltYXhfdWEgPSBudW0gPT0gMiA/ IE1UNjM3MF9JVE9SQ0hfRE9VQkxFX01BWF91QSA6IE1UNjM3MF9JVE9SQ0hfTUFYX3VBOwo+ID4g PiA+ICsJdmFsID0gTVQ2MzcwX0lUT1JDSF9NSU5fdUE7Cj4gPiA+Cj4gPiA+IEluIHdoYXQgc2Nl bmFyaW8gZG9lcyB0aGlzIG5vdCBnZXQgb3ZlcndyaXR0ZW4/Cj4gPiA+Cj4gPiBPbmx5IGlmIHRo ZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLiBUaGlzIHdpbGwgbWFrZSB0aGUgdmFsdWUga2VlcCBpbiBt aW5pbXVtLgo+IAo+IElmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBmd25vZGVfcHJvcGVydHlf cmVhZF91MzIoKSByZXR1cm5zIGFuIGVycm5vLCBubz8KPiAKPiBJZiB0aGF0J3MgdGhlIGNhc2Us IHZhbCB3aWxsIGJlIG92ZXItd3JpdHRlbiBpbiB0aGUgaWYoKSBjbGF1c2U/Cj4gCkluIHRoaXMg ZnVuY2l0b24sIHRocmVlIHByb3BlcnRpZXMgbmVlZHMgdG8gYmUgcGFyZXNlZCBmcm9tIERULiBF YWNoIG9uZSBuZWVkIHRvIGNsYW1wIHRoZSB2YWx1ZS4KVGhlcmUncmUgdHdvIHdheXMgdG8gd3Jp dGUgdGhlIGNvZGUuCgpbT3B0aW9uIDFdCnJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMigu Li4pCmlmIChyZXQpCiAgICB2YWwgPSBNSU1fdUE7Cgp2YWwgPSBtdDYzNzBfY2xhbXAodmFsLCBN SU4sIE1BWCk7CgpbT3B0aW9uIDJdCnZhbCA9IE1JTl91QTsKaWYgKCFyZXQpCiAgICB2YWwgPSBt dDYzNzBfY2xhbXAodmFsLCBNSU4sIE1BWCk7CgoKRnJvbSB0aGUgYWJvdmUsIHRoZSBzZW5jb25k IG9uZSBjYW4gc2F2ZSBtb3JlIExPQywgbm8/CkJ1dCBpdCBzZWVtcyB0aGUgZmlyc3Qgb25lIGlz IG1vcmUgcHJlZmVyYWJsZSBieSB5b3UsIHJpZ2h0Pwo+IC0tCj4gTGVlIEpvbmVzIFvmnY7nkLzm lq9dCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1h cm0ta2VybmVsCg==