From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751637AbeBZIVR (ORCPT ); Mon, 26 Feb 2018 03:21:17 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:45021 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751522AbeBZIVN (ORCPT ); Mon, 26 Feb 2018 03:21:13 -0500 X-Google-Smtp-Source: AH8x22699v4A2dCspHJA4ePcpDmXk7VlDMX5BjFy08nSNrazRAdUBt2RZTTdEn8K9+Dm5ePORsDB8w== Subject: Re: [PATCH 0/9] drm/xen-front: Add support for Xen PV display frontend To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: Oleksandr Andrushchenko References: <1519200222-20623-1-git-send-email-andr2000@gmail.com> From: Oleksandr Andrushchenko Message-ID: <4c7e6f65-1787-3815-22b5-f9495e388c06@gmail.com> Date: Mon, 26 Feb 2018 10:21:09 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <1519200222-20623-1-git-send-email-andr2000@gmail.com> 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 ** *Hi, all!* * Last *Friday* some concerns on #dri-devel were raised wrt "yet another driver" for Xen and why not virtio-gpu. Let me highlight on why we need a new paravirtualized driver for Xen and why we can't just use virtio. Hope this helps the communities (both Xen and DRI) to have better understanding of this work and our motivation. Disclaimer: some or all of the below may sound weak argument or not 100% correct, so any help on clarifying the below is more than welcome ;) 1. First of all, we are targeting ARM embedded use-cases and for ARM we do not use QEMU [1]: "...Xen on ARM is not just a straight 1:1 port of x86 Xen... Xen on ARM does not need QEMU because it does not do any emulation. It accomplishes the goal by exploiting virtualization support in hardware as much as possible and using paravirtualized interfaces for IO." That being said it is still possible to run virtio-gpu and Xen+QEMU: [2] In this case QEMU can be used for device virtualization, e.g. network, block, console. But these already exist as Xen para-virtualized drivers again eliminating the need for QEMU: typical ARM system runs para-virtualized drivers for network, block, console etc. 2. virtio-gpu requires PCI/MMIO emulation virtio-gpu (virtio-gpu-pci) require virtio-pci, but para-virtualized device drivers do not need this. 3. No need for 3d/virgl. There are use-cases which either do not use OpenGL at all or will use custom virtualization solutions allowing sharing of a real GPU with guest, e.g. vGPU approach. 4. More freedom for buffer allocation. As of now virtio-gpu is only capable of allocating buffers via TTM, while there are use-cases where we need to have more freedom: for systems which do not provide IOMMU support, but having specific requirements for display buffers, it is possible to allocate such buffers at backend side and share those with the frontend driver. For example, if host domain is 1:1 mapped and has DRM/GPU hardware expecting physically contiguous memory (in PA, not IPA), this allows implementing zero-copying use-cases. 5. Zero-copying support at backend side Having native Xen implementation allows implementing zero-copying use-cases on backend side with the help of supporting driver DRM driver [3] which we hope to upstream as well (it is not yet ready in terms of code cleanup). 6. QEMU backends for virtio-gpu cannot be used as is, e.g. guest displays could be just a part of the final user experience. Thus, a QEMU backend must be modified to interact, for example, with Automotive Grade Linux display manager. So, QEMU part needs modifications. In our use-case we have a backend which supports multi-touch and guest display(s) and running either as a weston client (which is not supported by QEMU at the moment?) or KMS/DRM client. This allows us to enable much more use-cases**without the need to run QEMU. * *Thank you,* **Oleksandr Andrushchenko* * * * *[1] https://wiki.xen.org/wiki/Xen_ARM_with_Virtualization_Extensions_whitepaper* * [2] https://elinux.org/R-Car/Virtualization [3] https://github.com/xen-troops/linux/blob/ces2018/drivers/gpu/drm/xen/xen_drm_zcopy_drv.c * On 02/21/2018 10:03 AM, Oleksandr Andrushchenko wrote: > From: Oleksandr Andrushchenko > > Hello! > > This patch series adds support for Xen [1] para-virtualized > frontend display driver. It implements the protocol from > include/xen/interface/io/displif.h [2]. > Accompanying backend [3] is implemented as a user-space application > and its helper library [4], capable of running as a Weston client > or DRM master. > Configuration of both backend and frontend is done via > Xen guest domain configuration options [5]. > > ******************************************************************************* > * Driver limitations > ******************************************************************************* > 1. Configuration options 1.1 (contiguous display buffers) and 2 (backend > allocated buffers) below are not supported at the same time. > > 2. Only primary plane without additional properties is supported. > > 3. Only one video mode supported which resolution is configured via XenStore. > > 4. All CRTCs operate at fixed frequency of 60Hz. > > ******************************************************************************* > * Driver modes of operation in terms of display buffers used > ******************************************************************************* > Depending on the requirements for the para-virtualized environment, namely > requirements dictated by the accompanying DRM/(v)GPU drivers running in both > host and guest environments, number of operating modes of para-virtualized > display driver are supported: > - display buffers can be allocated by either frontend driver or backend > - display buffers can be allocated to be contiguous in memory or not > > Note! Frontend driver itself has no dependency on contiguous memory for > its operation. > > ******************************************************************************* > * 1. Buffers allocated by the frontend driver. > ******************************************************************************* > > The below modes of operation are configured at compile-time via > frontend driver's kernel configuration. > > 1.1. Front driver configured to use GEM CMA helpers > This use-case is useful when used with accompanying DRM/vGPU driver in > guest domain which was designed to only work with contiguous buffers, > e.g. DRM driver based on GEM CMA helpers: such drivers can only import > contiguous PRIME buffers, thus requiring frontend driver to provide > such. In order to implement this mode of operation para-virtualized > frontend driver can be configured to use GEM CMA helpers. > > 1.2. Front driver doesn't use GEM CMA > If accompanying drivers can cope with non-contiguous memory then, to > lower pressure on CMA subsystem of the kernel, driver can allocate > buffers from system memory. > > Note! If used with accompanying DRM/(v)GPU drivers this mode of operation > may require IOMMU support on the platform, so accompanying DRM/vGPU > hardware can still reach display buffer memory while importing PRIME > buffers from the frontend driver. > > ******************************************************************************* > * 2. Buffers allocated by the backend > ******************************************************************************* > > This mode of operation is run-time configured via guest domain configuration > through XenStore entries. > > For systems which do not provide IOMMU support, but having specific > requirements for display buffers it is possible to allocate such buffers > at backend side and share those with the frontend. > For example, if host domain is 1:1 mapped and has DRM/GPU hardware expecting > physically contiguous memory, this allows implementing zero-copying > use-cases. > > > I would like to thank at least, but not at last the following > people/communities who helped this driver to happen ;) > > 1. My team at EPAM for continuous support > 2. Xen community for answering tons of questions on different > modes of operation of the driver with respect to virtualized > environment. > 3. Rob Clark for "GEM allocation for para-virtualized DRM driver" [6] > 4. Maarten Lankhorst for "Atomic driver and old remove FB behavior" [7] > 5. Ville Syrjälä for "Questions on page flips and atomic modeset" [8] > > Thank you, > Oleksandr Andrushchenko > > P.S. There are two dependencies for this driver limiting some of the > use-cases which are on review now: > 1. "drm/simple_kms_helper: Add {enable|disable}_vblank callback support" [9] > 2. "drm/simple_kms_helper: Fix NULL pointer dereference with no active CRTC" [10] > > [1] https://wiki.xen.org/wiki/Paravirtualization_(PV)#PV_IO_Drivers > [2] https://elixir.bootlin.com/linux/v4.16-rc2/source/include/xen/interface/io/displif.h > [3] https://github.com/xen-troops/displ_be > [4] https://github.com/xen-troops/libxenbe > [5] https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=docs/man/xl.cfg.pod.5.in;h=a699367779e2ae1212ff8f638eff0206ec1a1cc9;hb=refs/heads/master#l1257 > [6] https://lists.freedesktop.org/archives/dri-devel/2017-March/136038.html > [7] https://www.spinics.net/lists/dri-devel/msg164102.html > [8] https://www.spinics.net/lists/dri-devel/msg164463.html > [9] https://patchwork.freedesktop.org/series/38073/ > [10] https://patchwork.freedesktop.org/series/38139/ > > Oleksandr Andrushchenko (9): > drm/xen-front: Introduce Xen para-virtualized frontend driver > drm/xen-front: Implement Xen bus state handling > drm/xen-front: Read driver configuration from Xen store > drm/xen-front: Implement Xen event channel handling > drm/xen-front: Implement handling of shared display buffers > drm/xen-front: Introduce DRM/KMS virtual display driver > drm/xen-front: Implement KMS/connector handling > drm/xen-front: Implement GEM operations > drm/xen-front: Implement communication with backend > > drivers/gpu/drm/Kconfig | 2 + > drivers/gpu/drm/Makefile | 1 + > drivers/gpu/drm/xen/Kconfig | 30 ++ > drivers/gpu/drm/xen/Makefile | 17 + > drivers/gpu/drm/xen/xen_drm_front.c | 712 ++++++++++++++++++++++++++++ > drivers/gpu/drm/xen/xen_drm_front.h | 154 ++++++ > drivers/gpu/drm/xen/xen_drm_front_cfg.c | 84 ++++ > drivers/gpu/drm/xen/xen_drm_front_cfg.h | 45 ++ > drivers/gpu/drm/xen/xen_drm_front_conn.c | 125 +++++ > drivers/gpu/drm/xen/xen_drm_front_conn.h | 35 ++ > drivers/gpu/drm/xen/xen_drm_front_drv.c | 294 ++++++++++++ > drivers/gpu/drm/xen/xen_drm_front_drv.h | 73 +++ > drivers/gpu/drm/xen/xen_drm_front_evtchnl.c | 399 ++++++++++++++++ > drivers/gpu/drm/xen/xen_drm_front_evtchnl.h | 89 ++++ > drivers/gpu/drm/xen/xen_drm_front_gem.c | 360 ++++++++++++++ > drivers/gpu/drm/xen/xen_drm_front_gem.h | 46 ++ > drivers/gpu/drm/xen/xen_drm_front_gem_cma.c | 93 ++++ > drivers/gpu/drm/xen/xen_drm_front_kms.c | 299 ++++++++++++ > drivers/gpu/drm/xen/xen_drm_front_kms.h | 30 ++ > drivers/gpu/drm/xen/xen_drm_front_shbuf.c | 430 +++++++++++++++++ > drivers/gpu/drm/xen/xen_drm_front_shbuf.h | 80 ++++ > 21 files changed, 3398 insertions(+) > create mode 100644 drivers/gpu/drm/xen/Kconfig > create mode 100644 drivers/gpu/drm/xen/Makefile > create mode 100644 drivers/gpu/drm/xen/xen_drm_front.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front.h > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_cfg.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_cfg.h > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_conn.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_conn.h > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_drv.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_drv.h > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_evtchnl.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_evtchnl.h > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_gem.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_gem.h > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_gem_cma.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_kms.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_kms.h > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_shbuf.c > create mode 100644 drivers/gpu/drm/xen/xen_drm_front_shbuf.h > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 0/9] drm/xen-front: Add support for Xen PV display frontend Date: Mon, 26 Feb 2018 10:21:09 +0200 Message-ID: <4c7e6f65-1787-3815-22b5-f9495e388c06@gmail.com> References: <1519200222-20623-1-git-send-email-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x241.google.com (mail-lf0-x241.google.com [IPv6:2a00:1450:4010:c07::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id CEA6F6E20F for ; Mon, 26 Feb 2018 08:21:13 +0000 (UTC) Received: by mail-lf0-x241.google.com with SMTP id o145so17673456lff.0 for ; Mon, 26 Feb 2018 00:21:13 -0800 (PST) In-Reply-To: <1519200222-20623-1-git-send-email-andr2000@gmail.com> 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: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: Oleksandr Andrushchenko List-Id: dri-devel@lists.freedesktop.org KioKCipIaSwgYWxsISoKCioKCkxhc3QgKkZyaWRheSogc29tZSBjb25jZXJucyBvbiAjZHJpLWRl dmVsIHdlcmUgcmFpc2VkIHdydCAieWV0Cgphbm90aGVyIGRyaXZlciIgZm9yIFhlbiBhbmQgd2h5 IG5vdCB2aXJ0aW8tZ3B1LiBMZXQgbWUgaGlnaGxpZ2h0CgpvbiB3aHkgd2UgbmVlZCBhIG5ldyBw YXJhdmlydHVhbGl6ZWQgZHJpdmVyIGZvciBYZW4gYW5kIHdoeSB3ZQoKY2FuJ3QganVzdCB1c2Ug dmlydGlvLiBIb3BlIHRoaXMgaGVscHMgdGhlIGNvbW11bml0aWVzIChib3RoIFhlbgoKYW5kIERS SSkgdG8gaGF2ZSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGlzIHdvcmsgYW5kIG91ciBtb3Rp dmF0aW9uLgoKCkRpc2NsYWltZXI6IHNvbWUgb3IgYWxsIG9mIHRoZSBiZWxvdyBtYXkgc291bmQg d2VhayBhcmd1bWVudCBvcgoKbm90IDEwMCUgY29ycmVjdCwgc28gYW55IGhlbHAgb24gY2xhcmlm eWluZyB0aGUgYmVsb3cgaXMgbW9yZQoKdGhhbiB3ZWxjb21lIDspCgoKMS4gRmlyc3Qgb2YgYWxs LCB3ZSBhcmUgdGFyZ2V0aW5nIEFSTSBlbWJlZGRlZCB1c2UtY2FzZXMgYW5kIGZvcgoKQVJNIHdl IGRvIG5vdCB1c2UgUUVNVSBbMV06ICIuLi5YZW4gb24gQVJNIGlzIG5vdCBqdXN0IGEgc3RyYWln aHQKCjE6MSBwb3J0IG9mIHg4NiBYZW4uLi4gWGVuIG9uIEFSTSBkb2VzIG5vdCBuZWVkIFFFTVUg YmVjYXVzZSBpdCBkb2VzCgpub3QgZG8gYW55IGVtdWxhdGlvbi4gSXQgYWNjb21wbGlzaGVzIHRo ZSBnb2FsIGJ5IGV4cGxvaXRpbmcKCnZpcnR1YWxpemF0aW9uIHN1cHBvcnQgaW4gaGFyZHdhcmUg YXMgbXVjaCBhcyBwb3NzaWJsZSBhbmQgdXNpbmcKCnBhcmF2aXJ0dWFsaXplZCBpbnRlcmZhY2Vz IGZvciBJTy4iCgoKVGhhdCBiZWluZyBzYWlkIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHJ1biB2 aXJ0aW8tZ3B1IGFuZCBYZW4rUUVNVTogWzJdCgoKSW4gdGhpcyBjYXNlIFFFTVUgY2FuIGJlIHVz ZWQgZm9yIGRldmljZSB2aXJ0dWFsaXphdGlvbiwgZS5nLiBuZXR3b3JrLAoKYmxvY2ssIGNvbnNv bGUuIEJ1dCB0aGVzZSBhbHJlYWR5IGV4aXN0IGFzIFhlbiBwYXJhLXZpcnR1YWxpemVkIGRyaXZl cnMKCmFnYWluIGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBRRU1VOiB0eXBpY2FsIEFSTSBzeXN0 ZW0gcnVucyAKcGFyYS12aXJ0dWFsaXplZAoKZHJpdmVycyBmb3IgbmV0d29yaywgYmxvY2ssIGNv bnNvbGUgZXRjLgoKCjIuIHZpcnRpby1ncHUgcmVxdWlyZXMgUENJL01NSU8gZW11bGF0aW9uCgp2 aXJ0aW8tZ3B1ICh2aXJ0aW8tZ3B1LXBjaSkgcmVxdWlyZSB2aXJ0aW8tcGNpLCBidXQgcGFyYS12 aXJ0dWFsaXplZCBkZXZpY2UKCmRyaXZlcnMgZG8gbm90IG5lZWQgdGhpcy4KCgozLiBObyBuZWVk IGZvciAzZC92aXJnbC4KClRoZXJlIGFyZSB1c2UtY2FzZXMgd2hpY2ggZWl0aGVyIGRvIG5vdCB1 c2UgT3BlbkdMIGF0IGFsbCBvciB3aWxsIHVzZQoKY3VzdG9tIHZpcnR1YWxpemF0aW9uIHNvbHV0 aW9ucyBhbGxvd2luZyBzaGFyaW5nIG9mIGEgcmVhbCBHUFUgd2l0aCBndWVzdCwKCmUuZy4gdkdQ VSBhcHByb2FjaC4KCgo0LiBNb3JlIGZyZWVkb20gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uLgoKQXMg b2Ygbm93IHZpcnRpby1ncHUgaXMgb25seSBjYXBhYmxlIG9mIGFsbG9jYXRpbmcgYnVmZmVycyB2 aWEgVFRNLCB3aGlsZQoKdGhlcmUgYXJlIHVzZS1jYXNlcyB3aGVyZSB3ZSBuZWVkIHRvIGhhdmUg bW9yZSBmcmVlZG9tOgoKZm9yIHN5c3RlbXMgd2hpY2ggZG8gbm90IHByb3ZpZGUgSU9NTVUgc3Vw cG9ydCwgYnV0IGhhdmluZyBzcGVjaWZpYwoKcmVxdWlyZW1lbnRzIGZvciBkaXNwbGF5IGJ1ZmZl cnMsIGl0IGlzIHBvc3NpYmxlIHRvIGFsbG9jYXRlIHN1Y2ggYnVmZmVycwoKYXQgYmFja2VuZCBz aWRlIGFuZCBzaGFyZSB0aG9zZSB3aXRoIHRoZSBmcm9udGVuZCBkcml2ZXIuCgpGb3IgZXhhbXBs ZSwgaWYgaG9zdCBkb21haW4gaXMgMToxIG1hcHBlZCBhbmQgaGFzIERSTS9HUFUgaGFyZHdhcmUg ZXhwZWN0aW5nCgpwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IChpbiBQQSwgbm90IElQQSks IHRoaXMgYWxsb3dzIGltcGxlbWVudGluZwoKemVyby1jb3B5aW5nIHVzZS1jYXNlcy4KCgo1LiBa ZXJvLWNvcHlpbmcgc3VwcG9ydCBhdCBiYWNrZW5kIHNpZGUKCkhhdmluZyBuYXRpdmUgWGVuIGlt cGxlbWVudGF0aW9uIGFsbG93cyBpbXBsZW1lbnRpbmcgemVyby1jb3B5aW5nIHVzZS1jYXNlcwoK b24gYmFja2VuZCBzaWRlIHdpdGggdGhlIGhlbHAgb2Ygc3VwcG9ydGluZyBkcml2ZXIgRFJNIGRy aXZlciBbM10gd2hpY2ggd2UKCmhvcGUgdG8gdXBzdHJlYW0gYXMgd2VsbCAoaXQgaXMgbm90IHll dCByZWFkeSBpbiB0ZXJtcyBvZiBjb2RlIGNsZWFudXApLgoKCjYuIFFFTVUgYmFja2VuZHMgZm9y IHZpcnRpby1ncHUgY2Fubm90IGJlIHVzZWQgYXMgaXMsIGUuZy4gZ3Vlc3QgZGlzcGxheXMKCmNv dWxkIGJlIGp1c3QgYSBwYXJ0IG9mIHRoZSBmaW5hbCB1c2VyIGV4cGVyaWVuY2UuIFRodXMsIGEg UUVNVSBiYWNrZW5kCgptdXN0IGJlIG1vZGlmaWVkIHRvIGludGVyYWN0LCBmb3IgZXhhbXBsZSwg d2l0aCBBdXRvbW90aXZlIEdyYWRlIExpbnV4CgpkaXNwbGF5IG1hbmFnZXIuIFNvLCBRRU1VIHBh cnQgbmVlZHMgbW9kaWZpY2F0aW9ucy4KCkluIG91ciB1c2UtY2FzZSB3ZSBoYXZlIGEgYmFja2Vu ZCB3aGljaCBzdXBwb3J0cyBtdWx0aS10b3VjaCBhbmQgZ3Vlc3QKCmRpc3BsYXkocykgYW5kIHJ1 bm5pbmcgZWl0aGVyIGFzIGEgd2VzdG9uIGNsaWVudCAod2hpY2ggaXMgbm90IHN1cHBvcnRlZAoK YnkgUUVNVSBhdCB0aGUgbW9tZW50Pykgb3IgS01TL0RSTSBjbGllbnQuIFRoaXMgYWxsb3dzIHVz IHRvIGVuYWJsZSBtdWNoCgptb3JlIHVzZS1jYXNlcyoqd2l0aG91dCB0aGUgbmVlZCB0byBydW4g UUVNVS4KCioKCipUaGFuayB5b3UsKgoKKipPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyoKKgoKKgoq CgoqWzFdIApodHRwczovL3dpa2kueGVuLm9yZy93aWtpL1hlbl9BUk1fd2l0aF9WaXJ0dWFsaXph dGlvbl9FeHRlbnNpb25zX3doaXRlcGFwZXIqCgoqCgpbMl0gaHR0cHM6Ly9lbGludXgub3JnL1It Q2FyL1ZpcnR1YWxpemF0aW9uCgpbM10gCmh0dHBzOi8vZ2l0aHViLmNvbS94ZW4tdHJvb3BzL2xp bnV4L2Jsb2IvY2VzMjAxOC9kcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1femNvcHlfZHJ2LmMK CgoqCgoKT24gMDIvMjEvMjAxOCAxMDowMyBBTSwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3Jv dGU6Cj4gRnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hl bmtvQGVwYW0uY29tPgo+Cj4gSGVsbG8hCj4KPiBUaGlzIHBhdGNoIHNlcmllcyBhZGRzIHN1cHBv cnQgZm9yIFhlbiBbMV0gcGFyYS12aXJ0dWFsaXplZAo+IGZyb250ZW5kIGRpc3BsYXkgZHJpdmVy LiBJdCBpbXBsZW1lbnRzIHRoZSBwcm90b2NvbCBmcm9tCj4gaW5jbHVkZS94ZW4vaW50ZXJmYWNl L2lvL2Rpc3BsaWYuaCBbMl0uCj4gQWNjb21wYW55aW5nIGJhY2tlbmQgWzNdIGlzIGltcGxlbWVu dGVkIGFzIGEgdXNlci1zcGFjZSBhcHBsaWNhdGlvbgo+IGFuZCBpdHMgaGVscGVyIGxpYnJhcnkg WzRdLCBjYXBhYmxlIG9mIHJ1bm5pbmcgYXMgYSBXZXN0b24gY2xpZW50Cj4gb3IgRFJNIG1hc3Rl ci4KPiBDb25maWd1cmF0aW9uIG9mIGJvdGggYmFja2VuZCBhbmQgZnJvbnRlbmQgaXMgZG9uZSB2 aWEKPiBYZW4gZ3Vlc3QgZG9tYWluIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBbNV0uCj4KPiAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCj4gKiBEcml2ZXIgbGltaXRhdGlvbnMKPiAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCj4gICAxLiBDb25maWd1cmF0aW9uIG9wdGlvbnMgMS4xIChjb250aWd1b3VzIGRp c3BsYXkgYnVmZmVycykgYW5kIDIgKGJhY2tlbmQKPiAgICAgIGFsbG9jYXRlZCBidWZmZXJzKSBi ZWxvdyBhcmUgbm90IHN1cHBvcnRlZCBhdCB0aGUgc2FtZSB0aW1lLgo+Cj4gICAyLiBPbmx5IHBy aW1hcnkgcGxhbmUgd2l0aG91dCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaXMgc3VwcG9ydGVkLgo+ Cj4gICAzLiBPbmx5IG9uZSB2aWRlbyBtb2RlIHN1cHBvcnRlZCB3aGljaCByZXNvbHV0aW9uIGlz IGNvbmZpZ3VyZWQgdmlhIFhlblN0b3JlLgo+Cj4gICA0LiBBbGwgQ1JUQ3Mgb3BlcmF0ZSBhdCBm aXhlZCBmcmVxdWVuY3kgb2YgNjBIei4KPgo+ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPiAqIERy aXZlciBtb2RlcyBvZiBvcGVyYXRpb24gaW4gdGVybXMgb2YgZGlzcGxheSBidWZmZXJzIHVzZWQK PiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCj4gICBEZXBlbmRpbmcgb24gdGhlIHJlcXVpcmVtZW50 cyBmb3IgdGhlIHBhcmEtdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIG5hbWVseQo+ICAgcmVxdWly ZW1lbnRzIGRpY3RhdGVkIGJ5IHRoZSBhY2NvbXBhbnlpbmcgRFJNLyh2KUdQVSBkcml2ZXJzIHJ1 bm5pbmcgaW4gYm90aAo+ICAgaG9zdCBhbmQgZ3Vlc3QgZW52aXJvbm1lbnRzLCBudW1iZXIgb2Yg b3BlcmF0aW5nIG1vZGVzIG9mIHBhcmEtdmlydHVhbGl6ZWQKPiAgIGRpc3BsYXkgZHJpdmVyIGFy ZSBzdXBwb3J0ZWQ6Cj4gICAgLSBkaXNwbGF5IGJ1ZmZlcnMgY2FuIGJlIGFsbG9jYXRlZCBieSBl aXRoZXIgZnJvbnRlbmQgZHJpdmVyIG9yIGJhY2tlbmQKPiAgICAtIGRpc3BsYXkgYnVmZmVycyBj YW4gYmUgYWxsb2NhdGVkIHRvIGJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5IG9yIG5vdAo+Cj4gICBO b3RlISBGcm9udGVuZCBkcml2ZXIgaXRzZWxmIGhhcyBubyBkZXBlbmRlbmN5IG9uIGNvbnRpZ3Vv dXMgbWVtb3J5IGZvcgo+ICAgICAgICAgaXRzIG9wZXJhdGlvbi4KPgo+ICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioKPiAqIDEuIEJ1ZmZlcnMgYWxsb2NhdGVkIGJ5IHRoZSBmcm9udGVuZCBkcml2ZXIu Cj4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKgo+Cj4gICBUaGUgYmVsb3cgbW9kZXMgb2Ygb3BlcmF0 aW9uIGFyZSBjb25maWd1cmVkIGF0IGNvbXBpbGUtdGltZSB2aWEKPiAgIGZyb250ZW5kIGRyaXZl cidzIGtlcm5lbCBjb25maWd1cmF0aW9uLgo+Cj4gICAxLjEuIEZyb250IGRyaXZlciBjb25maWd1 cmVkIHRvIHVzZSBHRU0gQ01BIGhlbHBlcnMKPiAgICAgICAgVGhpcyB1c2UtY2FzZSBpcyB1c2Vm dWwgd2hlbiB1c2VkIHdpdGggYWNjb21wYW55aW5nIERSTS92R1BVIGRyaXZlciBpbgo+ICAgICAg ICBndWVzdCBkb21haW4gd2hpY2ggd2FzIGRlc2lnbmVkIHRvIG9ubHkgd29yayB3aXRoIGNvbnRp Z3VvdXMgYnVmZmVycywKPiAgICAgICAgZS5nLiBEUk0gZHJpdmVyIGJhc2VkIG9uIEdFTSBDTUEg aGVscGVyczogc3VjaCBkcml2ZXJzIGNhbiBvbmx5IGltcG9ydAo+ICAgICAgICBjb250aWd1b3Vz IFBSSU1FIGJ1ZmZlcnMsIHRodXMgcmVxdWlyaW5nIGZyb250ZW5kIGRyaXZlciB0byBwcm92aWRl Cj4gICAgICAgIHN1Y2guIEluIG9yZGVyIHRvIGltcGxlbWVudCB0aGlzIG1vZGUgb2Ygb3BlcmF0 aW9uIHBhcmEtdmlydHVhbGl6ZWQKPiAgICAgICAgZnJvbnRlbmQgZHJpdmVyIGNhbiBiZSBjb25m aWd1cmVkIHRvIHVzZSBHRU0gQ01BIGhlbHBlcnMuCj4KPiAgIDEuMi4gRnJvbnQgZHJpdmVyIGRv ZXNuJ3QgdXNlIEdFTSBDTUEKPiAgICAgICAgSWYgYWNjb21wYW55aW5nIGRyaXZlcnMgY2FuIGNv cGUgd2l0aCBub24tY29udGlndW91cyBtZW1vcnkgdGhlbiwgdG8KPiAgICAgICAgbG93ZXIgcHJl c3N1cmUgb24gQ01BIHN1YnN5c3RlbSBvZiB0aGUga2VybmVsLCBkcml2ZXIgY2FuIGFsbG9jYXRl Cj4gICAgICAgIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5Lgo+Cj4gICBOb3RlISBJZiB1c2Vk IHdpdGggYWNjb21wYW55aW5nIERSTS8odilHUFUgZHJpdmVycyB0aGlzIG1vZGUgb2Ygb3BlcmF0 aW9uCj4gICAgIG1heSByZXF1aXJlIElPTU1VIHN1cHBvcnQgb24gdGhlIHBsYXRmb3JtLCBzbyBh Y2NvbXBhbnlpbmcgRFJNL3ZHUFUKPiAgICAgaGFyZHdhcmUgY2FuIHN0aWxsIHJlYWNoIGRpc3Bs YXkgYnVmZmVyIG1lbW9yeSB3aGlsZSBpbXBvcnRpbmcgUFJJTUUKPiAgICAgYnVmZmVycyBmcm9t IHRoZSBmcm9udGVuZCBkcml2ZXIuCj4KPiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKiAyLiBC dWZmZXJzIGFsbG9jYXRlZCBieSB0aGUgYmFja2VuZAo+ICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK Pgo+ICAgVGhpcyBtb2RlIG9mIG9wZXJhdGlvbiBpcyBydW4tdGltZSBjb25maWd1cmVkIHZpYSBn dWVzdCBkb21haW4gY29uZmlndXJhdGlvbgo+ICAgdGhyb3VnaCBYZW5TdG9yZSBlbnRyaWVzLgo+ Cj4gICBGb3Igc3lzdGVtcyB3aGljaCBkbyBub3QgcHJvdmlkZSBJT01NVSBzdXBwb3J0LCBidXQg aGF2aW5nIHNwZWNpZmljCj4gICByZXF1aXJlbWVudHMgZm9yIGRpc3BsYXkgYnVmZmVycyBpdCBp cyBwb3NzaWJsZSB0byBhbGxvY2F0ZSBzdWNoIGJ1ZmZlcnMKPiAgIGF0IGJhY2tlbmQgc2lkZSBh bmQgc2hhcmUgdGhvc2Ugd2l0aCB0aGUgZnJvbnRlbmQuCj4gICBGb3IgZXhhbXBsZSwgaWYgaG9z dCBkb21haW4gaXMgMToxIG1hcHBlZCBhbmQgaGFzIERSTS9HUFUgaGFyZHdhcmUgZXhwZWN0aW5n Cj4gICBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5LCB0aGlzIGFsbG93cyBpbXBsZW1lbnRp bmcgemVyby1jb3B5aW5nCj4gICB1c2UtY2FzZXMuCj4KPgo+IEkgd291bGQgbGlrZSB0byB0aGFu ayBhdCBsZWFzdCwgYnV0IG5vdCBhdCBsYXN0IHRoZSBmb2xsb3dpbmcKPiBwZW9wbGUvY29tbXVu aXRpZXMgd2hvIGhlbHBlZCB0aGlzIGRyaXZlciB0byBoYXBwZW4gOykKPgo+IDEuIE15IHRlYW0g YXQgRVBBTSBmb3IgY29udGludW91cyBzdXBwb3J0Cj4gMi4gWGVuIGNvbW11bml0eSBmb3IgYW5z d2VyaW5nIHRvbnMgb2YgcXVlc3Rpb25zIG9uIGRpZmZlcmVudAo+IG1vZGVzIG9mIG9wZXJhdGlv biBvZiB0aGUgZHJpdmVyIHdpdGggcmVzcGVjdCB0byB2aXJ0dWFsaXplZAo+IGVudmlyb25tZW50 Lgo+IDMuIFJvYiBDbGFyayBmb3IgIkdFTSBhbGxvY2F0aW9uIGZvciBwYXJhLXZpcnR1YWxpemVk IERSTSBkcml2ZXIiIFs2XQo+IDQuIE1hYXJ0ZW4gTGFua2hvcnN0IGZvciAiQXRvbWljIGRyaXZl ciBhbmQgb2xkIHJlbW92ZSBGQiBiZWhhdmlvciIgWzddCj4gNS4gVmlsbGUgU3lyasOkbMOkIGZv ciAiUXVlc3Rpb25zIG9uIHBhZ2UgZmxpcHMgYW5kIGF0b21pYyBtb2Rlc2V0IiBbOF0KPgo+IFRo YW5rIHlvdSwKPiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbwo+Cj4gUC5TLiBUaGVyZSBhcmUgdHdv IGRlcGVuZGVuY2llcyBmb3IgdGhpcyBkcml2ZXIgbGltaXRpbmcgc29tZSBvZiB0aGUKPiB1c2Ut Y2FzZXMgd2hpY2ggYXJlIG9uIHJldmlldyBub3c6Cj4gMS4gImRybS9zaW1wbGVfa21zX2hlbHBl cjogQWRkIHtlbmFibGV8ZGlzYWJsZX1fdmJsYW5rIGNhbGxiYWNrIHN1cHBvcnQiIFs5XQo+IDIu ICJkcm0vc2ltcGxlX2ttc19oZWxwZXI6IEZpeCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2Ugd2l0 aCBubyBhY3RpdmUgQ1JUQyIgWzEwXQo+Cj4gWzFdIGh0dHBzOi8vd2lraS54ZW4ub3JnL3dpa2kv UGFyYXZpcnR1YWxpemF0aW9uXyhQVikjUFZfSU9fRHJpdmVycwo+IFsyXSBodHRwczovL2VsaXhp ci5ib290bGluLmNvbS9saW51eC92NC4xNi1yYzIvc291cmNlL2luY2x1ZGUveGVuL2ludGVyZmFj ZS9pby9kaXNwbGlmLmgKPiBbM10gaHR0cHM6Ly9naXRodWIuY29tL3hlbi10cm9vcHMvZGlzcGxf YmUKPiBbNF0gaHR0cHM6Ly9naXRodWIuY29tL3hlbi10cm9vcHMvbGlieGVuYmUKPiBbNV0gaHR0 cHM6Ly94ZW5iaXRzLnhlbi5vcmcvZ2l0d2ViLz9wPXhlbi5naXQ7YT1ibG9iO2Y9ZG9jcy9tYW4v eGwuY2ZnLnBvZC41LmluO2g9YTY5OTM2Nzc3OWUyYWUxMjEyZmY4ZjYzOGVmZjAyMDZlYzFhMWNj OTtoYj1yZWZzL2hlYWRzL21hc3RlciNsMTI1Nwo+IFs2XSBodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9hcmNoaXZlcy9kcmktZGV2ZWwvMjAxNy1NYXJjaC8xMzYwMzguaHRtbAo+IFs3XSBo dHRwczovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9kcmktZGV2ZWwvbXNnMTY0MTAyLmh0bWwKPiBb OF0gaHR0cHM6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvZHJpLWRldmVsL21zZzE2NDQ2My5odG1s Cj4gWzldIGh0dHBzOi8vcGF0Y2h3b3JrLmZyZWVkZXNrdG9wLm9yZy9zZXJpZXMvMzgwNzMvCj4g WzEwXSBodHRwczovL3BhdGNod29yay5mcmVlZGVza3RvcC5vcmcvc2VyaWVzLzM4MTM5Lwo+Cj4g T2xla3NhbmRyIEFuZHJ1c2hjaGVua28gKDkpOgo+ICAgIGRybS94ZW4tZnJvbnQ6IEludHJvZHVj ZSBYZW4gcGFyYS12aXJ0dWFsaXplZCBmcm9udGVuZCBkcml2ZXIKPiAgICBkcm0veGVuLWZyb250 OiBJbXBsZW1lbnQgWGVuIGJ1cyBzdGF0ZSBoYW5kbGluZwo+ICAgIGRybS94ZW4tZnJvbnQ6IFJl YWQgZHJpdmVyIGNvbmZpZ3VyYXRpb24gZnJvbSBYZW4gc3RvcmUKPiAgICBkcm0veGVuLWZyb250 OiBJbXBsZW1lbnQgWGVuIGV2ZW50IGNoYW5uZWwgaGFuZGxpbmcKPiAgICBkcm0veGVuLWZyb250 OiBJbXBsZW1lbnQgaGFuZGxpbmcgb2Ygc2hhcmVkIGRpc3BsYXkgYnVmZmVycwo+ICAgIGRybS94 ZW4tZnJvbnQ6IEludHJvZHVjZSBEUk0vS01TIHZpcnR1YWwgZGlzcGxheSBkcml2ZXIKPiAgICBk cm0veGVuLWZyb250OiBJbXBsZW1lbnQgS01TL2Nvbm5lY3RvciBoYW5kbGluZwo+ICAgIGRybS94 ZW4tZnJvbnQ6IEltcGxlbWVudCBHRU0gb3BlcmF0aW9ucwo+ICAgIGRybS94ZW4tZnJvbnQ6IElt cGxlbWVudCBjb21tdW5pY2F0aW9uIHdpdGggYmFja2VuZAo+Cj4gICBkcml2ZXJzL2dwdS9kcm0v S2NvbmZpZyAgICAgICAgICAgICAgICAgICAgIHwgICAyICsKPiAgIGRyaXZlcnMvZ3B1L2RybS9N YWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+ICAgZHJpdmVycy9ncHUvZHJtL3hl bi9LY29uZmlnICAgICAgICAgICAgICAgICB8ICAzMCArKwo+ICAgZHJpdmVycy9ncHUvZHJtL3hl bi9NYWtlZmlsZSAgICAgICAgICAgICAgICB8ICAxNyArCj4gICBkcml2ZXJzL2dwdS9kcm0veGVu L3hlbl9kcm1fZnJvbnQuYyAgICAgICAgIHwgNzEyICsrKysrKysrKysrKysrKysrKysrKysrKysr KysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udC5oICAgICAgICAgfCAxNTQg KysrKysrCj4gICBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRfY2ZnLmMgICAgIHwg IDg0ICsrKysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9jZmcuaCAgICAg fCAgNDUgKysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9jb25uLmMgICAg fCAxMjUgKysrKysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9jb25uLmgg ICAgfCAgMzUgKysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9kcnYuYyAg ICAgfCAyOTQgKysrKysrKysrKysrCj4gICBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJv bnRfZHJ2LmggICAgIHwgIDczICsrKwo+ICAgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zy b250X2V2dGNobmwuYyB8IDM5OSArKysrKysrKysrKysrKysrCj4gICBkcml2ZXJzL2dwdS9kcm0v eGVuL3hlbl9kcm1fZnJvbnRfZXZ0Y2hubC5oIHwgIDg5ICsrKysKPiAgIGRyaXZlcnMvZ3B1L2Ry bS94ZW4veGVuX2RybV9mcm9udF9nZW0uYyAgICAgfCAzNjAgKysrKysrKysrKysrKysKPiAgIGRy aXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9nZW0uaCAgICAgfCAgNDYgKysKPiAgIGRy aXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9nZW1fY21hLmMgfCAgOTMgKysrKwo+ICAg ZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X2ttcy5jICAgICB8IDI5OSArKysrKysr KysrKysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9rbXMuaCAgICAgfCAg MzAgKysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9zaGJ1Zi5jICAgfCA0 MzAgKysrKysrKysrKysrKysrKysKPiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9u dF9zaGJ1Zi5oICAgfCAgODAgKysrKwo+ICAgMjEgZmlsZXMgY2hhbmdlZCwgMzM5OCBpbnNlcnRp b25zKCspCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi9LY29uZmln Cj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi9NYWtlZmlsZQo+ICAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udC5jCj4g ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250LmgK PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRf Y2ZnLmMKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1f ZnJvbnRfY2ZnLmgKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hl bl9kcm1fZnJvbnRfY29ubi5jCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJt L3hlbi94ZW5fZHJtX2Zyb250X2Nvbm4uaAo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9kcnYuYwo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9kcnYuaAo+ICAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9ldnRjaG5sLmMKPiAgIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRfZXZ0Y2hubC5o Cj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250 X2dlbS5jCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJt X2Zyb250X2dlbS5oCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94 ZW5fZHJtX2Zyb250X2dlbV9jbWEuYwo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1 L2RybS94ZW4veGVuX2RybV9mcm9udF9rbXMuYwo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9rbXMuaAo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9zaGJ1Zi5jCj4gICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X3NoYnVmLmgKPgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1h aWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==