From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752306AbeDSITn (ORCPT ); Thu, 19 Apr 2018 04:19:43 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:36609 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750884AbeDSITl (ORCPT ); Thu, 19 Apr 2018 04:19:41 -0400 X-Google-Smtp-Source: AIpwx48fYDTxpkquZrawRPjE+z7tjcNRCykUIBUjv2hhTZ3cWWK2b8VxnZT3RETxHnab4LfrzDeKZA== Subject: Re: [Xen-devel] [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver To: Dongwon Kim Cc: =?UTF-8?Q?Roger_Pau_Monn=c3=a9?= , Paul Durrant , "jgross@suse.com" , Artem Mygaiev , "airlied@linux.ie" , "Oleksandr_Andrushchenko@epam.com" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "Potrola, MateuszX" , "xen-devel@lists.xenproject.org" , "daniel.vetter@intel.com" , "boris.ostrovsky@oracle.com" , Matt Roper References: <20180417075928.GT31310@phenom.ffwll.local> <20180417205744.GA15930@downor-Z87X-UD5H> <41487acb-a67a-8933-d0c3-702c19b0938e@gmail.com> <20180418073508.ptvntwedczpvl7bx@MacBook-Pro-de-Roger.local> <20180418101058.hyqk3gr3b2ibxswu@MacBook-Pro-de-Roger.local> <7d6710a76b9a42299139d7914358ed52@AMSPEX02CL03.citrite.net> <46489b33-e6fc-b874-6cd4-dbb94c002ef8@gmail.com> <20180418105526.a4qtlhofrn3gubsl@MacBook-Pro-de-Roger.local> <11ec6f16-6eff-6439-2e66-f1ef14cdff21@gmail.com> <20180418160115.GA20588@downor-Z87X-UD5H> From: Oleksandr Andrushchenko Message-ID: Date: Thu, 19 Apr 2018 11:19:38 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <20180418160115.GA20588@downor-Z87X-UD5H> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/18/2018 07:01 PM, Dongwon Kim wrote: > On Wed, Apr 18, 2018 at 03:42:29PM +0300, Oleksandr Andrushchenko wrote: >> On 04/18/2018 01:55 PM, Roger Pau Monné wrote: >>> On Wed, Apr 18, 2018 at 01:39:35PM +0300, Oleksandr Andrushchenko wrote: >>>> On 04/18/2018 01:18 PM, Paul Durrant wrote: >>>>>> -----Original Message----- >>>>>> From: Xen-devel [mailto:xen-devel-bounces@lists.xenproject.org] On Behalf >>>>>> Of Roger Pau Monné >>>>>> Sent: 18 April 2018 11:11 >>>>>> To: Oleksandr Andrushchenko >>>>>> Cc: jgross@suse.com; Artem Mygaiev ; >>>>>> Dongwon Kim ; airlied@linux.ie; >>>>>> Oleksandr_Andrushchenko@epam.com; linux-kernel@vger.kernel.org; dri- >>>>>> devel@lists.freedesktop.org; Potrola, MateuszX >>>>>> ; xen-devel@lists.xenproject.org; >>>>>> daniel.vetter@intel.com; boris.ostrovsky@oracle.com; Matt Roper >>>>>> >>>>>> Subject: Re: [Xen-devel] [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy >>>>>> helper DRM driver >>>>>> >>>>>> On Wed, Apr 18, 2018 at 11:01:12AM +0300, Oleksandr Andrushchenko >>>>>> wrote: >>>>>>> On 04/18/2018 10:35 AM, Roger Pau Monné wrote: >>>>>> After speaking with Oleksandr on IRC, I think the main usage of the >>>>>> gntdev extension is to: >>>>>> >>>>>> 1. Create a dma-buf from a set of grant references. >>>>>> 2. Share dma-buf and get a list of grant references. >>>>>> >>>>>> I think this set of operations could be broken into: >>>>>> >>>>>> 1.1 Map grant references into user-space using the gntdev. >>>>>> 1.2 Create a dma-buf out of a set of user-space virtual addresses. >>>>>> >>>>>> 2.1 Map a dma-buf into user-space. >>>>>> 2.2 Get grefs out of the user-space addresses where the dma-buf is >>>>>> mapped. >>>>>> >>>>>> So it seems like what's actually missing is a way to: >>>>>> >>>>>> - Create a dma-buf from a list of user-space virtual addresses. >>>>>> - Allow to map a dma-buf into user-space, so it can then be used with >>>>>> the gntdev. >>>>>> >>>>>> I think this is generic enough that it could be implemented by a >>>>>> device not tied to Xen. AFAICT the hyper_dma guys also wanted >>>>>> something similar to this. >>>> Ok, so just to summarize, xen-zcopy/hyper-dmabuf as they are now, >>>> are no go from your POV? > FYI, > > our use-case is "surface sharing" or "graphic obj sharing" where a client > application in one guest renders and export this render target(e.g. EGL surface) > as dma-buf. This dma-buf is then exported to another guest/host via hyper_dmabuf > drv where a compositor is running. This importing domain creates a dmabuf with > shared reference then it is imported as EGL image that later can be used as > texture object via EGL api. > Mapping dmabuf to the userspace or vice versa > might be possible with modifying user space drivers/applications but it is an > unnecessary extra step from our perspective. +1. I also feel like if it is implemented in the kernel space it will be *much* more easier then inventing workarounds with gntdev, user-space and helper dma-buf driver (which obviously can be implemented). Of course, this approach is easier for Xen as we do not touch its kernel code ;) But there is a demand for changes as number of embedded/multimedia use-cases is constantly growing and we have to react. > Also, we want to keep all objects > in the kernel level. > >>> My opinion is that there seems to be a more generic way to implement >>> this, and thus I would prefer that one. >>> >>>> Instead, we have to make all that fancy stuff >>>> with VAs <-> device-X and have that device-X driver live out of drivers/xen >>>> as it is not a Xen specific driver? >>> That would be my preference if feasible, simply because it can be >>> reused by other use-cases that need to create dma-bufs in user-space. >> There is a use-case I have: a display unit on my target has a DMA >> controller which can't do scatter-gather, e.g. it only expects a >> single starting address of the buffer. >> In order to create a dma-buf from grefs in this case >> I allocate memory with dma_alloc_xxx and then balloon pages of the >> buffer and finally map grefs onto this DMA buffer. >> This way I can give this shared buffer to the display unit as its bus >> addresses are contiguous. >> >> With the proposed solution (gntdev + device-X) I won't be able to achieve >> this, >> as I have no control over from where gntdev/balloon drivers get the pages >> (even more, those can easily be out of DMA address space of the display >> unit). >> >> Thus, even if implemented, I can't use this approach. >>> In any case I just knew about dma-bufs this morning, there might be >>> things that I'm missing. >>> >>> Roger. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [Xen-devel] [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver Date: Thu, 19 Apr 2018 11:19:38 +0300 Message-ID: References: <20180417075928.GT31310@phenom.ffwll.local> <20180417205744.GA15930@downor-Z87X-UD5H> <41487acb-a67a-8933-d0c3-702c19b0938e@gmail.com> <20180418073508.ptvntwedczpvl7bx@MacBook-Pro-de-Roger.local> <20180418101058.hyqk3gr3b2ibxswu@MacBook-Pro-de-Roger.local> <7d6710a76b9a42299139d7914358ed52@AMSPEX02CL03.citrite.net> <46489b33-e6fc-b874-6cd4-dbb94c002ef8@gmail.com> <20180418105526.a4qtlhofrn3gubsl@MacBook-Pro-de-Roger.local> <11ec6f16-6eff-6439-2e66-f1ef14cdff21@gmail.com> <20180418160115.GA20588@downor-Z87X-UD5H> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x244.google.com (mail-lf0-x244.google.com [IPv6:2a00:1450:4010:c07::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id A82DD6E5DA for ; Thu, 19 Apr 2018 08:19:41 +0000 (UTC) Received: by mail-lf0-x244.google.com with SMTP id r125-v6so6488203lfe.2 for ; Thu, 19 Apr 2018 01:19:41 -0700 (PDT) In-Reply-To: <20180418160115.GA20588@downor-Z87X-UD5H> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Dongwon Kim Cc: "jgross@suse.com" , Artem Mygaiev , "Oleksandr_Andrushchenko@epam.com" , "airlied@linux.ie" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , Paul Durrant , "Potrola, MateuszX" , "daniel.vetter@intel.com" , "xen-devel@lists.xenproject.org" , "boris.ostrovsky@oracle.com" , =?UTF-8?Q?Roger_Pau_Monn=c3=a9?= List-Id: dri-devel@lists.freedesktop.org T24gMDQvMTgvMjAxOCAwNzowMSBQTSwgRG9uZ3dvbiBLaW0gd3JvdGU6Cj4gT24gV2VkLCBBcHIg MTgsIDIwMTggYXQgMDM6NDI6MjlQTSArMDMwMCwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3Jv dGU6Cj4+IE9uIDA0LzE4LzIwMTggMDE6NTUgUE0sIFJvZ2VyIFBhdSBNb25uw6kgd3JvdGU6Cj4+ PiBPbiBXZWQsIEFwciAxOCwgMjAxOCBhdCAwMTozOTozNVBNICswMzAwLCBPbGVrc2FuZHIgQW5k cnVzaGNoZW5rbyB3cm90ZToKPj4+PiBPbiAwNC8xOC8yMDE4IDAxOjE4IFBNLCBQYXVsIER1cnJh bnQgd3JvdGU6Cj4+Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+Pj4+Pj4gRnJvbTog WGVuLWRldmVsIFttYWlsdG86eGVuLWRldmVsLWJvdW5jZXNAbGlzdHMueGVucHJvamVjdC5vcmdd IE9uIEJlaGFsZgo+Pj4+Pj4gT2YgUm9nZXIgUGF1IE1vbm7DqQo+Pj4+Pj4gU2VudDogMTggQXBy aWwgMjAxOCAxMToxMQo+Pj4+Pj4gVG86IE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIDxhbmRyMjAw MEBnbWFpbC5jb20+Cj4+Pj4+PiBDYzogamdyb3NzQHN1c2UuY29tOyBBcnRlbSBNeWdhaWV2IDxB cnRlbV9NeWdhaWV2QGVwYW0uY29tPjsKPj4+Pj4+IERvbmd3b24gS2ltIDxkb25nd29uLmtpbUBp bnRlbC5jb20+OyBhaXJsaWVkQGxpbnV4LmllOwo+Pj4+Pj4gT2xla3NhbmRyX0FuZHJ1c2hjaGVu a29AZXBhbS5jb207IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGRyaS0KPj4+Pj4+IGRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZzsgUG90cm9sYSwgTWF0ZXVzelgKPj4+Pj4+IDxtYXRl dXN6eC5wb3Ryb2xhQGludGVsLmNvbT47IHhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZzsK Pj4+Pj4+IGRhbmllbC52ZXR0ZXJAaW50ZWwuY29tOyBib3Jpcy5vc3Ryb3Zza3lAb3JhY2xlLmNv bTsgTWF0dCBSb3Blcgo+Pj4+Pj4gPG1hdHRoZXcuZC5yb3BlckBpbnRlbC5jb20+Cj4+Pj4+PiBT dWJqZWN0OiBSZTogW1hlbi1kZXZlbF0gW1BBVENIIDAvMV0gZHJtL3hlbi16Y29weTogQWRkIFhl biB6ZXJvLWNvcHkKPj4+Pj4+IGhlbHBlciBEUk0gZHJpdmVyCj4+Pj4+Pgo+Pj4+Pj4gT24gV2Vk LCBBcHIgMTgsIDIwMTggYXQgMTE6MDE6MTJBTSArMDMwMCwgT2xla3NhbmRyIEFuZHJ1c2hjaGVu a28KPj4+Pj4+IHdyb3RlOgo+Pj4+Pj4+IE9uIDA0LzE4LzIwMTggMTA6MzUgQU0sIFJvZ2VyIFBh dSBNb25uw6kgd3JvdGU6Cj4+Pj4+PiBBZnRlciBzcGVha2luZyB3aXRoIE9sZWtzYW5kciBvbiBJ UkMsIEkgdGhpbmsgdGhlIG1haW4gdXNhZ2Ugb2YgdGhlCj4+Pj4+PiBnbnRkZXYgZXh0ZW5zaW9u IGlzIHRvOgo+Pj4+Pj4KPj4+Pj4+IDEuIENyZWF0ZSBhIGRtYS1idWYgZnJvbSBhIHNldCBvZiBn cmFudCByZWZlcmVuY2VzLgo+Pj4+Pj4gMi4gU2hhcmUgZG1hLWJ1ZiBhbmQgZ2V0IGEgbGlzdCBv ZiBncmFudCByZWZlcmVuY2VzLgo+Pj4+Pj4KPj4+Pj4+IEkgdGhpbmsgdGhpcyBzZXQgb2Ygb3Bl cmF0aW9ucyBjb3VsZCBiZSBicm9rZW4gaW50bzoKPj4+Pj4+Cj4+Pj4+PiAxLjEgTWFwIGdyYW50 IHJlZmVyZW5jZXMgaW50byB1c2VyLXNwYWNlIHVzaW5nIHRoZSBnbnRkZXYuCj4+Pj4+PiAxLjIg Q3JlYXRlIGEgZG1hLWJ1ZiBvdXQgb2YgYSBzZXQgb2YgdXNlci1zcGFjZSB2aXJ0dWFsIGFkZHJl c3Nlcy4KPj4+Pj4+Cj4+Pj4+PiAyLjEgTWFwIGEgZG1hLWJ1ZiBpbnRvIHVzZXItc3BhY2UuCj4+ Pj4+PiAyLjIgR2V0IGdyZWZzIG91dCBvZiB0aGUgdXNlci1zcGFjZSBhZGRyZXNzZXMgd2hlcmUg dGhlIGRtYS1idWYgaXMKPj4+Pj4+ICAgICAgIG1hcHBlZC4KPj4+Pj4+Cj4+Pj4+PiBTbyBpdCBz ZWVtcyBsaWtlIHdoYXQncyBhY3R1YWxseSBtaXNzaW5nIGlzIGEgd2F5IHRvOgo+Pj4+Pj4KPj4+ Pj4+ICAgIC0gQ3JlYXRlIGEgZG1hLWJ1ZiBmcm9tIGEgbGlzdCBvZiB1c2VyLXNwYWNlIHZpcnR1 YWwgYWRkcmVzc2VzLgo+Pj4+Pj4gICAgLSBBbGxvdyB0byBtYXAgYSBkbWEtYnVmIGludG8gdXNl ci1zcGFjZSwgc28gaXQgY2FuIHRoZW4gYmUgdXNlZCB3aXRoCj4+Pj4+PiAgICAgIHRoZSBnbnRk ZXYuCj4+Pj4+Pgo+Pj4+Pj4gSSB0aGluayB0aGlzIGlzIGdlbmVyaWMgZW5vdWdoIHRoYXQgaXQg Y291bGQgYmUgaW1wbGVtZW50ZWQgYnkgYQo+Pj4+Pj4gZGV2aWNlIG5vdCB0aWVkIHRvIFhlbi4g QUZBSUNUIHRoZSBoeXBlcl9kbWEgZ3V5cyBhbHNvIHdhbnRlZAo+Pj4+Pj4gc29tZXRoaW5nIHNp bWlsYXIgdG8gdGhpcy4KPj4+PiBPaywgc28ganVzdCB0byBzdW1tYXJpemUsIHhlbi16Y29weS9o eXBlci1kbWFidWYgYXMgdGhleSBhcmUgbm93LAo+Pj4+IGFyZSBubyBnbyBmcm9tIHlvdXIgUE9W Pwo+IEZZSSwKPgo+IG91ciB1c2UtY2FzZSBpcyAic3VyZmFjZSBzaGFyaW5nIiBvciAiZ3JhcGhp YyBvYmogc2hhcmluZyIgd2hlcmUgYSBjbGllbnQKPiBhcHBsaWNhdGlvbiBpbiBvbmUgZ3Vlc3Qg cmVuZGVycyBhbmQgZXhwb3J0IHRoaXMgcmVuZGVyIHRhcmdldChlLmcuIEVHTCBzdXJmYWNlKQo+ IGFzIGRtYS1idWYuIFRoaXMgZG1hLWJ1ZiBpcyB0aGVuIGV4cG9ydGVkIHRvIGFub3RoZXIgZ3Vl c3QvaG9zdCB2aWEgaHlwZXJfZG1hYnVmCj4gZHJ2IHdoZXJlIGEgY29tcG9zaXRvciBpcyBydW5u aW5nLiBUaGlzIGltcG9ydGluZyBkb21haW4gY3JlYXRlcyBhIGRtYWJ1ZiB3aXRoCj4gc2hhcmVk IHJlZmVyZW5jZSB0aGVuIGl0IGlzIGltcG9ydGVkIGFzIEVHTCBpbWFnZSB0aGF0IGxhdGVyIGNh biBiZSB1c2VkIGFzCj4gdGV4dHVyZSBvYmplY3QgdmlhIEVHTCBhcGkuCgo+ICAgTWFwcGluZyBk bWFidWYgdG8gdGhlIHVzZXJzcGFjZSBvciB2aWNlIHZlcnNhCj4gbWlnaHQgYmUgcG9zc2libGUg d2l0aCBtb2RpZnlpbmcgdXNlciBzcGFjZSBkcml2ZXJzL2FwcGxpY2F0aW9ucyBidXQgaXQgaXMg YW4KPiB1bm5lY2Vzc2FyeSBleHRyYSBzdGVwIGZyb20gb3VyIHBlcnNwZWN0aXZlLgorMS4gSSBh bHNvIGZlZWwgbGlrZSBpZiBpdCBpcyBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsIHNwYWNlIGl0 CndpbGwgYmUgKm11Y2gqIG1vcmUgZWFzaWVyIHRoZW4gaW52ZW50aW5nIHdvcmthcm91bmRzIHdp dGgKZ250ZGV2LCB1c2VyLXNwYWNlIGFuZCBoZWxwZXIgZG1hLWJ1ZiBkcml2ZXIgKHdoaWNoIG9i dmlvdXNseSBjYW4gYmUKaW1wbGVtZW50ZWQpLiBPZiBjb3Vyc2UsIHRoaXMgYXBwcm9hY2ggaXMg ZWFzaWVyIGZvciBYZW4gYXMgd2UgZG8gbm90CnRvdWNoIGl0cyBrZXJuZWwgY29kZSA7KQpCdXQg dGhlcmUgaXMgYSBkZW1hbmQgZm9yIGNoYW5nZXMgYXMgbnVtYmVyIG9mIGVtYmVkZGVkL211bHRp bWVkaWEgdXNlLWNhc2VzCmlzIGNvbnN0YW50bHkgZ3Jvd2luZyBhbmQgd2UgaGF2ZSB0byByZWFj dC4KPiBBbHNvLCB3ZSB3YW50IHRvIGtlZXAgYWxsIG9iamVjdHMKPiBpbiB0aGUga2VybmVsIGxl dmVsLgo+Cj4+PiBNeSBvcGluaW9uIGlzIHRoYXQgdGhlcmUgc2VlbXMgdG8gYmUgYSBtb3JlIGdl bmVyaWMgd2F5IHRvIGltcGxlbWVudAo+Pj4gdGhpcywgYW5kIHRodXMgSSB3b3VsZCBwcmVmZXIg dGhhdCBvbmUuCj4+Pgo+Pj4+IEluc3RlYWQsIHdlIGhhdmUgdG8gbWFrZSBhbGwgdGhhdCBmYW5j eSBzdHVmZgo+Pj4+IHdpdGggVkFzIDwtPiBkZXZpY2UtWCBhbmQgaGF2ZSB0aGF0IGRldmljZS1Y IGRyaXZlciBsaXZlIG91dCBvZiBkcml2ZXJzL3hlbgo+Pj4+IGFzIGl0IGlzIG5vdCBhIFhlbiBz cGVjaWZpYyBkcml2ZXI/Cj4+PiBUaGF0IHdvdWxkIGJlIG15IHByZWZlcmVuY2UgaWYgZmVhc2li bGUsIHNpbXBseSBiZWNhdXNlIGl0IGNhbiBiZQo+Pj4gcmV1c2VkIGJ5IG90aGVyIHVzZS1jYXNl cyB0aGF0IG5lZWQgdG8gY3JlYXRlIGRtYS1idWZzIGluIHVzZXItc3BhY2UuCj4+IFRoZXJlIGlz IGEgdXNlLWNhc2UgSSBoYXZlOiBhIGRpc3BsYXkgdW5pdCBvbiBteSB0YXJnZXQgaGFzIGEgRE1B Cj4+IGNvbnRyb2xsZXIgd2hpY2ggY2FuJ3QgZG8gc2NhdHRlci1nYXRoZXIsIGUuZy4gaXQgb25s eSBleHBlY3RzIGEKPj4gc2luZ2xlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlci4KPj4g SW4gb3JkZXIgdG8gY3JlYXRlIGEgZG1hLWJ1ZiBmcm9tIGdyZWZzIGluIHRoaXMgY2FzZQo+PiBJ IGFsbG9jYXRlIG1lbW9yeSB3aXRoIGRtYV9hbGxvY194eHggYW5kIHRoZW4gYmFsbG9vbiBwYWdl cyBvZiB0aGUKPj4gYnVmZmVyIGFuZCBmaW5hbGx5IG1hcCBncmVmcyBvbnRvIHRoaXMgRE1BIGJ1 ZmZlci4KPj4gVGhpcyB3YXkgSSBjYW4gZ2l2ZSB0aGlzIHNoYXJlZCBidWZmZXIgdG8gdGhlIGRp c3BsYXkgdW5pdCBhcyBpdHMgYnVzCj4+IGFkZHJlc3NlcyBhcmUgY29udGlndW91cy4KPj4KPj4g V2l0aCB0aGUgcHJvcG9zZWQgc29sdXRpb24gKGdudGRldiArIGRldmljZS1YKSBJIHdvbid0IGJl IGFibGUgdG8gYWNoaWV2ZQo+PiB0aGlzLAo+PiBhcyBJIGhhdmUgbm8gY29udHJvbCBvdmVyIGZy b20gd2hlcmUgZ250ZGV2L2JhbGxvb24gZHJpdmVycyBnZXQgdGhlIHBhZ2VzCj4+IChldmVuIG1v cmUsIHRob3NlIGNhbiBlYXNpbHkgYmUgb3V0IG9mIERNQSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBk aXNwbGF5Cj4+IHVuaXQpLgo+Pgo+PiBUaHVzLCBldmVuIGlmIGltcGxlbWVudGVkLCBJIGNhbid0 IHVzZSB0aGlzIGFwcHJvYWNoLgo+Pj4gSW4gYW55IGNhc2UgSSBqdXN0IGtuZXcgYWJvdXQgZG1h LWJ1ZnMgdGhpcyBtb3JuaW5nLCB0aGVyZSBtaWdodCBiZQo+Pj4gdGhpbmdzIHRoYXQgSSdtIG1p c3NpbmcuCj4+Pgo+Pj4gUm9nZXIuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9kcmktZGV2ZWwK