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 CEC9BC433F5 for ; Mon, 3 Oct 2022 00:06:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229479AbiJCAG0 (ORCPT ); Sun, 2 Oct 2022 20:06:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41170 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229470AbiJCAGZ (ORCPT ); Sun, 2 Oct 2022 20:06:25 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 624A536DF3 for ; Sun, 2 Oct 2022 17:06:24 -0700 (PDT) Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 304FA8B8; Mon, 3 Oct 2022 02:06:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1664755582; bh=Q2OLvRxaTex/nZYjssOAlRaKsw2guN6fKXvLB/8YKj0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=k4aHTiJKvC53u9A5JoQVPLD8t0agwJlMdcM35fivnB3WcxVRri3p4JWILxCN6//zB d98PuNhEaT07gOpeNSP4im9bS4rlAlcyJptiih/jmNyfm3X2fp6bUOfhdHoRl+Xyfd YZSaZl5ZfXEsgmSRG9YaGqG8T2RLRxqGd/7r16EY= Date: Mon, 3 Oct 2022 03:06:20 +0300 From: Laurent Pinchart To: Quanyang Wang Cc: Maxime Ripard , Stephen Boyd , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Michal Simek , Rajan Vaja Subject: Re: [PATCH] clk: zynqmp: pll: Fix divider calculation to avoid out-of-range rate Message-ID: References: <20220928201656.30318-1-laurent.pinchart@ideasonboard.com> <11481209-7c8f-7543-1e04-5723ffc2ccd4@windriver.com> <20221001000503.23268C433D6@smtp.kernel.org> <20221001104001.r7r2utwymm32tv53@houat> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org Hello, On Sun, Oct 02, 2022 at 10:17:24AM +0800, Quanyang Wang wrote: > On 10/1/22 18:40, Maxime Ripard wrote: > > On Fri, Sep 30, 2022 at 05:05:01PM -0700, Stephen Boyd wrote: > >> +Maxime > >> > >> Quoting Quanyang Wang (2022-09-28 18:05:10) > >>> Hi Laurent, > >>> > >>> I have sent a patch as below to fix this issue which set rate failed and > >>> it's in linux-next repo now. > >>> > >>> https://lore.kernel.org/linux-arm-kernel/20220826142030.213805-1-quanyang.wang@windriver.com/T/ > >>> > > > > It looks to me that the fundamental issue is that, in some situations, > > the round_rate implementation can return a rate outside of the > > boundaries enforced on a clock. > > In my limited view, the round_rate callbacks should return a rate within > boundaries as output, but can take a rate outside of boundaries as input. > > Take Xilinx Zynqmp for instance, VPLL's rate range is 1.5GHz~3GHz. A > consumer dp_video_ref wants a 200MHz rate, its request walks upward > through multiplexers and dividers then reaches to VPLL, VPLL receives > this 200MHz request and call zynqmp_pll_round_rate to "round" this > out-of-range rate 200MHz to 1600MHz via multiplying by 8. I don't think that's the right way to look at it. Making the VPLL driver multiply the requested 200MHz rate by 8 assumes that it knows that the next block in the clock tree is a divider capable of dividing by 8. That's not something the VPLL driver should know about. The next block may be able to divide by 10 and up only, which means that the VPLL should then be configured to output 2000 MHz. The problem that needs to be solved is to find a global optimal configuration for cascaded PLLs and dividers. > zynqmp_pll_round_rate returns 1600MHz and clk subsystem will call > determine callbacks to configure dividers correctly to make sure that > dp_video_ref can get an exact rate 200MHz. > > But the commit 948fb0969eae8 ("clk: Always clamp the rounded rate") adds > > req->rate = clamp(req->rate, req->min_rate, req->max_rate); > > before > > rate = core->ops->round_rate(core->hw, req->rate,&req->best_parent_rate); > > This results that .round_rate callbacks lose functionality since they > have no chance to pick up a precise rate but only a boundary rate. > Still for Xilinx Zynqmp, the 200MHz rate request to PLL will be set to > 1500MHz by clamp function and then zynqmp_pll_round_rate does nothing, > dp_video_ref will finally receive a rate which is 1500MHz/8 = 187.5MHz. > The rate gap (200MHz-187.5MHz) happens. > > There is no doubt that round_rate should return a valid rate as output. > But is it necessary that forces the input of round_rate callbacks to be > within boundaries? > > > I think that's the current behaviour (that was there prior to my > > patches) to reject any rate outside of the boundaries in > > clk_calc_new_rates() makes it clear that it's not something we should > > allow. > > > > I'm a bit two-minded on this though. All the failures of that test I've > > seen actually turned out to be bugs, so I guess it's useful, but it's > > also true that for rounding errors it's a bit overkill. We could also > > relax that check and warn instead of failing. > > > >>> As for the frequency gap between the requested rate and the actual, it's > >>> because of the commit: > >>> > >>> commit 948fb0969eae8 > >>> Author: Maxime Ripard > >>> Date:   Fri Feb 25 15:35:26 2022 +0100 > >>> > >>>     clk: Always clamp the rounded rate > >>> > >>> And I haven't figured out how to fix it. > > > > Again, it boils down on whether or not we should allow a rate outside of > > boundaries. If we don't and if the clock can't do better, then yeah, the > > rate difference is fairly big but we can't do better. > > > >> Maxime has some more patches to fix this and they're in linux-next. > >> Maybe those fix this problem? > > > > I don't think they will fix it. However, depending on the outcome of > > that discussion I can send more fixes your way :) > > > > Maxime -- Regards, Laurent Pinchart 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 AEBE5C433FE for ; Mon, 3 Oct 2022 00:07:39 +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=6KM78ilJmrhSXNgoKJPA+wOok+Li7MjTDvezXBzxP8M=; b=l7KKjjN/khzwym GdC5erzgequov0TTue9smexILD8cyt0WGh39HQx3pyvZa5ttcynfLq10G80UrOXrKMeh913H6Vfu4 garCQUt/lzIccjtLqkiceotvwy9wF+chNw3MTYAA4IYUXVBEkXlHHO+56pdH17CNlf3kscNd8dY72 k63rXy5LN4+ZMl6Lgs8ffDQpRZsGT/g4dPhAnCKE/U+RPkNx85fatdx+ZEXHNCPRYAtLJ8pYDaAvX 7OLWlNen8JuwXvauHNX01OtWtF72gUpEPNeBko5toR7psRXhrjzqoYS/W7LcQthSZ9NycKuyQrfSQ ZG71SRmLOzqwpu/5DOAg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1of8yZ-003BjR-UW; Mon, 03 Oct 2022 00:06:28 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1of8yX-003BiG-18 for linux-arm-kernel@lists.infradead.org; Mon, 03 Oct 2022 00:06:26 +0000 Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 304FA8B8; Mon, 3 Oct 2022 02:06:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1664755582; bh=Q2OLvRxaTex/nZYjssOAlRaKsw2guN6fKXvLB/8YKj0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=k4aHTiJKvC53u9A5JoQVPLD8t0agwJlMdcM35fivnB3WcxVRri3p4JWILxCN6//zB d98PuNhEaT07gOpeNSP4im9bS4rlAlcyJptiih/jmNyfm3X2fp6bUOfhdHoRl+Xyfd YZSaZl5ZfXEsgmSRG9YaGqG8T2RLRxqGd/7r16EY= Date: Mon, 3 Oct 2022 03:06:20 +0300 From: Laurent Pinchart To: Quanyang Wang Cc: Maxime Ripard , Stephen Boyd , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Michal Simek , Rajan Vaja Subject: Re: [PATCH] clk: zynqmp: pll: Fix divider calculation to avoid out-of-range rate Message-ID: References: <20220928201656.30318-1-laurent.pinchart@ideasonboard.com> <11481209-7c8f-7543-1e04-5723ffc2ccd4@windriver.com> <20221001000503.23268C433D6@smtp.kernel.org> <20221001104001.r7r2utwymm32tv53@houat> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221002_170625_248948_BBE0310D X-CRM114-Status: GOOD ( 40.07 ) 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 SGVsbG8sCgpPbiBTdW4sIE9jdCAwMiwgMjAyMiBhdCAxMDoxNzoyNEFNICswODAwLCBRdWFueWFu ZyBXYW5nIHdyb3RlOgo+IE9uIDEwLzEvMjIgMTg6NDAsIE1heGltZSBSaXBhcmQgd3JvdGU6Cj4g PiBPbiBGcmksIFNlcCAzMCwgMjAyMiBhdCAwNTowNTowMVBNIC0wNzAwLCBTdGVwaGVuIEJveWQg d3JvdGU6Cj4gPj4gK01heGltZQo+ID4+Cj4gPj4gUXVvdGluZyBRdWFueWFuZyBXYW5nICgyMDIy LTA5LTI4IDE4OjA1OjEwKQo+ID4+PiBIaSBMYXVyZW50LAo+ID4+Pgo+ID4+PiBJIGhhdmUgc2Vu dCBhIHBhdGNoIGFzIGJlbG93IHRvIGZpeCB0aGlzIGlzc3VlIHdoaWNoIHNldCByYXRlIGZhaWxl ZCBhbmQKPiA+Pj4gaXQncyBpbiBsaW51eC1uZXh0IHJlcG8gbm93Lgo+ID4+Pgo+ID4+PiBodHRw czovL2xvcmUua2VybmVsLm9yZy9saW51eC1hcm0ta2VybmVsLzIwMjIwODI2MTQyMDMwLjIxMzgw NS0xLXF1YW55YW5nLndhbmdAd2luZHJpdmVyLmNvbS9ULwo+ID4+Pgo+ID4gCj4gPiBJdCBsb29r cyB0byBtZSB0aGF0IHRoZSBmdW5kYW1lbnRhbCBpc3N1ZSBpcyB0aGF0LCBpbiBzb21lIHNpdHVh dGlvbnMsCj4gPiB0aGUgcm91bmRfcmF0ZSBpbXBsZW1lbnRhdGlvbiBjYW4gcmV0dXJuIGEgcmF0 ZSBvdXRzaWRlIG9mIHRoZQo+ID4gYm91bmRhcmllcyBlbmZvcmNlZCBvbiBhIGNsb2NrLgo+Cj4g SW4gbXkgbGltaXRlZCB2aWV3LCB0aGUgcm91bmRfcmF0ZSBjYWxsYmFja3Mgc2hvdWxkIHJldHVy biBhIHJhdGUgd2l0aGluIAo+IGJvdW5kYXJpZXMgYXMgb3V0cHV0LCBidXQgY2FuIHRha2UgYSBy YXRlIG91dHNpZGUgb2YgYm91bmRhcmllcyBhcyBpbnB1dC4KPiAKPiBUYWtlIFhpbGlueCBaeW5x bXAgZm9yIGluc3RhbmNlLCBWUExMJ3MgcmF0ZSByYW5nZSBpcyAxLjVHSHp+M0dIei4gQSAKPiBj b25zdW1lciBkcF92aWRlb19yZWYgd2FudHMgYSAyMDBNSHogcmF0ZSwgaXRzIHJlcXVlc3Qgd2Fs a3MgdXB3YXJkIAo+IHRocm91Z2ggbXVsdGlwbGV4ZXJzIGFuZCBkaXZpZGVycyB0aGVuIHJlYWNo ZXMgdG8gVlBMTCwgVlBMTCByZWNlaXZlcyAKPiB0aGlzIDIwME1IeiByZXF1ZXN0IGFuZCBjYWxs ICB6eW5xbXBfcGxsX3JvdW5kX3JhdGUgdG8gInJvdW5kIiB0aGlzIAo+IG91dC1vZi1yYW5nZSBy YXRlIDIwME1IeiB0byAxNjAwTUh6IHZpYSBtdWx0aXBseWluZyBieSA4LiAKCkkgZG9uJ3QgdGhp bmsgdGhhdCdzIHRoZSByaWdodCB3YXkgdG8gbG9vayBhdCBpdC4gTWFraW5nIHRoZSBWUExMIGRy aXZlcgptdWx0aXBseSB0aGUgcmVxdWVzdGVkIDIwME1IeiByYXRlIGJ5IDggYXNzdW1lcyB0aGF0 IGl0IGtub3dzIHRoYXQgdGhlCm5leHQgYmxvY2sgaW4gdGhlIGNsb2NrIHRyZWUgaXMgYSBkaXZp ZGVyIGNhcGFibGUgb2YgZGl2aWRpbmcgYnkgOC4KVGhhdCdzIG5vdCBzb21ldGhpbmcgdGhlIFZQ TEwgZHJpdmVyIHNob3VsZCBrbm93IGFib3V0LiBUaGUgbmV4dCBibG9jawptYXkgYmUgYWJsZSB0 byBkaXZpZGUgYnkgMTAgYW5kIHVwIG9ubHksIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFZQTEwKc2hv dWxkIHRoZW4gYmUgY29uZmlndXJlZCB0byBvdXRwdXQgMjAwMCBNSHouCgpUaGUgcHJvYmxlbSB0 aGF0IG5lZWRzIHRvIGJlIHNvbHZlZCBpcyB0byBmaW5kIGEgZ2xvYmFsIG9wdGltYWwKY29uZmln dXJhdGlvbiBmb3IgY2FzY2FkZWQgUExMcyBhbmQgZGl2aWRlcnMuIAoKPiB6eW5xbXBfcGxsX3Jv dW5kX3JhdGUgcmV0dXJucyAxNjAwTUh6IGFuZCBjbGsgc3Vic3lzdGVtIHdpbGwgY2FsbCAKPiBk ZXRlcm1pbmUgY2FsbGJhY2tzIHRvIGNvbmZpZ3VyZSBkaXZpZGVycyBjb3JyZWN0bHkgdG8gbWFr ZSBzdXJlIHRoYXQgCj4gZHBfdmlkZW9fcmVmIGNhbiBnZXQgYW4gZXhhY3QgcmF0ZSAyMDBNSHou Cj4gCj4gQnV0IHRoZSBjb21taXQgOTQ4ZmIwOTY5ZWFlOCAoImNsazogQWx3YXlzIGNsYW1wIHRo ZSByb3VuZGVkIHJhdGUiKSBhZGRzCj4gCj4gcmVxLT5yYXRlID0gY2xhbXAocmVxLT5yYXRlLCBy ZXEtPm1pbl9yYXRlLCByZXEtPm1heF9yYXRlKTsKPiAKPiBiZWZvcmUKPiAKPiByYXRlID0gY29y ZS0+b3BzLT5yb3VuZF9yYXRlKGNvcmUtPmh3LCByZXEtPnJhdGUsJnJlcS0+YmVzdF9wYXJlbnRf cmF0ZSk7Cj4gCj4gVGhpcyByZXN1bHRzIHRoYXQgLnJvdW5kX3JhdGUgY2FsbGJhY2tzIGxvc2Ug ZnVuY3Rpb25hbGl0eSBzaW5jZSB0aGV5IAo+IGhhdmUgbm8gY2hhbmNlIHRvIHBpY2sgdXAgYSBw cmVjaXNlIHJhdGUgYnV0IG9ubHkgYSBib3VuZGFyeSByYXRlLgo+IFN0aWxsIGZvciBYaWxpbngg WnlucW1wLCB0aGUgMjAwTUh6IHJhdGUgcmVxdWVzdCB0byBQTEwgd2lsbCBiZSBzZXQgdG8gCj4g MTUwME1IeiBieSBjbGFtcCBmdW5jdGlvbiBhbmQgdGhlbiB6eW5xbXBfcGxsX3JvdW5kX3JhdGUg ZG9lcyBub3RoaW5nLCAKPiBkcF92aWRlb19yZWYgd2lsbCBmaW5hbGx5IHJlY2VpdmUgYSByYXRl IHdoaWNoIGlzIDE1MDBNSHovOCA9IDE4Ny41TUh6Lgo+IFRoZSByYXRlIGdhcCAoMjAwTUh6LTE4 Ny41TUh6KSBoYXBwZW5zLgo+IAo+IFRoZXJlIGlzIG5vIGRvdWJ0IHRoYXQgcm91bmRfcmF0ZSBz aG91bGQgcmV0dXJuIGEgdmFsaWQgcmF0ZSBhcyBvdXRwdXQuIAo+IEJ1dCBpcyBpdCBuZWNlc3Nh cnkgdGhhdCBmb3JjZXMgdGhlIGlucHV0IG9mIHJvdW5kX3JhdGUgY2FsbGJhY2tzIHRvIGJlIAo+ IHdpdGhpbiBib3VuZGFyaWVzPwo+IAo+ID4gSSB0aGluayB0aGF0J3MgdGhlIGN1cnJlbnQgYmVo YXZpb3VyICh0aGF0IHdhcyB0aGVyZSBwcmlvciB0byBteQo+ID4gcGF0Y2hlcykgdG8gcmVqZWN0 IGFueSByYXRlIG91dHNpZGUgb2YgdGhlIGJvdW5kYXJpZXMgaW4KPiA+IGNsa19jYWxjX25ld19y YXRlcygpIG1ha2VzIGl0IGNsZWFyIHRoYXQgaXQncyBub3Qgc29tZXRoaW5nIHdlIHNob3VsZAo+ ID4gYWxsb3cuCj4gPiAKPiA+IEknbSBhIGJpdCB0d28tbWluZGVkIG9uIHRoaXMgdGhvdWdoLiBB bGwgdGhlIGZhaWx1cmVzIG9mIHRoYXQgdGVzdCBJJ3ZlCj4gPiBzZWVuIGFjdHVhbGx5IHR1cm5l ZCBvdXQgdG8gYmUgYnVncywgc28gSSBndWVzcyBpdCdzIHVzZWZ1bCwgYnV0IGl0J3MKPiA+IGFs c28gdHJ1ZSB0aGF0IGZvciByb3VuZGluZyBlcnJvcnMgaXQncyBhIGJpdCBvdmVya2lsbC4gV2Ug Y291bGQgYWxzbwo+ID4gcmVsYXggdGhhdCBjaGVjayBhbmQgd2FybiBpbnN0ZWFkIG9mIGZhaWxp bmcuCj4gPiAKPiA+Pj4gQXMgZm9yIHRoZSBmcmVxdWVuY3kgZ2FwIGJldHdlZW4gdGhlIHJlcXVl c3RlZCByYXRlIGFuZCB0aGUgYWN0dWFsLCBpdCdzCj4gPj4+IGJlY2F1c2Ugb2YgdGhlIGNvbW1p dDoKPiA+Pj4KPiA+Pj4gY29tbWl0IDk0OGZiMDk2OWVhZTgKPiA+Pj4gQXV0aG9yOiBNYXhpbWUg UmlwYXJkIDxtYXhpbWVAY2Vybm8udGVjaD4KPiA+Pj4gRGF0ZTrCoMKgIEZyaSBGZWIgMjUgMTU6 MzU6MjYgMjAyMiArMDEwMAo+ID4+Pgo+ID4+PiAgIMKgwqDCoCBjbGs6IEFsd2F5cyBjbGFtcCB0 aGUgcm91bmRlZCByYXRlCj4gPj4+Cj4gPj4+IEFuZCBJIGhhdmVuJ3QgZmlndXJlZCBvdXQgaG93 IHRvIGZpeCBpdC4KPiA+IAo+ID4gQWdhaW4sIGl0IGJvaWxzIGRvd24gb24gd2hldGhlciBvciBu b3Qgd2Ugc2hvdWxkIGFsbG93IGEgcmF0ZSBvdXRzaWRlIG9mCj4gPiBib3VuZGFyaWVzLiBJZiB3 ZSBkb24ndCBhbmQgaWYgdGhlIGNsb2NrIGNhbid0IGRvIGJldHRlciwgdGhlbiB5ZWFoLCB0aGUK PiA+IHJhdGUgZGlmZmVyZW5jZSBpcyBmYWlybHkgYmlnIGJ1dCB3ZSBjYW4ndCBkbyBiZXR0ZXIu Cj4gPiAKPiA+PiBNYXhpbWUgaGFzIHNvbWUgbW9yZSBwYXRjaGVzIHRvIGZpeCB0aGlzIGFuZCB0 aGV5J3JlIGluIGxpbnV4LW5leHQuCj4gPj4gTWF5YmUgdGhvc2UgZml4IHRoaXMgcHJvYmxlbT8K PiA+IAo+ID4gSSBkb24ndCB0aGluayB0aGV5IHdpbGwgZml4IGl0LiBIb3dldmVyLCBkZXBlbmRp bmcgb24gdGhlIG91dGNvbWUgb2YKPiA+IHRoYXQgZGlzY3Vzc2lvbiBJIGNhbiBzZW5kIG1vcmUg Zml4ZXMgeW91ciB3YXkgOikKPiA+IAo+ID4gTWF4aW1lCgotLSAKUmVnYXJkcywKCkxhdXJlbnQg UGluY2hhcnQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFybS1rZXJuZWwK