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=-7.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT 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 A39B8C43381 for ; Thu, 21 Feb 2019 08:23:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6AAE120818 for ; Thu, 21 Feb 2019 08:23:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="hA/PV4uK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727055AbfBUIXY (ORCPT ); Thu, 21 Feb 2019 03:23:24 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:55176 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725891AbfBUIXY (ORCPT ); Thu, 21 Feb 2019 03:23:24 -0500 Received: from pendragon.ideasonboard.com (dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0F817255; Thu, 21 Feb 2019 09:23:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1550737402; bh=79pJL4OzZb76gYTmQX/C8HlRAqgUQkuB7qPlrbJhzn8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=hA/PV4uKz2vi3VzqEKHNkS3Mfl7OGCYPybnAQFhYs7RTFRtmsOKpqTgWb6jkpOUc/ ZhGd4OMlzSYHLeH/erJig459zxYojSTf6xPDxbfQBjY0XTkHUIL7U3SoBGPWQldARs oD7me1t2wlYVy/QgAVn+KMLMawZcEwwGXlBQ4dQo= Date: Thu, 21 Feb 2019 10:23:17 +0200 From: Laurent Pinchart To: Brian Starkey Cc: Laurent Pinchart , nd , Kieran Bingham , "dri-devel@lists.freedesktop.org" , "linux-media@vger.kernel.org" Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Message-ID: <20190221082317.GB3451@pendragon.ideasonboard.com> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Hi Brian, On Mon, Feb 18, 2019 at 12:22:58PM +0000, Brian Starkey wrote: > On Sun, Feb 17, 2019 at 04:48:45AM +0200, Laurent Pinchart wrote: > > Hello, > > > > This patch series implements display writeback support for the R-Car > > Gen3 platforms in the VSP1 driver. > > > > DRM/KMS provides a writeback API through a special type of writeback > > connectors. This series takes a different approach by exposing writeback > > as a V4L2 device. While there is nothing fundamentally wrong with > > writeback connectors, display for R-Car Gen3 platforms relies on the > > VSP1 driver behind the scene, which already implements V4L2 support. > > Enabling writeback through V4L2 is thus significantly easier in this > > case. > > How does this look to an application? (I'm entirely ignorant about > R-Car). They are interacting with the DRM device, and then need to > open and configure a v4l2 device to get the writeback? Can the process > which isn't controlling the DRM device independently capture the > screen output? > > I didn't see any major complication to implementing this as a > writeback connector. If you want/need to use the vb2_queue, couldn't > you just do that entirely from within the kernel? > > Honestly (predictably?), to me it seems like a bad idea to introduce a > second, non-compatible interface for display writeback. Any > application interested in display writeback (e.g. compositors) will > need to implement both in order to support all HW. drm_hwcomposer > already supports writeback via DRM writeback connectors. > > While I can see the advantages of having writeback exposed via v4l2 > for streaming use-cases, I think it would be better to have it done in > such a way that it works for all writeback connectors, rather than > being VSP1-specific. That would allow any application to choose > whichever method is most appropriate for their use-case, without > limiting themselves to a subset of hardware. So I gave writeback connectors a go, and it wasn't very pretty. There writeback support in the DRM core leaks jobs, and is missing support for the equivalent of .prepare_fb()/.cleanup_fb(), which requires per-job driver-specific data. I'm working on these issues and will submit patches. In the meantime, I need to test my implementation, so I need a command line application that will let me exercise the API. I assume you've tested your code, haven't you ? :-) Could you tell me how I can test writeback ? > > The writeback pixel format is restricted to RGB, due to the VSP1 > > outputting RGB to the display and lacking a separate colour space > > conversion unit for writeback. The resolution can be freely picked by > > will result in cropping or composing, not scaling. > > > > Writeback requests are queued to the hardware on page flip (atomic > > flush), and complete at the next vblank. This means that a queued > > writeback buffer will not be processed until the next page flip, but > > once it starts being written to by the VSP, it will complete at the next > > vblank regardless of whether another page flip occurs at that time. > > This sounds the same as mali-dp, and so fits directly with the > semantics of writeback connectors. > > > The code is based on a merge of the media master branch, the drm-next > > branch and the R-Car DT next branch. For convenience patches can be > > found at > > > > git://linuxtv.org/pinchartl/media.git v4l2/vsp1/writeback > > > > Kieran Bingham (2): > > Revert "[media] v4l: vsp1: Supply frames to the DU continuously" > > media: vsp1: Provide a writeback video device > > > > Laurent Pinchart (5): > > media: vsp1: wpf: Fix partition configuration for display pipelines > > media: vsp1: Replace leftover occurrence of fragment with body > > media: vsp1: Fix addresses of display-related registers for VSP-DL > > media: vsp1: Refactor vsp1_video_complete_buffer() for later reuse > > media: vsp1: Replace the display list internal flag with a flags field > > > > drivers/media/platform/vsp1/vsp1_dl.c | 118 ++++++++++++-- > > drivers/media/platform/vsp1/vsp1_dl.h | 6 +- > > drivers/media/platform/vsp1/vsp1_drm.c | 24 ++- > > drivers/media/platform/vsp1/vsp1_drv.c | 17 +- > > drivers/media/platform/vsp1/vsp1_pipe.c | 5 + > > drivers/media/platform/vsp1/vsp1_pipe.h | 6 + > > drivers/media/platform/vsp1/vsp1_regs.h | 6 +- > > drivers/media/platform/vsp1/vsp1_rwpf.h | 2 + > > drivers/media/platform/vsp1/vsp1_video.c | 198 +++++++++++++++++++---- > > drivers/media/platform/vsp1/vsp1_video.h | 6 + > > drivers/media/platform/vsp1/vsp1_wpf.c | 65 ++++++-- > > 11 files changed, 378 insertions(+), 75 deletions(-) -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Date: Thu, 21 Feb 2019 10:23:17 +0200 Message-ID: <20190221082317.GB3451@pendragon.ideasonboard.com> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id C2DD18936E for ; Thu, 21 Feb 2019 08:23:23 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Brian Starkey Cc: nd , Laurent Pinchart , Kieran Bingham , "dri-devel@lists.freedesktop.org" , "linux-media@vger.kernel.org" List-Id: dri-devel@lists.freedesktop.org SGkgQnJpYW4sCgpPbiBNb24sIEZlYiAxOCwgMjAxOSBhdCAxMjoyMjo1OFBNICswMDAwLCBCcmlh biBTdGFya2V5IHdyb3RlOgo+IE9uIFN1biwgRmViIDE3LCAyMDE5IGF0IDA0OjQ4OjQ1QU0gKzAy MDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiBIZWxsbywKPiA+IAo+ID4gVGhpcyBwYXRj aCBzZXJpZXMgaW1wbGVtZW50cyBkaXNwbGF5IHdyaXRlYmFjayBzdXBwb3J0IGZvciB0aGUgUi1D YXIKPiA+IEdlbjMgcGxhdGZvcm1zIGluIHRoZSBWU1AxIGRyaXZlci4KPiA+IAo+ID4gRFJNL0tN UyBwcm92aWRlcyBhIHdyaXRlYmFjayBBUEkgdGhyb3VnaCBhIHNwZWNpYWwgdHlwZSBvZiB3cml0 ZWJhY2sKPiA+IGNvbm5lY3RvcnMuIFRoaXMgc2VyaWVzIHRha2VzIGEgZGlmZmVyZW50IGFwcHJv YWNoIGJ5IGV4cG9zaW5nIHdyaXRlYmFjawo+ID4gYXMgYSBWNEwyIGRldmljZS4gV2hpbGUgdGhl cmUgaXMgbm90aGluZyBmdW5kYW1lbnRhbGx5IHdyb25nIHdpdGgKPiA+IHdyaXRlYmFjayBjb25u ZWN0b3JzLCBkaXNwbGF5IGZvciBSLUNhciBHZW4zIHBsYXRmb3JtcyByZWxpZXMgb24gdGhlCj4g PiBWU1AxIGRyaXZlciBiZWhpbmQgdGhlIHNjZW5lLCB3aGljaCBhbHJlYWR5IGltcGxlbWVudHMg VjRMMiBzdXBwb3J0Lgo+ID4gRW5hYmxpbmcgd3JpdGViYWNrIHRocm91Z2ggVjRMMiBpcyB0aHVz IHNpZ25pZmljYW50bHkgZWFzaWVyIGluIHRoaXMKPiA+IGNhc2UuCj4gCj4gSG93IGRvZXMgdGhp cyBsb29rIHRvIGFuIGFwcGxpY2F0aW9uPyAoSSdtIGVudGlyZWx5IGlnbm9yYW50IGFib3V0Cj4g Ui1DYXIpLiBUaGV5IGFyZSBpbnRlcmFjdGluZyB3aXRoIHRoZSBEUk0gZGV2aWNlLCBhbmQgdGhl biBuZWVkIHRvCj4gb3BlbiBhbmQgY29uZmlndXJlIGEgdjRsMiBkZXZpY2UgdG8gZ2V0IHRoZSB3 cml0ZWJhY2s/IENhbiB0aGUgcHJvY2Vzcwo+IHdoaWNoIGlzbid0IGNvbnRyb2xsaW5nIHRoZSBE Uk0gZGV2aWNlIGluZGVwZW5kZW50bHkgY2FwdHVyZSB0aGUKPiBzY3JlZW4gb3V0cHV0Pwo+IAo+ IEkgZGlkbid0IHNlZSBhbnkgbWFqb3IgY29tcGxpY2F0aW9uIHRvIGltcGxlbWVudGluZyB0aGlz IGFzIGEKPiB3cml0ZWJhY2sgY29ubmVjdG9yLiBJZiB5b3Ugd2FudC9uZWVkIHRvIHVzZSB0aGUg dmIyX3F1ZXVlLCBjb3VsZG4ndAo+IHlvdSBqdXN0IGRvIHRoYXQgZW50aXJlbHkgZnJvbSB3aXRo aW4gdGhlIGtlcm5lbD8KPiAKPiBIb25lc3RseSAocHJlZGljdGFibHk/KSwgdG8gbWUgaXQgc2Vl bXMgbGlrZSBhIGJhZCBpZGVhIHRvIGludHJvZHVjZSBhCj4gc2Vjb25kLCBub24tY29tcGF0aWJs ZSBpbnRlcmZhY2UgZm9yIGRpc3BsYXkgd3JpdGViYWNrLiBBbnkKPiBhcHBsaWNhdGlvbiBpbnRl cmVzdGVkIGluIGRpc3BsYXkgd3JpdGViYWNrIChlLmcuIGNvbXBvc2l0b3JzKSB3aWxsCj4gbmVl ZCB0byBpbXBsZW1lbnQgYm90aCBpbiBvcmRlciB0byBzdXBwb3J0IGFsbCBIVy4gZHJtX2h3Y29t cG9zZXIKPiBhbHJlYWR5IHN1cHBvcnRzIHdyaXRlYmFjayB2aWEgRFJNIHdyaXRlYmFjayBjb25u ZWN0b3JzLgo+IAo+IFdoaWxlIEkgY2FuIHNlZSB0aGUgYWR2YW50YWdlcyBvZiBoYXZpbmcgd3Jp dGViYWNrIGV4cG9zZWQgdmlhIHY0bDIKPiBmb3Igc3RyZWFtaW5nIHVzZS1jYXNlcywgSSB0aGlu ayBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBpdCBkb25lIGluCj4gc3VjaCBhIHdheSB0aGF0 IGl0IHdvcmtzIGZvciBhbGwgd3JpdGViYWNrIGNvbm5lY3RvcnMsIHJhdGhlciB0aGFuCj4gYmVp bmcgVlNQMS1zcGVjaWZpYy4gVGhhdCB3b3VsZCBhbGxvdyBhbnkgYXBwbGljYXRpb24gdG8gY2hv b3NlCj4gd2hpY2hldmVyIG1ldGhvZCBpcyBtb3N0IGFwcHJvcHJpYXRlIGZvciB0aGVpciB1c2Ut Y2FzZSwgd2l0aG91dAo+IGxpbWl0aW5nIHRoZW1zZWx2ZXMgdG8gYSBzdWJzZXQgb2YgaGFyZHdh cmUuCgpTbyBJIGdhdmUgd3JpdGViYWNrIGNvbm5lY3RvcnMgYSBnbywgYW5kIGl0IHdhc24ndCB2 ZXJ5IHByZXR0eS4gVGhlcmUKd3JpdGViYWNrIHN1cHBvcnQgaW4gdGhlIERSTSBjb3JlIGxlYWtz IGpvYnMsIGFuZCBpcyBtaXNzaW5nIHN1cHBvcnQgZm9yCnRoZSBlcXVpdmFsZW50IG9mIC5wcmVw YXJlX2ZiKCkvLmNsZWFudXBfZmIoKSwgd2hpY2ggcmVxdWlyZXMgcGVyLWpvYgpkcml2ZXItc3Bl Y2lmaWMgZGF0YS4gSSdtIHdvcmtpbmcgb24gdGhlc2UgaXNzdWVzIGFuZCB3aWxsIHN1Ym1pdApw YXRjaGVzLgoKSW4gdGhlIG1lYW50aW1lLCBJIG5lZWQgdG8gdGVzdCBteSBpbXBsZW1lbnRhdGlv biwgc28gSSBuZWVkIGEgY29tbWFuZApsaW5lIGFwcGxpY2F0aW9uIHRoYXQgd2lsbCBsZXQgbWUg ZXhlcmNpc2UgdGhlIEFQSS4gSSBhc3N1bWUgeW91J3ZlCnRlc3RlZCB5b3VyIGNvZGUsIGhhdmVu J3QgeW91ID8gOi0pIENvdWxkIHlvdSB0ZWxsIG1lIGhvdyBJIGNhbiB0ZXN0CndyaXRlYmFjayA/ Cgo+ID4gVGhlIHdyaXRlYmFjayBwaXhlbCBmb3JtYXQgaXMgcmVzdHJpY3RlZCB0byBSR0IsIGR1 ZSB0byB0aGUgVlNQMQo+ID4gb3V0cHV0dGluZyBSR0IgdG8gdGhlIGRpc3BsYXkgYW5kIGxhY2tp bmcgYSBzZXBhcmF0ZSBjb2xvdXIgc3BhY2UKPiA+IGNvbnZlcnNpb24gdW5pdCBmb3Igd3JpdGVi YWNrLiBUaGUgcmVzb2x1dGlvbiBjYW4gYmUgZnJlZWx5IHBpY2tlZCBieQo+ID4gd2lsbCByZXN1 bHQgaW4gY3JvcHBpbmcgb3IgY29tcG9zaW5nLCBub3Qgc2NhbGluZy4KPiA+IAo+ID4gV3JpdGVi YWNrIHJlcXVlc3RzIGFyZSBxdWV1ZWQgdG8gdGhlIGhhcmR3YXJlIG9uIHBhZ2UgZmxpcCAoYXRv bWljCj4gPiBmbHVzaCksIGFuZCBjb21wbGV0ZSBhdCB0aGUgbmV4dCB2YmxhbmsuIFRoaXMgbWVh bnMgdGhhdCBhIHF1ZXVlZAo+ID4gd3JpdGViYWNrIGJ1ZmZlciB3aWxsIG5vdCBiZSBwcm9jZXNz ZWQgdW50aWwgdGhlIG5leHQgcGFnZSBmbGlwLCBidXQKPiA+IG9uY2UgaXQgc3RhcnRzIGJlaW5n IHdyaXR0ZW4gdG8gYnkgdGhlIFZTUCwgaXQgd2lsbCBjb21wbGV0ZSBhdCB0aGUgbmV4dAo+ID4g dmJsYW5rIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbm90aGVyIHBhZ2UgZmxpcCBvY2N1cnMgYXQg dGhhdCB0aW1lLgo+IAo+IFRoaXMgc291bmRzIHRoZSBzYW1lIGFzIG1hbGktZHAsIGFuZCBzbyBm aXRzIGRpcmVjdGx5IHdpdGggdGhlCj4gc2VtYW50aWNzIG9mIHdyaXRlYmFjayBjb25uZWN0b3Jz Lgo+IAo+ID4gVGhlIGNvZGUgaXMgYmFzZWQgb24gYSBtZXJnZSBvZiB0aGUgbWVkaWEgbWFzdGVy IGJyYW5jaCwgdGhlIGRybS1uZXh0Cj4gPiBicmFuY2ggYW5kIHRoZSBSLUNhciBEVCBuZXh0IGJy YW5jaC4gRm9yIGNvbnZlbmllbmNlIHBhdGNoZXMgY2FuIGJlCj4gPiBmb3VuZCBhdAo+ID4gCj4g PiAJZ2l0Oi8vbGludXh0di5vcmcvcGluY2hhcnRsL21lZGlhLmdpdCB2NGwyL3ZzcDEvd3JpdGVi YWNrCj4gPiAKPiA+IEtpZXJhbiBCaW5naGFtICgyKToKPiA+ICAgUmV2ZXJ0ICJbbWVkaWFdIHY0 bDogdnNwMTogU3VwcGx5IGZyYW1lcyB0byB0aGUgRFUgY29udGludW91c2x5Igo+ID4gICBtZWRp YTogdnNwMTogUHJvdmlkZSBhIHdyaXRlYmFjayB2aWRlbyBkZXZpY2UKPiA+IAo+ID4gTGF1cmVu dCBQaW5jaGFydCAoNSk6Cj4gPiAgIG1lZGlhOiB2c3AxOiB3cGY6IEZpeCBwYXJ0aXRpb24gY29u ZmlndXJhdGlvbiBmb3IgZGlzcGxheSBwaXBlbGluZXMKPiA+ICAgbWVkaWE6IHZzcDE6IFJlcGxh Y2UgbGVmdG92ZXIgb2NjdXJyZW5jZSBvZiBmcmFnbWVudCB3aXRoIGJvZHkKPiA+ICAgbWVkaWE6 IHZzcDE6IEZpeCBhZGRyZXNzZXMgb2YgZGlzcGxheS1yZWxhdGVkIHJlZ2lzdGVycyBmb3IgVlNQ LURMCj4gPiAgIG1lZGlhOiB2c3AxOiBSZWZhY3RvciB2c3AxX3ZpZGVvX2NvbXBsZXRlX2J1ZmZl cigpIGZvciBsYXRlciByZXVzZQo+ID4gICBtZWRpYTogdnNwMTogUmVwbGFjZSB0aGUgZGlzcGxh eSBsaXN0IGludGVybmFsIGZsYWcgd2l0aCBhIGZsYWdzIGZpZWxkCj4gPiAKPiA+ICBkcml2ZXJz L21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9kbC5jICAgIHwgMTE4ICsrKysrKysrKysrKy0tCj4g PiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZGwuaCAgICB8ICAgNiArLQo+ID4g IGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2RybS5jICAgfCAgMjQgKystCj4gPiAg ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJ2LmMgICB8ICAxNyArLQo+ID4gIGRy aXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3BpcGUuYyAgfCAgIDUgKwo+ID4gIGRyaXZl cnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3BpcGUuaCAgfCAgIDYgKwo+ID4gIGRyaXZlcnMv bWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3JlZ3MuaCAgfCAgIDYgKy0KPiA+ICBkcml2ZXJzL21l ZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yd3BmLmggIHwgICAyICsKPiA+ICBkcml2ZXJzL21lZGlh L3BsYXRmb3JtL3ZzcDEvdnNwMV92aWRlby5jIHwgMTk4ICsrKysrKysrKysrKysrKysrKystLS0t Cj4gPiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfdmlkZW8uaCB8ICAgNiArCj4g PiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfd3BmLmMgICB8ICA2NSArKysrKyst LQo+ID4gIDExIGZpbGVzIGNoYW5nZWQsIDM3OCBpbnNlcnRpb25zKCspLCA3NSBkZWxldGlvbnMo LSkKCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydApfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZl bEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWw=