From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932726AbcAYNQy (ORCPT ); Mon, 25 Jan 2016 08:16:54 -0500 Received: from mail-wm0-f45.google.com ([74.125.82.45]:33271 "EHLO mail-wm0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932118AbcAYNQt (ORCPT ); Mon, 25 Jan 2016 08:16:49 -0500 Subject: Re: linux-4.4 bisected: kwin5 stuck on kde5 loading screen with radeon To: =?UTF-8?Q?Michel_D=c3=a4nzer?= , =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= References: <569CC357.8030302@suse.cz> <569FEEDE.4060409@gmail.com> <56A053CE.7000500@daenzer.net> <56A06D2E.4000008@gmail.com> <56A07CF9.5060506@daenzer.net> <56A07D97.6030606@daenzer.net> <20160121075849.GH19130@phenom.ffwll.local> <56A0989E.30006@daenzer.net> <20160121100905.GL19130@phenom.ffwll.local> <56A19C98.8020208@daenzer.net> <20160122151835.GM23290@intel.com> <56A5A171.7000205@daenzer.net> Cc: Alex Deucher , Vlastimil Babka , LKML , dri-devel@lists.freedesktop.org, =?UTF-8?Q?Christian_K=c3=b6nig?= From: Mario Kleiner Message-ID: <56A6203D.3030803@gmail.com> Date: Mon, 25 Jan 2016 14:16:45 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <56A5A171.7000205@daenzer.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/25/2016 05:15 AM, Michel Dänzer wrote: > On 23.01.2016 00:18, Ville Syrjälä wrote: >> On Fri, Jan 22, 2016 at 12:06:00PM +0900, Michel Dänzer wrote: >>> >>> [ Trimming KDE folks from Cc ] >>> >>> On 21.01.2016 19:09, Daniel Vetter wrote: >>>> On Thu, Jan 21, 2016 at 05:36:46PM +0900, Michel Dänzer wrote: >>>>> On 21.01.2016 16:58, Daniel Vetter wrote: >>>>>> >>>>>> Can you please point me at the vblank on/off jump bug please? >>>>> >>>>> AFAIR I originally reported it in response to >>>>> http://lists.freedesktop.org/archives/dri-devel/2015-August/087841.html >>>>> , but I can't find that in the archives, so maybe that was just on IRC. >>>>> See >>>>> http://lists.freedesktop.org/archives/dri-devel/2016-January/099122.html >>>>> . Basically, I ran into the bug fixed by your patch because the counter >>>>> jumped forward on every DPMS off, so it hit the 32-bit boundary after >>>>> just a few days. >>>> >>>> Ok, so just uncovered the overflow bug. >>> >>> Not sure what you mean by "just", but to be clear: The drm_vblank_on/off >>> counter jumping bug (similar to the bug this thread is about), which >>> exposed the overflow bug, is still alive and kicking in 4.5. It seems >>> to happen when turning off the CRTC: >>> >>> [drm:drm_update_vblank_count] updating vblank count on crtc 0: current=218104694, diff=0, hw=916 hw_last=916 >>> [drm:radeon_get_vblank_counter_kms] crtc 0: dist from vblank start 3 >>> [drm:drm_calc_vbltimestamp_from_scanoutpos] crtc 0 : v 0x7 p(2199,-45)@ 7304.307354 -> 7304.308006 [e 0 us, 0 rep] >>> [drm:radeon_get_vblank_counter_kms] crtc 0: dist from vblank start 3 >>> [drm:drm_update_vblank_count] updating vblank count on crtc 0: current=218104694, diff=16776301, hw=1 hw_last=916 >> >> Not sure what bug we're talking about here, but here the hw counter >> clearly jumps backwards. >> >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>> [drm:drm_update_vblank_count] updating vblank count on crtc 1: current=0, diff=0, hw=0 hw_last=0 >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>> [drm:drm_update_vblank_count] updating vblank count on crtc 2: current=0, diff=0, hw=0 hw_last=0 >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>> [drm:drm_update_vblank_count] updating vblank count on crtc 3: current=0, diff=0, hw=0 hw_last=0 >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 1 >>> [drm:drm_calc_vbltimestamp_from_scanoutpos] crtc 0 : v 0x1 p(0,0)@ 7304.317140 -> 7304.317140 [e 0 us, 0 rep] >>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 1 >>> [drm:drm_update_vblank_count] updating vblank count on crtc 0: current=234880995, diff=16777215, hw=0 hw_last=1 >> >> Same here. > > At least one of the jumps is expected, because this is around turning > off the CRTC for DPMS off. Don't know yet why there are two jumps back > though. > > >> These things just don't happen on i915 because drm_vblank_off() and >> drm_vblank_on() are always called around the times when the hw counter >> might get reset. Or at least that's how it should be. > > Which is of course the idea of Daniel's patch (which is what I'm getting > the above with) or Mario's patch as well, but clearly something's still > wrong. It's certainly possible that it's something in the driver, but > since calling drm_vblank_pre/post_modeset from the same places seems to > work fine (ignoring the regression discussed in this thread)... Do > drm_vblank_on/off require something else to handle this correctly? > > I suspect it is because vblank_disable_and_save calls drm_update_vblank_count() unconditionally, even if vblank irqs are already off. So on a manual display disable -> reenable you get something like At disable: Call to dpms-off --> atombios_crtc_dpms(DPMS_OFF) --> drm_vblank_off -> vblank_disable_and_save -> irqs off, drm_update_vblank_count() computes final count. Then the crtc is shut down and its hw counter resets to zero. At reenable: Modesetting -> drm_crtc_helper_set_mode -> crtc_funcs->prepare(crtc) -> atombios_crtc_prepare() -> atombios_crtc_dpms(DPMS_OFF) -> drm_vblank_off -> vblank_disable_and_save -> A pointless drm_update_vblank_count() while the hw counter is already reset to zero --> Unwanted counter jump. The problem doesn't happen on a pure modeset to a different video resolution/refresh rate, as then we only have one call into atombios_crtc_dpms(DPMS_OFF). I think the fix is to fix vblank_disable_and_save() to only call drm_update_vblank_count() if vblank irqs get actually disabled, not on no-op calls. I will try that now. Otherwise kms drivers would have to be careful to never call drm_vblank_off multiple times before calling drm_vblank_on, but the help text to drm_vblank_on() claims that unbalanced calls to these functions are perfectly fine. -mario From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mario Kleiner Subject: Re: linux-4.4 bisected: kwin5 stuck on kde5 loading screen with radeon Date: Mon, 25 Jan 2016 14:16:45 +0100 Message-ID: <56A6203D.3030803@gmail.com> References: <569CC357.8030302@suse.cz> <569FEEDE.4060409@gmail.com> <56A053CE.7000500@daenzer.net> <56A06D2E.4000008@gmail.com> <56A07CF9.5060506@daenzer.net> <56A07D97.6030606@daenzer.net> <20160121075849.GH19130@phenom.ffwll.local> <56A0989E.30006@daenzer.net> <20160121100905.GL19130@phenom.ffwll.local> <56A19C98.8020208@daenzer.net> <20160122151835.GM23290@intel.com> <56A5A171.7000205@daenzer.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id CC8B36E07D for ; Mon, 25 Jan 2016 05:16:49 -0800 (PST) Received: by mail-wm0-f43.google.com with SMTP id 123so65145731wmz.0 for ; Mon, 25 Jan 2016 05:16:49 -0800 (PST) In-Reply-To: <56A5A171.7000205@daenzer.net> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: =?UTF-8?Q?Michel_D=c3=a4nzer?= , =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= Cc: Alex Deucher , dri-devel@lists.freedesktop.org, LKML , Vlastimil Babka , =?UTF-8?Q?Christian_K=c3=b6nig?= List-Id: dri-devel@lists.freedesktop.org CgpPbiAwMS8yNS8yMDE2IDA1OjE1IEFNLCBNaWNoZWwgRMOkbnplciB3cm90ZToKPiBPbiAyMy4w MS4yMDE2IDAwOjE4LCBWaWxsZSBTeXJqw6Rsw6Qgd3JvdGU6Cj4+IE9uIEZyaSwgSmFuIDIyLCAy MDE2IGF0IDEyOjA2OjAwUE0gKzA5MDAsIE1pY2hlbCBEw6RuemVyIHdyb3RlOgo+Pj4KPj4+IFsg VHJpbW1pbmcgS0RFIGZvbGtzIGZyb20gQ2MgXQo+Pj4KPj4+IE9uIDIxLjAxLjIwMTYgMTk6MDks IERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+Pj4gT24gVGh1LCBKYW4gMjEsIDIwMTYgYXQgMDU6MzY6 NDZQTSArMDkwMCwgTWljaGVsIETDpG56ZXIgd3JvdGU6Cj4+Pj4+IE9uIDIxLjAxLjIwMTYgMTY6 NTgsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+Pj4+Pgo+Pj4+Pj4gQ2FuIHlvdSBwbGVhc2UgcG9p bnQgbWUgYXQgdGhlIHZibGFuayBvbi9vZmYganVtcCBidWcgcGxlYXNlPwo+Pj4+Pgo+Pj4+PiBB RkFJUiBJIG9yaWdpbmFsbHkgcmVwb3J0ZWQgaXQgaW4gcmVzcG9uc2UgdG8KPj4+Pj4gaHR0cDov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9hcmNoaXZlcy9kcmktZGV2ZWwvMjAxNS1BdWd1c3QvMDg3 ODQxLmh0bWwKPj4+Pj4gLCBidXQgSSBjYW4ndCBmaW5kIHRoYXQgaW4gdGhlIGFyY2hpdmVzLCBz byBtYXliZSB0aGF0IHdhcyBqdXN0IG9uIElSQy4KPj4+Pj4gU2VlCj4+Pj4+IGh0dHA6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvYXJjaGl2ZXMvZHJpLWRldmVsLzIwMTYtSmFudWFyeS8wOTkxMjIu aHRtbAo+Pj4+PiAuIEJhc2ljYWxseSwgSSByYW4gaW50byB0aGUgYnVnIGZpeGVkIGJ5IHlvdXIg cGF0Y2ggYmVjYXVzZSB0aGUgY291bnRlcgo+Pj4+PiBqdW1wZWQgZm9yd2FyZCBvbiBldmVyeSBE UE1TIG9mZiwgc28gaXQgaGl0IHRoZSAzMi1iaXQgYm91bmRhcnkgYWZ0ZXIKPj4+Pj4ganVzdCBh IGZldyBkYXlzLgo+Pj4+Cj4+Pj4gT2ssIHNvIGp1c3QgdW5jb3ZlcmVkIHRoZSBvdmVyZmxvdyBi dWcuCj4+Pgo+Pj4gTm90IHN1cmUgd2hhdCB5b3UgbWVhbiBieSAianVzdCIsIGJ1dCB0byBiZSBj bGVhcjogVGhlIGRybV92Ymxhbmtfb24vb2ZmCj4+PiBjb3VudGVyIGp1bXBpbmcgYnVnIChzaW1p bGFyIHRvIHRoZSBidWcgdGhpcyB0aHJlYWQgaXMgYWJvdXQpLCB3aGljaAo+Pj4gZXhwb3NlZCB0 aGUgb3ZlcmZsb3cgYnVnLCBpcyBzdGlsbCBhbGl2ZSBhbmQga2lja2luZyBpbiA0LjUuIEl0IHNl ZW1zCj4+PiB0byBoYXBwZW4gd2hlbiB0dXJuaW5nIG9mZiB0aGUgQ1JUQzoKPj4+Cj4+PiBbZHJt OmRybV91cGRhdGVfdmJsYW5rX2NvdW50XSB1cGRhdGluZyB2YmxhbmsgY291bnQgb24gY3J0YyAw OiBjdXJyZW50PTIxODEwNDY5NCwgZGlmZj0wLCBodz05MTYgaHdfbGFzdD05MTYKPj4+IFtkcm06 cmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXNdIGNydGMgMDogZGlzdCBmcm9tIHZibGFuayBz dGFydCAzCj4+PiBbZHJtOmRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3NdIGNy dGMgMCA6IHYgMHg3IHAoMjE5OSwtNDUpQCA3MzA0LjMwNzM1NCAtPiA3MzA0LjMwODAwNiBbZSAw IHVzLCAwIHJlcF0KPj4+IFtkcm06cmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXNdIGNydGMg MDogZGlzdCBmcm9tIHZibGFuayBzdGFydCAzCj4+PiBbZHJtOmRybV91cGRhdGVfdmJsYW5rX2Nv dW50XSB1cGRhdGluZyB2YmxhbmsgY291bnQgb24gY3J0YyAwOiBjdXJyZW50PTIxODEwNDY5NCwg ZGlmZj0xNjc3NjMwMSwgaHc9MSBod19sYXN0PTkxNgo+Pgo+PiBOb3Qgc3VyZSB3aGF0IGJ1ZyB3 ZSdyZSB0YWxraW5nIGFib3V0IGhlcmUsIGJ1dCBoZXJlIHRoZSBodyBjb3VudGVyCj4+IGNsZWFy bHkganVtcHMgYmFja3dhcmRzLgo+Pgo+Pj4gW2RybTpyYWRlb25fZ2V0X3ZibGFua19jb3VudGVy X2ttc10gUXVlcnkgZmFpbGVkISBzdGF0IDMKPj4+IFtkcm06cmFkZW9uX2dldF92YmxhbmtfY291 bnRlcl9rbXNdIFF1ZXJ5IGZhaWxlZCEgc3RhdCAzCj4+PiBbZHJtOmRybV91cGRhdGVfdmJsYW5r X2NvdW50XSB1cGRhdGluZyB2YmxhbmsgY291bnQgb24gY3J0YyAxOiBjdXJyZW50PTAsIGRpZmY9 MCwgaHc9MCBod19sYXN0PTAKPj4+IFtkcm06cmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXNd IFF1ZXJ5IGZhaWxlZCEgc3RhdCAzCj4+PiBbZHJtOnJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXJf a21zXSBRdWVyeSBmYWlsZWQhIHN0YXQgMwo+Pj4gW2RybTpkcm1fdXBkYXRlX3ZibGFua19jb3Vu dF0gdXBkYXRpbmcgdmJsYW5rIGNvdW50IG9uIGNydGMgMjogY3VycmVudD0wLCBkaWZmPTAsIGh3 PTAgaHdfbGFzdD0wCj4+PiBbZHJtOnJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXJfa21zXSBRdWVy eSBmYWlsZWQhIHN0YXQgMwo+Pj4gW2RybTpyYWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttc10g UXVlcnkgZmFpbGVkISBzdGF0IDMKPj4+IFtkcm06ZHJtX3VwZGF0ZV92YmxhbmtfY291bnRdIHVw ZGF0aW5nIHZibGFuayBjb3VudCBvbiBjcnRjIDM6IGN1cnJlbnQ9MCwgZGlmZj0wLCBodz0wIGh3 X2xhc3Q9MAo+Pj4gW2RybTpyYWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttc10gUXVlcnkgZmFp bGVkISBzdGF0IDEKPj4+IFtkcm06ZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBv c10gY3J0YyAwIDogdiAweDEgcCgwLDApQCA3MzA0LjMxNzE0MCAtPiA3MzA0LjMxNzE0MCBbZSAw IHVzLCAwIHJlcF0KPj4+IFtkcm06cmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXNdIFF1ZXJ5 IGZhaWxlZCEgc3RhdCAxCj4+PiBbZHJtOmRybV91cGRhdGVfdmJsYW5rX2NvdW50XSB1cGRhdGlu ZyB2YmxhbmsgY291bnQgb24gY3J0YyAwOiBjdXJyZW50PTIzNDg4MDk5NSwgZGlmZj0xNjc3NzIx NSwgaHc9MCBod19sYXN0PTEKPj4KPj4gU2FtZSBoZXJlLgo+Cj4gQXQgbGVhc3Qgb25lIG9mIHRo ZSBqdW1wcyBpcyBleHBlY3RlZCwgYmVjYXVzZSB0aGlzIGlzIGFyb3VuZCB0dXJuaW5nCj4gb2Zm IHRoZSBDUlRDIGZvciBEUE1TIG9mZi4gRG9uJ3Qga25vdyB5ZXQgd2h5IHRoZXJlIGFyZSB0d28g anVtcHMgYmFjawo+IHRob3VnaC4KPgo+Cj4+IFRoZXNlIHRoaW5ncyBqdXN0IGRvbid0IGhhcHBl biBvbiBpOTE1IGJlY2F1c2UgZHJtX3ZibGFua19vZmYoKSBhbmQKPj4gZHJtX3ZibGFua19vbigp IGFyZSBhbHdheXMgY2FsbGVkIGFyb3VuZCB0aGUgdGltZXMgd2hlbiB0aGUgaHcgY291bnRlcgo+ PiBtaWdodCBnZXQgcmVzZXQuIE9yIGF0IGxlYXN0IHRoYXQncyBob3cgaXQgc2hvdWxkIGJlLgo+ Cj4gV2hpY2ggaXMgb2YgY291cnNlIHRoZSBpZGVhIG9mIERhbmllbCdzIHBhdGNoICh3aGljaCBp cyB3aGF0IEknbSBnZXR0aW5nCj4gdGhlIGFib3ZlIHdpdGgpIG9yIE1hcmlvJ3MgcGF0Y2ggYXMg d2VsbCwgYnV0IGNsZWFybHkgc29tZXRoaW5nJ3Mgc3RpbGwKPiB3cm9uZy4gSXQncyBjZXJ0YWlu bHkgcG9zc2libGUgdGhhdCBpdCdzIHNvbWV0aGluZyBpbiB0aGUgZHJpdmVyLCBidXQKPiBzaW5j ZSBjYWxsaW5nIGRybV92YmxhbmtfcHJlL3Bvc3RfbW9kZXNldCBmcm9tIHRoZSBzYW1lIHBsYWNl cyBzZWVtcyB0bwo+IHdvcmsgZmluZSAoaWdub3JpbmcgdGhlIHJlZ3Jlc3Npb24gZGlzY3Vzc2Vk IGluIHRoaXMgdGhyZWFkKS4uLiBEbwo+IGRybV92Ymxhbmtfb24vb2ZmIHJlcXVpcmUgc29tZXRo aW5nIGVsc2UgdG8gaGFuZGxlIHRoaXMgY29ycmVjdGx5Pwo+Cj4KCkkgc3VzcGVjdCBpdCBpcyBi ZWNhdXNlIHZibGFua19kaXNhYmxlX2FuZF9zYXZlIGNhbGxzIApkcm1fdXBkYXRlX3ZibGFua19j b3VudCgpIHVuY29uZGl0aW9uYWxseSwgZXZlbiBpZiB2YmxhbmsgaXJxcyBhcmUgCmFscmVhZHkg b2ZmLgoKU28gb24gYSBtYW51YWwgZGlzcGxheSBkaXNhYmxlIC0+IHJlZW5hYmxlIHlvdSBnZXQg c29tZXRoaW5nIGxpa2UKCkF0IGRpc2FibGU6CgpDYWxsIHRvIGRwbXMtb2ZmIC0tPiBhdG9tYmlv c19jcnRjX2RwbXMoRFBNU19PRkYpIC0tPiBkcm1fdmJsYW5rX29mZiAtPiAKdmJsYW5rX2Rpc2Fi bGVfYW5kX3NhdmUgLT4gaXJxcyBvZmYsIGRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkgY29tcHV0 ZXMgCmZpbmFsIGNvdW50LgoKVGhlbiB0aGUgY3J0YyBpcyBzaHV0IGRvd24gYW5kIGl0cyBodyBj b3VudGVyIHJlc2V0cyB0byB6ZXJvLgoKQXQgcmVlbmFibGU6CgpNb2Rlc2V0dGluZyAtPiBkcm1f Y3J0Y19oZWxwZXJfc2V0X21vZGUgLT4gY3J0Y19mdW5jcy0+cHJlcGFyZShjcnRjKSAtPiAKYXRv bWJpb3NfY3J0Y19wcmVwYXJlKCkgLT4gYXRvbWJpb3NfY3J0Y19kcG1zKERQTVNfT0ZGKSAtPiAK ZHJtX3ZibGFua19vZmYgLT4gdmJsYW5rX2Rpc2FibGVfYW5kX3NhdmUgLT4gQSBwb2ludGxlc3Mg CmRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkgd2hpbGUgdGhlIGh3IGNvdW50ZXIgaXMgYWxyZWFk eSByZXNldCB0byB6ZXJvIAotLT4gVW53YW50ZWQgY291bnRlciBqdW1wLgoKClRoZSBwcm9ibGVt IGRvZXNuJ3QgaGFwcGVuIG9uIGEgcHVyZSBtb2Rlc2V0IHRvIGEgZGlmZmVyZW50IHZpZGVvIApy ZXNvbHV0aW9uL3JlZnJlc2ggcmF0ZSwgYXMgdGhlbiB3ZSBvbmx5IGhhdmUgb25lIGNhbGwgaW50 byAKYXRvbWJpb3NfY3J0Y19kcG1zKERQTVNfT0ZGKS4KCkkgdGhpbmsgdGhlIGZpeCBpcyB0byBm aXggdmJsYW5rX2Rpc2FibGVfYW5kX3NhdmUoKSB0byBvbmx5IGNhbGwgCmRybV91cGRhdGVfdmJs YW5rX2NvdW50KCkgaWYgdmJsYW5rIGlycXMgZ2V0IGFjdHVhbGx5IGRpc2FibGVkLCBub3Qgb24g Cm5vLW9wIGNhbGxzLiBJIHdpbGwgdHJ5IHRoYXQgbm93LgoKT3RoZXJ3aXNlIGttcyBkcml2ZXJz IHdvdWxkIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBuZXZlciBjYWxsIApkcm1fdmJsYW5rX29mZiBt dWx0aXBsZSB0aW1lcyBiZWZvcmUgY2FsbGluZyBkcm1fdmJsYW5rX29uLCBidXQgdGhlIGhlbHAg CnRleHQgdG8gZHJtX3ZibGFua19vbigpIGNsYWltcyB0aGF0IHVuYmFsYW5jZWQgY2FsbHMgdG8g dGhlc2UgZnVuY3Rpb25zIAphcmUgcGVyZmVjdGx5IGZpbmUuCgotbWFyaW8KCgoKCgoKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFp bGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=