From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753327AbcKHGcv (ORCPT ); Tue, 8 Nov 2016 01:32:51 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:35499 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752549AbcKHGct (ORCPT ); Tue, 8 Nov 2016 01:32:49 -0500 Subject: Re: [PATCH v2] drm/udl: Ensure channel is selected before using the device. To: Jamie Lentin , David Airlie , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org References: <20160815064328.GZ6232@phenom.ffwll.local> <1471904254-26545-1-git-send-email-jm@lentin.co.uk> <20160823055758.GI24290@phenom.ffwll.local> From: poma Message-ID: Date: Tue, 8 Nov 2016 07:32:45 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <20160823055758.GI24290@phenom.ffwll.local> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 23.08.2016 07:57, Daniel Vetter wrote: > On Mon, Aug 22, 2016 at 11:17:34PM +0100, Jamie Lentin wrote: >> Lift configuration command from udlfb. This appears to be essential for >> at least a Rextron VCUD-60, without which no URB communication occurs. >> >> Signed-off-by: Jamie Lentin >> --- >> udl_encoder_commit() is too late to do this set up in it seems. This >> setup doesn't need to be performed again after a suspend, although this >> is somewhat academic until I send the patch adding suspend and resume >> functions. >> >> Tested with a Rextron VCUD-60 attached to a Thinkpad X201s on Linux 4.7.0 > > Applied to drm-misc, thanks. > -Daniel > >> >> Cheers, >> --- >> drivers/gpu/drm/udl/udl_main.c | 25 +++++++++++++++++++++++++ >> 1 file changed, 25 insertions(+) >> >> diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c >> index 33dbfb2..29f0207 100644 >> --- a/drivers/gpu/drm/udl/udl_main.c >> +++ b/drivers/gpu/drm/udl/udl_main.c >> @@ -16,6 +16,8 @@ >> /* -BULK_SIZE as per usb-skeleton. Can we get full page and avoid overhead? */ >> #define BULK_SIZE 512 >> >> +#define NR_USB_REQUEST_CHANNEL 0x12 >> + >> #define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE) >> #define WRITES_IN_FLIGHT (4) >> #define MAX_VENDOR_DESCRIPTOR_SIZE 256 >> @@ -90,6 +92,26 @@ success: >> return true; >> } >> >> +/* >> + * Need to ensure a channel is selected before submitting URBs >> + */ >> +static int udl_select_std_channel(struct udl_device *udl) >> +{ >> + int ret; >> + u8 set_def_chn[] = {0x57, 0xCD, 0xDC, 0xA7, >> + 0x1C, 0x88, 0x5E, 0x15, >> + 0x60, 0xFE, 0xC6, 0x97, >> + 0x16, 0x3D, 0x47, 0xF2}; >> + >> + ret = usb_control_msg(udl->udev, >> + usb_sndctrlpipe(udl->udev, 0), >> + NR_USB_REQUEST_CHANNEL, >> + (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0, >> + set_def_chn, sizeof(set_def_chn), >> + USB_CTRL_SET_TIMEOUT); >> + return ret < 0 ? ret : 0; >> +} >> + >> static void udl_release_urb_work(struct work_struct *work) >> { >> struct urb_node *unode = container_of(work, struct urb_node, >> @@ -301,6 +323,9 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags) >> goto err; >> } >> >> + if (udl_select_std_channel(udl)) >> + DRM_ERROR("Selecting channel failed\n"); >> + >> if (!udl_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) { >> DRM_ERROR("udl_alloc_urb_list failed\n"); >> goto err; >> -- >> 2.8.1 >> > It doesn't breaks the device, however under the hood it is boiling, ------------[ cut here ]------------ WARNING: CPU: 0 PID: 381 at drivers/usb/core/hcd.c:1584 usb_hcd_map_urb_for_dma+0x49f/0x770 transfer buffer not dma capable Modules linked in: ... udl(+) ... drm_kms_helper ... drm ... CPU: 0 PID: 381 Comm: systemd-udevd Not tainted 4.9.0-0.rc4.git0.1.fc26.x86_64+debug #1 ... Call Trace: [] dump_stack+0x86/0xc3 [] __warn+0xcb/0xf0 [] warn_slowpath_fmt+0x5f/0x80 [] ? debug_dma_mapping_error+0x7b/0x90 [] usb_hcd_map_urb_for_dma+0x49f/0x770 [] ? trace_hardirqs_on_caller+0xf5/0x1b0 [] usb_hcd_submit_urb+0x34d/0xb50 [] ? mark_held_locks+0x76/0xa0 [] ? __raw_spin_lock_init+0x21/0x60 [] ? trace_hardirqs_on_caller+0xf5/0x1b0 [] usb_submit_urb+0x2f4/0x560 [] ? lockdep_init_map+0x61/0x210 [] usb_start_wait_urb+0x74/0x180 [] usb_control_msg+0xdc/0x120 [] udl_driver_load+0x141/0x590 [udl] [] ? trace_hardirqs_on_caller+0xd1/0x1b0 [] drm_dev_register+0xa9/0xd0 [drm] [] udl_usb_probe+0x42/0x90 [udl] [] usb_probe_interface+0x15f/0x2d0 [] driver_probe_device+0x223/0x430 [] __driver_attach+0xe3/0xf0 [] ? driver_probe_device+0x430/0x430 [] bus_for_each_dev+0x73/0xc0 [] driver_attach+0x1e/0x20 [] bus_add_driver+0x173/0x270 [] driver_register+0x60/0xe0 [] usb_register_driver+0xaa/0x160 [] ? 0xffffffffc089a000 [] udl_driver_init+0x1e/0x1000 [udl] [] do_one_initcall+0x50/0x180 [] ? rcu_read_lock_sched_held+0x45/0x80 [] ? kmem_cache_alloc_trace+0x277/0x2d0 [] ? do_init_module+0x27/0x1f1 [] do_init_module+0x5f/0x1f1 [] load_module+0x2401/0x2b40 [] ? __symbol_put+0x70/0x70 [] ? sched_clock_cpu+0x90/0xc0 [] SYSC_init_module+0x19b/0x1c0 [] SyS_init_module+0xe/0x10 [] do_syscall_64+0x6c/0x1f0 [] entry_SYSCALL64_slow_path+0x25/0x25 ---[ end trace 1fa5e22a0dcf62da ]--- [drm:udl_driver_load [udl]] *ERROR* Selecting channel failed udl 1-2:1.0: fb1: udldrmfb frame buffer device [drm] Initialized udl on minor 1 usbcore: registered new interface driver udl Is this expected WARN? Ref. https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/gpu/drm/udl?id=d1c151dc https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/core/hcd.c?id=refs/tags/v4.9-rc4#n1584 From mboxrd@z Thu Jan 1 00:00:00 1970 From: poma Subject: Re: [PATCH v2] drm/udl: Ensure channel is selected before using the device. Date: Tue, 8 Nov 2016 07:32:45 +0100 Message-ID: References: <20160815064328.GZ6232@phenom.ffwll.local> <1471904254-26545-1-git-send-email-jm@lentin.co.uk> <20160823055758.GI24290@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id EFF3E6E312 for ; Tue, 8 Nov 2016 06:32:48 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id a20so9694373wme.2 for ; Mon, 07 Nov 2016 22:32:48 -0800 (PST) In-Reply-To: <20160823055758.GI24290@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jamie Lentin , David Airlie , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org T24gMjMuMDguMjAxNiAwNzo1NywgRGFuaWVsIFZldHRlciB3cm90ZToKPiBPbiBNb24sIEF1ZyAy MiwgMjAxNiBhdCAxMToxNzozNFBNICswMTAwLCBKYW1pZSBMZW50aW4gd3JvdGU6Cj4+IExpZnQg Y29uZmlndXJhdGlvbiBjb21tYW5kIGZyb20gdWRsZmIuIFRoaXMgYXBwZWFycyB0byBiZSBlc3Nl bnRpYWwgZm9yCj4+IGF0IGxlYXN0IGEgUmV4dHJvbiBWQ1VELTYwLCB3aXRob3V0IHdoaWNoIG5v IFVSQiBjb21tdW5pY2F0aW9uIG9jY3Vycy4KPj4KPj4gU2lnbmVkLW9mZi1ieTogSmFtaWUgTGVu dGluIDxqbUBsZW50aW4uY28udWs+Cj4+IC0tLQo+PiB1ZGxfZW5jb2Rlcl9jb21taXQoKSBpcyB0 b28gbGF0ZSB0byBkbyB0aGlzIHNldCB1cCBpbiBpdCBzZWVtcy4gVGhpcwo+PiBzZXR1cCBkb2Vz bid0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIGFnYWluIGFmdGVyIGEgc3VzcGVuZCwgYWx0aG91Z2gg dGhpcwo+PiBpcyBzb21ld2hhdCBhY2FkZW1pYyB1bnRpbCBJIHNlbmQgdGhlIHBhdGNoIGFkZGlu ZyBzdXNwZW5kIGFuZCByZXN1bWUKPj4gZnVuY3Rpb25zLgo+Pgo+PiBUZXN0ZWQgd2l0aCBhIFJl eHRyb24gVkNVRC02MCBhdHRhY2hlZCB0byBhIFRoaW5rcGFkIFgyMDFzIG9uIExpbnV4IDQuNy4w Cj4gCj4gQXBwbGllZCB0byBkcm0tbWlzYywgdGhhbmtzLgo+IC1EYW5pZWwKPiAKPj4KPj4gQ2hl ZXJzLAo+PiAtLS0KPj4gIGRyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX21haW4uYyB8IDI1ICsrKysr KysrKysrKysrKysrKysrKysrKysKPj4gIDEgZmlsZSBjaGFuZ2VkLCAyNSBpbnNlcnRpb25zKCsp Cj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9tYWluLmMgYi9kcml2 ZXJzL2dwdS9kcm0vdWRsL3VkbF9tYWluLmMKPj4gaW5kZXggMzNkYmZiMi4uMjlmMDIwNyAxMDA2 NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfbWFpbi5jCj4+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS91ZGwvdWRsX21haW4uYwo+PiBAQCAtMTYsNiArMTYsOCBAQAo+PiAgLyogLUJV TEtfU0laRSBhcyBwZXIgdXNiLXNrZWxldG9uLiBDYW4gd2UgZ2V0IGZ1bGwgcGFnZSBhbmQgYXZv aWQgb3ZlcmhlYWQ/ICovCj4+ICAjZGVmaW5lIEJVTEtfU0laRSA1MTIKPj4gIAo+PiArI2RlZmlu ZSBOUl9VU0JfUkVRVUVTVF9DSEFOTkVMIDB4MTIKPj4gKwo+PiAgI2RlZmluZSBNQVhfVFJBTlNG RVIgKFBBR0VfU0laRSoxNiAtIEJVTEtfU0laRSkKPj4gICNkZWZpbmUgV1JJVEVTX0lOX0ZMSUdI VCAoNCkKPj4gICNkZWZpbmUgTUFYX1ZFTkRPUl9ERVNDUklQVE9SX1NJWkUgMjU2Cj4+IEBAIC05 MCw2ICs5MiwyNiBAQCBzdWNjZXNzOgo+PiAgCXJldHVybiB0cnVlOwo+PiAgfQo+PiAgCj4+ICsv Kgo+PiArICogTmVlZCB0byBlbnN1cmUgYSBjaGFubmVsIGlzIHNlbGVjdGVkIGJlZm9yZSBzdWJt aXR0aW5nIFVSQnMKPj4gKyAqLwo+PiArc3RhdGljIGludCB1ZGxfc2VsZWN0X3N0ZF9jaGFubmVs KHN0cnVjdCB1ZGxfZGV2aWNlICp1ZGwpCj4+ICt7Cj4+ICsJaW50IHJldDsKPj4gKwl1OCBzZXRf ZGVmX2NobltdID0gezB4NTcsIDB4Q0QsIDB4REMsIDB4QTcsCj4+ICsJCQkgICAgMHgxQywgMHg4 OCwgMHg1RSwgMHgxNSwKPj4gKwkJCSAgICAweDYwLCAweEZFLCAweEM2LCAweDk3LAo+PiArCQkJ ICAgIDB4MTYsIDB4M0QsIDB4NDcsIDB4RjJ9Owo+PiArCj4+ICsJcmV0ID0gdXNiX2NvbnRyb2xf bXNnKHVkbC0+dWRldiwKPj4gKwkJCSAgICAgIHVzYl9zbmRjdHJscGlwZSh1ZGwtPnVkZXYsIDAp LAo+PiArCQkJICAgICAgTlJfVVNCX1JFUVVFU1RfQ0hBTk5FTCwKPj4gKwkJCSAgICAgIChVU0Jf RElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiksIDAsIDAsCj4+ICsJCQkgICAgICBzZXRfZGVmX2No biwgc2l6ZW9mKHNldF9kZWZfY2huKSwKPj4gKwkJCSAgICAgIFVTQl9DVFJMX1NFVF9USU1FT1VU KTsKPj4gKwlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Cj4+ICt9Cj4+ICsKPj4gIHN0YXRpYyB2 b2lkIHVkbF9yZWxlYXNlX3VyYl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPj4gIHsK Pj4gIAlzdHJ1Y3QgdXJiX25vZGUgKnVub2RlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1 cmJfbm9kZSwKPj4gQEAgLTMwMSw2ICszMjMsOSBAQCBpbnQgdWRsX2RyaXZlcl9sb2FkKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCj4+ICAJCWdvdG8gZXJyOwo+ PiAgCX0KPj4gIAo+PiArCWlmICh1ZGxfc2VsZWN0X3N0ZF9jaGFubmVsKHVkbCkpCj4+ICsJCURS TV9FUlJPUigiU2VsZWN0aW5nIGNoYW5uZWwgZmFpbGVkXG4iKTsKPj4gKwo+PiAgCWlmICghdWRs X2FsbG9jX3VyYl9saXN0KGRldiwgV1JJVEVTX0lOX0ZMSUdIVCwgTUFYX1RSQU5TRkVSKSkgewo+ PiAgCQlEUk1fRVJST1IoInVkbF9hbGxvY191cmJfbGlzdCBmYWlsZWRcbiIpOwo+PiAgCQlnb3Rv IGVycjsKPj4gLS0gCj4+IDIuOC4xCj4+Cj4gCgpJdCBkb2Vzbid0IGJyZWFrcyB0aGUgZGV2aWNl LCBob3dldmVyIHVuZGVyIHRoZSBob29kIGl0IGlzIGJvaWxpbmcsCgotLS0tLS0tLS0tLS1bIGN1 dCBoZXJlIF0tLS0tLS0tLS0tLS0KV0FSTklORzogQ1BVOiAwIFBJRDogMzgxIGF0IGRyaXZlcnMv dXNiL2NvcmUvaGNkLmM6MTU4NCB1c2JfaGNkX21hcF91cmJfZm9yX2RtYSsweDQ5Zi8weDc3MAp0 cmFuc2ZlciBidWZmZXIgbm90IGRtYSBjYXBhYmxlCk1vZHVsZXMgbGlua2VkIGluOiAuLi4gdWRs KCspIC4uLiBkcm1fa21zX2hlbHBlciAuLi4gZHJtIC4uLgpDUFU6IDAgUElEOiAzODEgQ29tbTog c3lzdGVtZC11ZGV2ZCBOb3QgdGFpbnRlZCA0LjkuMC0wLnJjNC5naXQwLjEuZmMyNi54ODZfNjQr ZGVidWcgIzEKLi4uCkNhbGwgVHJhY2U6CiBbPGZmZmZmZmZmYjY0NmIxYjM+XSBkdW1wX3N0YWNr KzB4ODYvMHhjMwogWzxmZmZmZmZmZmI2MGFmNTViPl0gX193YXJuKzB4Y2IvMHhmMAogWzxmZmZm ZmZmZmI2MGFmNWRmPl0gd2Fybl9zbG93cGF0aF9mbXQrMHg1Zi8weDgwCiBbPGZmZmZmZmZmYjY0 OWU4NmI+XSA/IGRlYnVnX2RtYV9tYXBwaW5nX2Vycm9yKzB4N2IvMHg5MAogWzxmZmZmZmZmZmI2 Njk0YThmPl0gdXNiX2hjZF9tYXBfdXJiX2Zvcl9kbWErMHg0OWYvMHg3NzAKIFs8ZmZmZmZmZmZi NjExMGUyNT5dID8gdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKzB4ZjUvMHgxYjAKIFs8ZmZmZmZm ZmZiNjY5NTM5ZD5dIHVzYl9oY2Rfc3VibWl0X3VyYisweDM0ZC8weGI1MAogWzxmZmZmZmZmZmI2 MTEwZDA2Pl0gPyBtYXJrX2hlbGRfbG9ja3MrMHg3Ni8weGEwCiBbPGZmZmZmZmZmYjYxMTY2MDE+ XSA/IF9fcmF3X3NwaW5fbG9ja19pbml0KzB4MjEvMHg2MAogWzxmZmZmZmZmZmI2MTEwZTI1Pl0g PyB0cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIrMHhmNS8weDFiMAogWzxmZmZmZmZmZmI2Njk2ZDc0 Pl0gdXNiX3N1Ym1pdF91cmIrMHgyZjQvMHg1NjAKIFs8ZmZmZmZmZmZiNjEwZTE3MT5dID8gbG9j a2RlcF9pbml0X21hcCsweDYxLzB4MjEwCiBbPGZmZmZmZmZmYjY2OTc2ZjQ+XSB1c2Jfc3RhcnRf d2FpdF91cmIrMHg3NC8weDE4MAogWzxmZmZmZmZmZmI2Njk3OGRjPl0gdXNiX2NvbnRyb2xfbXNn KzB4ZGMvMHgxMjAKIFs8ZmZmZmZmZmZjMDg5MjNlMT5dIHVkbF9kcml2ZXJfbG9hZCsweDE0MS8w eDU5MCBbdWRsXQogWzxmZmZmZmZmZmI2MTEwZTAxPl0gPyB0cmFjZV9oYXJkaXJxc19vbl9jYWxs ZXIrMHhkMS8weDFiMAogWzxmZmZmZmZmZmMwNTlmYmU5Pl0gZHJtX2Rldl9yZWdpc3RlcisweGE5 LzB4ZDAgW2RybV0KIFs8ZmZmZmZmZmZjMDg5MTBjMj5dIHVkbF91c2JfcHJvYmUrMHg0Mi8weDkw IFt1ZGxdCiBbPGZmZmZmZmZmYjY2OWMxOGY+XSB1c2JfcHJvYmVfaW50ZXJmYWNlKzB4MTVmLzB4 MmQwCiBbPGZmZmZmZmZmYjY1ZWIyZjM+XSBkcml2ZXJfcHJvYmVfZGV2aWNlKzB4MjIzLzB4NDMw CiBbPGZmZmZmZmZmYjY1ZWI1ZTM+XSBfX2RyaXZlcl9hdHRhY2grMHhlMy8weGYwCiBbPGZmZmZm ZmZmYjY1ZWI1MDA+XSA/IGRyaXZlcl9wcm9iZV9kZXZpY2UrMHg0MzAvMHg0MzAKIFs8ZmZmZmZm ZmZiNjVlOGJmMz5dIGJ1c19mb3JfZWFjaF9kZXYrMHg3My8weGMwCiBbPGZmZmZmZmZmYjY1ZWFh MWU+XSBkcml2ZXJfYXR0YWNoKzB4MWUvMHgyMAogWzxmZmZmZmZmZmI2NWVhNDQzPl0gYnVzX2Fk ZF9kcml2ZXIrMHgxNzMvMHgyNzAKIFs8ZmZmZmZmZmZiNjVlYzI0MD5dIGRyaXZlcl9yZWdpc3Rl cisweDYwLzB4ZTAKIFs8ZmZmZmZmZmZiNjY5YTlmYT5dIHVzYl9yZWdpc3Rlcl9kcml2ZXIrMHhh YS8weDE2MAogWzxmZmZmZmZmZmMwODlhMDAwPl0gPyAweGZmZmZmZmZmYzA4OWEwMDAKIFs8ZmZm ZmZmZmZjMDg5YTAxZT5dIHVkbF9kcml2ZXJfaW5pdCsweDFlLzB4MTAwMCBbdWRsXQogWzxmZmZm ZmZmZmI2MDAyMTkwPl0gZG9fb25lX2luaXRjYWxsKzB4NTAvMHgxODAKIFs8ZmZmZmZmZmZiNjEz MTA0NT5dID8gcmN1X3JlYWRfbG9ja19zY2hlZF9oZWxkKzB4NDUvMHg4MAogWzxmZmZmZmZmZmI2 Mjc1Nzg3Pl0gPyBrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKzB4Mjc3LzB4MmQwCiBbPGZmZmZmZmZm YjYxZmIyY2U+XSA/IGRvX2luaXRfbW9kdWxlKzB4MjcvMHgxZjEKIFs8ZmZmZmZmZmZiNjFmYjMw Nj5dIGRvX2luaXRfbW9kdWxlKzB4NWYvMHgxZjEKIFs8ZmZmZmZmZmZiNjE1ZTNkMT5dIGxvYWRf bW9kdWxlKzB4MjQwMS8weDJiNDAKIFs8ZmZmZmZmZmZiNjE1YWMwMD5dID8gX19zeW1ib2xfcHV0 KzB4NzAvMHg3MAogWzxmZmZmZmZmZmI2MGVjZDEwPl0gPyBzY2hlZF9jbG9ja19jcHUrMHg5MC8w eGMwCiBbPGZmZmZmZmZmYjYxNWVjYWI+XSBTWVNDX2luaXRfbW9kdWxlKzB4MTliLzB4MWMwCiBb PGZmZmZmZmZmYjYxNWVkZWU+XSBTeVNfaW5pdF9tb2R1bGUrMHhlLzB4MTAKIFs8ZmZmZmZmZmZi NjAwM2VlYz5dIGRvX3N5c2NhbGxfNjQrMHg2Yy8weDFmMAogWzxmZmZmZmZmZmI2OTBiZDQ5Pl0g ZW50cnlfU1lTQ0FMTDY0X3Nsb3dfcGF0aCsweDI1LzB4MjUKLS0tWyBlbmQgdHJhY2UgMWZhNWUy MmEwZGNmNjJkYSBdLS0tCltkcm06dWRsX2RyaXZlcl9sb2FkIFt1ZGxdXSAqRVJST1IqIFNlbGVj dGluZyBjaGFubmVsIGZhaWxlZAp1ZGwgMS0yOjEuMDogZmIxOiB1ZGxkcm1mYiBmcmFtZSBidWZm ZXIgZGV2aWNlCltkcm1dIEluaXRpYWxpemVkIHVkbCBvbiBtaW5vciAxCnVzYmNvcmU6IHJlZ2lz dGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgdWRsCgoKSXMgdGhpcyBleHBlY3RlZCBXQVJOPwoK ClJlZi4KaHR0cHM6Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQvdG9ydmFs ZHMvbGludXguZ2l0L2NvbW1pdC9kcml2ZXJzL2dwdS9kcm0vdWRsP2lkPWQxYzE1MWRjCmh0dHBz Oi8vZ2l0Lmtlcm5lbC5vcmcvY2dpdC9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4Lmdp dC90cmVlL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmM/aWQ9cmVmcy90YWdzL3Y0LjktcmM0I24xNTg0 CgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1k ZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=