From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-lf1-f65.google.com ([209.85.167.65]:41792 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726683AbeIKLuW (ORCPT ); Tue, 11 Sep 2018 07:50:22 -0400 Received: by mail-lf1-f65.google.com with SMTP id l26-v6so19458593lfc.8 for ; Mon, 10 Sep 2018 23:52:30 -0700 (PDT) Subject: Re: [Xen-devel][PATCH 1/1] cameraif: add ABI for para-virtual camera To: Hans Verkuil , "Oleksandr_Andrushchenko@epam.com" , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> <7134b3ad-9fcf-0139-41b3-67a3dbc8224d@xs4all.nl> <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> <3c6bb5c8-eeb4-fd09-407a-5a77b29b56c3@xs4all.nl> <2a39c994-118f-a17e-c40a-f5fbbad1cb03@epam.com> <30d7c91a-4515-157b-fc29-90c2e6f0008b@xs4all.nl> From: Oleksandr Andrushchenko Message-ID: Date: Tue, 11 Sep 2018 09:52:27 +0300 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-media-owner@vger.kernel.org List-ID: Hi, Hans! On 09/10/2018 03:26 PM, Hans Verkuil wrote: > On 09/10/2018 01:49 PM, Oleksandr Andrushchenko wrote: >> On 09/10/2018 02:09 PM, Hans Verkuil wrote: >>> On 09/10/2018 11:52 AM, Oleksandr Andrushchenko wrote: >>>> On 09/10/2018 12:04 PM, Hans Verkuil wrote: >>>>> On 09/10/2018 10:24 AM, Oleksandr Andrushchenko wrote: >>>>>> On 09/10/2018 10:53 AM, Hans Verkuil wrote: >>>>>>> Hi Oleksandr, >>>>>>> >>>>>>> On 09/10/2018 09:16 AM, Oleksandr Andrushchenko wrote: >>>>> >>>>> >>>>>>>>> I suspect that you likely will want to support such sources eventually, so >>>>>>>>> it pays to design this with that in mind. >>>>>>>> Again, I think that this is the backend to hide these >>>>>>>> use-cases from the frontend. >>>>>>> I'm not sure you can: say you are playing a bluray connected to the system >>>>>>> with HDMI, then if there is a resolution change, what do you do? You can tear >>>>>>> everything down and build it up again, or you can just tell frontends that >>>>>>> something changed and that they have to look at the new vcamera configuration. >>>>>>> >>>>>>> The latter seems to be more sensible to me. It is really not much that you >>>>>>> need to do: all you really need is an event signalling that something changed. >>>>>>> In V4L2 that's the V4L2_EVENT_SOURCE_CHANGE. >>>>>> well, this complicates things a lot as I'll have to >>>>>> re-allocate buffers - right? >>>>> Right. Different resolutions means different sized buffers and usually lots of >>>>> changes throughout the whole video pipeline, which in this case can even >>>>> go into multiple VMs. >>>>> >>>>> One additional thing to keep in mind for the future: V4L2_EVENT_SOURCE_CHANGE >>>>> has a flags field that tells userspace what changed. Right now that is just the >>>>> resolution, but in the future you can expect flags for cases where just the >>>>> colorspace information changes, but not the resolution. >>>>> >>>>> Which reminds me of two important missing pieces of information in your protocol: >>>>> >>>>> 1) You need to communicate the colorspace data: >>>>> >>>>> - colorspace >>>>> - xfer_func >>>>> - ycbcr_enc/hsv_enc (unlikely you ever want to support HSV pixelformats, so I >>>>> think you can ignore hsv_enc) >>>>> - quantization >>>>> >>>>> See https://hverkuil.home.xs4all.nl/spec/uapi/v4l/pixfmt-v4l2.html#c.v4l2_pix_format >>>>> and the links to the colorspace sections in the V4L2 spec for details). >>>>> >>>>> This information is part of the format, it is reported by the driver. >>>> I'll take a look and think what can be put and how into the protocol, >>>> do you think I'll have to implement all the above for >>>> this stage? >>> Yes. Without it VMs will have no way of knowing how to reproduce the right colors. >>> They don't *have* to use this information, but it should be there. For cameras >>> this isn't all that important, for SDTV/HDTV sources this becomes more relevant >>> (esp. the quantization and ycbcr_enc information) and for sources with BT.2020/HDR >>> formats this is critical. >> ok, then I'll add the following to the set_config request/response: >> >> uint32_t colorspace; >> uint32_t xfer_func; >> uint32_t ycbcr_enc; >> uint32_t quantization; Yet another question here: are the above (color space, xfer etc.) and display aspect ratio defined per pixel_format or per pixel_format + resolution? If per pixel_format then .../vcamera/1/formats/YUYV/display-aspect-ratio = "59/58" or if per resolution .../vcamera/1/formats/YUYV/640x480/display-aspect-ratio = "59/58" >> >> With this respect, I will need to put some OS agnostic constants >> into the protocol, so if backend and frontend are not Linux/V4L2 >> based they can still talk to each other. >> I see that V4L2 already defines constants for the above: [1], [2], [3], [4]. >> >> Do you think I can define the same replacing V4L2_ prefix >> with XENCAMERA_, e.g. V4L2_XFER_FUNC_SRGB -> XENCAMERA_XFER_FUNC_SRGB? > Yes. > >> Do I need to define all those or there can be some subset of the >> above for my simpler use-case? > Most of these defines directly map to standards. I would skip the following > defines: > > V4L2_COLORSPACE_DEFAULT (not applicable) > V4L2_COLORSPACE_470_SYSTEM_* (rarely used, if received by the HW the Xen backend > should map this to V4L2_COLORSPACE_SMPTE170M) > V4L2_COLORSPACE_JPEG (historical V4L2 artifact, see here how to map: > https://hverkuil.home.xs4all.nl/spec/uapi/v4l/colorspaces-details.html#col-jpeg) > > V4L2_COLORSPACE_SMPTE240M (rarely used, map to V4L2_COLORSPACE_SMPTE170M if seen in backend) > > V4L2_XFER_FUNC_SMPTE240M (rarely used, map to V4L2_XFER_FUNC_709) > > V4L2_YCBCR_ENC_SMPTE240M (rarely used, map to V4L2_YCBCR_ENC_709) > > While V4L2 allows 0 (DEFAULT) values for xfer_func, ycbcr_enc and quantization, and > provides macros to map default values to the actual values (for legacy reasons), > the Xen backend should always fill this in explicitly, using those same mapping > macros (see e.g. V4L2_MAP_XFER_FUNC_DEFAULT). > > The V4L2 spec has extensive information on colorspaces (sections 2.14-2.17). > >>> The vivid driver can actually reproduce all combinations, so that's a good driver >>> to test this with. >> You mean I can use it on backend side instead of real HW camera and >> test all the configurations possible/those of interest? > Right. > > Regards, > > Hans Thank you, Oleksandr From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 1/1] cameraif: add ABI for para-virtual camera Date: Tue, 11 Sep 2018 09:52:27 +0300 Message-ID: References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> <7134b3ad-9fcf-0139-41b3-67a3dbc8224d@xs4all.nl> <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> <3c6bb5c8-eeb4-fd09-407a-5a77b29b56c3@xs4all.nl> <2a39c994-118f-a17e-c40a-f5fbbad1cb03@epam.com> <30d7c91a-4515-157b-fc29-90c2e6f0008b@xs4all.nl> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fzcXI-00057X-FJ for xen-devel@lists.xenproject.org; Tue, 11 Sep 2018 06:52:32 +0000 Received: by mail-lf1-x144.google.com with SMTP id i7-v6so19472666lfh.5 for ; Mon, 10 Sep 2018 23:52:31 -0700 (PDT) In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Hans Verkuil , "Oleksandr_Andrushchenko@epam.com" , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com List-Id: xen-devel@lists.xenproject.org SGksIEhhbnMhCgpPbiAwOS8xMC8yMDE4IDAzOjI2IFBNLCBIYW5zIFZlcmt1aWwgd3JvdGU6Cj4g T24gMDkvMTAvMjAxOCAwMTo0OSBQTSwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4+ IE9uIDA5LzEwLzIwMTggMDI6MDkgUE0sIEhhbnMgVmVya3VpbCB3cm90ZToKPj4+IE9uIDA5LzEw LzIwMTggMTE6NTIgQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+Pj4+IE9uIDA5 LzEwLzIwMTggMTI6MDQgUE0sIEhhbnMgVmVya3VpbCB3cm90ZToKPj4+Pj4gT24gMDkvMTAvMjAx OCAxMDoyNCBBTSwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4+Pj4+PiBPbiAwOS8x MC8yMDE4IDEwOjUzIEFNLCBIYW5zIFZlcmt1aWwgd3JvdGU6Cj4+Pj4+Pj4gSGkgT2xla3NhbmRy LAo+Pj4+Pj4+Cj4+Pj4+Pj4gT24gMDkvMTAvMjAxOCAwOToxNiBBTSwgT2xla3NhbmRyIEFuZHJ1 c2hjaGVua28gd3JvdGU6Cj4+Pj4+IDxzbmlwPgo+Pj4+Pgo+Pj4+Pj4+Pj4gSSBzdXNwZWN0IHRo YXQgeW91IGxpa2VseSB3aWxsIHdhbnQgdG8gc3VwcG9ydCBzdWNoIHNvdXJjZXMgZXZlbnR1YWxs eSwgc28KPj4+Pj4+Pj4+IGl0IHBheXMgdG8gZGVzaWduIHRoaXMgd2l0aCB0aGF0IGluIG1pbmQu Cj4+Pj4+Pj4+IEFnYWluLCBJIHRoaW5rIHRoYXQgdGhpcyBpcyB0aGUgYmFja2VuZCB0byBoaWRl IHRoZXNlCj4+Pj4+Pj4+IHVzZS1jYXNlcyBmcm9tIHRoZSBmcm9udGVuZC4KPj4+Pj4+PiBJJ20g bm90IHN1cmUgeW91IGNhbjogc2F5IHlvdSBhcmUgcGxheWluZyBhIGJsdXJheSBjb25uZWN0ZWQg dG8gdGhlIHN5c3RlbQo+Pj4+Pj4+IHdpdGggSERNSSwgdGhlbiBpZiB0aGVyZSBpcyBhIHJlc29s dXRpb24gY2hhbmdlLCB3aGF0IGRvIHlvdSBkbz8gWW91IGNhbiB0ZWFyCj4+Pj4+Pj4gZXZlcnl0 aGluZyBkb3duIGFuZCBidWlsZCBpdCB1cCBhZ2Fpbiwgb3IgeW91IGNhbiBqdXN0IHRlbGwgZnJv bnRlbmRzIHRoYXQKPj4+Pj4+PiBzb21ldGhpbmcgY2hhbmdlZCBhbmQgdGhhdCB0aGV5IGhhdmUg dG8gbG9vayBhdCB0aGUgbmV3IHZjYW1lcmEgY29uZmlndXJhdGlvbi4KPj4+Pj4+Pgo+Pj4+Pj4+ IFRoZSBsYXR0ZXIgc2VlbXMgdG8gYmUgbW9yZSBzZW5zaWJsZSB0byBtZS4gSXQgaXMgcmVhbGx5 IG5vdCBtdWNoIHRoYXQgeW91Cj4+Pj4+Pj4gbmVlZCB0byBkbzogYWxsIHlvdSByZWFsbHkgbmVl ZCBpcyBhbiBldmVudCBzaWduYWxsaW5nIHRoYXQgc29tZXRoaW5nIGNoYW5nZWQuCj4+Pj4+Pj4g SW4gVjRMMiB0aGF0J3MgdGhlIFY0TDJfRVZFTlRfU09VUkNFX0NIQU5HRS4KPj4+Pj4+IHdlbGws IHRoaXMgY29tcGxpY2F0ZXMgdGhpbmdzIGEgbG90IGFzIEknbGwgaGF2ZSB0bwo+Pj4+Pj4gcmUt YWxsb2NhdGUgYnVmZmVycyAtIHJpZ2h0Pwo+Pj4+PiBSaWdodC4gRGlmZmVyZW50IHJlc29sdXRp b25zIG1lYW5zIGRpZmZlcmVudCBzaXplZCBidWZmZXJzIGFuZCB1c3VhbGx5IGxvdHMgb2YKPj4+ Pj4gY2hhbmdlcyB0aHJvdWdob3V0IHRoZSB3aG9sZSB2aWRlbyBwaXBlbGluZSwgd2hpY2ggaW4g dGhpcyBjYXNlIGNhbiBldmVuCj4+Pj4+IGdvIGludG8gbXVsdGlwbGUgVk1zLgo+Pj4+Pgo+Pj4+ PiBPbmUgYWRkaXRpb25hbCB0aGluZyB0byBrZWVwIGluIG1pbmQgZm9yIHRoZSBmdXR1cmU6IFY0 TDJfRVZFTlRfU09VUkNFX0NIQU5HRQo+Pj4+PiBoYXMgYSBmbGFncyBmaWVsZCB0aGF0IHRlbGxz IHVzZXJzcGFjZSB3aGF0IGNoYW5nZWQuIFJpZ2h0IG5vdyB0aGF0IGlzIGp1c3QgdGhlCj4+Pj4+ IHJlc29sdXRpb24sIGJ1dCBpbiB0aGUgZnV0dXJlIHlvdSBjYW4gZXhwZWN0IGZsYWdzIGZvciBj YXNlcyB3aGVyZSBqdXN0IHRoZQo+Pj4+PiBjb2xvcnNwYWNlIGluZm9ybWF0aW9uIGNoYW5nZXMs IGJ1dCBub3QgdGhlIHJlc29sdXRpb24uCj4+Pj4+Cj4+Pj4+IFdoaWNoIHJlbWluZHMgbWUgb2Yg dHdvIGltcG9ydGFudCBtaXNzaW5nIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB5b3VyIHByb3Rv Y29sOgo+Pj4+Pgo+Pj4+PiAxKSBZb3UgbmVlZCB0byBjb21tdW5pY2F0ZSB0aGUgY29sb3JzcGFj ZSBkYXRhOgo+Pj4+Pgo+Pj4+PiAtIGNvbG9yc3BhY2UKPj4+Pj4gLSB4ZmVyX2Z1bmMKPj4+Pj4g LSB5Y2Jjcl9lbmMvaHN2X2VuYyAodW5saWtlbHkgeW91IGV2ZXIgd2FudCB0byBzdXBwb3J0IEhT ViBwaXhlbGZvcm1hdHMsIHNvIEkKPj4+Pj4gICAgICB0aGluayB5b3UgY2FuIGlnbm9yZSBoc3Zf ZW5jKQo+Pj4+PiAtIHF1YW50aXphdGlvbgo+Pj4+Pgo+Pj4+PiBTZWUgaHR0cHM6Ly9odmVya3Vp bC5ob21lLnhzNGFsbC5ubC9zcGVjL3VhcGkvdjRsL3BpeGZtdC12NGwyLmh0bWwjYy52NGwyX3Bp eF9mb3JtYXQKPj4+Pj4gYW5kIHRoZSBsaW5rcyB0byB0aGUgY29sb3JzcGFjZSBzZWN0aW9ucyBp biB0aGUgVjRMMiBzcGVjIGZvciBkZXRhaWxzKS4KPj4+Pj4KPj4+Pj4gVGhpcyBpbmZvcm1hdGlv biBpcyBwYXJ0IG9mIHRoZSBmb3JtYXQsIGl0IGlzIHJlcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCj4+ Pj4gSSdsbCB0YWtlIGEgbG9vayBhbmQgdGhpbmsgd2hhdCBjYW4gYmUgcHV0IGFuZCBob3cgaW50 byB0aGUgcHJvdG9jb2wsCj4+Pj4gZG8geW91IHRoaW5rIEknbGwgaGF2ZSB0byBpbXBsZW1lbnQg YWxsIHRoZSBhYm92ZSBmb3IKPj4+PiB0aGlzIHN0YWdlPwo+Pj4gWWVzLiBXaXRob3V0IGl0IFZN cyB3aWxsIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgaG93IHRvIHJlcHJvZHVjZSB0aGUgcmlnaHQg Y29sb3JzLgo+Pj4gVGhleSBkb24ndCAqaGF2ZSogdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24sIGJ1 dCBpdCBzaG91bGQgYmUgdGhlcmUuIEZvciBjYW1lcmFzCj4+PiB0aGlzIGlzbid0IGFsbCB0aGF0 IGltcG9ydGFudCwgZm9yIFNEVFYvSERUViBzb3VyY2VzIHRoaXMgYmVjb21lcyBtb3JlIHJlbGV2 YW50Cj4+PiAoZXNwLiB0aGUgcXVhbnRpemF0aW9uIGFuZCB5Y2Jjcl9lbmMgaW5mb3JtYXRpb24p IGFuZCBmb3Igc291cmNlcyB3aXRoIEJULjIwMjAvSERSCj4+PiBmb3JtYXRzIHRoaXMgaXMgY3Jp dGljYWwuCj4+IG9rLCB0aGVuIEknbGwgYWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHNldF9jb25m aWcgcmVxdWVzdC9yZXNwb25zZToKPj4KPj4gICAgICAgdWludDMyX3QgY29sb3JzcGFjZTsKPj4g ICAgICAgdWludDMyX3QgeGZlcl9mdW5jOwo+PiAgICAgICB1aW50MzJfdCB5Y2Jjcl9lbmM7Cj4+ ICAgICAgIHVpbnQzMl90IHF1YW50aXphdGlvbjsKWWV0IGFub3RoZXIgcXVlc3Rpb24gaGVyZTog YXJlIHRoZSBhYm92ZSAoY29sb3Igc3BhY2UsIHhmZXIgZXRjLikgYW5kCmRpc3BsYXkgYXNwZWN0 IHJhdGlvIGRlZmluZWQgcGVyIHBpeGVsX2Zvcm1hdCBvciBwZXIgcGl4ZWxfZm9ybWF0ICsgCnJl c29sdXRpb24/CgpJZiBwZXIgcGl4ZWxfZm9ybWF0IHRoZW4KCi4uLi92Y2FtZXJhLzEvZm9ybWF0 cy9ZVVlWL2Rpc3BsYXktYXNwZWN0LXJhdGlvID0gIjU5LzU4IgoKb3IgaWYgcGVyIHJlc29sdXRp b24KCi4uLi92Y2FtZXJhLzEvZm9ybWF0cy9ZVVlWLzY0MHg0ODAvZGlzcGxheS1hc3BlY3QtcmF0 aW8gPSAiNTkvNTgiCgo+Pgo+PiBXaXRoIHRoaXMgcmVzcGVjdCwgSSB3aWxsIG5lZWQgdG8gcHV0 IHNvbWUgT1MgYWdub3N0aWMgY29uc3RhbnRzCj4+IGludG8gdGhlIHByb3RvY29sLCBzbyBpZiBi YWNrZW5kIGFuZCBmcm9udGVuZCBhcmUgbm90IExpbnV4L1Y0TDIKPj4gYmFzZWQgdGhleSBjYW4g c3RpbGwgdGFsayB0byBlYWNoIG90aGVyLgo+PiBJIHNlZSB0aGF0IFY0TDIgYWxyZWFkeSBkZWZp bmVzIGNvbnN0YW50cyBmb3IgdGhlIGFib3ZlOiBbMV0sIFsyXSwgWzNdLCBbNF0uCj4+Cj4+IERv IHlvdSB0aGluayBJIGNhbiBkZWZpbmUgdGhlIHNhbWUgcmVwbGFjaW5nIFY0TDJfIHByZWZpeAo+ PiB3aXRoIFhFTkNBTUVSQV8sIGUuZy4gVjRMMl9YRkVSX0ZVTkNfU1JHQiAtPiBYRU5DQU1FUkFf WEZFUl9GVU5DX1NSR0I/Cj4gWWVzLgo+Cj4+IERvIEkgbmVlZCB0byBkZWZpbmUgYWxsIHRob3Nl IG9yIHRoZXJlIGNhbiBiZSBzb21lIHN1YnNldCBvZiB0aGUKPj4gYWJvdmUgZm9yIG15IHNpbXBs ZXIgdXNlLWNhc2U/Cj4gTW9zdCBvZiB0aGVzZSBkZWZpbmVzIGRpcmVjdGx5IG1hcCB0byBzdGFu ZGFyZHMuIEkgd291bGQgc2tpcCB0aGUgZm9sbG93aW5nCj4gZGVmaW5lczoKPgo+IFY0TDJfQ09M T1JTUEFDRV9ERUZBVUxUIChub3QgYXBwbGljYWJsZSkKPiBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZ U1RFTV8qICAocmFyZWx5IHVzZWQsIGlmIHJlY2VpdmVkIGJ5IHRoZSBIVyB0aGUgWGVuIGJhY2tl bmQKPiAJCQlzaG91bGQgbWFwIHRoaXMgdG8gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSkKPiBW NEwyX0NPTE9SU1BBQ0VfSlBFRyAoaGlzdG9yaWNhbCBWNEwyIGFydGlmYWN0LCBzZWUgaGVyZSBo b3cgdG8gbWFwOgo+IAkgaHR0cHM6Ly9odmVya3VpbC5ob21lLnhzNGFsbC5ubC9zcGVjL3VhcGkv djRsL2NvbG9yc3BhY2VzLWRldGFpbHMuaHRtbCNjb2wtanBlZykKPgo+IFY0TDJfQ09MT1JTUEFD RV9TTVBURTI0ME0gKHJhcmVseSB1c2VkLCBtYXAgdG8gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcw TSBpZiBzZWVuIGluIGJhY2tlbmQpCj4KPiBWNEwyX1hGRVJfRlVOQ19TTVBURTI0ME0gKHJhcmVs eSB1c2VkLCBtYXAgdG8gVjRMMl9YRkVSX0ZVTkNfNzA5KQo+Cj4gVjRMMl9ZQ0JDUl9FTkNfU01Q VEUyNDBNIChyYXJlbHkgdXNlZCwgbWFwIHRvIFY0TDJfWUNCQ1JfRU5DXzcwOSkKPgo+IFdoaWxl IFY0TDIgYWxsb3dzIDAgKERFRkFVTFQpIHZhbHVlcyBmb3IgeGZlcl9mdW5jLCB5Y2Jjcl9lbmMg YW5kIHF1YW50aXphdGlvbiwgYW5kCj4gcHJvdmlkZXMgbWFjcm9zIHRvIG1hcCBkZWZhdWx0IHZh bHVlcyB0byB0aGUgYWN0dWFsIHZhbHVlcyAoZm9yIGxlZ2FjeSByZWFzb25zKSwKPiB0aGUgWGVu IGJhY2tlbmQgc2hvdWxkIGFsd2F5cyBmaWxsIHRoaXMgaW4gZXhwbGljaXRseSwgdXNpbmcgdGhv c2Ugc2FtZSBtYXBwaW5nCj4gbWFjcm9zIChzZWUgZS5nLiBWNEwyX01BUF9YRkVSX0ZVTkNfREVG QVVMVCkuCj4KPiBUaGUgVjRMMiBzcGVjIGhhcyBleHRlbnNpdmUgaW5mb3JtYXRpb24gb24gY29s b3JzcGFjZXMgKHNlY3Rpb25zIDIuMTQtMi4xNykuCj4KPj4+IFRoZSB2aXZpZCBkcml2ZXIgY2Fu IGFjdHVhbGx5IHJlcHJvZHVjZSBhbGwgY29tYmluYXRpb25zLCBzbyB0aGF0J3MgYSBnb29kIGRy aXZlcgo+Pj4gdG8gdGVzdCB0aGlzIHdpdGguCj4+IFlvdSBtZWFuIEkgY2FuIHVzZSBpdCBvbiBi YWNrZW5kIHNpZGUgaW5zdGVhZCBvZiByZWFsIEhXIGNhbWVyYSBhbmQKPj4gdGVzdCBhbGwgdGhl IGNvbmZpZ3VyYXRpb25zIHBvc3NpYmxlL3Rob3NlIG9mIGludGVyZXN0Pwo+IFJpZ2h0Lgo+Cj4g UmVnYXJkcywKPgo+IAlIYW5zClRoYW5rIHlvdSwKT2xla3NhbmRyCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhl bi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3Jn L21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs