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=-3.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=no 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 3EDDAC2BA2B for ; Mon, 6 Apr 2020 19:11:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 075B7206C0 for ; Mon, 6 Apr 2020 19:11:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=yandex.ru header.i=@yandex.ru header.b="j5IYEJ58" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725995AbgDFTLe (ORCPT ); Mon, 6 Apr 2020 15:11:34 -0400 Received: from forward106p.mail.yandex.net ([77.88.28.109]:51202 "EHLO forward106p.mail.yandex.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725928AbgDFTLd (ORCPT ); Mon, 6 Apr 2020 15:11:33 -0400 Received: from forward100q.mail.yandex.net (forward100q.mail.yandex.net [IPv6:2a02:6b8:c0e:4b:0:640:4012:bb97]) by forward106p.mail.yandex.net (Yandex) with ESMTP id 345B01C80565; Mon, 6 Apr 2020 22:11:29 +0300 (MSK) Received: from mxback1q.mail.yandex.net (mxback1q.mail.yandex.net [IPv6:2a02:6b8:c0e:39:0:640:25b3:aea5]) by forward100q.mail.yandex.net (Yandex) with ESMTP id 2CF627080014; Mon, 6 Apr 2020 22:11:29 +0300 (MSK) Received: from vla3-3dd1bd6927b2.qloud-c.yandex.net (vla3-3dd1bd6927b2.qloud-c.yandex.net [2a02:6b8:c15:350f:0:640:3dd1:bd69]) by mxback1q.mail.yandex.net (mxback/Yandex) with ESMTP id 0kHgAgVLWR-BQDqE1Re; Mon, 06 Apr 2020 22:11:29 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1586200289; bh=1VcoKan0Z08qea+vCKDcuAyu+FVCyJzkg8zpty9cfcg=; h=In-Reply-To:Subject:To:From:Cc:References:Date:Message-Id; b=j5IYEJ58eWEoa2LGxsKqgjb2XpUqdflbq+AwspY1NbmxRtEZGVKyA3nvseEJKRW5O NUlt7yfpnPCfCTYike+KkIFjF/pEgu5ZIUZ5xeRA17tRtEc73Ga79Qk5YAipPtRiBD yKLFIkJv7cmkKoxwE6Ab+mDFO3xehUVyQAWacNH8= Authentication-Results: mxback1q.mail.yandex.net; dkim=pass header.i=@yandex.ru Received: by vla3-3dd1bd6927b2.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id LMgrxo4Dm0-BO3m4D6W; Mon, 06 Apr 2020 22:11:26 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) From: Alexander Lobakin To: Florian Fainelli Cc: Alexander Lobakin , Andrew Lunn , "David S. Miller" , Jakub Kicinski , Woojung Huh , Hauke Mehrtens , Linus Walleij , Sean Wang , Russell King , Microchip Linux Driver Support , Claudiu Manoil , "netdev@vger.kernel.org" , "linux-mediatek@lists.infradead.org" , "linux-arm-kernel@lists.infradead.org" , Philipp Zabel , Vladimir Oltean , Matthias Brugger , Oleksij Rempel , Vivien Didelot , "linux-kernel@vger.kernel.org" , Mao Wenan Subject: Re: [PATCH net-next] net: dsa: add GRO support via gro_cells Date: Mon, 6 Apr 2020 22:11:13 +0300 Message-Id: <20200406191113.5983-1-bloodyreaper@yandex.ru> X-Mailer: git-send-email 2.26.0 In-Reply-To: <97a880e4-de7d-1f94-d35b-2635fbd8237e@gmail.com> References: <97a880e4-de7d-1f94-d35b-2635fbd8237e@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 06.04.2020, 20:57, "Florian Fainelli" : > On 4/6/2020 10:34 AM, Alexander Lobakin wrote: >>  06.04.2020, 18:21, "Alexander Lobakin" : >>>  06.04.2020, 17:48, "Andrew Lunn" : >>>>   On Mon, Apr 06, 2020 at 01:59:10PM +0300, Alexander Lobakin wrote: >>>>>    gro_cells lib is used by different encapsulating netdevices, such as >>>>>    geneve, macsec, vxlan etc. to speed up decapsulated traffic processing. >>>>>    CPU tag is a sort of "encapsulation", and we can use the same mechs to >>>>>    greatly improve overall DSA performance. >>>>>    skbs are passed to the GRO layer after removing CPU tags, so we don't >>>>>    need any new packet offload types as it was firstly proposed by me in >>>>>    the first GRO-over-DSA variant [1]. >>>>> >>>>>    The size of struct gro_cells is sizeof(void *), so hot struct >>>>>    dsa_slave_priv becomes only 4/8 bytes bigger, and all critical fields >>>>>    remain in one 32-byte cacheline. >>>>>    The other positive side effect is that drivers for network devices >>>>>    that can be shipped as CPU ports of DSA-driven switches can now use >>>>>    napi_gro_frags() to pass skbs to kernel. Packets built that way are >>>>>    completely non-linear and are likely being dropped without GRO. >>>>> >>>>>    This was tested on to-be-mainlined-soon Ethernet driver that uses >>>>>    napi_gro_frags(), and the overall performance was on par with the >>>>>    variant from [1], sometimes even better due to minimal overhead. >>>>>    net.core.gro_normal_batch tuning may help to push it to the limit >>>>>    on particular setups and platforms. >>>>> >>>>>    [1] https://lore.kernel.org/netdev/20191230143028.27313-1-alobakin@dlink.ru/ >>>> >>>>   Hi Alexander >>> >>>  Hi Andrew! >>> >>>>   net-next is closed at the moment. So you should of posted this with an >>>>   RFC prefix. >>> >>>  I saw that it's closed, but didn't knew about "RFC" tags for that period, >>>  sorry. >>> >>>>   The implementation looks nice and simple. But it would be nice to have >>>>   some performance figures. >>> >>>  I'll do, sure. I think I'll collect the stats with various main receiving >>>  functions in Ethernet driver (napi_gro_frags(), napi_gro_receive(), >>>  netif_receive_skb(), netif_receive_skb_list()), and with and without this >>>  patch to make them as complete as possible. >> >>  OK, so here we go. >> >>  My device is 1.2 GHz 4-core MIPS32 R2. Ethernet controller representing >>  the CPU port is capable of S/G, fraglists S/G, TSO4/6 and GSO UDP L4. >>  Tests are performed through simple IPoE VLAN NAT forwarding setup >>  (port0 <-> port1.218) with iperf3 in TCP mode. >>  net.core.gro_normal_batch is always set to 16 as that value seems to be >>  the most effective for that particular hardware and drivers. >> >>  Packet counters on eth0 are the real numbers of ongoing frames. Counters >>  on portX are pure-software and are updated inside networking stack. >> >>  --------------------------------------------------------------------- >> >>  netif_receive_skb() in Eth driver, no patch: >> >>  [ ID] Interval Transfer Bitrate Retr >>  [ 5] 0.00-120.01 sec 9.00 GBytes 644 Mbits/sec 413 sender >>  [ 5] 0.00-120.00 sec 8.99 GBytes 644 Mbits/sec receiver >> >>  eth0 >>  RX packets:7097731 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:7097702 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port0 >>  RX packets:426050 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:6671829 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1 >>  RX packets:6671681 errors:0 dropped:0 overruns:0 carrier:0 >>  TX packets:425862 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1.218 >>  RX packets:6671677 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:425851 errors:0 dropped:0 overruns:0 carrier:0 >> >>  --------------------------------------------------------------------- >> >>  netif_receive_skb_list() in Eth driver, no patch: >> >>  [ ID] Interval Transfer Bitrate Retr >>  [ 5] 0.00-120.01 sec 9.48 GBytes 679 Mbits/sec 129 sender >>  [ 5] 0.00-120.00 sec 9.48 GBytes 679 Mbits/sec receiver >> >>  eth0 >>  RX packets:7448098 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:7448073 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port0 >>  RX packets:416115 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:7032121 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1 >>  RX packets:7031983 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:415941 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1.218 >>  RX packets:7031978 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:415930 errors:0 dropped:0 overruns:0 carrier:0 >> >>  --------------------------------------------------------------------- >> >>  napi_gro_receive() in Eth driver, no patch: >> >>  [ ID] Interval Transfer Bitrate Retr >>  [ 5] 0.00-120.01 sec 10.0 GBytes 718 Mbits/sec 107 sender >>  [ 5] 0.00-120.00 sec 10.0 GBytes 718 Mbits/sec receiver >> >>  eth0 >>  RX packets:7868281 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:7868267 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port0 >>  RX packets:429082 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:7439343 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1 >>  RX packets:7439199 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:428913 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1.218 >>  RX packets:7439195 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:428902 errors:0 dropped:0 overruns:0 carrier:0 >> >>  ===================================================================== >> >>  netif_receive_skb() in Eth driver + patch: >> >>  [ ID] Interval Transfer Bitrate Retr >>  [ 5] 0.00-120.01 sec 12.2 GBytes 870 Mbits/sec 2267 sender >>  [ 5] 0.00-120.00 sec 12.2 GBytes 870 Mbits/sec receiver >> >>  eth0 >>  RX packets:9474792 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:9474777 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port0 >>  RX packets:455200 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:353288 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1 >>  RX packets:9019592 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:455035 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1.218 >>  RX packets:353144 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:455024 errors:0 dropped:0 overruns:0 carrier:0 >> >>  --------------------------------------------------------------------- >> >>  netif_receive_skb_list() in Eth driver + patch: >> >>  [ ID] Interval Transfer Bitrate Retr >>  [ 5] 0.00-120.01 sec 11.6 GBytes 827 Mbits/sec 2224 sender >>  [ 5] 0.00-120.00 sec 11.5 GBytes 827 Mbits/sec receiver >> >>  eth0 >>  RX packets:8981651 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:898187 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port0 >>  RX packets:436159 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:335665 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1 >>  RX packets:8545492 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:436071 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1.218 >>  RX packets:335593 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:436065 errors:0 dropped:0 overruns:0 carrier:0 >> >>  ----------------------------------------------------------- >> >>  napi_gro_receive() in Eth driver + patch: >> >>  [ ID] Interval Transfer Bitrate Retr >>  [ 5] 0.00-120.01 sec 11.8 GBytes 855 Mbits/sec 122 sender >>  [ 5] 0.00-120.00 sec 11.8 GBytes 855 Mbits/sec receiver >> >>  eth0 >>  RX packets:9292214 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:9292190 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port0 >>  RX packets:438516 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:347236 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1 >>  RX packets:8853698 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:438331 errors:0 dropped:0 overruns:0 carrier:0 >> >>  port1.218 >>  RX packets:347082 errors:0 dropped:0 overruns:0 frame:0 >>  TX packets:438320 errors:0 dropped:0 overruns:0 carrier:0 >> >>  ----------------------------------------------------------- >> >>  The main goal is achieved: we have about 100-200 Mbps of performance >>  boost while in-stack skbs are greatly reduced from ~8-9 millions to >>  ~350000 (compare port0 TX and port1 RX without patch and with it). > > And the number of TCP retries is also lower, which likely means that we > are making better use of the flow control built into the hardware/driver > here? > > BTW do you know why you have so many retries though? It sounds like your > flow control is missing a few edge cases, or that you have an incorrect > configuration of your TX admission queue. Well, I have the same question TBH. All these ~1.5 years that I'm working on these switches I have pretty chaotic number of TCP retransmissions each time I change something in the code. They are less likely to happen when the average CPU load is lower, but ~100 is the best result I ever got. Seems like I should stop trying to push software throughput to the max for a while and pay more attention to this and to hardware configuration instead and check if I miss something :) >>  The main bottleneck in gro_cells setup is that GRO layer starts to >>  work only after skb are being processed by DSA stack, so they are >>  going frame-by-frame until that moment (RX counter on port1). >> >>  If one day we change the way of handling incoming packets (not >>  through fake packet_type), we could avoid that by unblocking GRO >>  processing in between Eth driver and DSA core. >>  With my custom packet_offload for ETH_P_XDSA that works only for >>  my CPU tag format I have about ~910-920 Mbps on the same platform. >>  This way doesn't fit mainline code of course, so I'm working on >>  alternative Rx paths for DSA, e.g. through net_device::rx_handler() >>  etc. >> >>  Until then, gro_cells really improve things a lot while the actual >>  patch is tiny. > -- > Florian 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=-3.5 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=no 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 43789C2BA2B for ; Mon, 6 Apr 2020 19:11:58 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1FDE6206C0 for ; Mon, 6 Apr 2020 19:11:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="GOwSEB66"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yandex.ru header.i=@yandex.ru header.b="j5IYEJ58" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1FDE6206C0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=yandex.ru Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=n5i7eoI4VrXVCOwGy8KtzsnXKxsc7Ufm6knToWELdPE=; b=GOwSEB664e3Y2U VnkT3FtqvRZ3mRUTdJCbDXClAzSgbb2v4+18+XhijbGCPyc3HrBLO2Hvul0PyyNkEpSrMo74x/Pcg H2dnDpb9ub+SxQN3R+WvO4uCb9fB4idjOJwFUfyHWpIMomB1e/oqVedrRxfXoyrHneHD1bHExNJep DgicvazeUCr+GeFUm8joHHbMBnDH2G0SolS5fsSvdbzJ4w7c3MRDppN6LESaonbFU8Y5p3gjRcRg9 cKDrGAyLa9o1B/Y4sU2FMhPE1rgpl5jVTQ6fzw0gx4OLzrIrbQVlPvGTqCOy3iQtwx1s/B8u64zLC +zCKHryIWa4k6Ct+C2XA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jLX9s-0001A3-Eh; Mon, 06 Apr 2020 19:11:44 +0000 Received: from forward106p.mail.yandex.net ([2a02:6b8:0:1472:2741:0:8b7:109]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jLX9i-00012R-Pa; Mon, 06 Apr 2020 19:11:37 +0000 Received: from forward100q.mail.yandex.net (forward100q.mail.yandex.net [IPv6:2a02:6b8:c0e:4b:0:640:4012:bb97]) by forward106p.mail.yandex.net (Yandex) with ESMTP id 345B01C80565; Mon, 6 Apr 2020 22:11:29 +0300 (MSK) Received: from mxback1q.mail.yandex.net (mxback1q.mail.yandex.net [IPv6:2a02:6b8:c0e:39:0:640:25b3:aea5]) by forward100q.mail.yandex.net (Yandex) with ESMTP id 2CF627080014; Mon, 6 Apr 2020 22:11:29 +0300 (MSK) Received: from vla3-3dd1bd6927b2.qloud-c.yandex.net (vla3-3dd1bd6927b2.qloud-c.yandex.net [2a02:6b8:c15:350f:0:640:3dd1:bd69]) by mxback1q.mail.yandex.net (mxback/Yandex) with ESMTP id 0kHgAgVLWR-BQDqE1Re; Mon, 06 Apr 2020 22:11:29 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1586200289; bh=1VcoKan0Z08qea+vCKDcuAyu+FVCyJzkg8zpty9cfcg=; h=In-Reply-To:Subject:To:From:Cc:References:Date:Message-Id; b=j5IYEJ58eWEoa2LGxsKqgjb2XpUqdflbq+AwspY1NbmxRtEZGVKyA3nvseEJKRW5O NUlt7yfpnPCfCTYike+KkIFjF/pEgu5ZIUZ5xeRA17tRtEc73Ga79Qk5YAipPtRiBD yKLFIkJv7cmkKoxwE6Ab+mDFO3xehUVyQAWacNH8= Authentication-Results: mxback1q.mail.yandex.net; dkim=pass header.i=@yandex.ru Received: by vla3-3dd1bd6927b2.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id LMgrxo4Dm0-BO3m4D6W; Mon, 06 Apr 2020 22:11:26 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) From: Alexander Lobakin To: Florian Fainelli Subject: Re: [PATCH net-next] net: dsa: add GRO support via gro_cells Date: Mon, 6 Apr 2020 22:11:13 +0300 Message-Id: <20200406191113.5983-1-bloodyreaper@yandex.ru> X-Mailer: git-send-email 2.26.0 In-Reply-To: <97a880e4-de7d-1f94-d35b-2635fbd8237e@gmail.com> References: <97a880e4-de7d-1f94-d35b-2635fbd8237e@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200406_121135_328805_80EF3A42 X-CRM114-Status: GOOD ( 22.37 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Woojung Huh , Andrew Lunn , "linux-kernel@vger.kernel.org" , Alexander Lobakin , Hauke Mehrtens , Linus Walleij , Sean Wang , Russell King , Vivien Didelot , Microchip Linux Driver Support , Vladimir Oltean , Claudiu Manoil , "linux-mediatek@lists.infradead.org" , Philipp Zabel , "netdev@vger.kernel.org" , Matthias Brugger , Jakub Kicinski , Oleksij Rempel , "David S. Miller" , "linux-arm-kernel@lists.infradead.org" , Mao Wenan Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org MDYuMDQuMjAyMCwgMjA6NTcsICJGbG9yaWFuIEZhaW5lbGxpIiA8Zi5mYWluZWxsaUBnbWFpbC5j b20+Ogo+IE9uIDQvNi8yMDIwIDEwOjM0IEFNLCBBbGV4YW5kZXIgTG9iYWtpbiB3cm90ZToKPj4g wqAwNi4wNC4yMDIwLCAxODoyMSwgIkFsZXhhbmRlciBMb2Jha2luIiA8Ymxvb2R5cmVhcGVyQHlh bmRleC5ydT46Cj4+PiDCoDA2LjA0LjIwMjAsIDE3OjQ4LCAiQW5kcmV3IEx1bm4iIDxhbmRyZXdA bHVubi5jaD46Cj4+Pj4gwqDCoE9uIE1vbiwgQXByIDA2LCAyMDIwIGF0IDAxOjU5OjEwUE0gKzAz MDAsIEFsZXhhbmRlciBMb2Jha2luIHdyb3RlOgo+Pj4+PiDCoMKgwqBncm9fY2VsbHMgbGliIGlz IHVzZWQgYnkgZGlmZmVyZW50IGVuY2Fwc3VsYXRpbmcgbmV0ZGV2aWNlcywgc3VjaCBhcwo+Pj4+ PiDCoMKgwqBnZW5ldmUsIG1hY3NlYywgdnhsYW4gZXRjLiB0byBzcGVlZCB1cCBkZWNhcHN1bGF0 ZWQgdHJhZmZpYyBwcm9jZXNzaW5nLgo+Pj4+PiDCoMKgwqBDUFUgdGFnIGlzIGEgc29ydCBvZiAi ZW5jYXBzdWxhdGlvbiIsIGFuZCB3ZSBjYW4gdXNlIHRoZSBzYW1lIG1lY2hzIHRvCj4+Pj4+IMKg wqDCoGdyZWF0bHkgaW1wcm92ZSBvdmVyYWxsIERTQSBwZXJmb3JtYW5jZS4KPj4+Pj4gwqDCoMKg c2ticyBhcmUgcGFzc2VkIHRvIHRoZSBHUk8gbGF5ZXIgYWZ0ZXIgcmVtb3ZpbmcgQ1BVIHRhZ3Ms IHNvIHdlIGRvbid0Cj4+Pj4+IMKgwqDCoG5lZWQgYW55IG5ldyBwYWNrZXQgb2ZmbG9hZCB0eXBl cyBhcyBpdCB3YXMgZmlyc3RseSBwcm9wb3NlZCBieSBtZSBpbgo+Pj4+PiDCoMKgwqB0aGUgZmly c3QgR1JPLW92ZXItRFNBIHZhcmlhbnQgWzFdLgo+Pj4+Pgo+Pj4+PiDCoMKgwqBUaGUgc2l6ZSBv ZiBzdHJ1Y3QgZ3JvX2NlbGxzIGlzIHNpemVvZih2b2lkICopLCBzbyBob3Qgc3RydWN0Cj4+Pj4+ IMKgwqDCoGRzYV9zbGF2ZV9wcml2IGJlY29tZXMgb25seSA0LzggYnl0ZXMgYmlnZ2VyLCBhbmQg YWxsIGNyaXRpY2FsIGZpZWxkcwo+Pj4+PiDCoMKgwqByZW1haW4gaW4gb25lIDMyLWJ5dGUgY2Fj aGVsaW5lLgo+Pj4+PiDCoMKgwqBUaGUgb3RoZXIgcG9zaXRpdmUgc2lkZSBlZmZlY3QgaXMgdGhh dCBkcml2ZXJzIGZvciBuZXR3b3JrIGRldmljZXMKPj4+Pj4gwqDCoMKgdGhhdCBjYW4gYmUgc2hp cHBlZCBhcyBDUFUgcG9ydHMgb2YgRFNBLWRyaXZlbiBzd2l0Y2hlcyBjYW4gbm93IHVzZQo+Pj4+ PiDCoMKgwqBuYXBpX2dyb19mcmFncygpIHRvIHBhc3Mgc2ticyB0byBrZXJuZWwuIFBhY2tldHMg YnVpbHQgdGhhdCB3YXkgYXJlCj4+Pj4+IMKgwqDCoGNvbXBsZXRlbHkgbm9uLWxpbmVhciBhbmQg YXJlIGxpa2VseSBiZWluZyBkcm9wcGVkIHdpdGhvdXQgR1JPLgo+Pj4+Pgo+Pj4+PiDCoMKgwqBU aGlzIHdhcyB0ZXN0ZWQgb24gdG8tYmUtbWFpbmxpbmVkLXNvb24gRXRoZXJuZXQgZHJpdmVyIHRo YXQgdXNlcwo+Pj4+PiDCoMKgwqBuYXBpX2dyb19mcmFncygpLCBhbmQgdGhlIG92ZXJhbGwgcGVy Zm9ybWFuY2Ugd2FzIG9uIHBhciB3aXRoIHRoZQo+Pj4+PiDCoMKgwqB2YXJpYW50IGZyb20gWzFd LCBzb21ldGltZXMgZXZlbiBiZXR0ZXIgZHVlIHRvIG1pbmltYWwgb3ZlcmhlYWQuCj4+Pj4+IMKg wqDCoG5ldC5jb3JlLmdyb19ub3JtYWxfYmF0Y2ggdHVuaW5nIG1heSBoZWxwIHRvIHB1c2ggaXQg dG8gdGhlIGxpbWl0Cj4+Pj4+IMKgwqDCoG9uIHBhcnRpY3VsYXIgc2V0dXBzIGFuZCBwbGF0Zm9y bXMuCj4+Pj4+Cj4+Pj4+IMKgwqDCoFsxXSBodHRwczovL2xvcmUua2VybmVsLm9yZy9uZXRkZXYv MjAxOTEyMzAxNDMwMjguMjczMTMtMS1hbG9iYWtpbkBkbGluay5ydS8KPj4+Pgo+Pj4+IMKgwqBI aSBBbGV4YW5kZXIKPj4+Cj4+PiDCoEhpIEFuZHJldyEKPj4+Cj4+Pj4gwqDCoG5ldC1uZXh0IGlz IGNsb3NlZCBhdCB0aGUgbW9tZW50LiBTbyB5b3Ugc2hvdWxkIG9mIHBvc3RlZCB0aGlzIHdpdGgg YW4KPj4+PiDCoMKgUkZDIHByZWZpeC4KPj4+Cj4+PiDCoEkgc2F3IHRoYXQgaXQncyBjbG9zZWQs IGJ1dCBkaWRuJ3Qga25ldyBhYm91dCAiUkZDIiB0YWdzIGZvciB0aGF0IHBlcmlvZCwKPj4+IMKg c29ycnkuCj4+Pgo+Pj4+IMKgwqBUaGUgaW1wbGVtZW50YXRpb24gbG9va3MgbmljZSBhbmQgc2lt cGxlLiBCdXQgaXQgd291bGQgYmUgbmljZSB0byBoYXZlCj4+Pj4gwqDCoHNvbWUgcGVyZm9ybWFu Y2UgZmlndXJlcy4KPj4+Cj4+PiDCoEknbGwgZG8sIHN1cmUuIEkgdGhpbmsgSSdsbCBjb2xsZWN0 IHRoZSBzdGF0cyB3aXRoIHZhcmlvdXMgbWFpbiByZWNlaXZpbmcKPj4+IMKgZnVuY3Rpb25zIGlu IEV0aGVybmV0IGRyaXZlciAobmFwaV9ncm9fZnJhZ3MoKSwgbmFwaV9ncm9fcmVjZWl2ZSgpLAo+ Pj4gwqBuZXRpZl9yZWNlaXZlX3NrYigpLCBuZXRpZl9yZWNlaXZlX3NrYl9saXN0KCkpLCBhbmQg d2l0aCBhbmQgd2l0aG91dCB0aGlzCj4+PiDCoHBhdGNoIHRvIG1ha2UgdGhlbSBhcyBjb21wbGV0 ZSBhcyBwb3NzaWJsZS4KPj4KPj4gwqBPSywgc28gaGVyZSB3ZSBnby4KPj4KPj4gwqBNeSBkZXZp Y2UgaXMgMS4yIEdIeiA0LWNvcmUgTUlQUzMyIFIyLiBFdGhlcm5ldCBjb250cm9sbGVyIHJlcHJl c2VudGluZwo+PiDCoHRoZSBDUFUgcG9ydCBpcyBjYXBhYmxlIG9mIFMvRywgZnJhZ2xpc3RzIFMv RywgVFNPNC82IGFuZCBHU08gVURQIEw0Lgo+PiDCoFRlc3RzIGFyZSBwZXJmb3JtZWQgdGhyb3Vn aCBzaW1wbGUgSVBvRSBWTEFOIE5BVCBmb3J3YXJkaW5nIHNldHVwCj4+IMKgKHBvcnQwIDwtPiBw b3J0MS4yMTgpIHdpdGggaXBlcmYzIGluIFRDUCBtb2RlLgo+PiDCoG5ldC5jb3JlLmdyb19ub3Jt YWxfYmF0Y2ggaXMgYWx3YXlzIHNldCB0byAxNiBhcyB0aGF0IHZhbHVlIHNlZW1zIHRvIGJlCj4+ IMKgdGhlIG1vc3QgZWZmZWN0aXZlIGZvciB0aGF0IHBhcnRpY3VsYXIgaGFyZHdhcmUgYW5kIGRy aXZlcnMuCj4+Cj4+IMKgUGFja2V0IGNvdW50ZXJzIG9uIGV0aDAgYXJlIHRoZSByZWFsIG51bWJl cnMgb2Ygb25nb2luZyBmcmFtZXMuIENvdW50ZXJzCj4+IMKgb24gcG9ydFggYXJlIHB1cmUtc29m dHdhcmUgYW5kIGFyZSB1cGRhdGVkIGluc2lkZSBuZXR3b3JraW5nIHN0YWNrLgo+Pgo+PiDCoC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+Pgo+PiDCoG5ldGlmX3JlY2VpdmVfc2tiKCkgaW4gRXRoIGRyaXZlciwgbm8g cGF0Y2g6Cj4+Cj4+IMKgWyBJRF0gSW50ZXJ2YWwgVHJhbnNmZXIgQml0cmF0ZSBSZXRyCj4+IMKg WyA1XSAwLjAwLTEyMC4wMSBzZWMgOS4wMCBHQnl0ZXMgNjQ0IE1iaXRzL3NlYyA0MTMgc2VuZGVy Cj4+IMKgWyA1XSAwLjAwLTEyMC4wMCBzZWMgOC45OSBHQnl0ZXMgNjQ0IE1iaXRzL3NlYyByZWNl aXZlcgo+Pgo+PiDCoGV0aDAKPj4gwqBSWCBwYWNrZXRzOjcwOTc3MzEgZXJyb3JzOjAgZHJvcHBl ZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NzA5NzcwMiBlcnJvcnM6MCBk cm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MAo+PiDCoFJYIHBhY2tl dHM6NDI2MDUwIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBw YWNrZXRzOjY2NzE4MjkgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+ Cj4+IMKgcG9ydDEKPj4gwqBSWCBwYWNrZXRzOjY2NzE2ODEgZXJyb3JzOjAgZHJvcHBlZDowIG92 ZXJydW5zOjAgY2FycmllcjowCj4+IMKgVFggcGFja2V0czo0MjU4NjIgZXJyb3JzOjAgZHJvcHBl ZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgcG9ydDEuMjE4Cj4+IMKgUlggcGFja2V0 czo2NjcxNjc3IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBw YWNrZXRzOjQyNTg1MSBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4K Pj4gwqAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KPj4KPj4gwqBuZXRpZl9yZWNlaXZlX3NrYl9saXN0KCkgaW4gRXRo IGRyaXZlciwgbm8gcGF0Y2g6Cj4+Cj4+IMKgWyBJRF0gSW50ZXJ2YWwgVHJhbnNmZXIgQml0cmF0 ZSBSZXRyCj4+IMKgWyA1XSAwLjAwLTEyMC4wMSBzZWMgOS40OCBHQnl0ZXMgNjc5IE1iaXRzL3Nl YyAxMjkgc2VuZGVyCj4+IMKgWyA1XSAwLjAwLTEyMC4wMCBzZWMgOS40OCBHQnl0ZXMgNjc5IE1i aXRzL3NlYyByZWNlaXZlcgo+Pgo+PiDCoGV0aDAKPj4gwqBSWCBwYWNrZXRzOjc0NDgwOTggZXJy b3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NzQ0ODA3 MyBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MAo+ PiDCoFJYIHBhY2tldHM6NDE2MTE1IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1l OjAKPj4gwqBUWCBwYWNrZXRzOjcwMzIxMjEgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAg Y2FycmllcjowCj4+Cj4+IMKgcG9ydDEKPj4gwqBSWCBwYWNrZXRzOjcwMzE5ODMgZXJyb3JzOjAg ZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NDE1OTQxIGVycm9y czowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxLjIxOAo+PiDC oFJYIHBhY2tldHM6NzAzMTk3OCBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBmcmFtZTow Cj4+IMKgVFggcGFja2V0czo0MTU5MzAgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2Fy cmllcjowCj4+Cj4+IMKgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Cj4+IMKgbmFwaV9ncm9fcmVjZWl2ZSgpIGlu IEV0aCBkcml2ZXIsIG5vIHBhdGNoOgo+Pgo+PiDCoFsgSURdIEludGVydmFsIFRyYW5zZmVyIEJp dHJhdGUgUmV0cgo+PiDCoFsgNV0gMC4wMC0xMjAuMDEgc2VjIDEwLjAgR0J5dGVzIDcxOCBNYml0 cy9zZWMgMTA3IHNlbmRlcgo+PiDCoFsgNV0gMC4wMC0xMjAuMDAgc2VjIDEwLjAgR0J5dGVzIDcx OCBNYml0cy9zZWMgcmVjZWl2ZXIKPj4KPj4gwqBldGgwCj4+IMKgUlggcGFja2V0czo3ODY4Mjgx IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjc4 NjgyNjcgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgcG9y dDAKPj4gwqBSWCBwYWNrZXRzOjQyOTA4MiBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBm cmFtZTowCj4+IMKgVFggcGFja2V0czo3NDM5MzQzIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVu czowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxCj4+IMKgUlggcGFja2V0czo3NDM5MTk5IGVycm9y czowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjQyODkxMyBl cnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MS4yMTgK Pj4gwqBSWCBwYWNrZXRzOjc0MzkxOTUgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJh bWU6MAo+PiDCoFRYIHBhY2tldHM6NDI4OTAyIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczow IGNhcnJpZXI6MAo+Pgo+PiDCoD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo+Pgo+PiDCoG5ldGlmX3JlY2VpdmVfc2ti KCkgaW4gRXRoIGRyaXZlciArIHBhdGNoOgo+Pgo+PiDCoFsgSURdIEludGVydmFsIFRyYW5zZmVy IEJpdHJhdGUgUmV0cgo+PiDCoFsgNV0gMC4wMC0xMjAuMDEgc2VjIDEyLjIgR0J5dGVzIDg3MCBN Yml0cy9zZWMgMjI2NyBzZW5kZXIKPj4gwqBbIDVdIDAuMDAtMTIwLjAwIHNlYyAxMi4yIEdCeXRl cyA4NzAgTWJpdHMvc2VjIHJlY2VpdmVyCj4+Cj4+IMKgZXRoMAo+PiDCoFJYIHBhY2tldHM6OTQ3 NDc5MiBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBmcmFtZTowCj4+IMKgVFggcGFja2V0 czo5NDc0Nzc3IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDC oHBvcnQwCj4+IMKgUlggcGFja2V0czo0NTUyMDAgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5z OjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6MzUzMjg4IGVycm9yczowIGRyb3BwZWQ6MCBvdmVy cnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxCj4+IMKgUlggcGFja2V0czo5MDE5NTkyIGVy cm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjQ1NTAz NSBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MS4y MTgKPj4gwqBSWCBwYWNrZXRzOjM1MzE0NCBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBm cmFtZTowCj4+IMKgVFggcGFja2V0czo0NTUwMjQgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5z OjAgY2FycmllcjowCj4+Cj4+IMKgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Cj4+IMKgbmV0aWZfcmVjZWl2ZV9z a2JfbGlzdCgpIGluIEV0aCBkcml2ZXIgKyBwYXRjaDoKPj4KPj4gwqBbIElEXSBJbnRlcnZhbCBU cmFuc2ZlciBCaXRyYXRlIFJldHIKPj4gwqBbIDVdIDAuMDAtMTIwLjAxIHNlYyAxMS42IEdCeXRl cyA4MjcgTWJpdHMvc2VjIDIyMjQgc2VuZGVyCj4+IMKgWyA1XSAwLjAwLTEyMC4wMCBzZWMgMTEu NSBHQnl0ZXMgODI3IE1iaXRzL3NlYyByZWNlaXZlcgo+Pgo+PiDCoGV0aDAKPj4gwqBSWCBwYWNr ZXRzOjg5ODE2NTEgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRY IHBhY2tldHM6ODk4MTg3IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+ Pgo+PiDCoHBvcnQwCj4+IMKgUlggcGFja2V0czo0MzYxNTkgZXJyb3JzOjAgZHJvcHBlZDowIG92 ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6MzM1NjY1IGVycm9yczowIGRyb3BwZWQ6 MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxCj4+IMKgUlggcGFja2V0czo4NTQ1 NDkyIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRz OjQzNjA3MSBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBw b3J0MS4yMTgKPj4gwqBSWCBwYWNrZXRzOjMzNTU5MyBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1 bnM6MCBmcmFtZTowCj4+IMKgVFggcGFja2V0czo0MzYwNjUgZXJyb3JzOjAgZHJvcHBlZDowIG92 ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4KPj4gwqBuYXBpX2dyb19yZWNlaXZlKCkg aW4gRXRoIGRyaXZlciArIHBhdGNoOgo+Pgo+PiDCoFsgSURdIEludGVydmFsIFRyYW5zZmVyIEJp dHJhdGUgUmV0cgo+PiDCoFsgNV0gMC4wMC0xMjAuMDEgc2VjIDExLjggR0J5dGVzIDg1NSBNYml0 cy9zZWMgMTIyIHNlbmRlcgo+PiDCoFsgNV0gMC4wMC0xMjAuMDAgc2VjIDExLjggR0J5dGVzIDg1 NSBNYml0cy9zZWMgcmVjZWl2ZXIKPj4KPj4gwqBldGgwCj4+IMKgUlggcGFja2V0czo5MjkyMjE0 IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjky OTIxOTAgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgcG9y dDAKPj4gwqBSWCBwYWNrZXRzOjQzODUxNiBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBm cmFtZTowCj4+IMKgVFggcGFja2V0czozNDcyMzYgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5z OjAgY2FycmllcjowCj4+Cj4+IMKgcG9ydDEKPj4gwqBSWCBwYWNrZXRzOjg4NTM2OTggZXJyb3Jz OjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NDM4MzMxIGVy cm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxLjIxOAo+ PiDCoFJYIHBhY2tldHM6MzQ3MDgyIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1l OjAKPj4gwqBUWCBwYWNrZXRzOjQzODMyMCBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBj YXJyaWVyOjAKPj4KPj4gwqAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQo+Pgo+PiDCoFRoZSBtYWluIGdvYWwgaXMgYWNoaWV2ZWQ6IHdl IGhhdmUgYWJvdXQgMTAwLTIwMCBNYnBzIG9mIHBlcmZvcm1hbmNlCj4+IMKgYm9vc3Qgd2hpbGUg aW4tc3RhY2sgc2ticyBhcmUgZ3JlYXRseSByZWR1Y2VkIGZyb20gfjgtOSBtaWxsaW9ucyB0bwo+ PiDCoH4zNTAwMDAgKGNvbXBhcmUgcG9ydDAgVFggYW5kIHBvcnQxIFJYIHdpdGhvdXQgcGF0Y2gg YW5kIHdpdGggaXQpLgo+Cj4gQW5kIHRoZSBudW1iZXIgb2YgVENQIHJldHJpZXMgaXMgYWxzbyBs b3dlciwgd2hpY2ggbGlrZWx5IG1lYW5zIHRoYXQgd2UKPiBhcmUgbWFraW5nIGJldHRlciB1c2Ug b2YgdGhlIGZsb3cgY29udHJvbCBidWlsdCBpbnRvIHRoZSBoYXJkd2FyZS9kcml2ZXIKPiBoZXJl Pwo+Cj4gQlRXIGRvIHlvdSBrbm93IHdoeSB5b3UgaGF2ZSBzbyBtYW55IHJldHJpZXMgdGhvdWdo PyBJdCBzb3VuZHMgbGlrZSB5b3VyCj4gZmxvdyBjb250cm9sIGlzIG1pc3NpbmcgYSBmZXcgZWRn ZSBjYXNlcywgb3IgdGhhdCB5b3UgaGF2ZSBhbiBpbmNvcnJlY3QKPiBjb25maWd1cmF0aW9uIG9m IHlvdXIgVFggYWRtaXNzaW9uIHF1ZXVlLgoKV2VsbCwgSSBoYXZlIHRoZSBzYW1lIHF1ZXN0aW9u IFRCSC4gQWxsIHRoZXNlIH4xLjUgeWVhcnMgdGhhdCBJJ20Kd29ya2luZyBvbiB0aGVzZSBzd2l0 Y2hlcyBJIGhhdmUgcHJldHR5IGNoYW90aWMgbnVtYmVyIG9mIFRDUApyZXRyYW5zbWlzc2lvbnMg ZWFjaCB0aW1lIEkgY2hhbmdlIHNvbWV0aGluZyBpbiB0aGUgY29kZS4gVGhleSBhcmUKbGVzcyBs aWtlbHkgdG8gaGFwcGVuIHdoZW4gdGhlIGF2ZXJhZ2UgQ1BVIGxvYWQgaXMgbG93ZXIsIGJ1dCB+ MTAwCmlzIHRoZSBiZXN0IHJlc3VsdCBJIGV2ZXIgZ290LgpTZWVtcyBsaWtlIEkgc2hvdWxkIHN0 b3AgdHJ5aW5nIHRvIHB1c2ggc29mdHdhcmUgdGhyb3VnaHB1dCB0bwp0aGUgbWF4IGZvciBhIHdo aWxlIGFuZCBwYXkgbW9yZSBhdHRlbnRpb24gdG8gdGhpcyBhbmQgdG8gaGFyZHdhcmUKY29uZmln dXJhdGlvbiBpbnN0ZWFkIGFuZCBjaGVjayBpZiBJIG1pc3Mgc29tZXRoaW5nIDopIAoKPj4gwqBU aGUgbWFpbiBib3R0bGVuZWNrIGluIGdyb19jZWxscyBzZXR1cCBpcyB0aGF0IEdSTyBsYXllciBz dGFydHMgdG8KPj4gwqB3b3JrIG9ubHkgYWZ0ZXIgc2tiIGFyZSBiZWluZyBwcm9jZXNzZWQgYnkg RFNBIHN0YWNrLCBzbyB0aGV5IGFyZQo+PiDCoGdvaW5nIGZyYW1lLWJ5LWZyYW1lIHVudGlsIHRo YXQgbW9tZW50IChSWCBjb3VudGVyIG9uIHBvcnQxKS4KPj4KPj4gwqBJZiBvbmUgZGF5IHdlIGNo YW5nZSB0aGUgd2F5IG9mIGhhbmRsaW5nIGluY29taW5nIHBhY2tldHMgKG5vdAo+PiDCoHRocm91 Z2ggZmFrZSBwYWNrZXRfdHlwZSksIHdlIGNvdWxkIGF2b2lkIHRoYXQgYnkgdW5ibG9ja2luZyBH Uk8KPj4gwqBwcm9jZXNzaW5nIGluIGJldHdlZW4gRXRoIGRyaXZlciBhbmQgRFNBIGNvcmUuCj4+ IMKgV2l0aCBteSBjdXN0b20gcGFja2V0X29mZmxvYWQgZm9yIEVUSF9QX1hEU0EgdGhhdCB3b3Jr cyBvbmx5IGZvcgo+PiDCoG15IENQVSB0YWcgZm9ybWF0IEkgaGF2ZSBhYm91dCB+OTEwLTkyMCBN YnBzIG9uIHRoZSBzYW1lIHBsYXRmb3JtLgo+PiDCoFRoaXMgd2F5IGRvZXNuJ3QgZml0IG1haW5s aW5lIGNvZGUgb2YgY291cnNlLCBzbyBJJ20gd29ya2luZyBvbgo+PiDCoGFsdGVybmF0aXZlIFJ4 IHBhdGhzIGZvciBEU0EsIGUuZy4gdGhyb3VnaCBuZXRfZGV2aWNlOjpyeF9oYW5kbGVyKCkKPj4g wqBldGMuCj4+Cj4+IMKgVW50aWwgdGhlbiwgZ3JvX2NlbGxzIHJlYWxseSBpbXByb3ZlIHRoaW5n cyBhIGxvdCB3aGlsZSB0aGUgYWN0dWFsCj4+IMKgcGF0Y2ggaXMgdGlueS4KPiAtLQo+IEZsb3Jp YW4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4 LW1lZGlhdGVrIG1haWxpbmcgbGlzdApMaW51eC1tZWRpYXRla0BsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbWVkaWF0 ZWsK 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=-3.5 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=no 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 7C07DC2BA2B for ; Mon, 6 Apr 2020 19:11:40 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 57D34206C0 for ; Mon, 6 Apr 2020 19:11:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Mp+DcRgp"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yandex.ru header.i=@yandex.ru header.b="j5IYEJ58" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 57D34206C0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=yandex.ru Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=nPmdQIe0gb8WyGHf5/DZmkNa/xx/Pg0D4gnWaCwO5+U=; b=Mp+DcRgpE9E1b2 b6iAmTIkYaxG8/9J5T6bPfu09ipHTAkK1U0yjhD54h5j5yTGKa+s3k7UzeP9N6N2YvZ2s+gbzPqWr YAwXsYxH2QeQMZ40O6MJXTo6kJbjvYnjZgCSnpPOJUNkrg5tiPUlv2sA5EM/542m80UXcdkMdZeeL lo9B30BagyklginbB75wXuPP9hBJk9rgMGBJg7dx6xGULXrMSu4Fd6MkgDAbtI4ANceMv0KAtvixr IDAreNx+z9ttVYQrbjkC1oJPVKjgYx31QfuU/Wy99NB9OoybeFnf3FH2JnO1Eu4pVW9+4sQEFih4l xnO8vcbWxFnxQHIwTVzA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jLX9n-00013V-Uo; Mon, 06 Apr 2020 19:11:39 +0000 Received: from forward106p.mail.yandex.net ([2a02:6b8:0:1472:2741:0:8b7:109]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jLX9i-00012R-Pa; Mon, 06 Apr 2020 19:11:37 +0000 Received: from forward100q.mail.yandex.net (forward100q.mail.yandex.net [IPv6:2a02:6b8:c0e:4b:0:640:4012:bb97]) by forward106p.mail.yandex.net (Yandex) with ESMTP id 345B01C80565; Mon, 6 Apr 2020 22:11:29 +0300 (MSK) Received: from mxback1q.mail.yandex.net (mxback1q.mail.yandex.net [IPv6:2a02:6b8:c0e:39:0:640:25b3:aea5]) by forward100q.mail.yandex.net (Yandex) with ESMTP id 2CF627080014; Mon, 6 Apr 2020 22:11:29 +0300 (MSK) Received: from vla3-3dd1bd6927b2.qloud-c.yandex.net (vla3-3dd1bd6927b2.qloud-c.yandex.net [2a02:6b8:c15:350f:0:640:3dd1:bd69]) by mxback1q.mail.yandex.net (mxback/Yandex) with ESMTP id 0kHgAgVLWR-BQDqE1Re; Mon, 06 Apr 2020 22:11:29 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1586200289; bh=1VcoKan0Z08qea+vCKDcuAyu+FVCyJzkg8zpty9cfcg=; h=In-Reply-To:Subject:To:From:Cc:References:Date:Message-Id; b=j5IYEJ58eWEoa2LGxsKqgjb2XpUqdflbq+AwspY1NbmxRtEZGVKyA3nvseEJKRW5O NUlt7yfpnPCfCTYike+KkIFjF/pEgu5ZIUZ5xeRA17tRtEc73Ga79Qk5YAipPtRiBD yKLFIkJv7cmkKoxwE6Ab+mDFO3xehUVyQAWacNH8= Authentication-Results: mxback1q.mail.yandex.net; dkim=pass header.i=@yandex.ru Received: by vla3-3dd1bd6927b2.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id LMgrxo4Dm0-BO3m4D6W; Mon, 06 Apr 2020 22:11:26 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) From: Alexander Lobakin To: Florian Fainelli Subject: Re: [PATCH net-next] net: dsa: add GRO support via gro_cells Date: Mon, 6 Apr 2020 22:11:13 +0300 Message-Id: <20200406191113.5983-1-bloodyreaper@yandex.ru> X-Mailer: git-send-email 2.26.0 In-Reply-To: <97a880e4-de7d-1f94-d35b-2635fbd8237e@gmail.com> References: <97a880e4-de7d-1f94-d35b-2635fbd8237e@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200406_121135_328805_80EF3A42 X-CRM114-Status: GOOD ( 22.37 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Woojung Huh , Andrew Lunn , "linux-kernel@vger.kernel.org" , Alexander Lobakin , Hauke Mehrtens , Linus Walleij , Sean Wang , Russell King , Vivien Didelot , Microchip Linux Driver Support , Vladimir Oltean , Claudiu Manoil , "linux-mediatek@lists.infradead.org" , Philipp Zabel , "netdev@vger.kernel.org" , Matthias Brugger , Jakub Kicinski , Oleksij Rempel , "David S. Miller" , "linux-arm-kernel@lists.infradead.org" , Mao Wenan Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org MDYuMDQuMjAyMCwgMjA6NTcsICJGbG9yaWFuIEZhaW5lbGxpIiA8Zi5mYWluZWxsaUBnbWFpbC5j b20+Ogo+IE9uIDQvNi8yMDIwIDEwOjM0IEFNLCBBbGV4YW5kZXIgTG9iYWtpbiB3cm90ZToKPj4g wqAwNi4wNC4yMDIwLCAxODoyMSwgIkFsZXhhbmRlciBMb2Jha2luIiA8Ymxvb2R5cmVhcGVyQHlh bmRleC5ydT46Cj4+PiDCoDA2LjA0LjIwMjAsIDE3OjQ4LCAiQW5kcmV3IEx1bm4iIDxhbmRyZXdA bHVubi5jaD46Cj4+Pj4gwqDCoE9uIE1vbiwgQXByIDA2LCAyMDIwIGF0IDAxOjU5OjEwUE0gKzAz MDAsIEFsZXhhbmRlciBMb2Jha2luIHdyb3RlOgo+Pj4+PiDCoMKgwqBncm9fY2VsbHMgbGliIGlz IHVzZWQgYnkgZGlmZmVyZW50IGVuY2Fwc3VsYXRpbmcgbmV0ZGV2aWNlcywgc3VjaCBhcwo+Pj4+ PiDCoMKgwqBnZW5ldmUsIG1hY3NlYywgdnhsYW4gZXRjLiB0byBzcGVlZCB1cCBkZWNhcHN1bGF0 ZWQgdHJhZmZpYyBwcm9jZXNzaW5nLgo+Pj4+PiDCoMKgwqBDUFUgdGFnIGlzIGEgc29ydCBvZiAi ZW5jYXBzdWxhdGlvbiIsIGFuZCB3ZSBjYW4gdXNlIHRoZSBzYW1lIG1lY2hzIHRvCj4+Pj4+IMKg wqDCoGdyZWF0bHkgaW1wcm92ZSBvdmVyYWxsIERTQSBwZXJmb3JtYW5jZS4KPj4+Pj4gwqDCoMKg c2ticyBhcmUgcGFzc2VkIHRvIHRoZSBHUk8gbGF5ZXIgYWZ0ZXIgcmVtb3ZpbmcgQ1BVIHRhZ3Ms IHNvIHdlIGRvbid0Cj4+Pj4+IMKgwqDCoG5lZWQgYW55IG5ldyBwYWNrZXQgb2ZmbG9hZCB0eXBl cyBhcyBpdCB3YXMgZmlyc3RseSBwcm9wb3NlZCBieSBtZSBpbgo+Pj4+PiDCoMKgwqB0aGUgZmly c3QgR1JPLW92ZXItRFNBIHZhcmlhbnQgWzFdLgo+Pj4+Pgo+Pj4+PiDCoMKgwqBUaGUgc2l6ZSBv ZiBzdHJ1Y3QgZ3JvX2NlbGxzIGlzIHNpemVvZih2b2lkICopLCBzbyBob3Qgc3RydWN0Cj4+Pj4+ IMKgwqDCoGRzYV9zbGF2ZV9wcml2IGJlY29tZXMgb25seSA0LzggYnl0ZXMgYmlnZ2VyLCBhbmQg YWxsIGNyaXRpY2FsIGZpZWxkcwo+Pj4+PiDCoMKgwqByZW1haW4gaW4gb25lIDMyLWJ5dGUgY2Fj aGVsaW5lLgo+Pj4+PiDCoMKgwqBUaGUgb3RoZXIgcG9zaXRpdmUgc2lkZSBlZmZlY3QgaXMgdGhh dCBkcml2ZXJzIGZvciBuZXR3b3JrIGRldmljZXMKPj4+Pj4gwqDCoMKgdGhhdCBjYW4gYmUgc2hp cHBlZCBhcyBDUFUgcG9ydHMgb2YgRFNBLWRyaXZlbiBzd2l0Y2hlcyBjYW4gbm93IHVzZQo+Pj4+ PiDCoMKgwqBuYXBpX2dyb19mcmFncygpIHRvIHBhc3Mgc2ticyB0byBrZXJuZWwuIFBhY2tldHMg YnVpbHQgdGhhdCB3YXkgYXJlCj4+Pj4+IMKgwqDCoGNvbXBsZXRlbHkgbm9uLWxpbmVhciBhbmQg YXJlIGxpa2VseSBiZWluZyBkcm9wcGVkIHdpdGhvdXQgR1JPLgo+Pj4+Pgo+Pj4+PiDCoMKgwqBU aGlzIHdhcyB0ZXN0ZWQgb24gdG8tYmUtbWFpbmxpbmVkLXNvb24gRXRoZXJuZXQgZHJpdmVyIHRo YXQgdXNlcwo+Pj4+PiDCoMKgwqBuYXBpX2dyb19mcmFncygpLCBhbmQgdGhlIG92ZXJhbGwgcGVy Zm9ybWFuY2Ugd2FzIG9uIHBhciB3aXRoIHRoZQo+Pj4+PiDCoMKgwqB2YXJpYW50IGZyb20gWzFd LCBzb21ldGltZXMgZXZlbiBiZXR0ZXIgZHVlIHRvIG1pbmltYWwgb3ZlcmhlYWQuCj4+Pj4+IMKg wqDCoG5ldC5jb3JlLmdyb19ub3JtYWxfYmF0Y2ggdHVuaW5nIG1heSBoZWxwIHRvIHB1c2ggaXQg dG8gdGhlIGxpbWl0Cj4+Pj4+IMKgwqDCoG9uIHBhcnRpY3VsYXIgc2V0dXBzIGFuZCBwbGF0Zm9y bXMuCj4+Pj4+Cj4+Pj4+IMKgwqDCoFsxXSBodHRwczovL2xvcmUua2VybmVsLm9yZy9uZXRkZXYv MjAxOTEyMzAxNDMwMjguMjczMTMtMS1hbG9iYWtpbkBkbGluay5ydS8KPj4+Pgo+Pj4+IMKgwqBI aSBBbGV4YW5kZXIKPj4+Cj4+PiDCoEhpIEFuZHJldyEKPj4+Cj4+Pj4gwqDCoG5ldC1uZXh0IGlz IGNsb3NlZCBhdCB0aGUgbW9tZW50LiBTbyB5b3Ugc2hvdWxkIG9mIHBvc3RlZCB0aGlzIHdpdGgg YW4KPj4+PiDCoMKgUkZDIHByZWZpeC4KPj4+Cj4+PiDCoEkgc2F3IHRoYXQgaXQncyBjbG9zZWQs IGJ1dCBkaWRuJ3Qga25ldyBhYm91dCAiUkZDIiB0YWdzIGZvciB0aGF0IHBlcmlvZCwKPj4+IMKg c29ycnkuCj4+Pgo+Pj4+IMKgwqBUaGUgaW1wbGVtZW50YXRpb24gbG9va3MgbmljZSBhbmQgc2lt cGxlLiBCdXQgaXQgd291bGQgYmUgbmljZSB0byBoYXZlCj4+Pj4gwqDCoHNvbWUgcGVyZm9ybWFu Y2UgZmlndXJlcy4KPj4+Cj4+PiDCoEknbGwgZG8sIHN1cmUuIEkgdGhpbmsgSSdsbCBjb2xsZWN0 IHRoZSBzdGF0cyB3aXRoIHZhcmlvdXMgbWFpbiByZWNlaXZpbmcKPj4+IMKgZnVuY3Rpb25zIGlu IEV0aGVybmV0IGRyaXZlciAobmFwaV9ncm9fZnJhZ3MoKSwgbmFwaV9ncm9fcmVjZWl2ZSgpLAo+ Pj4gwqBuZXRpZl9yZWNlaXZlX3NrYigpLCBuZXRpZl9yZWNlaXZlX3NrYl9saXN0KCkpLCBhbmQg d2l0aCBhbmQgd2l0aG91dCB0aGlzCj4+PiDCoHBhdGNoIHRvIG1ha2UgdGhlbSBhcyBjb21wbGV0 ZSBhcyBwb3NzaWJsZS4KPj4KPj4gwqBPSywgc28gaGVyZSB3ZSBnby4KPj4KPj4gwqBNeSBkZXZp Y2UgaXMgMS4yIEdIeiA0LWNvcmUgTUlQUzMyIFIyLiBFdGhlcm5ldCBjb250cm9sbGVyIHJlcHJl c2VudGluZwo+PiDCoHRoZSBDUFUgcG9ydCBpcyBjYXBhYmxlIG9mIFMvRywgZnJhZ2xpc3RzIFMv RywgVFNPNC82IGFuZCBHU08gVURQIEw0Lgo+PiDCoFRlc3RzIGFyZSBwZXJmb3JtZWQgdGhyb3Vn aCBzaW1wbGUgSVBvRSBWTEFOIE5BVCBmb3J3YXJkaW5nIHNldHVwCj4+IMKgKHBvcnQwIDwtPiBw b3J0MS4yMTgpIHdpdGggaXBlcmYzIGluIFRDUCBtb2RlLgo+PiDCoG5ldC5jb3JlLmdyb19ub3Jt YWxfYmF0Y2ggaXMgYWx3YXlzIHNldCB0byAxNiBhcyB0aGF0IHZhbHVlIHNlZW1zIHRvIGJlCj4+ IMKgdGhlIG1vc3QgZWZmZWN0aXZlIGZvciB0aGF0IHBhcnRpY3VsYXIgaGFyZHdhcmUgYW5kIGRy aXZlcnMuCj4+Cj4+IMKgUGFja2V0IGNvdW50ZXJzIG9uIGV0aDAgYXJlIHRoZSByZWFsIG51bWJl cnMgb2Ygb25nb2luZyBmcmFtZXMuIENvdW50ZXJzCj4+IMKgb24gcG9ydFggYXJlIHB1cmUtc29m dHdhcmUgYW5kIGFyZSB1cGRhdGVkIGluc2lkZSBuZXR3b3JraW5nIHN0YWNrLgo+Pgo+PiDCoC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+Pgo+PiDCoG5ldGlmX3JlY2VpdmVfc2tiKCkgaW4gRXRoIGRyaXZlciwgbm8g cGF0Y2g6Cj4+Cj4+IMKgWyBJRF0gSW50ZXJ2YWwgVHJhbnNmZXIgQml0cmF0ZSBSZXRyCj4+IMKg WyA1XSAwLjAwLTEyMC4wMSBzZWMgOS4wMCBHQnl0ZXMgNjQ0IE1iaXRzL3NlYyA0MTMgc2VuZGVy Cj4+IMKgWyA1XSAwLjAwLTEyMC4wMCBzZWMgOC45OSBHQnl0ZXMgNjQ0IE1iaXRzL3NlYyByZWNl aXZlcgo+Pgo+PiDCoGV0aDAKPj4gwqBSWCBwYWNrZXRzOjcwOTc3MzEgZXJyb3JzOjAgZHJvcHBl ZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NzA5NzcwMiBlcnJvcnM6MCBk cm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MAo+PiDCoFJYIHBhY2tl dHM6NDI2MDUwIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBw YWNrZXRzOjY2NzE4MjkgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+ Cj4+IMKgcG9ydDEKPj4gwqBSWCBwYWNrZXRzOjY2NzE2ODEgZXJyb3JzOjAgZHJvcHBlZDowIG92 ZXJydW5zOjAgY2FycmllcjowCj4+IMKgVFggcGFja2V0czo0MjU4NjIgZXJyb3JzOjAgZHJvcHBl ZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgcG9ydDEuMjE4Cj4+IMKgUlggcGFja2V0 czo2NjcxNjc3IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBw YWNrZXRzOjQyNTg1MSBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4K Pj4gwqAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KPj4KPj4gwqBuZXRpZl9yZWNlaXZlX3NrYl9saXN0KCkgaW4gRXRo IGRyaXZlciwgbm8gcGF0Y2g6Cj4+Cj4+IMKgWyBJRF0gSW50ZXJ2YWwgVHJhbnNmZXIgQml0cmF0 ZSBSZXRyCj4+IMKgWyA1XSAwLjAwLTEyMC4wMSBzZWMgOS40OCBHQnl0ZXMgNjc5IE1iaXRzL3Nl YyAxMjkgc2VuZGVyCj4+IMKgWyA1XSAwLjAwLTEyMC4wMCBzZWMgOS40OCBHQnl0ZXMgNjc5IE1i aXRzL3NlYyByZWNlaXZlcgo+Pgo+PiDCoGV0aDAKPj4gwqBSWCBwYWNrZXRzOjc0NDgwOTggZXJy b3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NzQ0ODA3 MyBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MAo+ PiDCoFJYIHBhY2tldHM6NDE2MTE1IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1l OjAKPj4gwqBUWCBwYWNrZXRzOjcwMzIxMjEgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAg Y2FycmllcjowCj4+Cj4+IMKgcG9ydDEKPj4gwqBSWCBwYWNrZXRzOjcwMzE5ODMgZXJyb3JzOjAg ZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NDE1OTQxIGVycm9y czowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxLjIxOAo+PiDC oFJYIHBhY2tldHM6NzAzMTk3OCBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBmcmFtZTow Cj4+IMKgVFggcGFja2V0czo0MTU5MzAgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2Fy cmllcjowCj4+Cj4+IMKgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Cj4+IMKgbmFwaV9ncm9fcmVjZWl2ZSgpIGlu IEV0aCBkcml2ZXIsIG5vIHBhdGNoOgo+Pgo+PiDCoFsgSURdIEludGVydmFsIFRyYW5zZmVyIEJp dHJhdGUgUmV0cgo+PiDCoFsgNV0gMC4wMC0xMjAuMDEgc2VjIDEwLjAgR0J5dGVzIDcxOCBNYml0 cy9zZWMgMTA3IHNlbmRlcgo+PiDCoFsgNV0gMC4wMC0xMjAuMDAgc2VjIDEwLjAgR0J5dGVzIDcx OCBNYml0cy9zZWMgcmVjZWl2ZXIKPj4KPj4gwqBldGgwCj4+IMKgUlggcGFja2V0czo3ODY4Mjgx IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjc4 NjgyNjcgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgcG9y dDAKPj4gwqBSWCBwYWNrZXRzOjQyOTA4MiBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBm cmFtZTowCj4+IMKgVFggcGFja2V0czo3NDM5MzQzIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVu czowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxCj4+IMKgUlggcGFja2V0czo3NDM5MTk5IGVycm9y czowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjQyODkxMyBl cnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MS4yMTgK Pj4gwqBSWCBwYWNrZXRzOjc0MzkxOTUgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJh bWU6MAo+PiDCoFRYIHBhY2tldHM6NDI4OTAyIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczow IGNhcnJpZXI6MAo+Pgo+PiDCoD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo+Pgo+PiDCoG5ldGlmX3JlY2VpdmVfc2ti KCkgaW4gRXRoIGRyaXZlciArIHBhdGNoOgo+Pgo+PiDCoFsgSURdIEludGVydmFsIFRyYW5zZmVy IEJpdHJhdGUgUmV0cgo+PiDCoFsgNV0gMC4wMC0xMjAuMDEgc2VjIDEyLjIgR0J5dGVzIDg3MCBN Yml0cy9zZWMgMjI2NyBzZW5kZXIKPj4gwqBbIDVdIDAuMDAtMTIwLjAwIHNlYyAxMi4yIEdCeXRl cyA4NzAgTWJpdHMvc2VjIHJlY2VpdmVyCj4+Cj4+IMKgZXRoMAo+PiDCoFJYIHBhY2tldHM6OTQ3 NDc5MiBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBmcmFtZTowCj4+IMKgVFggcGFja2V0 czo5NDc0Nzc3IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDC oHBvcnQwCj4+IMKgUlggcGFja2V0czo0NTUyMDAgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5z OjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6MzUzMjg4IGVycm9yczowIGRyb3BwZWQ6MCBvdmVy cnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxCj4+IMKgUlggcGFja2V0czo5MDE5NTkyIGVy cm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjQ1NTAz NSBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBwb3J0MS4y MTgKPj4gwqBSWCBwYWNrZXRzOjM1MzE0NCBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBm cmFtZTowCj4+IMKgVFggcGFja2V0czo0NTUwMjQgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5z OjAgY2FycmllcjowCj4+Cj4+IMKgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Cj4+IMKgbmV0aWZfcmVjZWl2ZV9z a2JfbGlzdCgpIGluIEV0aCBkcml2ZXIgKyBwYXRjaDoKPj4KPj4gwqBbIElEXSBJbnRlcnZhbCBU cmFuc2ZlciBCaXRyYXRlIFJldHIKPj4gwqBbIDVdIDAuMDAtMTIwLjAxIHNlYyAxMS42IEdCeXRl cyA4MjcgTWJpdHMvc2VjIDIyMjQgc2VuZGVyCj4+IMKgWyA1XSAwLjAwLTEyMC4wMCBzZWMgMTEu NSBHQnl0ZXMgODI3IE1iaXRzL3NlYyByZWNlaXZlcgo+Pgo+PiDCoGV0aDAKPj4gwqBSWCBwYWNr ZXRzOjg5ODE2NTEgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRY IHBhY2tldHM6ODk4MTg3IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+ Pgo+PiDCoHBvcnQwCj4+IMKgUlggcGFja2V0czo0MzYxNTkgZXJyb3JzOjAgZHJvcHBlZDowIG92 ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6MzM1NjY1IGVycm9yczowIGRyb3BwZWQ6 MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxCj4+IMKgUlggcGFja2V0czo4NTQ1 NDkyIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRz OjQzNjA3MSBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBjYXJyaWVyOjAKPj4KPj4gwqBw b3J0MS4yMTgKPj4gwqBSWCBwYWNrZXRzOjMzNTU5MyBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1 bnM6MCBmcmFtZTowCj4+IMKgVFggcGFja2V0czo0MzYwNjUgZXJyb3JzOjAgZHJvcHBlZDowIG92 ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4KPj4gwqBuYXBpX2dyb19yZWNlaXZlKCkg aW4gRXRoIGRyaXZlciArIHBhdGNoOgo+Pgo+PiDCoFsgSURdIEludGVydmFsIFRyYW5zZmVyIEJp dHJhdGUgUmV0cgo+PiDCoFsgNV0gMC4wMC0xMjAuMDEgc2VjIDExLjggR0J5dGVzIDg1NSBNYml0 cy9zZWMgMTIyIHNlbmRlcgo+PiDCoFsgNV0gMC4wMC0xMjAuMDAgc2VjIDExLjggR0J5dGVzIDg1 NSBNYml0cy9zZWMgcmVjZWl2ZXIKPj4KPj4gwqBldGgwCj4+IMKgUlggcGFja2V0czo5MjkyMjE0 IGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1lOjAKPj4gwqBUWCBwYWNrZXRzOjky OTIxOTAgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5zOjAgY2FycmllcjowCj4+Cj4+IMKgcG9y dDAKPj4gwqBSWCBwYWNrZXRzOjQzODUxNiBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBm cmFtZTowCj4+IMKgVFggcGFja2V0czozNDcyMzYgZXJyb3JzOjAgZHJvcHBlZDowIG92ZXJydW5z OjAgY2FycmllcjowCj4+Cj4+IMKgcG9ydDEKPj4gwqBSWCBwYWNrZXRzOjg4NTM2OTggZXJyb3Jz OjAgZHJvcHBlZDowIG92ZXJydW5zOjAgZnJhbWU6MAo+PiDCoFRYIHBhY2tldHM6NDM4MzMxIGVy cm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGNhcnJpZXI6MAo+Pgo+PiDCoHBvcnQxLjIxOAo+ PiDCoFJYIHBhY2tldHM6MzQ3MDgyIGVycm9yczowIGRyb3BwZWQ6MCBvdmVycnVuczowIGZyYW1l OjAKPj4gwqBUWCBwYWNrZXRzOjQzODMyMCBlcnJvcnM6MCBkcm9wcGVkOjAgb3ZlcnJ1bnM6MCBj YXJyaWVyOjAKPj4KPj4gwqAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQo+Pgo+PiDCoFRoZSBtYWluIGdvYWwgaXMgYWNoaWV2ZWQ6IHdl IGhhdmUgYWJvdXQgMTAwLTIwMCBNYnBzIG9mIHBlcmZvcm1hbmNlCj4+IMKgYm9vc3Qgd2hpbGUg aW4tc3RhY2sgc2ticyBhcmUgZ3JlYXRseSByZWR1Y2VkIGZyb20gfjgtOSBtaWxsaW9ucyB0bwo+ PiDCoH4zNTAwMDAgKGNvbXBhcmUgcG9ydDAgVFggYW5kIHBvcnQxIFJYIHdpdGhvdXQgcGF0Y2gg YW5kIHdpdGggaXQpLgo+Cj4gQW5kIHRoZSBudW1iZXIgb2YgVENQIHJldHJpZXMgaXMgYWxzbyBs b3dlciwgd2hpY2ggbGlrZWx5IG1lYW5zIHRoYXQgd2UKPiBhcmUgbWFraW5nIGJldHRlciB1c2Ug b2YgdGhlIGZsb3cgY29udHJvbCBidWlsdCBpbnRvIHRoZSBoYXJkd2FyZS9kcml2ZXIKPiBoZXJl Pwo+Cj4gQlRXIGRvIHlvdSBrbm93IHdoeSB5b3UgaGF2ZSBzbyBtYW55IHJldHJpZXMgdGhvdWdo PyBJdCBzb3VuZHMgbGlrZSB5b3VyCj4gZmxvdyBjb250cm9sIGlzIG1pc3NpbmcgYSBmZXcgZWRn ZSBjYXNlcywgb3IgdGhhdCB5b3UgaGF2ZSBhbiBpbmNvcnJlY3QKPiBjb25maWd1cmF0aW9uIG9m IHlvdXIgVFggYWRtaXNzaW9uIHF1ZXVlLgoKV2VsbCwgSSBoYXZlIHRoZSBzYW1lIHF1ZXN0aW9u IFRCSC4gQWxsIHRoZXNlIH4xLjUgeWVhcnMgdGhhdCBJJ20Kd29ya2luZyBvbiB0aGVzZSBzd2l0 Y2hlcyBJIGhhdmUgcHJldHR5IGNoYW90aWMgbnVtYmVyIG9mIFRDUApyZXRyYW5zbWlzc2lvbnMg ZWFjaCB0aW1lIEkgY2hhbmdlIHNvbWV0aGluZyBpbiB0aGUgY29kZS4gVGhleSBhcmUKbGVzcyBs aWtlbHkgdG8gaGFwcGVuIHdoZW4gdGhlIGF2ZXJhZ2UgQ1BVIGxvYWQgaXMgbG93ZXIsIGJ1dCB+ MTAwCmlzIHRoZSBiZXN0IHJlc3VsdCBJIGV2ZXIgZ290LgpTZWVtcyBsaWtlIEkgc2hvdWxkIHN0 b3AgdHJ5aW5nIHRvIHB1c2ggc29mdHdhcmUgdGhyb3VnaHB1dCB0bwp0aGUgbWF4IGZvciBhIHdo aWxlIGFuZCBwYXkgbW9yZSBhdHRlbnRpb24gdG8gdGhpcyBhbmQgdG8gaGFyZHdhcmUKY29uZmln dXJhdGlvbiBpbnN0ZWFkIGFuZCBjaGVjayBpZiBJIG1pc3Mgc29tZXRoaW5nIDopIAoKPj4gwqBU aGUgbWFpbiBib3R0bGVuZWNrIGluIGdyb19jZWxscyBzZXR1cCBpcyB0aGF0IEdSTyBsYXllciBz dGFydHMgdG8KPj4gwqB3b3JrIG9ubHkgYWZ0ZXIgc2tiIGFyZSBiZWluZyBwcm9jZXNzZWQgYnkg RFNBIHN0YWNrLCBzbyB0aGV5IGFyZQo+PiDCoGdvaW5nIGZyYW1lLWJ5LWZyYW1lIHVudGlsIHRo YXQgbW9tZW50IChSWCBjb3VudGVyIG9uIHBvcnQxKS4KPj4KPj4gwqBJZiBvbmUgZGF5IHdlIGNo YW5nZSB0aGUgd2F5IG9mIGhhbmRsaW5nIGluY29taW5nIHBhY2tldHMgKG5vdAo+PiDCoHRocm91 Z2ggZmFrZSBwYWNrZXRfdHlwZSksIHdlIGNvdWxkIGF2b2lkIHRoYXQgYnkgdW5ibG9ja2luZyBH Uk8KPj4gwqBwcm9jZXNzaW5nIGluIGJldHdlZW4gRXRoIGRyaXZlciBhbmQgRFNBIGNvcmUuCj4+ IMKgV2l0aCBteSBjdXN0b20gcGFja2V0X29mZmxvYWQgZm9yIEVUSF9QX1hEU0EgdGhhdCB3b3Jr cyBvbmx5IGZvcgo+PiDCoG15IENQVSB0YWcgZm9ybWF0IEkgaGF2ZSBhYm91dCB+OTEwLTkyMCBN YnBzIG9uIHRoZSBzYW1lIHBsYXRmb3JtLgo+PiDCoFRoaXMgd2F5IGRvZXNuJ3QgZml0IG1haW5s aW5lIGNvZGUgb2YgY291cnNlLCBzbyBJJ20gd29ya2luZyBvbgo+PiDCoGFsdGVybmF0aXZlIFJ4 IHBhdGhzIGZvciBEU0EsIGUuZy4gdGhyb3VnaCBuZXRfZGV2aWNlOjpyeF9oYW5kbGVyKCkKPj4g wqBldGMuCj4+Cj4+IMKgVW50aWwgdGhlbiwgZ3JvX2NlbGxzIHJlYWxseSBpbXByb3ZlIHRoaW5n cyBhIGxvdCB3aGlsZSB0aGUgYWN0dWFsCj4+IMKgcGF0Y2ggaXMgdGlueS4KPiAtLQo+IEZsb3Jp YW4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK