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=-0.6 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 B98C7C433FF for ; Sun, 28 Jul 2019 17:32:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 888582070D for ; Sun, 28 Jul 2019 17:32:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="ModjmV4K"; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="lUqLn/c0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726171AbfG1Rcx (ORCPT ); Sun, 28 Jul 2019 13:32:53 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:39748 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726098AbfG1Rcw (ORCPT ); Sun, 28 Jul 2019 13:32:52 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 250AF60247; Sun, 28 Jul 2019 17:32:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1564335171; bh=HIR7nBYXO3+FtqWafLLF5meNLRHqiK3l/PIi4dFF348=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=ModjmV4KJpuk55XYpqCY1CohhDNBOSSgFlyESIpZpahAmQVclSS7RE0m4gf49cFOA 9WAbxVlq2yHMtfw+SfDgKtcdFzIwsYvUxCmDnVEVgDM1Gl9mR1Og/xZRdnu3rFSGBX mwEOE5OHRZgj2cNXsV7UR/O3lzbroaNfhycA8KAQ= Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.codeaurora.org (Postfix) with ESMTP id 58C8260247; Sun, 28 Jul 2019 17:32:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1564335169; bh=HIR7nBYXO3+FtqWafLLF5meNLRHqiK3l/PIi4dFF348=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=lUqLn/c0DoOVlwKBs9U85MGQZ9Nt+fOZjxN9A2iFhES10ogvqoPgHL7PPmJIzPdDT lwHJ+EDoGjeSCyhxYFlV/aRVqb3SNgqaENs1cHH70ixOpDWbgUb9QI8NZ77Ldxl3bw 9dfDesvtxYGS2eBurhlwA8p8h8Pi7OiMo+l2WD4g= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Sun, 28 Jul 2019 10:32:49 -0700 From: Jeykumar Sankaran To: Sean Paul Cc: =?UTF-8?Q?Ville_Syrj=C3=A4l=C3=A4?= , freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, pdhaval@codeaurora.org, seanpaul@chromium.org, Daniel Vetter Subject: Re: [RFC] Expanding drm_mode_modeinfo flags In-Reply-To: <20190724144833.GM104440@art_vandelay> References: <1562870805-32314-1-git-send-email-jsanka@codeaurora.org> <20190716090712.GY15868@phenom.ffwll.local> <16fee2b42fa03d2cf104452223dcf5af@codeaurora.org> <20190719090553.GF15868@phenom.ffwll.local> <20190719135558.GC104440@art_vandelay> <20190719141528.GN5942@intel.com> <20190719142959.GD104440@art_vandelay> <20190724144833.GM104440@art_vandelay> Message-ID: <331f891d4f403c30ab346982251c911c@codeaurora.org> X-Sender: jsanka@codeaurora.org User-Agent: Roundcube Webmail/1.2.5 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org On 2019-07-24 07:48, Sean Paul wrote: > On Mon, Jul 22, 2019 at 04:50:43PM -0700, Jeykumar Sankaran wrote: >> On 2019-07-19 07:29, Sean Paul wrote: >> > On Fri, Jul 19, 2019 at 05:15:28PM +0300, Ville Syrjälä wrote: >> > > On Fri, Jul 19, 2019 at 09:55:58AM -0400, Sean Paul wrote: >> > > > On Fri, Jul 19, 2019 at 11:05:53AM +0200, Daniel Vetter wrote: >> > > > > On Thu, Jul 18, 2019 at 11:18:42AM -0700, Jeykumar Sankaran > wrote: >> > > > > > On 2019-07-16 02:07, Daniel Vetter wrote: >> > > > > > > On Thu, Jul 11, 2019 at 11:46:44AM -0700, Jeykumar Sankaran > wrote: >> > >> > /snip >> > >> > > > > > > > drm: add mode flags in uapi for seamless mode switch >> > > > > > > >> > > > > > > I think the uapi is the trivial part here, the real deal is > how >> > > > > > > userspace >> > > > > > > uses this. Can you pls post the patches for your compositor? >> > > > > > > >> > > > > > > Also note that we already allow userspace to tell the kernel > whether >> > > > > > > flickering is ok or not for a modeset. msm driver could use > that to at >> > > > > > > least tell userspace whether a modeset change is possible. > So you can >> > > > > > > already implement glitch-free modeset changes for at least > video mode. >> > > > > > > -Daniel >> > > > > > >> > > > > > I believe you are referring to the below tv property of the > connector. >> > > > > > >> > > > > > /** >> > > > > > * @tv_flicker_reduction_property: Optional TV property to > control the >> > > > > > * flicker reduction mode. >> > > > > > */ >> > > > > > struct drm_property *tv_flicker_reduction_property; >> > > > > >> > > > > Not even close :-) >> > > > > >> > > > > I mean the DRM_MODE_ATOMIC_ALLOW_MODESET flag for the atomic > ioctl. This >> > > > > is not a property of a mode, this is a property of a > _transition_ between >> > > > > configurations. Some transitions can be done flicker free, > others can't. >> > > > >> > > > Agree that an atomic flag on a commit is the way to accomplish > this. It's pretty >> > > > similar to the psr transitions, where we want to reuse most of the > atomic >> > > > circuitry, but in a specialized way. We'd also have to be careful > to only >> > > > involve the drm objects which are seamless modeset aware (you > could imagine >> > > > a bridge chain where the bridges downstream of the first bridge > don't care). >> > > > >> > > > > >> > > > > There's then still the question of how to pick video vs command > mode, but >> > > > > imo better to start with implementing the transition behaviour > correctly >> > > > > first. >> > > > >> > > > Connector property? Possibly a terrible idea, but I wonder if we > could [re]use >> > > > the vrr properties for command mode. The docs state that the > driver has the >> > > > option of putting upper and lower bounds on the refresh rate. >> > > >> > > Not really sure why this needs new props and whatnot. This is kinda >> > > what >> > > the i915 "fastset" stuff already does: >> > > 1. userspace asks for something to be changed via atomic >> > > 2. driver calculates whether a modeset is actually required >> > > 3. atomic validates need_modeset() vs. DRM_MODE_ATOMIC_ALLOW_MODESET >> > > 4. if (need_modeset) heavyweight_commit() else lightweight_commit() >> > > >> > > Ie. why should userspace really care about anything except the >> > > "flickers are OK" vs. "flickers not wanted" thing? >> > >> > Agree, I don't think the seamless modeset (ie: changing resolution >> > without >> > flicker) needs a property. Just need to test the commit without >> > ALLOW_MODESET >> > and commit it if the test passes. >> > >> >> Agreed that a TEST_ONLY commit without ALLOW_MODESET flag can be used >> to >> check >> whether the modeset can be done seamless. But since there are no error > code >> returns, >> the client cannot distinguish the test_only commit failures from other >> invalid config failures. >> >> Also, note that when the client sees two 1080p modes (vid/cmd) and it >> is >> interested only >> to do *only* seamless switches, without any additional flag it cannot >> distinguish between >> these two 1080p modes. The client has to invoke two test_only commits > with >> these >> modes to identify the seamless one. Is that a preferred approach? > > Hi Jey! > Yeah, pretty much. Stepping back a bit though, why is the kernel > exposing > 2 > 1080p modes in the first place? If you just expose one mode and then > use a > property to enter "low-latency operation" (or overloading vrr for cmd > mode), you > shouldn't need to do the mode switch, just flip the property and let > the > kernel > figure out how to transition to video/cmd mode. > >> >> Intel's "fastset" calculates the need for modeset internally based on > the >> configuration and chooses the best commit path. But the requirement >> here >> is to expose the information up-front since the use case cannot afford >> to fall back to the normal modeset when it has requested for a >> seamless > one. >> >> > > >> > > Also what's the benefit of using video mode if your panel supportes >> > > command mode? Can you turn off the memory in the panel and actually >> > > save power that way? And if there is a benefit can't the driver just >> > > automagically switch between the two based on how often things are >> > > getting updated? That would match how eDP PSR already works. >> > >> > I'm guessing video mode might have some latency benefits over command >> > mode? >> > >> > Sean >> >> Yes. Pretty much those are reasons we need to switch to video mode. >> But >> instead >> of making the decision internal to the driver based on the frequency >> of >> frame updates, >> we have proprietary use cases where the client has to trigger the >> switch >> explicitly. > > Unsolicited advice: if you find yourself typing "proprietary" while > justifying > an upstream proposal, reword your argument immediately :-) > > Now that I've filled my awful joke quota for the mail, I can move on. > Generally > speaking, it's better to you expand on why userspace needs this. > There's a > very > good chance that if it makes sense for Qualcomm, it makes sense for > others. If > we have an open discussion about it, others might chime in with "me > too" > and > that will help your case (and you might even hook someone into doing > the > work > for you!). Alternatively, we might be able to solve the problem in a > different > way that makes everyone happy (or most everyone happy). > > There's 100% a case for allowing userspace to trigger a low-latency > mode > at the > expense of power (we should have it disable the psr entry timer as > well). > Let's > steer this conversation in the direction of "can we use something that > already > exists, or should we add something new?" > > Sean > Thank you Sean for the suggestion! I can use the proposed property approach to switch between vid/cmd mode if every resolution is capable of switching between these two modes. But we have uses cases where the switch is restricted only between a set of resolutions. Also, appreciate your guidance for formating closed usecase questions. Let me check how much more details I can provide on why H/W has to enforce such restrictions and will revive the thread if needed. Thanks and Regards, Jeykumar S. > >> So we are trying to find ways to represent the same resolution in both >> video/cmd modes. >> >> Thanks and Regards, >> Jeykumar S. >> >> > >> > > >> > > -- >> > > Ville Syrjälä >> > > Intel >> >> -- >> Jeykumar S > > -- > Sean Paul, Software Engineer, Google / Chromium OS -- Jeykumar S From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeykumar Sankaran Subject: Re: [RFC] Expanding drm_mode_modeinfo flags Date: Sun, 28 Jul 2019 10:32:49 -0700 Message-ID: <331f891d4f403c30ab346982251c911c@codeaurora.org> References: <1562870805-32314-1-git-send-email-jsanka@codeaurora.org> <20190716090712.GY15868@phenom.ffwll.local> <16fee2b42fa03d2cf104452223dcf5af@codeaurora.org> <20190719090553.GF15868@phenom.ffwll.local> <20190719135558.GC104440@art_vandelay> <20190719141528.GN5942@intel.com> <20190719142959.GD104440@art_vandelay> <20190724144833.GM104440@art_vandelay> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190724144833.GM104440@art_vandelay> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: Sean Paul Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, pdhaval-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, Daniel Vetter , freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, =?UTF-8?Q?Ville_Syrj=C3=A4l=C3=A4?= List-Id: dri-devel@lists.freedesktop.org T24gMjAxOS0wNy0yNCAwNzo0OCwgU2VhbiBQYXVsIHdyb3RlOgo+IE9uIE1vbiwgSnVsIDIyLCAy MDE5IGF0IDA0OjUwOjQzUE0gLTA3MDAsIEpleWt1bWFyIFNhbmthcmFuIHdyb3RlOgo+PiBPbiAy MDE5LTA3LTE5IDA3OjI5LCBTZWFuIFBhdWwgd3JvdGU6Cj4+ID4gT24gRnJpLCBKdWwgMTksIDIw MTkgYXQgMDU6MTU6MjhQTSArMDMwMCwgVmlsbGUgU3lyasOkbMOkIHdyb3RlOgo+PiA+ID4gT24g RnJpLCBKdWwgMTksIDIwMTkgYXQgMDk6NTU6NThBTSAtMDQwMCwgU2VhbiBQYXVsIHdyb3RlOgo+ PiA+ID4gPiBPbiBGcmksIEp1bCAxOSwgMjAxOSBhdCAxMTowNTo1M0FNICswMjAwLCBEYW5pZWwg VmV0dGVyIHdyb3RlOgo+PiA+ID4gPiA+IE9uIFRodSwgSnVsIDE4LCAyMDE5IGF0IDExOjE4OjQy QU0gLTA3MDAsIEpleWt1bWFyIFNhbmthcmFuCj4gd3JvdGU6Cj4+ID4gPiA+ID4gPiBPbiAyMDE5 LTA3LTE2IDAyOjA3LCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+PiA+ID4gPiA+ID4gPiBPbiBUaHUs IEp1bCAxMSwgMjAxOSBhdCAxMTo0Njo0NEFNIC0wNzAwLCBKZXlrdW1hciBTYW5rYXJhbgo+IHdy b3RlOgo+PiA+Cj4+ID4gL3NuaXAKPj4gPgo+PiA+ID4gPiA+ID4gPiA+ICAgZHJtOiBhZGQgbW9k ZSBmbGFncyBpbiB1YXBpIGZvciBzZWFtbGVzcyBtb2RlIHN3aXRjaAo+PiA+ID4gPiA+ID4gPgo+ PiA+ID4gPiA+ID4gPiBJIHRoaW5rIHRoZSB1YXBpIGlzIHRoZSB0cml2aWFsIHBhcnQgaGVyZSwg dGhlIHJlYWwgZGVhbCBpcwo+IGhvdwo+PiA+ID4gPiA+ID4gPiB1c2Vyc3BhY2UKPj4gPiA+ID4g PiA+ID4gdXNlcyB0aGlzLiBDYW4geW91IHBscyBwb3N0IHRoZSBwYXRjaGVzIGZvciB5b3VyIGNv bXBvc2l0b3I/Cj4+ID4gPiA+ID4gPiA+Cj4+ID4gPiA+ID4gPiA+IEFsc28gbm90ZSB0aGF0IHdl IGFscmVhZHkgYWxsb3cgdXNlcnNwYWNlIHRvIHRlbGwgdGhlIGtlcm5lbAo+IHdoZXRoZXIKPj4g PiA+ID4gPiA+ID4gZmxpY2tlcmluZyBpcyBvayBvciBub3QgZm9yIGEgbW9kZXNldC4gbXNtIGRy aXZlciBjb3VsZCB1c2UKPiB0aGF0IHRvIGF0Cj4+ID4gPiA+ID4gPiA+IGxlYXN0IHRlbGwgdXNl cnNwYWNlIHdoZXRoZXIgYSBtb2Rlc2V0IGNoYW5nZSBpcyBwb3NzaWJsZS4KPiBTbyB5b3UgY2Fu Cj4+ID4gPiA+ID4gPiA+IGFscmVhZHkgaW1wbGVtZW50IGdsaXRjaC1mcmVlIG1vZGVzZXQgY2hh bmdlcyBmb3IgYXQgbGVhc3QKPiB2aWRlbyBtb2RlLgo+PiA+ID4gPiA+ID4gPiAtRGFuaWVsCj4+ ID4gPiA+ID4gPgo+PiA+ID4gPiA+ID4gSSBiZWxpZXZlIHlvdSBhcmUgcmVmZXJyaW5nIHRvIHRo ZSBiZWxvdyB0diBwcm9wZXJ0eSBvZiB0aGUKPiBjb25uZWN0b3IuCj4+ID4gPiA+ID4gPgo+PiA+ ID4gPiA+ID4gLyoqCj4+ID4gPiA+ID4gPiAgKiBAdHZfZmxpY2tlcl9yZWR1Y3Rpb25fcHJvcGVy dHk6IE9wdGlvbmFsIFRWIHByb3BlcnR5IHRvCj4gY29udHJvbCB0aGUKPj4gPiA+ID4gPiA+ICAq IGZsaWNrZXIgcmVkdWN0aW9uIG1vZGUuCj4+ID4gPiA+ID4gPiAgKi8KPj4gPiA+ID4gPiA+IHN0 cnVjdCBkcm1fcHJvcGVydHkgKnR2X2ZsaWNrZXJfcmVkdWN0aW9uX3Byb3BlcnR5Owo+PiA+ID4g PiA+Cj4+ID4gPiA+ID4gTm90IGV2ZW4gY2xvc2UgOi0pCj4+ID4gPiA+ID4KPj4gPiA+ID4gPiBJ IG1lYW4gdGhlIERSTV9NT0RFX0FUT01JQ19BTExPV19NT0RFU0VUIGZsYWcgZm9yIHRoZSBhdG9t aWMKPiBpb2N0bC4gVGhpcwo+PiA+ID4gPiA+IGlzIG5vdCBhIHByb3BlcnR5IG9mIGEgbW9kZSwg dGhpcyBpcyBhIHByb3BlcnR5IG9mIGEKPiBfdHJhbnNpdGlvbl8gYmV0d2Vlbgo+PiA+ID4gPiA+ IGNvbmZpZ3VyYXRpb25zLiBTb21lIHRyYW5zaXRpb25zIGNhbiBiZSBkb25lIGZsaWNrZXIgZnJl ZSwKPiBvdGhlcnMgY2FuJ3QuCj4+ID4gPiA+Cj4+ID4gPiA+IEFncmVlIHRoYXQgYW4gYXRvbWlj IGZsYWcgb24gYSBjb21taXQgaXMgdGhlIHdheSB0byBhY2NvbXBsaXNoCj4gdGhpcy4gSXQncyBw cmV0dHkKPj4gPiA+ID4gc2ltaWxhciB0byB0aGUgcHNyIHRyYW5zaXRpb25zLCB3aGVyZSB3ZSB3 YW50IHRvIHJldXNlIG1vc3Qgb2YgdGhlCj4gYXRvbWljCj4+ID4gPiA+IGNpcmN1aXRyeSwgYnV0 IGluIGEgc3BlY2lhbGl6ZWQgd2F5LiBXZSdkIGFsc28gaGF2ZSB0byBiZSBjYXJlZnVsCj4gdG8g b25seQo+PiA+ID4gPiBpbnZvbHZlIHRoZSBkcm0gb2JqZWN0cyB3aGljaCBhcmUgc2VhbWxlc3Mg bW9kZXNldCBhd2FyZSAoeW91Cj4gY291bGQgaW1hZ2luZQo+PiA+ID4gPiBhIGJyaWRnZSBjaGFp biB3aGVyZSB0aGUgYnJpZGdlcyBkb3duc3RyZWFtIG9mIHRoZSBmaXJzdCBicmlkZ2UKPiBkb24n dCBjYXJlKS4KPj4gPiA+ID4KPj4gPiA+ID4gPgo+PiA+ID4gPiA+IFRoZXJlJ3MgdGhlbiBzdGls bCB0aGUgcXVlc3Rpb24gb2YgaG93IHRvIHBpY2sgdmlkZW8gdnMgY29tbWFuZAo+IG1vZGUsIGJ1 dAo+PiA+ID4gPiA+IGltbyBiZXR0ZXIgdG8gc3RhcnQgd2l0aCBpbXBsZW1lbnRpbmcgdGhlIHRy YW5zaXRpb24gYmVoYXZpb3VyCj4gY29ycmVjdGx5Cj4+ID4gPiA+ID4gZmlyc3QuCj4+ID4gPiA+ Cj4+ID4gPiA+IENvbm5lY3RvciBwcm9wZXJ0eT8gUG9zc2libHkgYSB0ZXJyaWJsZSBpZGVhLCBi dXQgSSB3b25kZXIgaWYgd2UKPiBjb3VsZCBbcmVddXNlCj4+ID4gPiA+IHRoZSB2cnIgcHJvcGVy dGllcyBmb3IgY29tbWFuZCBtb2RlLiBUaGUgZG9jcyBzdGF0ZSB0aGF0IHRoZQo+IGRyaXZlciBo YXMgdGhlCj4+ID4gPiA+IG9wdGlvbiBvZiBwdXR0aW5nIHVwcGVyIGFuZCBsb3dlciBib3VuZHMg b24gdGhlIHJlZnJlc2ggcmF0ZS4KPj4gPiA+Cj4+ID4gPiBOb3QgcmVhbGx5IHN1cmUgd2h5IHRo aXMgbmVlZHMgbmV3IHByb3BzIGFuZCB3aGF0bm90LiBUaGlzIGlzIGtpbmRhCj4+ID4gPiB3aGF0 Cj4+ID4gPiB0aGUgaTkxNSAiZmFzdHNldCIgc3R1ZmYgYWxyZWFkeSBkb2VzOgo+PiA+ID4gMS4g dXNlcnNwYWNlIGFza3MgZm9yIHNvbWV0aGluZyB0byBiZSBjaGFuZ2VkIHZpYSBhdG9taWMKPj4g PiA+IDIuIGRyaXZlciBjYWxjdWxhdGVzIHdoZXRoZXIgYSBtb2Rlc2V0IGlzIGFjdHVhbGx5IHJl cXVpcmVkCj4+ID4gPiAzLiBhdG9taWMgdmFsaWRhdGVzIG5lZWRfbW9kZXNldCgpIHZzLiBEUk1f TU9ERV9BVE9NSUNfQUxMT1dfTU9ERVNFVAo+PiA+ID4gNC4gaWYgKG5lZWRfbW9kZXNldCkgaGVh dnl3ZWlnaHRfY29tbWl0KCkgZWxzZSBsaWdodHdlaWdodF9jb21taXQoKQo+PiA+ID4KPj4gPiA+ IEllLiB3aHkgc2hvdWxkIHVzZXJzcGFjZSByZWFsbHkgY2FyZSBhYm91dCBhbnl0aGluZyBleGNl cHQgdGhlCj4+ID4gPiAiZmxpY2tlcnMgYXJlIE9LIiB2cy4gImZsaWNrZXJzIG5vdCB3YW50ZWQi IHRoaW5nPwo+PiA+Cj4+ID4gQWdyZWUsIEkgZG9uJ3QgdGhpbmsgdGhlIHNlYW1sZXNzIG1vZGVz ZXQgKGllOiBjaGFuZ2luZyByZXNvbHV0aW9uCj4+ID4gd2l0aG91dAo+PiA+IGZsaWNrZXIpIG5l ZWRzIGEgcHJvcGVydHkuIEp1c3QgbmVlZCB0byB0ZXN0IHRoZSBjb21taXQgd2l0aG91dAo+PiA+ IEFMTE9XX01PREVTRVQKPj4gPiBhbmQgY29tbWl0IGl0IGlmIHRoZSB0ZXN0IHBhc3Nlcy4KPj4g Pgo+PiAKPj4gQWdyZWVkIHRoYXQgYSBURVNUX09OTFkgY29tbWl0IHdpdGhvdXQgQUxMT1dfTU9E RVNFVCBmbGFnIGNhbiBiZSB1c2VkIAo+PiB0bwo+PiBjaGVjawo+PiB3aGV0aGVyIHRoZSBtb2Rl c2V0IGNhbiBiZSBkb25lIHNlYW1sZXNzLiBCdXQgc2luY2UgdGhlcmUgYXJlIG5vIGVycm9yCj4g Y29kZQo+PiByZXR1cm5zLAo+PiB0aGUgY2xpZW50IGNhbm5vdCBkaXN0aW5ndWlzaCB0aGUgdGVz dF9vbmx5IGNvbW1pdCBmYWlsdXJlcyBmcm9tIG90aGVyCj4+IGludmFsaWQgY29uZmlnIGZhaWx1 cmVzLgo+PiAKPj4gQWxzbywgbm90ZSB0aGF0IHdoZW4gdGhlIGNsaWVudCBzZWVzIHR3byAxMDgw cCBtb2RlcyAodmlkL2NtZCkgYW5kIGl0IAo+PiBpcwo+PiBpbnRlcmVzdGVkIG9ubHkKPj4gdG8g ZG8gKm9ubHkqIHNlYW1sZXNzIHN3aXRjaGVzLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIGZsYWcg aXQgY2Fubm90Cj4+IGRpc3Rpbmd1aXNoIGJldHdlZW4KPj4gdGhlc2UgdHdvIDEwODBwIG1vZGVz LiBUaGUgY2xpZW50IGhhcyB0byBpbnZva2UgdHdvIHRlc3Rfb25seSBjb21taXRzCj4gd2l0aAo+ PiB0aGVzZQo+PiBtb2RlcyB0byBpZGVudGlmeSB0aGUgc2VhbWxlc3Mgb25lLiBJcyB0aGF0IGEg cHJlZmVycmVkIGFwcHJvYWNoPwo+IAo+IEhpIEpleSEKPiBZZWFoLCBwcmV0dHkgbXVjaC4gU3Rl cHBpbmcgYmFjayBhIGJpdCB0aG91Z2gsIHdoeSBpcyB0aGUga2VybmVsIAo+IGV4cG9zaW5nCj4g Mgo+IDEwODBwIG1vZGVzIGluIHRoZSBmaXJzdCBwbGFjZT8gSWYgeW91IGp1c3QgZXhwb3NlIG9u ZSBtb2RlIGFuZCB0aGVuIAo+IHVzZSBhCj4gcHJvcGVydHkgdG8gZW50ZXIgImxvdy1sYXRlbmN5 IG9wZXJhdGlvbiIgKG9yIG92ZXJsb2FkaW5nIHZyciBmb3IgY21kCj4gbW9kZSksIHlvdQo+IHNo b3VsZG4ndCBuZWVkIHRvIGRvIHRoZSBtb2RlIHN3aXRjaCwganVzdCBmbGlwIHRoZSBwcm9wZXJ0 eSBhbmQgbGV0IAo+IHRoZQo+IGtlcm5lbAo+IGZpZ3VyZSBvdXQgaG93IHRvIHRyYW5zaXRpb24g dG8gdmlkZW8vY21kIG1vZGUuCj4gCj4+IAo+PiBJbnRlbCdzICJmYXN0c2V0IiBjYWxjdWxhdGVz IHRoZSBuZWVkIGZvciBtb2Rlc2V0IGludGVybmFsbHkgYmFzZWQgb24KPiB0aGUKPj4gY29uZmln dXJhdGlvbiBhbmQgY2hvb3NlcyB0aGUgYmVzdCBjb21taXQgcGF0aC4gQnV0IHRoZSByZXF1aXJl bWVudCAKPj4gaGVyZQo+PiBpcyB0byBleHBvc2UgdGhlIGluZm9ybWF0aW9uIHVwLWZyb250IHNp bmNlIHRoZSB1c2UgY2FzZSBjYW5ub3QgYWZmb3JkCj4+IHRvIGZhbGwgYmFjayB0byB0aGUgbm9y bWFsIG1vZGVzZXQgd2hlbiBpdCBoYXMgcmVxdWVzdGVkIGZvciBhIAo+PiBzZWFtbGVzcwo+IG9u ZS4KPj4gCj4+ID4gPgo+PiA+ID4gQWxzbyB3aGF0J3MgdGhlIGJlbmVmaXQgb2YgdXNpbmcgdmlk ZW8gbW9kZSBpZiB5b3VyIHBhbmVsIHN1cHBvcnRlcwo+PiA+ID4gY29tbWFuZCBtb2RlPyBDYW4g eW91IHR1cm4gb2ZmIHRoZSBtZW1vcnkgaW4gdGhlIHBhbmVsIGFuZCBhY3R1YWxseQo+PiA+ID4g c2F2ZSBwb3dlciB0aGF0IHdheT8gQW5kIGlmIHRoZXJlIGlzIGEgYmVuZWZpdCBjYW4ndCB0aGUg ZHJpdmVyIGp1c3QKPj4gPiA+IGF1dG9tYWdpY2FsbHkgc3dpdGNoIGJldHdlZW4gdGhlIHR3byBi YXNlZCBvbiBob3cgb2Z0ZW4gdGhpbmdzIGFyZQo+PiA+ID4gZ2V0dGluZyB1cGRhdGVkPyBUaGF0 IHdvdWxkIG1hdGNoIGhvdyBlRFAgUFNSIGFscmVhZHkgd29ya3MuCj4+ID4KPj4gPiBJJ20gZ3Vl c3NpbmcgdmlkZW8gbW9kZSBtaWdodCBoYXZlIHNvbWUgbGF0ZW5jeSBiZW5lZml0cyBvdmVyIGNv bW1hbmQKPj4gPiBtb2RlPwo+PiA+Cj4+ID4gU2Vhbgo+PiAKPj4gWWVzLiBQcmV0dHkgbXVjaCB0 aG9zZSBhcmUgcmVhc29ucyB3ZSBuZWVkIHRvIHN3aXRjaCB0byB2aWRlbyBtb2RlLiAKPj4gQnV0 Cj4+IGluc3RlYWQKPj4gb2YgbWFraW5nIHRoZSBkZWNpc2lvbiBpbnRlcm5hbCB0byB0aGUgZHJp dmVyIGJhc2VkIG9uIHRoZSBmcmVxdWVuY3kgCj4+IG9mCj4+IGZyYW1lIHVwZGF0ZXMsCj4+IHdl IGhhdmUgcHJvcHJpZXRhcnkgdXNlIGNhc2VzIHdoZXJlIHRoZSBjbGllbnQgaGFzIHRvIHRyaWdn ZXIgdGhlIAo+PiBzd2l0Y2gKPj4gZXhwbGljaXRseS4KPiAKPiBVbnNvbGljaXRlZCBhZHZpY2U6 IGlmIHlvdSBmaW5kIHlvdXJzZWxmIHR5cGluZyAicHJvcHJpZXRhcnkiIHdoaWxlCj4ganVzdGlm eWluZwo+IGFuIHVwc3RyZWFtIHByb3Bvc2FsLCByZXdvcmQgeW91ciBhcmd1bWVudCBpbW1lZGlh dGVseSA6LSkKPiAKPiBOb3cgdGhhdCBJJ3ZlIGZpbGxlZCBteSBhd2Z1bCBqb2tlIHF1b3RhIGZv ciB0aGUgbWFpbCwgSSBjYW4gbW92ZSBvbi4KPiBHZW5lcmFsbHkKPiBzcGVha2luZywgaXQncyBi ZXR0ZXIgdG8geW91IGV4cGFuZCBvbiB3aHkgdXNlcnNwYWNlIG5lZWRzIHRoaXMuIAo+IFRoZXJl J3MgYQo+IHZlcnkKPiBnb29kIGNoYW5jZSB0aGF0IGlmIGl0IG1ha2VzIHNlbnNlIGZvciBRdWFs Y29tbSwgaXQgbWFrZXMgc2Vuc2UgZm9yCj4gb3RoZXJzLiBJZgo+IHdlIGhhdmUgYW4gb3BlbiBk aXNjdXNzaW9uIGFib3V0IGl0LCBvdGhlcnMgbWlnaHQgY2hpbWUgaW4gd2l0aCAibWUgCj4gdG9v Igo+IGFuZAo+IHRoYXQgd2lsbCBoZWxwIHlvdXIgY2FzZSAoYW5kIHlvdSBtaWdodCBldmVuIGhv b2sgc29tZW9uZSBpbnRvIGRvaW5nIAo+IHRoZQo+IHdvcmsKPiBmb3IgeW91ISkuIEFsdGVybmF0 aXZlbHksIHdlIG1pZ2h0IGJlIGFibGUgdG8gc29sdmUgdGhlIHByb2JsZW0gaW4gYQo+IGRpZmZl cmVudAo+IHdheSB0aGF0IG1ha2VzIGV2ZXJ5b25lIGhhcHB5IChvciBtb3N0IGV2ZXJ5b25lIGhh cHB5KS4KPiAKPiBUaGVyZSdzIDEwMCUgYSBjYXNlIGZvciBhbGxvd2luZyB1c2Vyc3BhY2UgdG8g dHJpZ2dlciBhIGxvdy1sYXRlbmN5IAo+IG1vZGUKPiBhdCB0aGUKPiBleHBlbnNlIG9mIHBvd2Vy ICh3ZSBzaG91bGQgaGF2ZSBpdCBkaXNhYmxlIHRoZSBwc3IgZW50cnkgdGltZXIgYXMgCj4gd2Vs bCkuCj4gTGV0J3MKPiBzdGVlciB0aGlzIGNvbnZlcnNhdGlvbiBpbiB0aGUgZGlyZWN0aW9uIG9m ICJjYW4gd2UgdXNlIHNvbWV0aGluZyB0aGF0Cj4gYWxyZWFkeQo+IGV4aXN0cywgb3Igc2hvdWxk IHdlIGFkZCBzb21ldGhpbmcgbmV3PyIKPiAKPiBTZWFuCj4gClRoYW5rIHlvdSBTZWFuIGZvciB0 aGUgc3VnZ2VzdGlvbiEgSSBjYW4gdXNlIHRoZSBwcm9wb3NlZCBwcm9wZXJ0eSAKYXBwcm9hY2gg dG8Kc3dpdGNoIGJldHdlZW4gdmlkL2NtZCBtb2RlIGlmIGV2ZXJ5IHJlc29sdXRpb24gaXMgY2Fw YWJsZSBvZiBzd2l0Y2hpbmcKYmV0d2VlbiB0aGVzZSB0d28gbW9kZXMuIEJ1dCB3ZSBoYXZlIHVz ZXMgY2FzZXMgd2hlcmUgdGhlIHN3aXRjaCBpcwpyZXN0cmljdGVkIG9ubHkgYmV0d2VlbiBhIHNl dCBvZiByZXNvbHV0aW9ucy4KCkFsc28sIGFwcHJlY2lhdGUgeW91ciBndWlkYW5jZSBmb3IgZm9y bWF0aW5nIGNsb3NlZCB1c2VjYXNlIHF1ZXN0aW9ucy4gCkxldCBtZQpjaGVjayBob3cgbXVjaCBt b3JlIGRldGFpbHMgSSBjYW4gcHJvdmlkZSBvbiB3aHkgSC9XIGhhcyB0byBlbmZvcmNlIHN1Y2gK cmVzdHJpY3Rpb25zIGFuZCB3aWxsIHJldml2ZSB0aGUgdGhyZWFkIGlmIG5lZWRlZC4KClRoYW5r cyBhbmQgUmVnYXJkcywKSmV5a3VtYXIgUy4KCj4gCj4+IFNvIHdlIGFyZSB0cnlpbmcgdG8gZmlu ZCB3YXlzIHRvIHJlcHJlc2VudCB0aGUgc2FtZSByZXNvbHV0aW9uIGluIGJvdGgKPj4gdmlkZW8v Y21kIG1vZGVzLgo+PiAKPj4gVGhhbmtzIGFuZCBSZWdhcmRzLAo+PiBKZXlrdW1hciBTLgo+PiAK Pj4gPgo+PiA+ID4KPj4gPiA+IC0tCj4+ID4gPiBWaWxsZSBTeXJqw6Rsw6QKPj4gPiA+IEludGVs Cj4+IAo+PiAtLQo+PiBKZXlrdW1hciBTCj4gCj4gLS0KPiBTZWFuIFBhdWwsIFNvZnR3YXJlIEVu Z2luZWVyLCBHb29nbGUgLyBDaHJvbWl1bSBPUwoKLS0gCkpleWt1bWFyIFMKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KRnJlZWRyZW5vIG1haWxpbmcgbGlz dApGcmVlZHJlbm9AbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZnJlZWRyZW5v