From shmulik.hen@intel.com Tue Apr 1 08:10:03 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 08:10:14 -0800 (PST) Received: from hermes.iil.intel.com (hermes.iil.intel.com [192.198.152.99]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31G9Lq9020029 for ; Tue, 1 Apr 2003 08:10:02 -0800 Received: from petasus.iil.intel.com (petasus.iil.intel.com [143.185.77.3]) by hermes.iil.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h31G5AJ14946 for ; Tue, 1 Apr 2003 16:05:10 GMT Received: from hasmsxvs01.iil.intel.com (hasmsxvs01.iil.intel.com [143.185.63.58]) by petasus.iil.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h31GBuB25127 for ; Tue, 1 Apr 2003 16:11:56 GMT Received: from hasmsx17.iil.intel.com ([143.185.63.203]) by hasmsxvs01.iil.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040119142716704 ; Tue, 01 Apr 2003 19:14:27 +0300 Received: by hasmsx17.iil.intel.com with Internet Mail Service (5.5.2653.19) id ; Tue, 1 Apr 2003 19:09:13 +0300 Message-ID: From: "Hen, Shmulik" To: "David S. Miller" Cc: bonding-devel@lists.sourceforge.net, bonding-announce@lists.sourceforge.net, linux-net@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: RE: [Bonding][patch] Adding Transmit load balancing mode to bondi ng Date: Tue, 1 Apr 2003 19:09:09 +0300 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2115 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shmulik.hen@intel.com Precedence: bulk X-list: netdev We haven't experimented with layer 4 load balancing in the past. I guess this is because of the big overhead of parsing the skb for the necessary data, but also because of the risk of dealing with IP fragmentation, large send issues, encryption and all kinds of off-loadings. Shmulik. > -----Original Message----- > From: David S. Miller [mailto:davem@redhat.com] > Sent: Thursday, March 27, 2003 6:06 PM > To: Hen, Shmulik > Cc: bonding-devel@lists.sourceforge.net; > bonding-announce@lists.sourceforge.net; > linux-net@vger.kernel.org; netdev@oss.sgi.com; > linux-kernel@vger.kernel.org; jgarzik@pobox.com > Subject: Re: [Bonding][patch] Adding Transmit load balancing > mode to bonding > > > From: shmulik.hen@intel.com > Date: Thu, 27 Mar 2003 17:38:02 +0200 (IST) > > Balancing is connection oriented (e.g. by IPv4 destination address) > so packet order is always kept. > > You could also key off of the destination/source port as well for > UDP/TCP/SCTP. Have you experimented with this? > From rask@sygehus.dk Tue Apr 1 08:49:43 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 08:49:49 -0800 (PST) Received: from cicero0.cybercity.dk (cicero0.cybercity.dk [212.242.40.52]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31Gnfq9020629 for ; Tue, 1 Apr 2003 08:49:43 -0800 Received: from user3.cybercity.dk (fxp0.user3.ip.cybercity.dk [212.242.41.36]) by cicero0.cybercity.dk (Postfix) with ESMTP id B2D4A102A05; Tue, 1 Apr 2003 18:49:39 +0200 (CEST) Received: from webmail.cybercity.dk (webmail.cybercity.dk [212.242.40.37]) by user3.cybercity.dk (Postfix) with SMTP id E66511FB; Tue, 1 Apr 2003 18:49:38 +0200 (CEST) Reply-To: rask@sygehus.dk From: rask@sygehus.dk (Rask Ingemann Lambertsen) To: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Is a driver allowed to modify dev->flags? Date: Tue, 1 Apr 2003 18:49:39 +0200 Message-Id: <3e89c32348ce76.94538914@not right> X-Authenticated-IP: [152.95.52.86] X-Sender: ccc94453@vip.cybercity.dk X-Mailer: Cybercity Webmail 1.06 (http://webmail.cybercity.dk/) MIME-version: 1.0 Content-type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2116 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rask@sygehus.dk Precedence: bulk X-list: netdev Hi. Is a network device driver allowed to modify dev->flags? For example: if (dev->flags & IFF_ALLMULTI) dev->flags |= IFF_PROMISC; I've found it to cause the IFF_PROMISC flag to stick when using "tcpdump -p", which to my surprice sets the IFF_ALLMULTI flag. Regards, Rask Ingemann Lambertsen From greearb@candelatech.com Tue Apr 1 08:59:57 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:00:00 -0800 (PST) Received: from grok.yi.org (IDENT:n3vqeOdPrL+AtFZojQViyJ8x9LBnkonw@dhcp93-dsl-usw3.w-link.net [206.129.84.93]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31GxGq9021029 for ; Tue, 1 Apr 2003 08:59:56 -0800 Received: from candelatech.com (IDENT:vgwWu11u12MF+05vNe3mavi3M594w8qh@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.6) with ESMTP id h31Gw7J15384; Tue, 1 Apr 2003 08:58:25 -0800 Message-ID: <3E89C51E.1060700@candelatech.com> Date: Tue, 01 Apr 2003 08:58:06 -0800 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, en MIME-Version: 1.0 To: rask@sygehus.dk CC: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Is a driver allowed to modify dev->flags? References: <3e89c32348ce76.94538914@not right> In-Reply-To: <3e89c32348ce76.94538914@not right> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2117 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Rask Ingemann Lambertsen wrote: > Hi. > > Is a network device driver allowed to modify dev->flags? For example: > > if (dev->flags & IFF_ALLMULTI) > dev->flags |= IFF_PROMISC; > > I've found it to cause the IFF_PROMISC flag to stick when using "tcpdump -p", which to my surprice sets the IFF_ALLMULTI flag. > > Regards, > Rask Ingemann Lambertsen > > You are supposed to increment the promisc requestors. I think something like this: dev_set_promiscuity(dev, 1); -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From rask@sygehus.dk Tue Apr 1 09:01:40 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:01:43 -0800 (PST) Received: from cicero0.cybercity.dk (cicero0.cybercity.dk [212.242.40.52]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31H0xq9021360 for ; Tue, 1 Apr 2003 09:01:40 -0800 Received: from user3.cybercity.dk (fxp0.user3.ip.cybercity.dk [212.242.41.36]) by cicero0.cybercity.dk (Postfix) with ESMTP id B3036102A78; Tue, 1 Apr 2003 19:00:58 +0200 (CEST) Received: from webmail.cybercity.dk (webmail.cybercity.dk [212.242.40.37]) by user3.cybercity.dk (Postfix) with SMTP id 2AB0B2CF; Tue, 1 Apr 2003 19:00:58 +0200 (CEST) Reply-To: rask@sygehus.dk From: rask@sygehus.dk (Rask Ingemann Lambertsen) To: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: net_device_stats questions Date: Tue, 1 Apr 2003 19:00:58 +0200 Message-Id: <3e89c5ca40b872.57198744@not right> X-Authenticated-IP: [152.95.52.86] X-Sender: ccc94453@vip.cybercity.dk X-Mailer: Cybercity Webmail 1.06 (http://webmail.cybercity.dk/) MIME-version: 1.0 Content-type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2118 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rask@sygehus.dk Precedence: bulk X-list: netdev Hi. When updating net_device_stats.tx_bytes, should I just add skb->len (like e.g. tulip does) or add skb->len plus any padding (like e.g. 3c59x does)? Let's say a TX heartbeat error occurs. Am I then supposed to update both net_device_stats.tx_errors and net_device_stats.tx_heartbeat_errors or just net_device_stats.tx_heartbeat_errors? Which events should cause an update of net_device_stats.tx_aborted? Regards, Rask Ingemann Lambertsen From davem@redhat.com Tue Apr 1 09:03:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:03:52 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31H34q9021729 for ; Tue, 1 Apr 2003 09:03:44 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id IAA18659; Tue, 1 Apr 2003 08:58:18 -0800 Date: Tue, 01 Apr 2003 08:58:17 -0800 (PST) Message-Id: <20030401.085817.56963537.davem@redhat.com> To: shmulik.hen@intel.com Cc: bonding-devel@lists.sourceforge.net, bonding-announce@lists.sourceforge.net, linux-net@vger.kernel.org, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [Bonding][patch] Adding Transmit load balancing mode to bondi ng From: "David S. Miller" In-Reply-To: References: X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2119 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: "Hen, Shmulik" Date: Tue, 1 Apr 2003 19:09:09 +0300 We haven't experimented with layer 4 load balancing in the past. I guess this is because of the big overhead of parsing the skb for the necessary data, but also because of the risk of dealing with IP fragmentation, large send issues, encryption and all kinds of off-loadings. In the modern internet, a fragmented TCP packet is nearly a bug. And if it's encrypted, you will never see the TCP headers to begin with. Finally, there are no "large send" issues, the TCP port information will always be in the front of the packet. I brought this up because it is very clear to me that various load-balancing daemons distributed by other gigabit card vendors are keying on the connection information in TCP packets. So someone thinks it is worthwhile :-) From rask@sygehus.dk Tue Apr 1 09:27:01 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:27:03 -0800 (PST) Received: from cicero0.cybercity.dk (cicero0.cybercity.dk [212.242.40.52]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31HQxq9022331 for ; Tue, 1 Apr 2003 09:27:00 -0800 Received: from user4.cybercity.dk (fxp0.user4.ip.cybercity.dk [212.242.41.50]) by cicero0.cybercity.dk (Postfix) with ESMTP id 94979102931; Tue, 1 Apr 2003 19:26:58 +0200 (CEST) Received: from webmail.cybercity.dk (webmail.cybercity.dk [212.242.40.37]) by user4.cybercity.dk (Postfix) with SMTP id D9AC454BF; Tue, 1 Apr 2003 19:26:57 +0200 (CEST) Reply-To: rask@sygehus.dk From: rask@sygehus.dk (Rask Ingemann Lambertsen) To: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Must dev->set_multicast_list() complete before returning? Date: Tue, 1 Apr 2003 19:26:58 +0200 Message-Id: <3e89cbe235cd78.41777977@not right> X-Authenticated-IP: [152.95.52.86] X-Sender: ccc94453@vip.cybercity.dk X-Mailer: Cybercity Webmail 1.06 (http://webmail.cybercity.dk/) MIME-version: 1.0 Content-type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2121 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rask@sygehus.dk Precedence: bulk X-list: netdev Hi. Must dev->set_multicast_list() complete the configuration of a network device before returning? Regards, Rask Ingemann Lambertsen From becker@scyld.com Tue Apr 1 09:26:27 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:26:30 -0800 (PST) Received: from beohost.scyld.com (dsl093-058-082.blt1.dsl.speakeasy.net [66.93.58.82]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31HQQq9022270 for ; Tue, 1 Apr 2003 09:26:27 -0800 Received: from localhost (becker@localhost) by beohost.scyld.com (8.11.6/8.11.6) with ESMTP id h31HQri09692; Tue, 1 Apr 2003 12:26:54 -0500 Date: Tue, 1 Apr 2003 12:26:53 -0500 (EST) From: Donald Becker To: Rask Ingemann Lambertsen cc: linux-net@vger.kernel.org, Subject: Re: Is a driver allowed to modify dev->flags? In-Reply-To: <3e89c32348ce76.94538914@not right> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2120 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: becker@scyld.com Precedence: bulk X-list: netdev On Tue, 1 Apr 2003, Rask Ingemann Lambertsen wrote: > Is a network device driver allowed to modify dev->flags? For example: > > if (dev->flags & IFF_ALLMULTI) > dev->flags |= IFF_PROMISC; You must be looking at the atp.c driver, or a driver that cribbed from it. (Is anyone still running a parallel port Ethernet device?!) Alan Cox added this code to atp.c because the chip doesn't have a reasonable multicast filter. The only way to receive all multicast traffic was to turn on promiscuous mode. But that caused a problem with some parts of the protocol stack were passed traffic not intended for the local host. A better solution (which is usually easier to see later) is to have the driver do the trivial final packet filtering itself. > I've found it to cause the IFF_PROMISC flag to stick when using > "tcpdump -p", which to my surprice sets the IFF_ALLMULTI flag. Which driver are you using? -- Donald Becker becker@scyld.com Scyld Computing Corporation http://www.scyld.com 410 Severn Ave. Suite 210 Scyld Beowulf cluster system Annapolis MD 21403 410-990-9993 From blueflux@koffein.net Tue Apr 1 09:47:10 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:47:15 -0800 (PST) Received: from laptop1.agatha ([195.163.42.244]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31Hl8q9023516 for ; Tue, 1 Apr 2003 09:47:09 -0800 Received: from localhost (blueflux@localhost) by laptop1.agatha (8.11.6/8.11.6) with ESMTP id h31HXE622646; Tue, 1 Apr 2003 19:33:17 +0200 X-Authentication-Warning: laptop1.agatha: blueflux owned process doing -bs Date: Tue, 1 Apr 2003 19:33:13 +0200 (CEST) From: Oskar Andreasson X-X-Sender: blueflux@laptop1.agatha To: "David S. Miller" , "Alexey N. Kuznetsov" cc: netdev@oss.sgi.com Subject: [PATCH][RESEND] Update of tcp_syncookies explanation Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463810815-689177628-1049217616=:22637" Content-ID: X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2122 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: blueflux@koffein.net Precedence: bulk X-list: netdev This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---1463810815-689177628-1049217616=:22637 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: Hi David, Alexey, et al. This is a patch that fixes/updates the tcp_syncookies explanation in the linux/Documentation/networking/ip-sysctl.txt document. Basically it reduces some of the "big red lights" set up about using this specific feature, and instead explains in more detail why the user should be careful about using the syncookies option. If anyone has any objections against this patch, please tell me so, with an explanation of why! [slightly off-topic explanation] It seems I got caught in the crossfire between two camps when I started writing the ipsysctl-tutorial at ipsysctl-tutorial.frozentux.net and at first I received some rather nasty mails about not warning enough about the syncookies option, so I changed it, at which point I received some more poison from the other side for warning about the option at all. Hence, my decision has been to walk somewhere on the borderline by simply explaining the option, what it does, how it works, and what the cons are, without taking up too much space in the kernelspace. I believe this is what would be best for the kernel documentation as well. If anyone disagrees, see above, send me a mail explaining why you disagree. Thanks! ---- Oskar Andreasson http://www.frozentux.net http://iptables-tutorial.frozentux.net http://ipsysctl-tutorial.frozentux.net mailto:blueflux@koffein.net ---1463810815-689177628-1049217616=:22637 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="2.4.19.docs.net.ip-sysctl.txt-2.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="2.4.19.docs.net.ip-sysctl.txt-2.patch" ZGlmZiAtdXIgbGludXgtMi40LjE5L0RvY3VtZW50YXRpb24vbmV0d29ya2lu Zy9pcC1zeXNjdGwudHh0IGxpbnV4LTIuNC4xOS5uZXcvRG9jdW1lbnRhdGlv bi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQNCi0tLSBsaW51eC0yLjQuMTkv RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQJU2F0IEF1 ZyAgMyAwMjozOTo0MiAyMDAyDQorKysgbGludXgtMi40LjE5Lm5ldy9Eb2N1 bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAlTdW4gTm92IDEw IDE4OjEzOjI2IDIwMDINCkBAIC0xNjIsNyArMTYyLDcgQEANCiAJb3ZlcmZs b3dzLiBUaGlzIGlzIHRvIHByZXZlbnQgYWdhaW5zdCB0aGUgY29tbW9uICdz eW4gZmxvb2QgYXR0YWNrJw0KIAlEZWZhdWx0OiBGQUxTRQ0KIA0KLQlOb3Rl LCB0aGF0IHN5bmNvb2tpZXMgaXMgZmFsbGJhY2sgZmFjaWxpdHkuDQorCU5v dGUsIHRoYXQgc3luY29va2llcyBpcyBhIGZhbGxiYWNrIGZhY2lsaXR5Lg0K IAlJdCBNVVNUIE5PVCBiZSB1c2VkIHRvIGhlbHAgaGlnaGx5IGxvYWRlZCBz ZXJ2ZXJzIHRvIHN0YW5kDQogCWFnYWluc3QgbGVnYWwgY29ubmVjdGlvbiBy YXRlLiBJZiB5b3Ugc2VlIHN5bmZsb29kIHdhcm5pbmdzDQogCWluIHlvdXIg bG9ncywgYnV0IGludmVzdGlnYXRpb24Jc2hvd3MgdGhhdCB0aGV5IG9jY3Vy DQpAQCAtMTcwLDEyICsxNzAsMTggQEANCiAJYW5vdGhlciBwYXJhbWV0ZXJz IHVudGlsIHRoaXMgd2FybmluZyBkaXNhcHBlYXIuDQogCVNlZTogdGNwX21h eF9zeW5fYmFja2xvZywgdGNwX3N5bmFja19yZXRyaWVzLCB0Y3BfYWJvcnRf b25fb3ZlcmZsb3cuDQogDQotCXN5bmNvb2tpZXMgc2VyaW91c2x5IHZpb2xh dGUgVENQIHByb3RvY29sLCBkbyBub3QgYWxsb3cNCi0JdG8gdXNlIFRDUCBl eHRlbnNpb25zLCBjYW4gcmVzdWx0IGluIHNlcmlvdXMgZGVncmFkYXRpb24N Ci0Jb2Ygc29tZSBzZXJ2aWNlcyAoZi5lLiBTTVRQIHJlbGF5aW5nKSwgdmlz aWJsZSBub3QgYnkgeW91LA0KLQlidXQgeW91ciBjbGllbnRzIGFuZCByZWxh eXMsIGNvbnRhY3RpbmcgeW91LiBXaGlsZSB5b3Ugc2VlDQotCXN5bmZsb29k IHdhcm5pbmdzIGluIGxvZ3Mgbm90IGJlaW5nIHJlYWxseSBmbG9vZGVkLCB5 b3VyIHNlcnZlcg0KLQlpcyBzZXJpb3VzbHkgbWlzY29uZmlndXJlZC4NCisJ VGhlIHRjcF9zeW5jb29raWVzIG9wdGlvbiBtZWFucyB0aGF0IHdoZW4gdGhl IG1hY2hpbmUgaGFzIG1vcmUgdGhhbiANCisJdGNwX21heF9zeW5fYmFja2xv ZyBTWU4gcGFja2V0cyBpbiB0aGUgcXVldWUsIGl0IHdpbGwgcmV2ZXJ0IHRv IA0KKwlzZW5kaW5nIG91dCBTWU4gY29va2llcy4gdGNwX3N5bmNvb2tpZXMg ZGVwZW5kcyBvbiBhIHNwZWNpZmljYWxseSANCisJZ3JhZnRlZCBUQ1AgU2Vx dWVuY2UgbnVtYmVyLCB3aGljaCB0aGUgU1lOIGZsb29kZXIgbXVzdCBndWVz cyB0aGUgDQorCWNvcnJlY3QgbnVtYmVyIG9mLCB1bmxlc3MgaGUgaXMgYWN0 dWFsbHkgcmVjZWl2aW5nIHRoZSBTWU4vQUNLIHRvDQorCWhpbXNlbGYuIA0K Kw0KKwlXaGVuIFNZTiBjb29raWVzIGFyZSB1c2VkLCBhbGwgbmV3bHkgb3Bl bmVkIGNvbm5lY3Rpb25zIHdpbGwgYmUgdW5hYmxlDQorCXRvIHVzZSBhbnkg YWR2YW5jZWQgZmVhdHVyZXMgbGlrZSBFQ04sIFNBQ0sgb3IgVGltZXN0YW1w cy4gVGhpcyBtYXkgDQorCXJlc3VsdCBpbiBzZXJpb3VzIGRlZ3JhZGF0aW9u IG9mIHNvbWUgc2VydmljZXMsIGFuZCBpZiB5b3Ugc2VlIA0KKwlzeW5mbG9v ZCB3YXJuaW5ncyBpbiB5b3VyIGxvZ3MsIGJ1dCB5b3UgYXJlIG5vdCBiZWlu ZyBmbG9vZGVkLCB5b3VyIA0KKwlzZXJ2ZXIgbWF5IGJlIG1pc2NvbmZpZ3Vy ZWQuDQogDQogdGNwX3N0ZHVyZyAtIEJPT0xFQU4NCiAJVXNlIHRoZSBIb3N0 IHJlcXVpcmVtZW50cyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVENQIHVyZyBw b2ludGVyIGZpZWxkLg0K ---1463810815-689177628-1049217616=:22637-- From scott.feldman@intel.com Tue Apr 1 09:48:18 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:48:21 -0800 (PST) Received: from caduceus.fm.intel.com (fmr02.intel.com [192.55.52.25]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31HmIq9023764 for ; Tue, 1 Apr 2003 09:48:18 -0800 Received: from talaria.fm.intel.com (talaria.fm.intel.com [10.1.192.39]) by caduceus.fm.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h31HfUn22630 for ; Tue, 1 Apr 2003 17:41:30 GMT Received: from fmsmsxvs042.fm.intel.com (fmsmsxvs042.fm.intel.com [132.233.42.128]) by talaria.fm.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h31HnYd14935 for ; Tue, 1 Apr 2003 17:49:34 GMT Received: from FMSMSX018.fm.intel.com ([132.233.42.197]) by fmsmsxvs042.fm.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040109513116460 ; Tue, 01 Apr 2003 09:51:32 -0800 Received: by fmsmsx018.fm.intel.com with Internet Mail Service (5.5.2653.19) id ; Tue, 1 Apr 2003 09:48:15 -0800 Message-ID: From: "Feldman, Scott" To: Robert Olsson , Jason Lunz Cc: Jeff Garzik , netdev@oss.sgi.com Subject: RE: [Fwd: [E1000] NAPI re-insertion w/ changes] Date: Tue, 1 Apr 2003 09:47:55 -0800 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="ISO-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2123 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev > A better approximation I think but probably not the last... Thanks for you help guys! I broke NAPI (don't hate me) and then went on vacation, so I apologize for not responding sooner. I like what you've come up with here, so I'll turn the patch around for Jeff to update 2.5 e1000. > + e1000_clean_tx_irq(adapter); > + e1000_clean_rx_irq(adapter, &work_done, work_to_do); Just curious, why give priority to Tx over Rx? -scott From davem@redhat.com Tue Apr 1 09:52:22 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 09:52:25 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31HqMq9024220 for ; Tue, 1 Apr 2003 09:52:22 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id JAA18765; Tue, 1 Apr 2003 09:47:26 -0800 Date: Tue, 01 Apr 2003 09:47:25 -0800 (PST) Message-Id: <20030401.094725.01304107.davem@redhat.com> To: blueflux@koffein.net Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com Subject: Re: [PATCH][RESEND] Update of tcp_syncookies explanation From: "David S. Miller" In-Reply-To: References: X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2124 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Oskar Andreasson Date: Tue, 1 Apr 2003 19:33:13 +0200 (CEST) If anyone has any objections against this patch, please tell me so, with an explanation of why! You didn't explain how TCP syncookies "seriously violates the TCP protocol" yet you choose to remove that statement written by Alexey. Either retain Alexey's statement (because it's true) or replace it with proper text. I'm not going into the details of how syncookies violates the TCP protocol here, that has been hashed out many times on netdev and linux-net years in the past, so I direct people to search up such discussions instead of starting up yet another flame war here about the topic. Thanks. From rask@sygehus.dk Tue Apr 1 10:08:22 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 10:08:25 -0800 (PST) Received: from cicero0.cybercity.dk (cicero0.cybercity.dk [212.242.40.52]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31I7Vq9024687 for ; Tue, 1 Apr 2003 10:08:12 -0800 Received: from user2.cybercity.dk (fxp0.user2.ip.cybercity.dk [212.242.41.35]) by cicero0.cybercity.dk (Postfix) with ESMTP id B1CBC102A4D; Tue, 1 Apr 2003 19:40:30 +0200 (CEST) Received: from webmail.cybercity.dk (webmail.cybercity.dk [212.242.40.37]) by user2.cybercity.dk (Postfix) with SMTP id 535B054D2; Tue, 1 Apr 2003 19:40:30 +0200 (CEST) Reply-To: rask@sygehus.dk From: rask@sygehus.dk (Rask Ingemann Lambertsen) To: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Is a driver allowed to modify dev->flags? Date: Tue, 1 Apr 2003 19:40:30 +0200 Message-Id: <3e89cf0e623458.50320081@not right> References: X-Authenticated-IP: [152.95.52.86] X-Sender: ccc94453@vip.cybercity.dk X-Mailer: Cybercity Webmail 1.06 (http://webmail.cybercity.dk/) MIME-version: 1.0 Content-type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2125 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rask@sygehus.dk Precedence: bulk X-list: netdev Donald Becker wrote: > On Tue, 1 Apr 2003, Rask Ingemann Lambertsen wrote: > > > Is a network device driver allowed to modify dev->flags? For example: > > > > if (dev->flags & IFF_ALLMULTI) > > dev->flags |= IFF_PROMISC; > > You must be looking at the atp.c driver, or a driver that cribbed from > it. (Is anyone still running a parallel port Ethernet device?!) No, but I've seen such code in other Ethernet drivers and adopted it for my NE3200 driver. > > I've found it to cause the IFF_PROMISC flag to stick when using > > "tcpdump -p", which to my surprice sets the IFF_ALLMULTI flag. > > Which driver are you using? My experimental NE3200 driver, linux 2.4.20 and tcpdump from Redhat 7.3. Regards, Rask Ingemann Lambertsen From Robert.Olsson@data.slu.se Tue Apr 1 10:58:44 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 10:58:47 -0800 (PST) Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31Iw3oJ026244 for ; Tue, 1 Apr 2003 10:58:44 -0800 Received: (from robert@localhost) by robur.slu.se (8.9.3p2/8.9.3) id UAA11217; Tue, 1 Apr 2003 20:57:24 +0200 From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16009.57620.391630.720667@robur.slu.se> Date: Tue, 1 Apr 2003 20:57:24 +0200 To: "Feldman, Scott" Cc: Robert Olsson , Jason Lunz , Jeff Garzik , netdev@oss.sgi.com Subject: RE: [Fwd: [E1000] NAPI re-insertion w/ changes] In-Reply-To: References: X-Mailer: VM 6.92 under Emacs 19.34.1 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2127 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Content-Length: 1048 Lines: 33 Feldman, Scott writes: > Thanks for you help guys! I broke NAPI (don't hate me) and then went on > vacation, so I apologize for not responding sooner. I like what you've > come up with here, so I'll turn the patch around for Jeff to update 2.5 > e1000. > > > + e1000_clean_tx_irq(adapter); > > + e1000_clean_rx_irq(adapter, &work_done, work_to_do); > > Just curious, why give priority to Tx over Rx? Hello! Honestly not too much thinking... well we can always argue by having Rx last we get more packets per poll. Yes we should test the other way around. Also still some concern by having the watchdog kicked in e1000_intr wouldn't e1000_clean feel better? It would also be interesting to see what happens if we remove the flush when enable interrupts in e1000_clean? I've tested the patch that removes some of the PCI-accesses. I think I sent you some version of it. Anyway it seems to have some effects. If Jason has time we will get some numbers from his instrument/setup. Cheers. --ro From scott.feldman@intel.com Tue Apr 1 11:14:40 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 11:14:45 -0800 (PST) Received: from hermes.fm.intel.com (fmr01.intel.com [192.55.52.18]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31JE0oJ026702 for ; Tue, 1 Apr 2003 11:14:40 -0800 Received: from talaria.fm.intel.com (talaria.fm.intel.com [10.1.192.39]) by hermes.fm.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h31JALN09521 for ; Tue, 1 Apr 2003 19:10:21 GMT Received: from fmsmsxv040-1.fm.intel.com (fmsmsxvs040.fm.intel.com [132.233.42.124]) by talaria.fm.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h31JFGc04887 for ; Tue, 1 Apr 2003 19:15:16 GMT Received: from FMSMSX016.fm.intel.com ([132.233.42.195]) by fmsmsxv040-1.fm.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040111141027149 ; Tue, 01 Apr 2003 11:14:10 -0800 Received: by fmsmsx016.fm.intel.com with Internet Mail Service (5.5.2653.19) id ; Tue, 1 Apr 2003 11:13:57 -0800 Message-ID: From: "Feldman, Scott" To: Robert Olsson Cc: Jason Lunz , Jeff Garzik , netdev@oss.sgi.com Subject: RE: [Fwd: [E1000] NAPI re-insertion w/ changes] Date: Tue, 1 Apr 2003 11:13:53 -0800 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2128 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev Content-Length: 742 Lines: 21 > Also still some concern by having the watchdog kicked in e1000_intr > wouldn't e1000_clean feel better? e1000_intr feels better to me in keeping the clean-up work separate from managing link status change (hopefully an infrequent event :). Do you see any problems? > It would also be interesting to see what happens if we > remove the flush when enable interrupts in e1000_clean? Ya, that read hurts, which was part of the motivation to get rid of the disable/enables altogether. > I've tested the patch that removes some of the PCI-accesses. > I think I sent you some version of it. Anyway it seems to > have some effects. If Jason has > time we will get some numbers from his instrument/setup. Ok, let's see. -scott From linux-netdev@gmane.org Tue Apr 1 11:42:03 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 11:42:50 -0800 (PST) Received: from main.gmane.org (main.gmane.org [80.91.224.249]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31JfLoJ029102 for ; Tue, 1 Apr 2003 11:42:03 -0800 Received: from root by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 190RcV-0007h3-00 for ; Tue, 01 Apr 2003 21:40:31 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@oss.sgi.com Received: from news by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 190RLi-0006Lj-00 for ; Tue, 01 Apr 2003 21:23:10 +0200 From: Jason Lunz Subject: Re: [Fwd: [E1000] NAPI re-insertion w/ changes] Date: Tue, 1 Apr 2003 19:23:10 +0000 (UTC) Organization: PBR Streetgang Message-ID: References: X-Complaints-To: usenet@main.gmane.org User-Agent: slrn/0.9.7.4 (Linux) X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2129 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lunz@reflexsecurity.com Precedence: bulk X-list: netdev Content-Length: 462 Lines: 14 scott.feldman@intel.com said: >> I've tested the patch that removes some of the PCI-accesses. I >> think I sent you some version of it. Anyway it seems to have some >> effects. If Jason has time we will get some numbers from his >> instrument/setup. > > Ok, let's see. It works. Reducing PCI accessess gives a measurable improvement. I'll post plots later today. -- Jason Lunz Reflex Security lunz@reflexsecurity.com http://www.reflexsecurity.com/ From Robert.Olsson@data.slu.se Tue Apr 1 11:44:40 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 11:44:43 -0800 (PST) Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31JicoJ029367 for ; Tue, 1 Apr 2003 11:44:40 -0800 Received: (from robert@localhost) by robur.slu.se (8.9.3p2/8.9.3) id VAA11969; Tue, 1 Apr 2003 21:44:04 +0200 From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16009.60419.764838.337501@robur.slu.se> Date: Tue, 1 Apr 2003 21:44:03 +0200 To: "Feldman, Scott" Cc: Robert Olsson , Jason Lunz , Jeff Garzik , netdev@oss.sgi.com Subject: RE: [Fwd: [E1000] NAPI re-insertion w/ changes] In-Reply-To: References: X-Mailer: VM 6.92 under Emacs 19.34.1 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2130 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Content-Length: 728 Lines: 24 Feldman, Scott writes: > > Also still some concern by having the watchdog kicked in e1000_intr > > wouldn't e1000_clean feel better? > > e1000_intr feels better to me in keeping the clean-up work separate from > managing link status change (hopefully an infrequent event :). Do you > see any problems? Well I was afraid that this would not be run at very heavy loads due to interrupt disabling but I forgot: e1000_watchdog(unsigned long data) { /* Cause software interrupt to ensure rx ring is cleaned */ E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_RXDMT0); Which generates irq from watchdog/timer so it should work and all practial experiments indicates this is OK. Cheers. --ro From blueflux@koffein.net Tue Apr 1 12:12:55 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 12:12:57 -0800 (PST) Received: from laptop1.agatha ([195.163.42.244]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31KCDoJ030617 for ; Tue, 1 Apr 2003 12:12:54 -0800 Received: from localhost (blueflux@localhost) by laptop1.agatha (8.11.6/8.11.6) with ESMTP id h31Jx5j22944; Tue, 1 Apr 2003 21:59:06 +0200 X-Authentication-Warning: laptop1.agatha: blueflux owned process doing -bs Date: Tue, 1 Apr 2003 21:59:05 +0200 (CEST) From: Oskar Andreasson X-X-Sender: blueflux@laptop1.agatha To: "David S. Miller" cc: netdev@oss.sgi.com Subject: Re: [PATCH][RESEND] Update of tcp_syncookies explanation Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2131 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: blueflux@koffein.net Precedence: bulk X-list: netdev Content-Length: 1921 Lines: 57 Hi David, Thanks for the reply! It was much appreciated, and I will do what I can to iron any problems out. (Also, I am very sorry for putting you or anyone else out there) My final question is this... could you give any tip on what specifics to look/search for? I've been searching through the archives available at http://oss.sgi.com/projects/netdev/archive/ for every single inclusion of SYN in any of the archives by now, but could not find any specifics on _what_ the syn cookies breaks, or why, except for ECN, SACK and timestamps:/. I have also checked through the source code as well as I could, as well as Mr. Bernsteins algorithms, searched the net at large with 3 search engines... and I am still not clever enough to figure it out. In short, what I am trying to ask for is simply some kind of hints on where to look... I hope you don't mind. Thanks! PS. David, sorry for sending this in private before, no bad intentions meant. DS. On Tue, 1 Apr 2003, David S. Miller wrote: > From: Oskar Andreasson > Date: Tue, 1 Apr 2003 19:33:13 +0200 (CEST) > > If anyone has any objections against this patch, please tell me so, with > an explanation of why! > > You didn't explain how TCP syncookies "seriously violates the TCP > protocol" yet you choose to remove that statement written by Alexey. > > Either retain Alexey's statement (because it's true) or replace it > with proper text. > > I'm not going into the details of how syncookies violates the TCP > protocol here, that has been hashed out many times on netdev and > linux-net years in the past, so I direct people to search up such > discussions instead of starting up yet another flame war here about > the topic. Thanks. > > > -- ---- Oskar Andreasson http://www.frozentux.net http://iptables-tutorial.frozentux.net http://ipsysctl-tutorial.frozentux.net mailto:blueflux@koffein.net From jsd@monmouth.com Tue Apr 1 12:59:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 12:59:46 -0800 (PST) Received: from av8n.net (pcp03191463pcs.midltn01.nj.comcast.net [68.37.175.11]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31KwxoJ031276 for ; Tue, 1 Apr 2003 12:59:42 -0800 Received: (qmail 10967 invoked from network); 1 Apr 2003 20:58:52 -0000 Received: from localhost (HELO monmouth.com) (127.0.0.1) by localhost with SMTP; 1 Apr 2003 20:58:52 -0000 Message-ID: <3E89FD8C.2060607@monmouth.com> Date: Tue, 01 Apr 2003 15:58:52 -0500 From: "John S. Denker" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030323 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Oskar Andreasson CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: defending against syn flood attacks References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2132 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jsd@monmouth.com Precedence: bulk X-list: netdev Content-Length: 1548 Lines: 36 On 04/01/2003 02:59 PM, Oskar Andreasson wrote: >> >> TCP syncookies "seriously violates the TCP protocol" >> ... statement written by Alexey. Those who are interested in defending against syn flood attacks without seriously violating the TCP protocol may be interested in the following: Abstract The protocol of the present invention includes two new first level protocols and several embodiments of a second level protocol. The two new first level protocols of the present invention include the TCP2B protocol and the TCP2E protocol. In the TCP2B protocol, both client and server indicate their support for this protocol using one or more bits in TCP header. According to the TCP2B protocol, the client retransmits its requested options in the ACK message so the server need not store the options after the connection request. In the TCP2E protocol, the server maintains a Friends Table listing addresses of device recently observed to be complying with TCP. If a client's address is on the Friends Table, the connection request is processed according to TCP. Otherwise, the server sends an ACK message to the client to prompt the client to send a reset message. The client's address can then be added to the Friends Table. The patent is held by AT&T. I have no idea how hard it would be to get a license. http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=/netahtml/srchnum.htm&r=1&f=G&l=50&s1=5,958,053.WKU.+5,958,053.WKU.&OS=PN/5,958,053+OR+PN/5,958,053&RS=PN/5,958,053+OR+PN/5,958,053 From garzik@gtf.org Tue Apr 1 13:17:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 13:18:16 -0800 (PST) Received: from havoc.gtf.org (havoc.daloft.com [64.213.145.173]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31LGvoJ031875 for ; Tue, 1 Apr 2003 13:17:42 -0800 Received: by havoc.gtf.org (Postfix, from userid 500) id D4CA76650; Tue, 1 Apr 2003 21:16:51 +0000 (US/Central) Date: Tue, 1 Apr 2003 16:16:51 -0500 From: Jeff Garzik To: "Feldman, Scott" Cc: Robert Olsson , Jason Lunz , netdev@oss.sgi.com Subject: Re: [Fwd: [E1000] NAPI re-insertion w/ changes] Message-ID: <20030401211651.GA23739@gtf.org> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.28i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2133 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 698 Lines: 22 On Tue, Apr 01, 2003 at 09:47:55AM -0800, Feldman, Scott wrote: > > A better approximation I think but probably not the last... > > Thanks for you help guys! I broke NAPI (don't hate me) and then went on > vacation, so I apologize for not responding sooner. I like what you've > come up with here, so I'll turn the patch around for Jeff to update 2.5 > e1000. > > > + e1000_clean_tx_irq(adapter); > > + e1000_clean_rx_irq(adapter, &work_done, work_to_do); > > Just curious, why give priority to Tx over Rx? TX frees skbs, RX allocates skbs. You lessen the chance of allocation failure or "additional work" being performed by the allocator when you do it in this order. Jeff From scott.feldman@intel.com Tue Apr 1 13:23:13 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 13:23:46 -0800 (PST) Received: from caduceus.fm.intel.com (fmr02.intel.com [192.55.52.25]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31LMWoJ032287 for ; Tue, 1 Apr 2003 13:23:13 -0800 Received: from talaria.fm.intel.com (talaria.fm.intel.com [10.1.192.39]) by caduceus.fm.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h31LFfD05037 for ; Tue, 1 Apr 2003 21:15:42 GMT Received: from fmsmsxv040-1.fm.intel.com (fmsmsxvs040.fm.intel.com [132.233.42.124]) by talaria.fm.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h31LNkc12960 for ; Tue, 1 Apr 2003 21:23:46 GMT Received: from fmsmsx26.fm.intel.com ([132.233.42.26]) by fmsmsxv040-1.fm.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040113224111981 ; Tue, 01 Apr 2003 13:22:41 -0800 Received: by fmsmsx26.fm.intel.com with Internet Mail Service (5.5.2653.19) id ; Tue, 1 Apr 2003 13:22:28 -0800 Message-ID: From: "Feldman, Scott" To: Jeff Garzik Cc: Robert Olsson , Jason Lunz , netdev@oss.sgi.com Subject: RE: [Fwd: [E1000] NAPI re-insertion w/ changes] Date: Tue, 1 Apr 2003 13:22:15 -0800 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2134 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev Content-Length: 323 Lines: 14 > > Just curious, why give priority to Tx over Rx? > > TX frees skbs, RX allocates skbs. > > You lessen the chance of allocation failure or "additional > work" being performed by the allocator when you do it in this order. At the expense of Rx latency. I suppose the best would be: rx_clean tx_clean rx_alloc -scott From toml@us.ibm.com Tue Apr 1 14:04:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 14:04:28 -0800 (PST) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31M3aoJ000539 for ; Tue, 1 Apr 2003 14:04:24 -0800 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e2.ny.us.ibm.com (8.12.9/8.12.2) with ESMTP id h31M2umL072412; Tue, 1 Apr 2003 17:02:57 -0500 Received: from tomlt2.austin.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.8/NCO/VER6.5) with ESMTP id h31M2rdV036296; Tue, 1 Apr 2003 17:02:53 -0500 Subject: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: Tom Lendacky To: netdev@oss.sgi.com Cc: davem@redhat.com, kuznet@ms2.inr.ac.ru, toml@us.ibm.com Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.8 (1.0.8-10) Date: 01 Apr 2003 16:04:32 -0600 Message-Id: <1049234673.5116.11.camel@tomlt2.tomloffice.austin.ibm.com> Mime-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2135 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: toml@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 4897 Lines: 132 Below is a patch for your consideration removing the hard coded 8 that represented the ESP spi and sequence number fields. I had to define a pointer to ip(v6)_esp_header in esp(6)_init_state in order to obtain the size of the enc_data member in the most straight forward way. Please review and let me know if any changes are required. Thanks, Tom diff -ur linux-2.5.66-orig/net/ipv4/esp.c linux-2.5.66/net/ipv4/esp.c --- linux-2.5.66-orig/net/ipv4/esp.c 2003-03-31 14:47:18.000000000 -0600 +++ linux-2.5.66/net/ipv4/esp.c 2003-03-31 14:46:39.000000000 -0600 @@ -134,7 +134,8 @@ if (esp->auth.icv_full_len) { esp->auth.icv(esp, skb, (u8*)esph-skb->data, - 8+esp->conf.ivlen+clen, trailer->tail); + (sizeof(struct ip_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen + clen, + trailer->tail); pskb_put(skb, trailer, alen); } @@ -171,7 +172,7 @@ struct sk_buff *trailer; int blksize = crypto_tfm_alg_blocksize(esp->conf.tfm); int alen = esp->auth.icv_trunc_len; - int elen = skb->len - 8 - esp->conf.ivlen - alen; + int elen = skb->len - (sizeof(struct ip_esp_hdr) - sizeof(esph->enc_data)) - esp->conf.ivlen - alen; int nfrags; if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) @@ -220,7 +221,8 @@ if (!sg) goto out; } - skb_to_sgvec(skb, sg, 8+esp->conf.ivlen, elen); + skb_to_sgvec(skb, sg, + (sizeof(struct ip_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen, elen); crypto_cipher_decrypt(esp->conf.tfm, sg, sg, elen); if (unlikely(sg != sgbuf)) kfree(sg); @@ -237,8 +239,8 @@ iph->protocol = nexthdr[1]; pskb_trim(skb, skb->len - alen - padlen - 2); memcpy(workbuf, skb->nh.raw, iph->ihl*4); - skb->h.raw = skb_pull(skb, 8 + esp->conf.ivlen); - skb->nh.raw += 8 + esp->conf.ivlen; + skb->h.raw = skb_pull(skb, (sizeof(struct ip_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen); + skb->nh.raw += (sizeof(struct ip_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen; memcpy(skb->nh.raw, workbuf, iph->ihl*4); skb->nh.iph->tot_len = htons(skb->len); } @@ -308,6 +310,7 @@ int esp_init_state(struct xfrm_state *x, void *args) { + struct ip_esp_hdr *esph = NULL; struct esp_data *esp = NULL; /* null auth and encryption can have zero length keys */ @@ -365,7 +368,7 @@ get_random_bytes(esp->conf.ivec, esp->conf.ivlen); } crypto_cipher_setkey(esp->conf.tfm, esp->conf.key, esp->conf.key_len); - x->props.header_len = 8 + esp->conf.ivlen; + x->props.header_len = (sizeof(struct ip_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen; if (x->props.mode) x->props.header_len += sizeof(struct iphdr); x->data = esp; diff -ur linux-2.5.66-orig/net/ipv6/esp6.c linux-2.5.66/net/ipv6/esp6.c --- linux-2.5.66-orig/net/ipv6/esp6.c 2003-03-31 14:47:18.000000000 -0600 +++ linux-2.5.66/net/ipv6/esp6.c 2003-03-31 14:46:39.000000000 -0600 @@ -232,7 +232,8 @@ if (esp->auth.icv_full_len) { esp->auth.icv(esp, skb, (u8*)esph-skb->data, - 8+esp->conf.ivlen+clen, trailer->tail); + (sizeof(struct ipv6_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen + clen, + trailer->tail); pskb_put(skb, trailer, alen); } @@ -262,7 +263,7 @@ struct sk_buff *trailer; int blksize = crypto_tfm_alg_blocksize(esp->conf.tfm); int alen = esp->auth.icv_trunc_len; - int elen = skb->len - 8 - esp->conf.ivlen - alen; + int elen = skb->len - (sizeof(struct ipv6_esp_hdr) - sizeof(esph->enc_data)) - esp->conf.ivlen - alen; int hdr_len = skb->h.raw - skb->nh.raw; int nfrags; @@ -319,7 +320,7 @@ if (!sg) goto out; } - skb_to_sgvec(skb, sg, 8+esp->conf.ivlen, elen); + skb_to_sgvec(skb, sg, (sizeof(struct ipv6_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen, elen); crypto_cipher_decrypt(esp->conf.tfm, sg, sg, elen); if (unlikely(sg != sgbuf)) kfree(sg); @@ -338,8 +339,8 @@ ret_nexthdr = ((struct ipv6hdr*)tmp_hdr)->nexthdr = nexthdr[1]; pskb_trim(skb, skb->len - alen - padlen - 2); - skb->h.raw = skb_pull(skb, 8 + esp->conf.ivlen); - skb->nh.raw += 8 + esp->conf.ivlen; + skb->h.raw = skb_pull(skb, (sizeof(struct ipv6_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen); + skb->nh.raw += (sizeof(struct ipv6_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen; memcpy(skb->nh.raw, tmp_hdr, hdr_len); } kfree(tmp_hdr); @@ -410,6 +411,7 @@ int esp6_init_state(struct xfrm_state *x, void *args) { + struct ipv6_esp_hdr *esph = NULL; struct esp_data *esp = NULL; if (x->aalg) { @@ -466,7 +468,7 @@ get_random_bytes(esp->conf.ivec, esp->conf.ivlen); } crypto_cipher_setkey(esp->conf.tfm, esp->conf.key, esp->conf.key_len); - x->props.header_len = 8 + esp->conf.ivlen; + x->props.header_len = (sizeof(struct ipv6_esp_hdr) - sizeof(esph->enc_data)) + esp->conf.ivlen; if (x->props.mode) x->props.header_len += sizeof(struct ipv6hdr); x->data = esp; From davem@redhat.com Tue Apr 1 14:12:53 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 14:12:56 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.8/8.12.5) with SMTP id h31MCCoJ001006 for ; Tue, 1 Apr 2003 14:12:53 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id OAA16242; Tue, 1 Apr 2003 14:07:28 -0800 Date: Tue, 01 Apr 2003 14:07:27 -0800 (PST) Message-Id: <20030401.140727.73666851.davem@redhat.com> To: toml@us.ibm.com Cc: netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: "David S. Miller" In-Reply-To: <1049234673.5116.11.camel@tomlt2.tomloffice.austin.ibm.com> References: <1049234673.5116.11.camel@tomlt2.tomloffice.austin.ibm.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2136 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 382 Lines: 12 From: Tom Lendacky Date: 01 Apr 2003 16:04:32 -0600 Please review and let me know if any changes are required. Ok, now that I look at this I realize my suggestions from the other day were wrong. These expressions are huge, it's almost less readable. Let's compact this, by creating a struct named {ip,ipv6}_esp_header_no_enc_data. How about that? From linux-netdev@gmane.org Tue Apr 1 14:40:29 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 14:41:02 -0800 (PST) Received: from main.gmane.org (main.gmane.org [80.91.224.249]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h31MeRrX003439 for ; Tue, 1 Apr 2003 14:40:28 -0800 Received: from list by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 190UQL-0003vg-00 for ; Wed, 02 Apr 2003 00:40:09 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@oss.sgi.com Received: from news by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 190UQG-0003vJ-00 for ; Wed, 02 Apr 2003 00:40:04 +0200 From: Jason Lunz Subject: Re: [Fwd: [E1000] NAPI re-insertion w/ changes] Date: Tue, 1 Apr 2003 22:40:03 +0000 (UTC) Organization: PBR Streetgang Message-ID: References: X-Complaints-To: usenet@main.gmane.org User-Agent: slrn/0.9.7.4 (Linux) X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2137 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lunz@reflexsecurity.com Precedence: bulk X-list: netdev Content-Length: 920 Lines: 20 lunz@reflexsecurity.com said: > It works. Reducing PCI accessess gives a measurable improvement. I'll > post plots later today. The graphs are up now. The best driver measured so far is Robert's change to reinstate irq-disable-on-poll + reduce-pci-traffic, with XsumRX turned off. I'm currently measuring to see if it still has an advantage with checksumming turned on. Scott, your bugfix of removing the while() from e1000_clean() puts the original 5.0.43-k1 driver from 2.5.66 back in the running. It no longer suffers from watchdog timeouts, and doesn't degrade under high load. It still scores lowest, though. I've seen that the max-pps-ceiling visible in these graphs is highly sensitive to CPU load, so I'd guess that the sf1 test lost solely because of the overhead of still running the irq handler once in a while. -- Jason Lunz Reflex Security lunz@reflexsecurity.com http://www.reflexsecurity.com/ From scott.feldman@intel.com Tue Apr 1 16:13:44 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 16:13:51 -0800 (PST) Received: from hermes.fm.intel.com (fmr01.intel.com [192.55.52.18]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h320DhrX005019 for ; Tue, 1 Apr 2003 16:13:44 -0800 Received: from talaria.fm.intel.com (talaria.fm.intel.com [10.1.192.39]) by hermes.fm.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h320A5N00551 for ; Wed, 2 Apr 2003 00:10:05 GMT Received: from fmsmsxv040-1.fm.intel.com (fmsmsxvs040.fm.intel.com [132.233.42.124]) by talaria.fm.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h320Evc25051 for ; Wed, 2 Apr 2003 00:14:58 GMT Received: from fmsmsx26.fm.intel.com ([132.233.42.26]) by fmsmsxv040-1.fm.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040116135024290 ; Tue, 01 Apr 2003 16:13:50 -0800 Received: by fmsmsx26.fm.intel.com with Internet Mail Service (5.5.2653.19) id ; Tue, 1 Apr 2003 16:13:37 -0800 Message-ID: From: "Feldman, Scott" To: Jason Lunz , Jeff Garzik , Robert Olsson , netdev@oss.sgi.com Subject: RE: [Fwd: [E1000] NAPI re-insertion w/ changes] Date: Tue, 1 Apr 2003 16:13:31 -0800 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2138 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev Content-Length: 1454 Lines: 37 > The graphs are up now. The best driver measured so far is > Robert's change to reinstate irq-disable-on-poll + > reduce-pci-traffic, with XsumRX turned off. I'm currently > measuring to see if it still has an advantage with > checksumming turned on. Very good. Jeff has the patch for -k2 which should be equivalent to -ro2. Robert, please post your -ro3 changes - I can't find them. BTW, the things that changed from 4.4.19-k3 to 5.0.43-k2 that may account for the improvements are: o eliminate the modulus operator for ring index wrapping (anton@samba.org) o single read of ICR (Interrupt Cause Register) in e1000_intr o dynamic ITR (Interrupt Throttle Rate) algorithm for 82545/6 Sum of many second-order improvements add up. We'll take all we can find. > Scott, your bugfix of removing the while() from e1000_clean() > puts the original 5.0.43-k1 driver from 2.5.66 back in the > running. It no longer suffers from watchdog timeouts, and > doesn't degrade under high load. It still scores lowest, > though. I've seen that the max-pps-ceiling visible in these > graphs is highly sensitive to CPU load, so I'd guess that the > sf1 test lost solely because of the overhead of still running > the irq handler once in a while. Ok, that settles that. Thanks for re-running the tests. I'm pretty happy with this NAPI code for e1000. Next step is to get some more generic QA testing with NAPI and then port back to 2.4.x. -scott From yoshfuji@linux-ipv6.org Tue Apr 1 19:25:22 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 19:25:34 -0800 (PST) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h323PLrX009657 for ; Tue, 1 Apr 2003 19:25:22 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h323PIDG015172; Wed, 2 Apr 2003 12:25:18 +0900 Date: Wed, 02 Apr 2003 12:25:18 +0900 (JST) Message-Id: <20030402.122518.62753078.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: toml@us.ibm.com, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030401.140727.73666851.davem@redhat.com> References: <1049234673.5116.11.camel@tomlt2.tomloffice.austin.ibm.com> <20030401.140727.73666851.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2139 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 982 Lines: 34 In article <20030401.140727.73666851.davem@redhat.com> (at Tue, 01 Apr 2003 14:07:27 -0800 (PST)), "David S. Miller" says: > From: Tom Lendacky > Date: 01 Apr 2003 16:04:32 -0600 > > Please review and let me know if any changes are required. > > Ok, now that I look at this I realize my suggestions from the other > day were wrong. > > These expressions are huge, it's almost less readable. Let's compact > this, by creating a struct named {ip,ipv6}_esp_header_no_enc_data. How about just removing 8 bytes from struct {ip,ipv6}_esp_hdr like this? struct ipv6_auth_hdr { __u8 nexthdr; __u8 hdrlen; __u16 reserved; __u32 spi; __u32 seq_no; __u8 auth_data[0]; } __attribute__ ((aligned (8))); struct ipv6_esp_hdr { __u32 spi; __u32 seq_no; __u8 enc_data[0]; } __attribute__ ((aligned (8))); -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Tue Apr 1 19:39:01 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 19:39:12 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h323d1rX010077 for ; Tue, 1 Apr 2003 19:39:01 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id TAA10335; Tue, 1 Apr 2003 19:34:30 -0800 Date: Tue, 01 Apr 2003 19:34:29 -0800 (PST) Message-Id: <20030401.193429.64279267.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: toml@us.ibm.com, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: "David S. Miller" In-Reply-To: <20030402.122518.62753078.yoshfuji@linux-ipv6.org> References: <1049234673.5116.11.camel@tomlt2.tomloffice.austin.ibm.com> <20030401.140727.73666851.davem@redhat.com> <20030402.122518.62753078.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2140 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 884 Lines: 21 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Wed, 02 Apr 2003 12:25:18 +0900 (JST) In article <20030401.140727.73666851.davem@redhat.com> (at Tue, 01 Apr 2003 14:07:27 -0800 (PST)), "David S. Miller" says: > From: Tom Lendacky > Date: 01 Apr 2003 16:04:32 -0600 > > Please review and let me know if any changes are required. > > Ok, now that I look at this I realize my suggestions from the other > day were wrong. > > These expressions are huge, it's almost less readable. Let's compact > this, by creating a struct named {ip,ipv6}_esp_header_no_enc_data. How about just removing 8 bytes from struct {ip,ipv6}_esp_hdr like this? Sure, but does anyone need the 8 bytes there? I thought so, which is why I didn't think about your suggestion :-) From becker@scyld.com Tue Apr 1 19:50:56 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 19:51:04 -0800 (PST) Received: from beohost.scyld.com (pcp724216pcs.arlngt01.va.comcast.net [68.49.198.32]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h323oorX010614 for ; Tue, 1 Apr 2003 19:50:55 -0800 Received: from localhost (becker@localhost) by beohost.scyld.com (8.11.6/8.11.6) with ESMTP id h323o7513065; Tue, 1 Apr 2003 22:50:39 -0500 Date: Tue, 1 Apr 2003 22:50:07 -0500 (EST) From: Donald Becker To: Rask Ingemann Lambertsen cc: linux-net@vger.kernel.org, Subject: Re: Must dev->set_multicast_list() complete before returning? In-Reply-To: <3e89cbe235cd78.41777977@not right> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2141 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: becker@scyld.com Precedence: bulk X-list: netdev Content-Length: 694 Lines: 19 On Tue, 1 Apr 2003, Rask Ingemann Lambertsen wrote: > Must dev->set_multicast_list() complete the configuration of a network > device before returning? The promiscuous setting must complete before return, but there are several drivers where the updated multicast filter does not immediately take effect. I have not seen hardware where setting promiscuous mode is a queued command. If you have such hardware, you may have to do some extra software filtering and accept missing some packets during transitions. -- Donald Becker becker@scyld.com Scyld Computing Corporation http://www.scyld.com 410 Severn Ave. Suite 210 Scyld Beowulf cluster system Annapolis MD 21403 410-990-9993 From yoshfuji@linux-ipv6.org Tue Apr 1 20:02:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 20:02:32 -0800 (PST) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h3242NrX011052 for ; Tue, 1 Apr 2003 20:02:23 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3242WDG015405; Wed, 2 Apr 2003 13:02:33 +0900 Date: Wed, 02 Apr 2003 13:02:32 +0900 (JST) Message-Id: <20030402.130232.78951283.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: toml@us.ibm.com, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030401.193429.64279267.davem@redhat.com> References: <20030401.140727.73666851.davem@redhat.com> <20030402.122518.62753078.yoshfuji@linux-ipv6.org> <20030401.193429.64279267.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2142 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 746 Lines: 21 In article <20030401.193429.64279267.davem@redhat.com> (at Tue, 01 Apr 2003 19:34:29 -0800 (PST)), "David S. Miller" says: > How about just removing 8 bytes from struct {ip,ipv6}_esp_hdr > like this? > > Sure, but does anyone need the 8 bytes there? I thought so, which is > why I didn't think about your suggestion :-) Let's define #define IPV6_ESP_MINDATA 8 and put "(sizeof(struct ip6_esp_hdr) + IPV6_ESP_MINDATA)" in such places. Or, how about this? (offsetof(struct ip6_esp_hdr, enc_data) + datalen) instead of ((sizeof(struct ip6_esp_hdr) - sizeof(esp->enc_data)) + datalen) -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Tue Apr 1 20:06:55 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 20:06:58 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h3246trX011505 for ; Tue, 1 Apr 2003 20:06:55 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id UAA10396; Tue, 1 Apr 2003 20:02:26 -0800 Date: Tue, 01 Apr 2003 20:02:25 -0800 (PST) Message-Id: <20030401.200225.88014087.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: toml@us.ibm.com, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: "David S. Miller" In-Reply-To: <20030402.130232.78951283.yoshfuji@linux-ipv6.org> References: <20030402.122518.62753078.yoshfuji@linux-ipv6.org> <20030401.193429.64279267.davem@redhat.com> <20030402.130232.78951283.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2143 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 808 Lines: 21 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Wed, 02 Apr 2003 13:02:32 +0900 (JST) In article <20030401.193429.64279267.davem@redhat.com> (at Tue, 01 Apr 2003 19:34:29 -0800 (PST)), "David S. Miller" says: > How about just removing 8 bytes from struct {ip,ipv6}_esp_hdr > like this? > > Sure, but does anyone need the 8 bytes there? I thought so, which is > why I didn't think about your suggestion :-) Let's define #define IPV6_ESP_MINDATA 8 and put "(sizeof(struct ip6_esp_hdr) + IPV6_ESP_MINDATA)" in such places. I just checked, nobody cares about the 8 bytes in enc_data. Therefore, I think you're idea of enc_data[0] is the best. Someone please double check my claims and submit a patch. :-) From linux-netdev@gmane.org Tue Apr 1 20:19:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 20:19:48 -0800 (PST) Received: from main.gmane.org (main.gmane.org [80.91.224.249]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h324JerX011981 for ; Tue, 1 Apr 2003 20:19:42 -0800 Received: from list by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 190Zie-0006rK-00 for ; Wed, 02 Apr 2003 06:19:24 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@oss.sgi.com Received: from news by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 190Zid-0006rA-00 for ; Wed, 02 Apr 2003 06:19:23 +0200 From: Jason Lunz Subject: Re: [Fwd: [E1000] NAPI re-insertion w/ changes] Date: Wed, 2 Apr 2003 04:19:23 +0000 (UTC) Organization: PBR Streetgang Message-ID: References: X-Complaints-To: usenet@main.gmane.org User-Agent: slrn/0.9.7.4 (Linux) X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2145 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lunz@falooley.org Precedence: bulk X-list: netdev Content-Length: 1048 Lines: 24 scott.feldman@intel.com said: > Robert, please post your -ro3 changes - I can't find them. sorry, the -roX and -sfX notations are mine; i'm backporting everything to 2.4.20 for testing and most of the patches have to be tweaked one way or another, so I gave them all my own names to help keep them straight. -ro1 and -ro2 come from Robert's posts here, and -ro3 is what you get when you apply ftp://robur.slu.se/pub/Linux/net-development/skb_recycling/e1000_pci_2.pat on top of that. > I'm pretty happy with this NAPI code for e1000. Next step is to get > some more generic QA testing with NAPI and then port back to 2.4.x. For what it's worth, I've subjected various e1000 chipsets to just about every kind of synthetic load all the way up to the maximum theoretical full-duplex gigE framerate for hours without a hiccup. I'm using backports from 2.5 with the TSO stuff stripped out. Judging from my apache logs and the emails I get, quite a few others have been using those patches on 2.4 too, but I've received no real complaints. Jason From scott.feldman@intel.com Tue Apr 1 20:19:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 20:19:30 -0800 (PST) Received: from hermes.fm.intel.com (fmr01.intel.com [192.55.52.18]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h324JJrX011946 for ; Tue, 1 Apr 2003 20:19:24 -0800 Received: from talaria.fm.intel.com (talaria.fm.intel.com [10.1.192.39]) by hermes.fm.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h324FeB02479 for ; Wed, 2 Apr 2003 04:15:40 GMT Received: from fmsmsxvs041.fm.intel.com (fmsmsxvs041.fm.intel.com [132.233.42.126]) by talaria.fm.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h324KZi21128 for ; Wed, 2 Apr 2003 04:20:35 GMT Received: from FMSMSX017.fm.intel.com ([132.233.42.196]) by fmsmsxvs041.fm.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040120165316542 ; Tue, 01 Apr 2003 20:16:53 -0800 Received: by fmsmsx017.fm.intel.com with Internet Mail Service (5.5.2653.19) id ; Tue, 1 Apr 2003 20:19:18 -0800 Message-ID: From: "Feldman, Scott" To: "Patrick R. McManus" , netdev@oss.sgi.com Subject: RE: Intel 1000 MT slow to restart Date: Tue, 1 Apr 2003 20:19:12 -0800 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2144 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev Content-Length: 1015 Lines: 23 > I'm running intel's e1000 driver (versions 4.4.12 and tried > 4.6.11) for a 1000/MT (dual) nic on a 2.4.19 kernel. > > for normal operations, everything is fine.. however if I do a > "ifconfig eth0 down; ifconfig eth0 up" 20 or 30 seconds > passes where I can't do any traffic. the ifconfig up comes > back quickly, and ifconfig reports the driver as up (and > netlink thinks its up if I try and add another one).. I just > can't move any traffic. no rx's and my tx's only move > counters in the driver - they don't actually make it to the wire. > > if I do "ifconfig eth0 down; sleep 30; ifconfig eth0 up" all > is well immediately after the up.. The driver doesn't seem to > be doing anything different in either case - its as if the > NIC itself is enforcing some kind of quiet period. > > I'm really writing to see if I'm crazy and hoping someone > else can corroborate this is what they've seen too. Do you have spanning tree turned on on your switch? This could cause such delays. -scott From yoshfuji@linux-ipv6.org Tue Apr 1 20:20:25 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 01 Apr 2003 20:20:30 -0800 (PST) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h324KOrX012246 for ; Tue, 1 Apr 2003 20:20:25 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h324KYDG015547; Wed, 2 Apr 2003 13:20:34 +0900 Date: Wed, 02 Apr 2003 13:20:34 +0900 (JST) Message-Id: <20030402.132034.126030996.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: toml@us.ibm.com, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030401.200225.88014087.davem@redhat.com> References: <20030401.193429.64279267.davem@redhat.com> <20030402.130232.78951283.yoshfuji@linux-ipv6.org> <20030401.200225.88014087.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2146 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 537 Lines: 14 In article <20030401.200225.88014087.davem@redhat.com> (at Tue, 01 Apr 2003 20:02:25 -0800 (PST)), "David S. Miller" says: > I just checked, nobody cares about the 8 bytes in enc_data. > > Therefore, I think you're idea of enc_data[0] is the best. > > Someone please double check my claims and submit a patch. :-) Okay, I'll check it (and make a patch) in this afternoon (in a few hours). -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From shmulik.hen@intel.com Wed Apr 2 04:54:07 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 04:54:12 -0800 (PST) Received: from hermes.iil.intel.com (hermes.iil.intel.com [192.198.152.99]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32Cs4rX031205 for ; Wed, 2 Apr 2003 04:54:06 -0800 Received: from petasus.iil.intel.com (petasus.iil.intel.com [143.185.77.3]) by hermes.iil.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h32CnrA17644 for ; Wed, 2 Apr 2003 12:49:53 GMT Received: from hasmsxvs01.iil.intel.com (hasmsxvs01.iil.intel.com [143.185.63.58]) by petasus.iil.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h32Cuek10294 for ; Wed, 2 Apr 2003 12:56:40 GMT Received: from hasmsx17.iil.intel.com ([143.185.63.203]) by hasmsxvs01.iil.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040215591201636 ; Wed, 02 Apr 2003 15:59:12 +0300 Received: by hasmsx17.iil.intel.com with Internet Mail Service (5.5.2653.19) id ; Wed, 2 Apr 2003 15:53:57 +0300 Message-ID: From: "Hen, Shmulik" To: "Feldman, Scott" , "Patrick R. McManus" , netdev@oss.sgi.com Subject: RE: Intel 1000 MT slow to restart Date: Wed, 2 Apr 2003 15:53:52 +0300 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2147 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shmulik.hen@intel.com Precedence: bulk X-list: netdev Content-Length: 1488 Lines: 40 > -----Original Message----- > From: Feldman, Scott > Sent: Wednesday, April 02, 2003 7:19 AM > To: Patrick R. McManus; netdev@oss.sgi.com > Subject: RE: Intel 1000 MT slow to restart > > > > I'm running intel's e1000 driver (versions 4.4.12 and tried > > 4.6.11) for a 1000/MT (dual) nic on a 2.4.19 kernel. > > > > for normal operations, everything is fine.. however if I do a > > "ifconfig eth0 down; ifconfig eth0 up" 20 or 30 seconds > > passes where I can't do any traffic. the ifconfig up comes > > back quickly, and ifconfig reports the driver as up (and > > netlink thinks its up if I try and add another one).. I just > > can't move any traffic. no rx's and my tx's only move > > counters in the driver - they don't actually make it to the wire. > > > > if I do "ifconfig eth0 down; sleep 30; ifconfig eth0 up" all > > is well immediately after the up.. The driver doesn't seem to > > be doing anything different in either case - its as if the > > NIC itself is enforcing some kind of quiet period. > > > > I'm really writing to see if I'm crazy and hoping someone > > else can corroborate this is what they've seen too. > > Do you have spanning tree turned on on your switch? This could cause > such delays. > > -scott > We've also seen this behavior with certain switches (e.g. Extreme Networks Summit 7i) even with STP turned off. The switch simply delays traffic for ~30sec after link was restored. I believe this delay is configurable. Shmulik. From rask@sygehus.dk Wed Apr 2 05:01:52 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 05:01:56 -0800 (PST) Received: from cicero0.cybercity.dk (cicero0.cybercity.dk [212.242.40.52]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32D1orX031703 for ; Wed, 2 Apr 2003 05:01:52 -0800 Received: from user4.cybercity.dk (fxp0.user4.ip.cybercity.dk [212.242.41.50]) by cicero0.cybercity.dk (Postfix) with ESMTP id 897E4102B26; Wed, 2 Apr 2003 15:01:49 +0200 (CEST) Received: from webmail.cybercity.dk (webmail.cybercity.dk [212.242.40.37]) by user4.cybercity.dk (Postfix) with SMTP id 0AAB155C4; Wed, 2 Apr 2003 15:01:49 +0200 (CEST) Reply-To: rask@sygehus.dk From: rask@sygehus.dk (Rask Ingemann Lambertsen) To: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Is a driver allowed to modify dev->flags? Date: Wed, 2 Apr 2003 15:01:49 +0200 Message-Id: <3e8adf3d2fe3c6.82986008@not right> References: <3e89c32348ce76.94538914@not right> X-Authenticated-IP: [152.95.52.86] X-Sender: ccc94453@vip.cybercity.dk X-Mailer: Cybercity Webmail 1.06 (http://webmail.cybercity.dk/) MIME-version: 1.0 Content-type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2148 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rask@sygehus.dk Precedence: bulk X-list: netdev Content-Length: 368 Lines: 14 I wrote: > Is a network device driver allowed to modify dev->flags? For example: > > if (dev->flags & IFF_ALLMULTI) > dev->flags |= IFF_PROMISC; Maybe the right question is: Is it necessary for the driver to set the IFF_PROMISC flag if the device enters promiscuous mode because it doesn't support all-multicast mode? Regards, Rask Ingemann Lambertsen From rask@sygehus.dk Wed Apr 2 05:51:02 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 05:51:09 -0800 (PST) Received: from cicero0.cybercity.dk (cicero0.cybercity.dk [212.242.40.52]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32DoorX004328 for ; Wed, 2 Apr 2003 05:50:51 -0800 Received: from user3.cybercity.dk (fxp0.user3.ip.cybercity.dk [212.242.41.36]) by cicero0.cybercity.dk (Postfix) with ESMTP id 2B9DC102A20; Wed, 2 Apr 2003 15:09:15 +0200 (CEST) Received: from webmail.cybercity.dk (webmail.cybercity.dk [212.242.40.37]) by user3.cybercity.dk (Postfix) with SMTP id B718D332; Wed, 2 Apr 2003 15:09:14 +0200 (CEST) Reply-To: rask@sygehus.dk From: rask@sygehus.dk (Rask Ingemann Lambertsen) To: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Must dev->set_multicast_list() complete before returning? Date: Wed, 2 Apr 2003 15:09:14 +0200 Message-Id: <3e8ae0facf3cc3.47481623@not right> References: X-Authenticated-IP: [152.95.52.86] X-Sender: ccc94453@vip.cybercity.dk X-Mailer: Cybercity Webmail 1.06 (http://webmail.cybercity.dk/) MIME-version: 1.0 Content-type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2149 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rask@sygehus.dk Precedence: bulk X-list: netdev Content-Length: 493 Lines: 16 Donald Becker wrote: > The promiscuous setting must complete before return, but there are > several drivers where the updated multicast filter does not immediately > take effect. > > I have not seen hardware where setting promiscuous mode is a queued > command. Intel i82586, i82596 and, as far as I can tell from other drivers, several other Intel i825xx Ethernet chips. IIRC, the function must not sleep. That means busy-wait for it to complete. :-( Regards, Rask Ingemann Lambertsen From toml@us.ibm.com Wed Apr 2 07:01:53 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 07:02:29 -0800 (PST) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32F1krX008727 for ; Wed, 2 Apr 2003 07:01:53 -0800 Received: from northrelay03.pok.ibm.com (northrelay03.pok.ibm.com [9.56.224.151]) by e3.ny.us.ibm.com (8.12.9/8.12.2) with ESMTP id h32F0E9k135280; Wed, 2 Apr 2003 10:00:14 -0500 Received: from d01ml072.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by northrelay03.pok.ibm.com (8.12.8/NCO/VER6.5) with ESMTP id h32F057J062192; Wed, 2 Apr 2003 10:00:11 -0500 Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II To: YOSHIFUJI Hideaki Cc: davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, "Hideaki YOSHIFUJI" X-Mailer: Lotus Notes Release 5.0.11 July 24, 2002 Message-ID: From: "Tom Lendacky" Date: Wed, 2 Apr 2003 09:00:03 -0600 X-MIMETrack: Serialize by Router on D01ML072/01/M/IBM(Release 5.0.11 +SPRs MIAS5EXFG4, MIAS5AUFPV and DHAG4Y6R7W, MATTEST |November 8th, 2002) at 04/02/2003 10:00:12 AM MIME-Version: 1.0 Content-type: text/plain; charset=us-ascii X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2150 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: toml@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 271 Lines: 11 I just noticed the use of the AH_HLEN_NOICV #define which is hardcoded to be 12. The patch should probably take the change to the esp header and apply it to the auth header also (as shown in an earlier post) and then eliminate the hardcoding of the 12. Thanks, Tom From david-b@pacbell.net Wed Apr 2 08:06:26 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 08:07:04 -0800 (PST) Received: from mta6.snfc21.pbi.net (mta6.snfc21.pbi.net [206.13.28.240]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32G6QrX013095 for ; Wed, 2 Apr 2003 08:06:26 -0800 Received: from pacbell.net ([67.118.247.200]) by mta6.snfc21.pbi.net (iPlanet Messaging Server 5.1 HotFix 1.6 (built Oct 18 2002)) with ESMTP id <0HCQ00KF14QOTV@mta6.snfc21.pbi.net> for netdev@oss.sgi.com; Wed, 02 Apr 2003 08:06:26 -0800 (PST) Date: Wed, 02 Apr 2003 08:18:11 -0800 From: David Brownell Subject: Re: Must dev->set_multicast_list() complete before returning? To: Donald Becker Cc: Rask Ingemann Lambertsen , linux-net@vger.kernel.org, netdev@oss.sgi.com Message-id: <3E8B0D43.2000003@pacbell.net> MIME-version: 1.0 Content-type: text/plain; format=flowed; charset=us-ascii Content-transfer-encoding: 7bit X-Accept-Language: en-us, en, fr User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9) Gecko/20020513 References: X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2151 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: david-b@pacbell.net Precedence: bulk X-list: netdev Content-Length: 482 Lines: 20 Donald Becker wrote: > > I have not seen hardware where setting promiscuous mode is a queued > command. If you have such hardware, you may have to do some extra > software filtering and accept missing some packets during transitions. Every USB network adapter will need to queue such commands, unless they don't support such operations at all. So you have probably seen such hardware, without realizing it! I just looked ... none of them do any extra filtering. - Dave From gandalf@wlug.westbo.se Wed Apr 2 09:23:21 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 09:23:29 -0800 (PST) Received: from tux.rsn.bth.se (postfix@tux.rsn.bth.se [194.47.143.135]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32HNIrX018415 for ; Wed, 2 Apr 2003 09:23:20 -0800 Received: by tux.rsn.bth.se (Postfix, from userid 501) id C410E36FCD; Wed, 2 Apr 2003 19:23:14 +0200 (CEST) Subject: Re: loopback behaviour under high load ... From: Martin Josefsson To: Davide Libenzi Cc: Linux Kernel Mailing List , netdev@oss.sgi.com In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit Organization: Message-Id: <1049304194.25168.56.camel@tux.rsn.bth.se> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.3 Date: 02 Apr 2003 19:23:14 +0200 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2152 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gandalf@wlug.westbo.se Precedence: bulk X-list: netdev Content-Length: 11251 Lines: 116 On Wed, 2003-04-02 at 18:23, Davide Libenzi wrote: > On Tue, 1 Apr 2003, Davide Libenzi wrote: > > > And netstat shows Recv-Q=0 for the server socket, and Send-Q=N for the > > client socket. This has been tested on 2.5.66 vanilla. > > An update on this. Kernel 2.4.20+epoll does not have this problem. I see something similar with 2.5.64-bk10 (seen with earlier 2.5 kernels as well). I use distcc on my machine which is running 2.5.64-bk10 and using two remote servers running 2.4.20 to do the compiling. Sometimes I see a ~120s stall in the middle of a connection with Recv-Q=0 on the server (2.4.20) and Send-Q=N on the client (2.5.64-bk10) (it's the client that's sending data to the server) x.x.x.x = client y.y.y.y = server As you can see there's a long delay between 16:02:09 and 16:04:24 There's some packetloss here (probably a congested interface in the router on the way). The dump was made on the client. I've included a lot of the dump to give some context. It appears the 111073:112497(1424) packet at 16:02:09.597800 going to the server was dropped and the server continues acking the previous packet. It takes a very long time until the client resends the missing packet and it appears it's been dropped once again. Then no packets are sent in either direction until the missing packet is retransmitted after a 120s timeout and the connection continues. (I hope there isn't any missing packets in this dump, libpcap without mmap dropped a lot but with mmap support it said it didn't drop a single packet) [snip] 16:02:09.445650 x.x.x.x.57798 > y.y.y.y.3632: . 95409:96833(1424) ack 1 win 730 (DF) 16:02:09.445665 x.x.x.x.57798 > y.y.y.y.3632: P 96833:98257(1424) ack 1 win 730 (DF) 16:02:09.445683 x.x.x.x.57798 > y.y.y.y.3632: . 98257:99681(1424) ack 1 win 730 (DF) 16:02:09.445695 x.x.x.x.57798 > y.y.y.y.3632: . 99681:101105(1424) ack 1 win 730 (DF) 16:02:09.451822 y.y.y.y.3632 > x.x.x.x.57798: . ack 84017 win 64080 (DF) 16:02:09.452573 y.y.y.y.3632 > x.x.x.x.57798: . ack 86865 win 64080 (DF) 16:02:09.452740 y.y.y.y.3632 > x.x.x.x.57798: . ack 89713 win 64080 (DF) 16:02:09.452989 y.y.y.y.3632 > x.x.x.x.57798: . ack 92561 win 64080 (DF) 16:02:09.453352 y.y.y.y.3632 > x.x.x.x.57798: . ack 95409 win 64080 (DF) 16:02:09.454195 y.y.y.y.3632 > x.x.x.x.57798: . ack 98257 win 64080 (DF) 16:02:09.454400 y.y.y.y.3632 > x.x.x.x.57798: . ack 101105 win 64080 (DF) 16:02:09.597688 x.x.x.x.57798 > y.y.y.y.3632: P 101105:102529(1424) ack 1 win 730 (DF) 16:02:09.597702 x.x.x.x.57798 > y.y.y.y.3632: . 102529:103953(1424) ack 1 win 730 (DF) 16:02:09.597721 x.x.x.x.57798 > y.y.y.y.3632: . 103953:105377(1424) ack 1 win 730 (DF) 16:02:09.597734 x.x.x.x.57798 > y.y.y.y.3632: P 105377:106801(1424) ack 1 win 730 (DF) 16:02:09.597755 x.x.x.x.57798 > y.y.y.y.3632: . 106801:108225(1424) ack 1 win 730 (DF) 16:02:09.597768 x.x.x.x.57798 > y.y.y.y.3632: . 108225:109649(1424) ack 1 win 730 (DF) 16:02:09.597787 x.x.x.x.57798 > y.y.y.y.3632: . 109649:111073(1424) ack 1 win 730 (DF) 16:02:09.597800 x.x.x.x.57798 > y.y.y.y.3632: . 111073:112497(1424) ack 1 win 730 (DF) 16:02:09.597818 x.x.x.x.57798 > y.y.y.y.3632: P 112497:113921(1424) ack 1 win 730 (DF) 16:02:09.597832 x.x.x.x.57798 > y.y.y.y.3632: . 113921:115345(1424) ack 1 win 730 (DF) 16:02:09.597849 x.x.x.x.57798 > y.y.y.y.3632: . 115345:116769(1424) ack 1 win 730 (DF) 16:02:09.597862 x.x.x.x.57798 > y.y.y.y.3632: P 116769:118193(1424) ack 1 win 730 (DF) 16:02:09.597903 x.x.x.x.57798 > y.y.y.y.3632: . 118193:119617(1424) ack 1 win 730 (DF) 16:02:09.597915 x.x.x.x.57798 > y.y.y.y.3632: . 119617:121041(1424) ack 1 win 730 (DF) 16:02:09.610011 y.y.y.y.3632 > x.x.x.x.57798: . ack 103953 win 64080 (DF) 16:02:09.610486 y.y.y.y.3632 > x.x.x.x.57798: . ack 106801 win 64080 (DF) 16:02:09.610899 y.y.y.y.3632 > x.x.x.x.57798: . ack 109649 win 64080 (DF) 16:02:09.611921 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.611944 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.611963 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.611996 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.703860 x.x.x.x.57798 > y.y.y.y.3632: P 121041:122465(1424) ack 1 win 730 (DF) 16:02:09.703873 x.x.x.x.57798 > y.y.y.y.3632: . 122465:123889(1424) ack 1 win 730 (DF) 16:02:09.703892 x.x.x.x.57798 > y.y.y.y.3632: . 123889:125313(1424) ack 1 win 730 (DF) 16:02:09.703908 x.x.x.x.57798 > y.y.y.y.3632: P 125313:126737(1424) ack 1 win 730 (DF) 16:02:09.703926 x.x.x.x.57798 > y.y.y.y.3632: . 126737:128161(1424) ack 1 win 730 (DF) 16:02:09.703939 x.x.x.x.57798 > y.y.y.y.3632: . 128161:129585(1424) ack 1 win 730 (DF) 16:02:09.705559 x.x.x.x.57798 > y.y.y.y.3632: P 129585:131009(1424) ack 1 win 730 (DF) 16:02:09.705565 x.x.x.x.57798 > y.y.y.y.3632: . 131009:132433(1424) ack 1 win 730 (DF) 16:02:09.705570 x.x.x.x.57798 > y.y.y.y.3632: . 132433:133857(1424) ack 1 win 730 (DF) 16:02:09.705574 x.x.x.x.57798 > y.y.y.y.3632: P 133857:135281(1424) ack 1 win 730 (DF) 16:02:09.705578 x.x.x.x.57798 > y.y.y.y.3632: . 135281:136705(1424) ack 1 win 730 (DF) 16:02:09.714200 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.714499 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.714698 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.714772 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.715358 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.715361 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.715550 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.715552 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.715672 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.715675 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.715677 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.808712 x.x.x.x.57798 > y.y.y.y.3632: . 136705:138129(1424) ack 1 win 730 (DF) 16:02:09.808735 x.x.x.x.57798 > y.y.y.y.3632: P 138129:139548(1419) ack 1 win 730 (DF) 16:02:09.808784 x.x.x.x.57798 > y.y.y.y.3632: . 111073:112497(1424) ack 1 win 730 (DF) 16:02:09.808813 x.x.x.x.57798 > y.y.y.y.3632: P 112497:113921(1424) ack 1 win 730 (DF) 16:02:09.808838 x.x.x.x.57798 > y.y.y.y.3632: . 119617:121041(1424) ack 1 win 730 (DF) 16:02:09.822496 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:02:09.822498 y.y.y.y.3632 > x.x.x.x.57798: . ack 111073 win 64080 (DF) 16:04:24.936079 x.x.x.x.57798 > y.y.y.y.3632: . 111073:112497(1424) ack 1 win 730 (DF) 16:04:24.938582 y.y.y.y.3632 > x.x.x.x.57798: . ack 112497 win 62656 (DF) 16:04:24.939909 x.x.x.x.57798 > y.y.y.y.3632: P 112497:113921(1424) ack 1 win 730 (DF) 16:04:24.939937 x.x.x.x.57798 > y.y.y.y.3632: . 119617:121041(1424) ack 1 win 730 (DF) 16:04:24.942568 y.y.y.y.3632 > x.x.x.x.57798: . ack 119617 win 55536 (DF) 16:04:24.942573 y.y.y.y.3632 > x.x.x.x.57798: . ack 139548 win 46992 (DF) 16:04:25.038755 y.y.y.y.3632 > x.x.x.x.57798: P 1:1166(1165) ack 139548 win 64080 (DF) 16:04:25.038765 y.y.y.y.3632 > x.x.x.x.57798: F 1166:1166(0) ack 139548 win 64080 (DF) 16:04:25.038893 x.x.x.x.57798 > y.y.y.y.3632: . ack 1166 win 1019 (DF) 16:04:25.039286 x.x.x.x.57798 > y.y.y.y.3632: F 139548:139548(0) ack 1167 win 1019 (DF) 16:04:25.041470 y.y.y.y.3632 > x.x.x.x.57798: . ack 139549 win 64080 (DF) -- /Martin From becker@scyld.com Wed Apr 2 11:40:03 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 11:40:12 -0800 (PST) Received: from beohost.scyld.com (dsl093-058-082.blt1.dsl.speakeasy.net [66.93.58.82]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32Je1rX020043 for ; Wed, 2 Apr 2003 11:40:03 -0800 Received: from localhost (becker@localhost) by beohost.scyld.com (8.11.6/8.11.6) with ESMTP id h32JePl14814; Wed, 2 Apr 2003 14:40:25 -0500 Date: Wed, 2 Apr 2003 14:40:24 -0500 (EST) From: Donald Becker To: David Brownell cc: Rask Ingemann Lambertsen , , Subject: Re: Must dev->set_multicast_list() complete before returning? In-Reply-To: <3E8B0D43.2000003@pacbell.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2153 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: becker@scyld.com Precedence: bulk X-list: netdev Content-Length: 1684 Lines: 40 On Wed, 2 Apr 2003, David Brownell wrote: > Donald Becker wrote: > > > > I have not seen hardware where setting promiscuous mode is a queued > > command. If you have such hardware, you may have to do some extra > > software filtering and accept missing some packets during transitions. > > Every USB network adapter will need to queue such commands, > unless they don't support such operations at all. So you > have probably seen such hardware, without realizing it! Errrm, a previous message pointed out to me that there were several other Intel chips that _I had written drivers for_ that queue commands. And yes, I had also forgotten about bridged NICs such as USB (which I've also written drivers for). > I just looked ... none of them do any extra filtering. I've not added extra filtering to any driver USB or otherwise. It may be that there is a problem here that is rarely encountered and never identified as a problem. A filter change from promiscuous to normal mode is at worst a narrow window. The atp.c driver is special because it put the hardware into promiscuous mode for allmulti, and thus any potential problem became a continuous issue. Alan, do you remember what piece of code had a problem with unicast packets to other hosts that would normally be filtered out by the hardware? It may be that issue is gone with 2.4 and later kernels. (Multicast is not an issue because most chips use an imperfect hash filter and thus the kernel has always needed additional filtering.) -- Donald Becker becker@scyld.com Scyld Computing Corporation http://www.scyld.com 410 Severn Ave. Suite 210 Scyld Beowulf cluster system Annapolis MD 21403 410-990-9993 From rddunlap@osdl.org Wed Apr 2 12:27:49 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 12:27:54 -0800 (PST) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32KRmrX023273 for ; Wed, 2 Apr 2003 12:27:49 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h32KRkW28048; Wed, 2 Apr 2003 12:27:46 -0800 Date: Wed, 2 Apr 2003 12:27:55 +0000 From: "Randy.Dunlap" To: linux-net@vger.kernel.org Cc: netdev@oss.sgi.com Subject: snmp stats as %ld or %lu Message-Id: <20030402122755.5dc3f022.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2154 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 182 Lines: 11 Hi, ipv4/proc.c prints SNMP stats using %lu, but ipv6/proc.c prints them using %ld. Is this difference intentional, planned, or an oversight, or something else? Thanks, -- ~Randy From davidel@xmailserver.org Wed Apr 2 14:49:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 14:49:38 -0800 (PST) Received: from x35.xmailserver.org (x35.xmailserver.org [208.129.208.51]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h32MnYDH025532 for ; Wed, 2 Apr 2003 14:49:34 -0800 X-AuthUser: davidel@xmailserver.org Received: from blue1.dev.mcafeelabs.com (161.69.79.199:54284) by xmailserver.org with [XMail 1.14 (Linux/Ix86) ESMTP Server] id for from ; Wed, 02 Apr 2003 15:13:30 -0800 Date: Wed, 2 Apr 2003 14:47:04 -0800 (PST) From: Davide Libenzi X-X-Sender: davide@blue1.dev.mcafeelabs.com To: Martin Josefsson cc: Linux Kernel Mailing List , "" Subject: Re: loopback behaviour under high load ... In-Reply-To: <1049304194.25168.56.camel@tux.rsn.bth.se> Message-ID: References: <1049304194.25168.56.camel@tux.rsn.bth.se> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2155 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davidel@xmailserver.org Precedence: bulk X-list: netdev Content-Length: 1529 Lines: 46 On Wed, 2 Apr 2003, Martin Josefsson wrote: > On Wed, 2003-04-02 at 18:23, Davide Libenzi wrote: > > On Tue, 1 Apr 2003, Davide Libenzi wrote: > > > > > And netstat shows Recv-Q=0 for the server socket, and Send-Q=N for the > > > client socket. This has been tested on 2.5.66 vanilla. > > > > An update on this. Kernel 2.4.20+epoll does not have this problem. > > I see something similar with 2.5.64-bk10 (seen with earlier 2.5 kernels > as well). > > I use distcc on my machine which is running 2.5.64-bk10 and using two > remote servers running 2.4.20 to do the compiling. > > Sometimes I see a ~120s stall in the middle of a connection with > Recv-Q=0 on the server (2.4.20) and Send-Q=N on the client (2.5.64-bk10) > (it's the client that's sending data to the server) > > x.x.x.x = client > y.y.y.y = server > > As you can see there's a long delay between 16:02:09 and 16:04:24 > > There's some packetloss here (probably a congested interface in the > router on the way). The dump was made on the client. Hmm, we don't see any dropped packet at interface ( loopback ) level here: $ cat /proc/net/softnet_stat 002a0c14 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 $ ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1349417 errors:0 dropped:0 overruns:0 frame:0 TX packets:1349417 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 - Davide From fubar@us.ibm.com Wed Apr 2 17:02:48 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 17:02:57 -0800 (PST) Received: from e4.ny.us.ibm.com (e4.ny.us.ibm.com [32.97.182.104]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h3312fDH026781 for ; Wed, 2 Apr 2003 17:02:47 -0800 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e4.ny.us.ibm.com (8.12.9/8.12.2) with ESMTP id h3312XdA138990; Wed, 2 Apr 2003 20:02:33 -0500 Received: from death.ibm.com (lig32-226-144-94.us.lig-dial.ibm.com [32.226.144.94]) by northrelay04.pok.ibm.com (8.12.8/NCO/VER6.5) with ESMTP id h3312TeR156884; Wed, 2 Apr 2003 20:02:30 -0500 Received: from us.ibm.com (fubar@localhost) by death.ibm.com (8.12.5/8.12.5/Submit) with ESMTP id h33113tc015107; Wed, 2 Apr 2003 17:01:04 -0800 Message-Id: <200304030101.h33113tc015107@death.ibm.com> X-Authentication-Warning: death.ibm.com: fubar owned process doing -bs To: "Hen, Shmulik" , "Marom, Noam" , "Feldman, Scott" cc: bonding-devel@lists.sourceforge.net, netdev@oss.sgi.com Subject: RE: [Bonding-devel] [patch] (2/8) Add 802.3ad support to bonding Date: Wed, 02 Apr 2003 17:01:03 -0800 From: Jay Vosburgh X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2156 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fubar@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 1848 Lines: 41 I've been trying various things with the 802.3ad patch, and am seeing a behavior that seems erroneous, but it could be that I'm missing something (in the standard, for example) that explains it. I have two systems, connected via an 802.3ad capable switch. System A has 4 10/100 ethernets connected to the switch, which are all ifenslaved into a single 802.3ad mode bond (with miimon=100). System B has a single 10/100 connected to the switch. As a traffic generator, I telnet from System A to System B's chargen service, and let it run. I see activity on two of the bond's four links (which is expected, one for incoming, one for outgoing). If I unplug either of the active cables from the switch, bonding notices immediately and transfers the connection to a different interface. If, however, I use "ifenslave -d bond0 ethX" (where ethX is one of the active interfaces, by which I mean one with traffic flowing over it), it takes a considerable amount of real time for bonding to recover and transfer the connection to a new interface. It appears that the deleted interface must be either the transmitting or receiving interface (I'm not sure which), as sometimes it recovers immediately. Removing an idle interface from the bond does not appear to cause any stalls. Also, curiously, if I "ifenslave bond0 ethX" where ethX is an already enslaved interface, I get an EBUSY error printed by ifenslave, but the data transmission stalls for a period of time. Presumably this is due to some of the prepatory work done by ifenslave, but I have not yet investigated precisely what it is. Ifenslave also seems to leave the interface in a down state, which may be the cause of the stall (if the interface is removed from the bond because it's down). Any thoughts? -J --- -Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com From yoshfuji@linux-ipv6.org Wed Apr 2 20:51:03 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 02 Apr 2003 20:51:14 -0800 (PST) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h334p1DH032168 for ; Wed, 2 Apr 2003 20:51:03 -0800 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h334p4DG024058; Thu, 3 Apr 2003 13:51:07 +0900 Date: Thu, 03 Apr 2003 13:51:04 +0900 (JST) Message-Id: <20030403.135104.748509693.yoshfuji@linux-ipv6.org> To: toml@us.ibm.com, davem@redhat.com, kuznet@ms2.inr.ac.ru Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: References: Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on XEmacs 21.4.6 (Common Lisp) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2157 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 9793 Lines: 269 In article (at Wed, 2 Apr 2003 09:00:03 -0600), "Tom Lendacky" says: > > I just noticed the use of the AH_HLEN_NOICV #define which is hardcoded to > be 12. The patch should probably take the change to the esp header and > apply it to the auth header also (as shown in an earlier post) and then > eliminate the hardcoding of the 12. Agreed. Here's the patch against linux-2.5.66 + ChangeSet 1.1004. Thanks. Index: include/linux/ip.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/linux/ip.h,v retrieving revision 1.1.1.4 retrieving revision 1.1.1.4.14.1 diff -u -r1.1.1.4 -r1.1.1.4.14.1 --- include/linux/ip.h 22 Mar 2003 01:52:35 -0000 1.1.1.4 +++ include/linux/ip.h 2 Apr 2003 10:17:41 -0000 1.1.1.4.14.1 @@ -188,13 +188,13 @@ __u16 reserved; __u32 spi; __u32 seq_no; /* Sequence number */ - __u8 auth_data[4]; /* Variable len but >=4. Mind the 64 bit alignment! */ + __u8 auth_data[0]; /* Variable len but >=4. Mind the 64 bit alignment! */ }; struct ip_esp_hdr { __u32 spi; __u32 seq_no; /* Sequence number */ - __u8 enc_data[8]; /* Variable len but >=8. Mind the 64 bit alignment! */ + __u8 enc_data[0]; /* Variable len but >=8. Mind the 64 bit alignment! */ }; #endif /* _LINUX_IP_H */ Index: include/linux/ipv6.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/linux/ipv6.h,v retrieving revision 1.1.1.4 retrieving revision 1.1.1.4.14.1 diff -u -r1.1.1.4 -r1.1.1.4.14.1 --- include/linux/ipv6.h 22 Mar 2003 01:52:37 -0000 1.1.1.4 +++ include/linux/ipv6.h 2 Apr 2003 10:17:41 -0000 1.1.1.4.14.1 @@ -80,13 +80,13 @@ __u16 reserved; __u32 spi; __u32 seq_no; /* Sequence number */ - __u8 auth_data[4]; /* Length variable but >=4. Mind the 64 bit alignment! */ + __u8 auth_data[0]; /* Length variable but >=4. Mind the 64 bit alignment! */ }; struct ipv6_esp_hdr { __u32 spi; __u32 seq_no; /* Sequence number */ - __u8 enc_data[8]; /* Length variable but >=8. Mind the 64 bit alignment! */ + __u8 enc_data[0]; /* Length variable but >=8. Mind the 64 bit alignment! */ }; /* Index: net/ipv4/ah.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv4/ah.c,v retrieving revision 1.1.1.10 retrieving revision 1.1.1.10.2.1 diff -u -r1.1.1.10 -r1.1.1.10.2.1 --- net/ipv4/ah.c 2 Apr 2003 07:25:57 -0000 1.1.1.10 +++ net/ipv4/ah.c 3 Apr 2003 01:40:12 -0000 1.1.1.10.2.1 @@ -9,8 +9,6 @@ #include -#define AH_HLEN_NOICV 12 - /* Clear mutable options and find final destination to substitute * into IP header for icv calculation. Options are already checked * for validity, so paranoia is not required. */ @@ -116,8 +114,8 @@ ah->nexthdr = iph->protocol; } ahp = x->data; - ah->hdrlen = (XFRM_ALIGN8(ahp->icv_trunc_len + - AH_HLEN_NOICV) >> 2) - 2; + ah->hdrlen = (XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + + ahp->icv_trunc_len) >> 2) - 2; ah->reserved = 0; ah->spi = x->id.spi; @@ -169,8 +167,8 @@ ahp = x->data; ah_hlen = (ah->hdrlen + 2) << 2; - if (ah_hlen != XFRM_ALIGN8(ahp->icv_full_len + AH_HLEN_NOICV) && - ah_hlen != XFRM_ALIGN8(ahp->icv_trunc_len + AH_HLEN_NOICV)) + if (ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_full_len) && + ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len)) goto out; if (!pskb_may_pull(skb, ah_hlen)) @@ -286,7 +284,7 @@ if (!ahp->work_icv) goto error; - x->props.header_len = XFRM_ALIGN8(ahp->icv_trunc_len + AH_HLEN_NOICV); + x->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len); if (x->props.mode) x->props.header_len += sizeof(struct iphdr); x->data = ahp; Index: net/ipv4/esp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv4/esp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.2.1 diff -u -r1.1.1.9 -r1.1.1.9.2.1 --- net/ipv4/esp.c 2 Apr 2003 07:25:57 -0000 1.1.1.9 +++ net/ipv4/esp.c 2 Apr 2003 10:17:41 -0000 1.1.1.9.2.1 @@ -134,7 +134,7 @@ if (esp->auth.icv_full_len) { esp->auth.icv(esp, skb, (u8*)esph-skb->data, - 8+esp->conf.ivlen+clen, trailer->tail); + sizeof(struct ip_esp_hdr) + esp->conf.ivlen+clen, trailer->tail); pskb_put(skb, trailer, alen); } @@ -171,7 +171,7 @@ struct sk_buff *trailer; int blksize = crypto_tfm_alg_blocksize(esp->conf.tfm); int alen = esp->auth.icv_trunc_len; - int elen = skb->len - 8 - esp->conf.ivlen - alen; + int elen = skb->len - sizeof(struct ip_esp_hdr) - esp->conf.ivlen - alen; int nfrags; if (!pskb_may_pull(skb, sizeof(struct ip_esp_hdr))) @@ -220,7 +220,7 @@ if (!sg) goto out; } - skb_to_sgvec(skb, sg, 8+esp->conf.ivlen, elen); + skb_to_sgvec(skb, sg, sizeof(struct ip_esp_hdr) + esp->conf.ivlen, elen); crypto_cipher_decrypt(esp->conf.tfm, sg, sg, elen); if (unlikely(sg != sgbuf)) kfree(sg); @@ -237,8 +237,8 @@ iph->protocol = nexthdr[1]; pskb_trim(skb, skb->len - alen - padlen - 2); memcpy(workbuf, skb->nh.raw, iph->ihl*4); - skb->h.raw = skb_pull(skb, 8 + esp->conf.ivlen); - skb->nh.raw += 8 + esp->conf.ivlen; + skb->h.raw = skb_pull(skb, sizeof(struct ip_esp_hdr) + esp->conf.ivlen); + skb->nh.raw += sizeof(struct ip_esp_hdr) + esp->conf.ivlen; memcpy(skb->nh.raw, workbuf, iph->ihl*4); skb->nh.iph->tot_len = htons(skb->len); } @@ -365,7 +365,7 @@ get_random_bytes(esp->conf.ivec, esp->conf.ivlen); } crypto_cipher_setkey(esp->conf.tfm, esp->conf.key, esp->conf.key_len); - x->props.header_len = 8 + esp->conf.ivlen; + x->props.header_len = sizeof(struct ip_esp_hdr) + esp->conf.ivlen; if (x->props.mode) x->props.header_len += sizeof(struct iphdr); x->data = esp; Index: net/ipv6/ah6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ah6.c,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.2.1 diff -u -r1.1.1.5 -r1.1.1.5.2.1 --- net/ipv6/ah6.c 2 Apr 2003 07:25:59 -0000 1.1.1.5 +++ net/ipv6/ah6.c 3 Apr 2003 01:40:12 -0000 1.1.1.5.2.1 @@ -36,8 +36,6 @@ #include #include -#define AH_HLEN_NOICV 12 - /* XXX no ipv6 ah specific */ #define NIP6(addr) \ ntohs((addr).s6_addr16[0]),\ @@ -110,8 +108,8 @@ skb->nh.ipv6h->hop_limit = 0; ahp = x->data; - ah->hdrlen = (XFRM_ALIGN8(ahp->icv_trunc_len + - AH_HLEN_NOICV) >> 2) - 2; + ah->hdrlen = (XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + + ahp->icv_trunc_len) >> 2) - 2; ah->reserved = 0; ah->spi = x->id.spi; @@ -165,8 +163,8 @@ ahp = x->data; ah_hlen = (ah->hdrlen + 2) << 2; - if (ah_hlen != XFRM_ALIGN8(ahp->icv_full_len + AH_HLEN_NOICV) && - ah_hlen != XFRM_ALIGN8(ahp->icv_trunc_len + AH_HLEN_NOICV)) + if (ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_full_len) && + ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len)) goto out; if (!pskb_may_pull(skb, ah_hlen)) @@ -285,7 +283,7 @@ if (!ahp->work_icv) goto error; - x->props.header_len = XFRM_ALIGN8(ahp->icv_trunc_len + AH_HLEN_NOICV); + x->props.header_len = XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len); if (x->props.mode) x->props.header_len += sizeof(struct ipv6hdr); x->data = ahp; Index: net/ipv6/esp6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/esp6.c,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.2.1 diff -u -r1.1.1.5 -r1.1.1.5.2.1 --- net/ipv6/esp6.c 2 Apr 2003 07:25:59 -0000 1.1.1.5 +++ net/ipv6/esp6.c 2 Apr 2003 10:17:41 -0000 1.1.1.5.2.1 @@ -232,7 +232,7 @@ if (esp->auth.icv_full_len) { esp->auth.icv(esp, skb, (u8*)esph-skb->data, - 8+esp->conf.ivlen+clen, trailer->tail); + sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen+clen, trailer->tail); pskb_put(skb, trailer, alen); } @@ -262,7 +262,7 @@ struct sk_buff *trailer; int blksize = crypto_tfm_alg_blocksize(esp->conf.tfm); int alen = esp->auth.icv_trunc_len; - int elen = skb->len - 8 - esp->conf.ivlen - alen; + int elen = skb->len - sizeof(struct ipv6_esp_hdr) - esp->conf.ivlen - alen; int hdr_len = skb->h.raw - skb->nh.raw; int nfrags; @@ -319,7 +319,7 @@ if (!sg) goto out; } - skb_to_sgvec(skb, sg, 8+esp->conf.ivlen, elen); + skb_to_sgvec(skb, sg, sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen, elen); crypto_cipher_decrypt(esp->conf.tfm, sg, sg, elen); if (unlikely(sg != sgbuf)) kfree(sg); @@ -338,8 +338,8 @@ ret_nexthdr = ((struct ipv6hdr*)tmp_hdr)->nexthdr = nexthdr[1]; pskb_trim(skb, skb->len - alen - padlen - 2); - skb->h.raw = skb_pull(skb, 8 + esp->conf.ivlen); - skb->nh.raw += 8 + esp->conf.ivlen; + skb->h.raw = skb_pull(skb, sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen); + skb->nh.raw += sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen; memcpy(skb->nh.raw, tmp_hdr, hdr_len); } kfree(tmp_hdr); @@ -466,7 +466,7 @@ get_random_bytes(esp->conf.ivec, esp->conf.ivlen); } crypto_cipher_setkey(esp->conf.tfm, esp->conf.key, esp->conf.key_len); - x->props.header_len = 8 + esp->conf.ivlen; + x->props.header_len = sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen; if (x->props.mode) x->props.header_len += sizeof(struct ipv6hdr); x->data = esp; -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Thu Apr 3 04:25:30 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 04:25:39 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33CPTDH009865 for ; Thu, 3 Apr 2003 04:25:30 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id EAA31426; Thu, 3 Apr 2003 04:20:09 -0800 Date: Thu, 03 Apr 2003 04:20:09 -0800 (PST) Message-Id: <20030403.042009.28704472.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: toml@us.ibm.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com Subject: Re: [PATCH] IPSec: Use of "sizeof" for header sizes, part II From: "David S. Miller" In-Reply-To: <20030403.135104.748509693.yoshfuji@linux-ipv6.org> References: <20030403.135104.748509693.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2158 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 676 Lines: 15 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Thu, 03 Apr 2003 13:51:04 +0900 (JST) In article (at Wed, 2 Apr 2003 09:00:03 -0600), "Tom Lendacky" says: > > I just noticed the use of the AH_HLEN_NOICV #define which is hardcoded to > be 12. The patch should probably take the change to the esp header and > apply it to the auth header also (as shown in an earlier post) and then > eliminate the hardcoding of the 12. Agreed. Here's the patch against linux-2.5.66 + ChangeSet 1.1004. Thanks. Patch applied, thank you. From davem@redhat.com Thu Apr 3 04:53:05 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 04:53:13 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33Cr5DH010322 for ; Thu, 3 Apr 2003 04:53:05 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id EAA31549; Thu, 3 Apr 2003 04:48:22 -0800 Date: Thu, 03 Apr 2003 04:48:22 -0800 (PST) Message-Id: <20030403.044822.00469453.davem@redhat.com> To: rddunlap@osdl.org Cc: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: snmp stats as %ld or %lu From: "David S. Miller" In-Reply-To: <20030402122755.5dc3f022.rddunlap@osdl.org> References: <20030402122755.5dc3f022.rddunlap@osdl.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2159 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 327 Lines: 10 From: "Randy.Dunlap" Date: Wed, 2 Apr 2003 12:27:55 +0000 ipv4/proc.c prints SNMP stats using %lu, but ipv6/proc.c prints them using %ld. Is this difference intentional, planned, or an oversight, or something else? Looks like an oversight to me, both should use the unsigned format. From acme@conectiva.com.br Thu Apr 3 06:34:38 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 06:34:49 -0800 (PST) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33EYZDH011642 for ; Thu, 3 Apr 2003 06:34:37 -0800 Received: from [200.181.171.142] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1915rK-00015V-00; Thu, 03 Apr 2003 11:38:30 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id AEA061966C; Thu, 3 Apr 2003 14:40:04 +0000 (UTC) Date: Thu, 3 Apr 2003 11:40:03 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] linux/net.h: bye bye struct net_proto Message-ID: <20030403144003.GA17155@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2160 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 8298 Lines: 247 Hi David, Please consider pulling from: bk://kernel.bkbits.net/acme/net-2.5 Still the same tree, not yet updated to linus's. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1003, 2003-04-03 11:08:27-03:00, acme@conectiva.com.br o linux/net.h: bye bye struct net_proto struct net_proto is not anymore needed, as the protocols have their init functions marked as __init, not needing explicit calling. include/linux/atm.h | 11 ----------- include/linux/if_pppox.h | 2 -- include/linux/inet.h | 7 +------ include/linux/net.h | 10 ---------- include/net/af_unix.h | 1 - net/atm/common.c | 3 +-- net/atm/pvc.c | 7 +++---- net/atm/svc.c | 7 +++---- net/ipv4/af_inet.c | 2 +- net/unix/af_unix.c | 5 ++--- 10 files changed, 11 insertions(+), 44 deletions(-) diff -Nru a/include/linux/atm.h b/include/linux/atm.h --- a/include/linux/atm.h Thu Apr 3 11:23:28 2003 +++ b/include/linux/atm.h Thu Apr 3 11:23:28 2003 @@ -236,15 +236,4 @@ }; typedef unsigned short atm_backend_t; - -#ifdef __KERNEL__ - -#include /* struct net_proto */ - - -void atmpvc_proto_init(struct net_proto *pro); -void atmsvc_proto_init(struct net_proto *pro); - -#endif /* __KERNEL__ */ - #endif diff -Nru a/include/linux/if_pppox.h b/include/linux/if_pppox.h --- a/include/linux/if_pppox.h Thu Apr 3 11:23:28 2003 +++ b/include/linux/if_pppox.h Thu Apr 3 11:23:28 2003 @@ -158,8 +158,6 @@ extern struct ppp_channel_ops pppoe_chan_ops; -extern int pppox_proto_init(struct net_proto *np); - #endif /* __KERNEL__ */ #endif /* !(__LINUX_IF_PPPOX_H) */ diff -Nru a/include/linux/inet.h b/include/linux/inet.h --- a/include/linux/inet.h Thu Apr 3 11:23:28 2003 +++ b/include/linux/inet.h Thu Apr 3 11:23:28 2003 @@ -43,11 +43,6 @@ #define _LINUX_INET_H #ifdef __KERNEL__ - -#include - -extern void inet_proto_init(struct net_proto *pro); -extern __u32 in_aton(const char *str); - +extern __u32 in_aton(const char *str); #endif #endif /* _LINUX_INET_H */ diff -Nru a/include/linux/net.h b/include/linux/net.h --- a/include/linux/net.h Thu Apr 3 11:23:28 2003 +++ b/include/linux/net.h Thu Apr 3 11:23:28 2003 @@ -136,16 +136,6 @@ short encrypt_net; }; -/** - * struct socket - network interface with the file system - * @name - Protocol name - * @init_func - Bootstrap - */ -struct net_proto { - const char *name; - void (*init_func)(struct net_proto *pro); -}; - extern int sock_wake_async(struct socket *sk, int how, int band); extern int sock_register(struct net_proto_family *fam); extern int sock_unregister(int family); diff -Nru a/include/net/af_unix.h b/include/net/af_unix.h --- a/include/net/af_unix.h Thu Apr 3 11:23:28 2003 +++ b/include/net/af_unix.h Thu Apr 3 11:23:28 2003 @@ -1,6 +1,5 @@ #ifndef __LINUX_NET_AFUNIX_H #define __LINUX_NET_AFUNIX_H -extern void unix_proto_init(struct net_proto *pro); extern void unix_inflight(struct file *fp); extern void unix_notinflight(struct file *fp); typedef struct sock unix_socket; diff -Nru a/net/atm/common.c b/net/atm/common.c --- a/net/atm/common.c Thu Apr 3 11:23:28 2003 +++ b/net/atm/common.c Thu Apr 3 11:23:28 2003 @@ -6,8 +6,7 @@ #include #include #include -#include /* struct socket, struct net_proto, struct - proto_ops */ +#include /* struct socket, struct proto_ops */ #include /* ATM stuff */ #include #include /* CLIP_*ENCAP */ diff -Nru a/net/atm/pvc.c b/net/atm/pvc.c --- a/net/atm/pvc.c Thu Apr 3 11:23:28 2003 +++ b/net/atm/pvc.c Thu Apr 3 11:23:28 2003 @@ -4,8 +4,7 @@ #include -#include /* struct socket, struct net_proto, - struct proto_ops */ +#include /* struct socket, struct proto_ops */ #include /* ATM stuff */ #include /* ATM devices */ #include /* Classical IP over ATM */ @@ -111,8 +110,8 @@ static struct net_proto_family pvc_family_ops = { - .family =PF_ATMPVC, - .create =pvc_create, + .family = PF_ATMPVC, + .create = pvc_create, }; diff -Nru a/net/atm/svc.c b/net/atm/svc.c --- a/net/atm/svc.c Thu Apr 3 11:23:28 2003 +++ b/net/atm/svc.c Thu Apr 3 11:23:28 2003 @@ -4,8 +4,7 @@ #include -#include /* struct socket, struct net_proto, - struct proto_ops */ +#include /* struct socket, struct proto_ops */ #include /* error codes */ #include /* printk */ #include @@ -430,8 +429,8 @@ static struct net_proto_family svc_family_ops = { - .family =PF_ATMSVC, - .create =svc_create, + .family = PF_ATMSVC, + .create = svc_create, }; diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c Thu Apr 3 11:23:28 2003 +++ b/net/ipv4/af_inet.c Thu Apr 3 11:23:28 2003 @@ -1122,7 +1122,7 @@ printk(KERN_INFO "NET4: Linux TCP/IP 1.0 for NET4.0\n"); if (sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)) { - printk(KERN_CRIT "inet_proto_init: panic\n"); + printk(KERN_CRIT "%s: panic\n", __FUNCTION__); return -EINVAL; } diff -Nru a/net/unix/af_unix.c b/net/unix/af_unix.c --- a/net/unix/af_unix.c Thu Apr 3 11:23:28 2003 +++ b/net/unix/af_unix.c Thu Apr 3 11:23:28 2003 @@ -1945,9 +1945,8 @@ struct sk_buff *dummy_skb; printk(banner); - if (sizeof(struct unix_skb_parms) > sizeof(dummy_skb->cb)) - { - printk(KERN_CRIT "unix_proto_init: panic\n"); + if (sizeof(struct unix_skb_parms) > sizeof(dummy_skb->cb)) { + printk(KERN_CRIT "%s: panic\n", __FUNCTION__); return -1; } /* allocate our sock slab cache */ =================================================================== This BitKeeper patch contains the following changesets: 1.1003 ## Wrapped with gzip_uu ## M'XL( .!#C#X ^V:VV[;1A"&K\6G6"0H8*<6M6>2:FTX<0XUTB:&D_2F+83E M6?HZ^Y";K=Y2.C?4< M_9+F1;^CT\3H(KI3MDYCV\]@XCI-8:(W3&/3>_6^EYBB2VUAP(S>8CQ71L^IWK-^^^_/KRVK).3]'%4"4WYI,IT.FI5:39G1H%^;DJAJ,T ML8M,)7ELBOHSR_E;2XHQA8<@#L-"ED1B[I2:!(0H3DR *7ICWX ]"^MCM4Z>+61]CU&@5_4@PZF+K%?J^ MIW!A:92B491,[BOWVL,^\J>F_LZ+;*(+!*.#<986*;P3GJNC*,I1DA9()=,X MS0Q,F, $)TCEJ!@:5+]'IZ,<#AVJ.U,-1AF*DJA X22!4TR3',4JNS5!=:^_$HTG"(5B/0>F-;[Y&D5 KKZC&^5G?/+\O""EMG6SP: M)7HT"4SEG9X*!Y,DNK>'B][UN%L*X0I:JL!1H0P])AVJ?"V;0[G>8@4+(QR[ MQ"N9ZWJ[BYL%, H'X_$X?:*/E]AA I?ZI'$(9!SQ&Y)Z1 V.K@2,E M81XA)7>DC_V0:N(IE_ETI\#-[2T*DXP)=RWA0\[H'= MG<1$XSM>G51]C:SXR"U! &&E(TD@A?2HS[C&>EVR:C:WE TX#-2E0$.QK_82E M_ZH)AA85Q&O*/(A* UZ/Z^:^C.V[C%M?H]%H>AX8/U*)G68W?WS[M+\V6R:$ M.)@3P T67]?A-6U."]KH ;8Y;+.J:"-LCV%H0QR1!-$FX&H_[0W;'G6/%8"G MXO-D4N1V$B6WRH:#-]CCE$-A0"!#4L&D6^/%]\6+H*X\X#7':U9 ;L:K/J,V M:'&)I'4I""*6N2],EH"P":-@?Z"*-#F"Z.2@9J@R] (\,UV/];@M12#-H!! M4&JZ5COC[6"U:\PMR)CY^2C5DV*2VSH.[20;V8FZF]IQ-%K3H#/L4H(](DK, M7"IF>4NT6#T/Q=G"ZEEM=:Q@M>K^-D1Y4)%=$@Q??KGZ_.(%1G1E5&!@%N8/9BY,E=//]T-UC7VH+NWD3NX)@XAW8_0[LSG;X MUK";_]_LG,\ZBI+@]>O_F M^L/@XOKR,WKV0]Y'8Y5$^L_DV0FH?OOEP\7GRX\?!H.';OKIIO]N'+:Y[]#$ M8=,-AT<.J2>=68L#3=J>'%+490<.YQS.[MTT<+@<@58<0A^*&'#H"5SEPBA$ M1WGTMTG#HX?3KVP/\EM_,%99G!^C,_0P'TSB>%K-=,^T?WR,_FE!\;=_QM!# 6HV_S27P:>H'O0D-C_0O4A,_X^2$ From shmulik.hen@intel.com Thu Apr 3 06:38:50 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 06:39:00 -0800 (PST) Received: from hermes.jf.intel.com (fmr05.intel.com [134.134.136.6]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33EclDH012001 for ; Thu, 3 Apr 2003 06:38:50 -0800 Received: from talaria.jf.intel.com (talaria.jf.intel.com [10.7.209.7]) by hermes.jf.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h33Eaiq16148 for ; Thu, 3 Apr 2003 14:36:44 GMT Received: from orsmsxvs040.jf.intel.com (orsmsxvs040.jf.intel.com [192.168.65.206]) by talaria.jf.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h33EDDL16174 for ; Thu, 3 Apr 2003 14:13:13 GMT Received: from jrslxjul4.npdj.intel.com ([10.12.254.188]) by orsmsxvs040.jf.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040306471029365 ; Thu, 03 Apr 2003 06:47:12 -0800 Date: Thu, 3 Apr 2003 17:38:37 +0300 (IDT) From: shmulik.hen@intel.com X-X-Sender: hshmulik@jrslxjul4.npdj.intel.com Reply-To: shmulik.hen@intel.com To: bond-devel , bond-announce , linux-netdev , linux-net cc: Jeff Garzik , "David S. Miller" Subject: [bonding][patch] Change locking scheme Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2161 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shmulik.hen@intel.com Precedence: bulk X-list: netdev Content-Length: 28437 Lines: 928 This patch replaces the use of lock_irqsave/unlock_irqrestore in bonding with lock/unlock or lock_bh/unlock_bh as appropriate according to context. This change is based on last week's discussion regarding the fact that holding a lock_irqsave doesn't prevent softirqs from running which can cause deadlocks in certain situations. This version has undergone rigorous testing by our QA lab for the past week or so, and so far problems were detected. It was tested in all supported modes with heavy outgoing and incoming traffic stress using various protocols, while performing continuous configuration changes, link disconnections, getting/setting bond's parameters periodically with ifconfig and polling status via proc file system. Performance data is available yet. There is also a change to the versioning scheme as follows: The driver version will be a number instead of the release date since this info is repeated in another field. The version number has 3 fields. X - Major version - big behavior changes Y - Minor version - addition of features Z - Extra version - minor changes and bug fixes The current version (1.0.6) is based on turning to 1.0.0 on 1/1/03 plus 6 bug fixes. Patch is against latest bonding drop from source forge (2.4.20-20030320). diff -Nuarp linux-2.4.20-bonding-20030320/drivers/net/bonding.c linux-2.4.20-bonding-20030320-devel/drivers/net/bonding.c --- linux-2.4.20-bonding-20030320/drivers/net/bonding.c 2003-04-01 17:38:31.000000000 +0300 +++ linux-2.4.20-bonding-20030320-devel/drivers/net/bonding.c 2003-04-01 17:38:31.000000000 +0300 @@ -278,7 +278,7 @@ * bonding round-robin mode ignoring links after failover/recovery * * 2003/03/17 - Jay Vosburgh - * - kmalloc fix (GPF_KERNEL to GPF_ATOMIC) reported by + * - kmalloc fix (GFP_KERNEL to GFP_ATOMIC) reported by * Shmulik dot Hen at intel.com. * - Based on discussion on mailing list, changed use of * update_slave_cnt(), created wrapper functions for adding/removing @@ -292,13 +292,30 @@ * - Make sure only bond_attach_slave() and bond_detach_slave() can * manipulate the slave list, including slave_cnt, even when in * bond_release_all(). - * - Fixed hang in bond_release() while traffic is running. + * - Fixed hang in bond_release() while traffic is running: * netdev_set_master() must not be called from within the bond lock. * * 2003/03/18 - Tsippy Mendelson and * Shmulik Hen - * - Fixed hang in bond_enslave(): netdev_set_master() must not be - * called from within the bond lock while traffic is running. + * - Fixed hang in bond_enslave() while traffic is running: + * netdev_set_master() must not be called from within the bond lock. + * + * 2003/04/01 - Shmulik Hen + * - Based on discussion on mailing list, changed locking scheme + * to use lock/unlock or lock_bh/unlock_bh appropriately instead + * of lock_irqsave/unlock_irqrestore. The new scheme helps exposing + * hidden bugs and solves system hangs that occurred due to the fact + * that holding lock_irqsave doesn't prevent softirqs from running. + * This also increases total throughput since interrupts are not + * blocked on each transmitted packets or monitor timeout. + * - Changed driver versioning scheme to include version number instead + * of release date (that is already in another field). There are 3 + * fields X.Y.Z where: + * X - Major version - big behavior changes + * Y - Minor version - addition of features + * Z - Extra version - minor changes and bug fixes + * The current version (1.0.6) is based on turning to 1.0.0 on 1/1/03 + * plus 6 bug fixes. */ #include @@ -339,8 +356,8 @@ #include #include -#define DRV_VERSION "2.4.20-20030320" -#define DRV_RELDATE "March 20, 2003" +#define DRV_VERSION "1.0.6" +#define DRV_RELDATE "April 1, 2003" #define DRV_NAME "bonding" #define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" @@ -553,7 +570,7 @@ update_slave_cnt(bonding_t *bond, int in * If the bond->current_slave pointer was pointing to , * it's replaced with slave->next, or if not applicable. * - * bond->lock held by caller. + * bond->lock held for writing by caller. */ static slave_t * bond_detach_slave(bonding_t *bond, slave_t *slave) @@ -568,20 +585,11 @@ bond_detach_slave(bonding_t *bond, slave if (bond->next == slave) { /* is the slave at the head ? */ if (bond->prev == slave) { /* is the slave alone ? */ - write_lock(&bond->ptrlock); - bond->current_slave = NULL; /* no slave anymore */ - write_unlock(&bond->ptrlock); bond->prev = bond->next = (slave_t *)bond; } else { /* not alone */ bond->next = slave->next; slave->next->prev = (slave_t *)bond; bond->prev->next = slave->next; - - write_lock(&bond->ptrlock); - if (bond->current_slave == slave) { - bond->current_slave = slave->next; - } - write_unlock(&bond->ptrlock); } } else { slave->prev->next = slave->next; @@ -590,19 +598,24 @@ bond_detach_slave(bonding_t *bond, slave } else { slave->next->prev = slave->prev; } - - write_lock(&bond->ptrlock); - if (bond->current_slave == slave) { - bond->current_slave = slave->next; - } - write_unlock(&bond->ptrlock); } update_slave_cnt(bond, -1); + if (bond->next != (slave_t *)bond) { /* found one slave */ + bond->current_slave = bond->next; + } else { + bond->current_slave = NULL; + } + return slave; } +/* + * This function attaches the slave to the list . + * + * bond->lock held for writing by caller. + */ static void bond_attach_slave(struct bonding *bond, struct slave *new_slave) { @@ -731,13 +744,12 @@ bond_check_dev_link(struct net_device *d static u16 bond_check_mii_link(bonding_t *bond) { int has_active_interface = 0; - unsigned long flags; - read_lock_irqsave(&bond->lock, flags); + read_lock_bh(&bond->lock); read_lock(&bond->ptrlock); has_active_interface = (bond->current_slave != NULL); read_unlock(&bond->ptrlock); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock_bh(&bond->lock); return (has_active_interface ? BMSR_LSTATUS : 0); } @@ -773,9 +785,8 @@ static int bond_open(struct net_device * static int bond_close(struct net_device *master) { bonding_t *bond = (struct bonding *) master->priv; - unsigned long flags; - write_lock_irqsave(&bond->lock, flags); + write_lock_bh(&bond->lock); if (miimon > 0) { /* link check interval, in milliseconds. */ del_timer(&bond->mii_timer); @@ -788,11 +799,12 @@ static int bond_close(struct net_device } } - /* Release the bonded slaves */ - bond_release_all(master); bond_mc_list_destroy (bond); - write_unlock_irqrestore(&bond->lock, flags); + write_unlock_bh(&bond->lock); + + /* Release the bonded slaves */ + bond_release_all(master); MOD_DEC_USE_COUNT; return 0; @@ -963,14 +975,13 @@ static void set_multicast_list(struct ne { bonding_t *bond = master->priv; struct dev_mc_list *dmi; - unsigned long flags = 0; if (multicast_mode == BOND_MULTICAST_DISABLED) return; /* * Lock the private data for the master */ - write_lock_irqsave(&bond->lock, flags); + write_lock_bh(&bond->lock); /* set promiscuity flag to slaves */ if ( (master->flags & IFF_PROMISC) && !(bond->flags & IFF_PROMISC) ) @@ -1005,7 +1016,7 @@ static void set_multicast_list(struct ne bond_mc_list_destroy (bond); bond_mc_list_copy (master->mc_list, bond, GFP_ATOMIC); - write_unlock_irqrestore(&bond->lock, flags); + write_unlock_bh(&bond->lock); } /* @@ -1051,7 +1062,6 @@ static int bond_enslave(struct net_devic { bonding_t *bond = NULL; slave_t *new_slave = NULL; - unsigned long flags = 0; unsigned long rflags = 0; int ndx = 0; int err = 0; @@ -1087,7 +1097,7 @@ static int bond_enslave(struct net_devic return -EBUSY; } - if ((new_slave = kmalloc(sizeof(slave_t), GFP_ATOMIC)) == NULL) { + if ((new_slave = kmalloc(sizeof(slave_t), GFP_KERNEL)) == NULL) { return -ENOMEM; } memset(new_slave, 0, sizeof(slave_t)); @@ -1119,7 +1129,7 @@ static int bond_enslave(struct net_devic dev_mc_add (slave_dev, dmi->dmi_addr, dmi->dmi_addrlen, 0); } - write_lock_irqsave(&bond->lock, flags); + write_lock_bh(&bond->lock); bond_attach_slave(bond, new_slave); new_slave->delay = 0; @@ -1206,9 +1216,11 @@ static int bond_enslave(struct net_devic read_unlock_irqrestore(&(((struct in_device *)slave_dev->ip_ptr)->lock), rflags); /* if there is a primary slave, remember it */ - if (primary != NULL) - if( strcmp(primary, new_slave->dev->name) == 0) - bond->primary_slave = new_slave; + if (primary != NULL) { + if (strcmp(primary, new_slave->dev->name) == 0) { + bond->primary_slave = new_slave; + } + } } else { #ifdef BONDING_DEBUG printk(KERN_CRIT "This slave is always active in trunk mode\n"); @@ -1219,7 +1231,7 @@ static int bond_enslave(struct net_devic bond->current_slave = new_slave; } - write_unlock_irqrestore(&bond->lock, flags); + write_unlock_bh(&bond->lock); /* * !!! This is to support old versions of ifenslave. We can remove @@ -1283,7 +1295,6 @@ static int bond_change_active(struct net slave_t *slave; slave_t *oldactive = NULL; slave_t *newactive = NULL; - unsigned long flags; int ret = 0; if (master_dev == NULL || slave_dev == NULL) { @@ -1291,7 +1302,7 @@ static int bond_change_active(struct net } bond = (struct bonding *) master_dev->priv; - write_lock_irqsave(&bond->lock, flags); + write_lock_bh(&bond->lock); slave = (slave_t *)bond; oldactive = bond->current_slave; @@ -1318,7 +1329,7 @@ static int bond_change_active(struct net else { ret = -EINVAL; } - write_unlock_irqrestore(&bond->lock, flags); + write_unlock_bh(&bond->lock); return ret; } @@ -1332,7 +1343,7 @@ static int bond_change_active(struct net * Since this function sends messages tails through printk, the caller * must have started something like `printk(KERN_INFO "xxxx ");'. * - * Warning: must put locks around the call to this function if needed. + * Warning: Caller must hold ptrlock for writing. */ slave_t *change_active_interface(bonding_t *bond) { @@ -1340,22 +1351,16 @@ slave_t *change_active_interface(bonding slave_t *bestslave = NULL; int mintime; - read_lock(&bond->ptrlock); newslave = oldslave = bond->current_slave; - read_unlock(&bond->ptrlock); if (newslave == NULL) { /* there were no active slaves left */ if (bond->next != (slave_t *)bond) { /* found one slave */ - write_lock(&bond->ptrlock); newslave = bond->current_slave = bond->next; - write_unlock(&bond->ptrlock); } else { printk (" but could not find any %s interface.\n", (bond_mode == BOND_MODE_ACTIVEBACKUP) ? "backup":"other"); - write_lock(&bond->ptrlock); bond->current_slave = (slave_t *)NULL; - write_unlock(&bond->ptrlock); return NULL; /* still no slave, return NULL */ } } else if (bond_mode == BOND_MODE_ACTIVEBACKUP) { @@ -1398,9 +1403,7 @@ slave_t *change_active_interface(bonding newslave->dev->name); } - write_lock(&bond->ptrlock); bond->current_slave = newslave; - write_unlock(&bond->ptrlock); return newslave; } else if (newslave->link == BOND_LINK_BACK) { @@ -1428,9 +1431,7 @@ slave_t *change_active_interface(bonding bestslave->jiffies = jiffies; bond_set_slave_active_flags(bestslave); bond_mc_update(bond, bestslave, oldslave); - write_lock(&bond->ptrlock); bond->current_slave = bestslave; - write_unlock(&bond->ptrlock); return bestslave; } @@ -1453,9 +1454,7 @@ slave_t *change_active_interface(bonding (bond_mode == BOND_MODE_ACTIVEBACKUP) ? "backup":"other"); /* absolutely nothing found. let's return NULL */ - write_lock(&bond->ptrlock); bond->current_slave = (slave_t *)NULL; - write_unlock(&bond->ptrlock); return NULL; } @@ -1474,7 +1473,6 @@ static int bond_release(struct net_devic { bonding_t *bond; slave_t *our_slave, *old_current; - unsigned long flags; if (master == NULL || slave == NULL) { return -ENODEV; @@ -1489,7 +1487,7 @@ static int bond_release(struct net_devic return -EINVAL; } - write_lock_irqsave(&bond->lock, flags); + write_lock_bh(&bond->lock); bond->current_arp_slave = NULL; our_slave = (slave_t *)bond; old_current = bond->current_slave; @@ -1523,7 +1521,7 @@ static int bond_release(struct net_devic } } - write_unlock_irqrestore(&bond->lock, flags); + write_unlock_bh(&bond->lock); if (our_slave == (slave_t *)bond) { /* if we get here, it's because the device was not found */ @@ -1568,13 +1566,13 @@ static int bond_release(struct net_devic /* * This function releases all slaves. - * Warning: must put write-locks around the call to this function. */ static int bond_release_all(struct net_device *master) { bonding_t *bond; - slave_t *our_slave; + slave_t *our_slave, *old_current; struct net_device *slave_dev; + int err = 0; if (master == NULL) { return -ENODEV; @@ -1585,25 +1583,39 @@ static int bond_release_all(struct net_d } bond = (struct bonding *) master->priv; - bond->current_arp_slave = NULL; + + write_lock_bh(&bond->lock); + if (bond->next == (struct slave *) bond) { + err = -EINVAL; + goto out; + } + + old_current = bond->current_slave; bond->current_slave = NULL; + bond->current_arp_slave = NULL; bond->primary_slave = NULL; while ((our_slave = bond->prev) != (slave_t *)bond) { slave_dev = our_slave->dev; bond_detach_slave(bond, our_slave); + /* now that the slave is detached, unlock and perform + * all the undo steps that should not be called from + * within a lock. + */ + write_unlock_bh(&bond->lock); + if (multicast_mode == BOND_MULTICAST_ALL || (multicast_mode == BOND_MULTICAST_ACTIVE - && bond->current_slave == our_slave)) { + && old_current == our_slave)) { /* flush master's mc_list from slave */ bond_mc_list_flush (slave_dev, master); - + /* unset promiscuity level from slave */ if (master->flags & IFF_PROMISC) dev_set_promiscuity(slave_dev, -1); - + /* unset allmulti level from slave */ if (master->flags & IFF_ALLMULTI) dev_set_allmulti(slave_dev, -1); @@ -1611,10 +1623,6 @@ static int bond_release_all(struct net_d kfree(our_slave); - /* - * Can be safely called from inside the bond lock - * since traffic and timers have already stopped - */ netdev_set_master(slave_dev, NULL); /* only restore its RUNNING flag if monitoring set it down */ @@ -1623,11 +1631,17 @@ static int bond_release_all(struct net_d if (slave_dev->flags & IFF_NOARP) dev_close(slave_dev); + + /* re-acquire the lock before getting the next slave */ + write_lock_bh(&bond->lock); } printk (KERN_INFO "%s: released all slaves\n", master->name); - return 0; +out: + write_unlock_bh(&bond->lock); + + return err; } /* this function is called regularly to monitor each slave's link. */ @@ -1635,10 +1649,9 @@ static void bond_mii_monitor(struct net_ { bonding_t *bond = (struct bonding *) master->priv; slave_t *slave, *bestslave, *oldcurrent; - unsigned long flags; int slave_died = 0; - read_lock_irqsave(&bond->lock, flags); + read_lock(&bond->lock); /* we will try to read the link status of each of our slaves, and * set their IFF_RUNNING flag appropriately. For each slave not @@ -1715,15 +1728,14 @@ static void bond_mii_monitor(struct net_ master->name, dev->name); - read_lock(&bond->ptrlock); + write_lock(&bond->ptrlock); if (slave == bond->current_slave) { - read_unlock(&bond->ptrlock); /* find a new interface and be verbose */ change_active_interface(bond); } else { - read_unlock(&bond->ptrlock); printk(".\n"); } + write_unlock(&bond->ptrlock); slave_died = 1; } else { slave->delay--; @@ -1800,9 +1812,11 @@ static void bond_mii_monitor(struct net_ master->name, dev->name); + write_lock(&bond->ptrlock); if ( (bond->primary_slave != NULL) && (slave == bond->primary_slave) ) change_active_interface(bond); + write_unlock(&bond->ptrlock); } else slave->delay--; @@ -1868,7 +1882,7 @@ static void bond_mii_monitor(struct net_ } } - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); /* re-arm the timer */ mod_timer(&bond->mii_timer, jiffies + (miimon * HZ / 1000)); } @@ -1883,7 +1897,6 @@ static void bond_mii_monitor(struct net_ static void loadbalance_arp_monitor(struct net_device *master) { bonding_t *bond; - unsigned long flags; slave_t *slave; int the_delta_in_ticks = arp_interval * HZ / 1000; int next_timer = jiffies + (arp_interval * HZ / 1000); @@ -1894,24 +1907,22 @@ static void loadbalance_arp_monitor(stru return; } - read_lock_irqsave(&bond->lock, flags); - /* TODO: investigate why rtnl_shlock_nowait and rtnl_exlock_nowait * are called below and add comment why they are required... */ if ((!IS_UP(master)) || rtnl_shlock_nowait()) { mod_timer(&bond->arp_timer, next_timer); - read_unlock_irqrestore(&bond->lock, flags); return; } if (rtnl_exlock_nowait()) { rtnl_shunlock(); mod_timer(&bond->arp_timer, next_timer); - read_unlock_irqrestore(&bond->lock, flags); return; } + read_lock(&bond->lock); + /* see if any of the previous devices are up now (i.e. they have * xmt and rcv traffic). the current_slave does not come into * the picture unless it is null. also, slave->jiffies is not needed @@ -1938,9 +1949,8 @@ static void loadbalance_arp_monitor(stru * current_slave being null after enslaving * is closed. */ - read_lock(&bond->ptrlock); + write_lock(&bond->ptrlock); if (bond->current_slave == NULL) { - read_unlock(&bond->ptrlock); printk(KERN_INFO "%s: link status definitely up " "for interface %s, ", @@ -1948,12 +1958,12 @@ static void loadbalance_arp_monitor(stru slave->dev->name); change_active_interface(bond); } else { - read_unlock(&bond->ptrlock); printk(KERN_INFO "%s: interface %s is now up\n", master->name, slave->dev->name); } + write_unlock(&bond->ptrlock); } } else { /* slave->link == BOND_LINK_UP */ @@ -1976,13 +1986,11 @@ static void loadbalance_arp_monitor(stru master->name, slave->dev->name); - read_lock(&bond->ptrlock); + write_lock(&bond->ptrlock); if (slave == bond->current_slave) { - read_unlock(&bond->ptrlock); change_active_interface(bond); - } else { - read_unlock(&bond->ptrlock); } + write_unlock(&bond->ptrlock); } } @@ -1998,9 +2006,9 @@ static void loadbalance_arp_monitor(stru } } + read_unlock(&bond->lock); rtnl_exunlock(); rtnl_shunlock(); - read_unlock_irqrestore(&bond->lock, flags); /* re-arm the timer */ mod_timer(&bond->arp_timer, next_timer); @@ -2024,7 +2032,6 @@ static void loadbalance_arp_monitor(stru static void activebackup_arp_monitor(struct net_device *master) { bonding_t *bond; - unsigned long flags; slave_t *slave; int the_delta_in_ticks = arp_interval * HZ / 1000; int next_timer = jiffies + (arp_interval * HZ / 1000); @@ -2035,14 +2042,13 @@ static void activebackup_arp_monitor(str return; } - read_lock_irqsave(&bond->lock, flags); - if (!IS_UP(master)) { mod_timer(&bond->arp_timer, next_timer); - read_unlock_irqrestore(&bond->lock, flags); return; } + read_lock(&bond->lock); + /* determine if any slave has come up or any backup slave has * gone down * TODO: what about up/down delay in arp mode? it wasn't here before @@ -2151,7 +2157,9 @@ static void activebackup_arp_monitor(str "active interface %s, disabling it", master->name, slave->dev->name); + write_lock(&bond->ptrlock); slave = change_active_interface(bond); + write_unlock(&bond->ptrlock); bond->current_arp_slave = slave; if (slave != NULL) { slave->jiffies = jiffies; @@ -2243,8 +2251,8 @@ static void activebackup_arp_monitor(str } } + read_unlock(&bond->lock); mod_timer(&bond->arp_timer, next_timer); - read_unlock_irqrestore(&bond->lock, flags); } typedef uint32_t in_addr_t; @@ -2340,17 +2348,16 @@ static int bond_info_query(struct net_de { bonding_t *bond = (struct bonding *) master->priv; slave_t *slave; - unsigned long flags; info->bond_mode = bond_mode; info->num_slaves = 0; info->miimon = miimon; - read_lock_irqsave(&bond->lock, flags); + read_lock_bh(&bond->lock); for (slave = bond->prev; slave != (slave_t *)bond; slave = slave->prev) { info->num_slaves++; } - read_unlock_irqrestore(&bond->lock, flags); + read_unlock_bh(&bond->lock); return 0; } @@ -2361,19 +2368,18 @@ static int bond_slave_info_query(struct bonding_t *bond = (struct bonding *) master->priv; slave_t *slave; int cur_ndx = 0; - unsigned long flags; if (info->slave_id < 0) { return -ENODEV; } - read_lock_irqsave(&bond->lock, flags); + read_lock_bh(&bond->lock); for (slave = bond->prev; slave != (slave_t *)bond && cur_ndx < info->slave_id; slave = slave->prev) { cur_ndx++; } - read_unlock_irqrestore(&bond->lock, flags); + read_unlock_bh(&bond->lock); if (slave != (slave_t *)bond) { strcpy(info->slave_name, slave->dev->name); @@ -2508,7 +2514,6 @@ static int bond_xmit_broadcast(struct sk { slave_t *slave, *start_at; struct bonding *bond = (struct bonding *) dev->priv; - unsigned long flags; struct net_device *device_we_should_send_to = 0; if (!IS_UP(dev)) { /* bond down */ @@ -2516,7 +2521,7 @@ static int bond_xmit_broadcast(struct sk return 0; } - read_lock_irqsave(&bond->lock, flags); + read_lock(&bond->lock); read_lock(&bond->ptrlock); slave = start_at = bond->current_slave; @@ -2524,7 +2529,7 @@ static int bond_xmit_broadcast(struct sk if (slave == NULL) { /* we're at the root, get the first slave */ /* no suitable interface, frame not sent */ - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); dev_kfree_skb(skb); return 0; } @@ -2556,7 +2561,7 @@ static int bond_xmit_broadcast(struct sk dev_kfree_skb(skb); /* frame sent to all suitable interfaces */ - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } @@ -2564,14 +2569,13 @@ static int bond_xmit_roundrobin(struct s { slave_t *slave, *start_at; struct bonding *bond = (struct bonding *) dev->priv; - unsigned long flags; if (!IS_UP(dev)) { /* bond down */ dev_kfree_skb(skb); return 0; } - read_lock_irqsave(&bond->lock, flags); + read_lock(&bond->lock); read_lock(&bond->ptrlock); slave = start_at = bond->current_slave; @@ -2580,7 +2584,7 @@ static int bond_xmit_roundrobin(struct s if (slave == NULL) { /* we're at the root, get the first slave */ /* no suitable interface, frame not sent */ dev_kfree_skb(skb); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } @@ -2597,14 +2601,14 @@ static int bond_xmit_roundrobin(struct s bond->current_slave = slave->next; write_unlock(&bond->ptrlock); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } } while ((slave = slave->next) != start_at); /* no suitable interface, frame not sent */ dev_kfree_skb(skb); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } @@ -2617,7 +2621,6 @@ static int bond_xmit_xor(struct sk_buff { slave_t *slave, *start_at; struct bonding *bond = (struct bonding *) dev->priv; - unsigned long flags; struct ethhdr *data = (struct ethhdr *)skb->data; int slave_no; @@ -2626,14 +2629,14 @@ static int bond_xmit_xor(struct sk_buff return 0; } - read_lock_irqsave(&bond->lock, flags); + read_lock(&bond->lock); slave = bond->prev; /* we're at the root, get the first slave */ if (bond->slave_cnt == 0) { /* no suitable interface, frame not sent */ dev_kfree_skb(skb); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } @@ -2654,14 +2657,14 @@ static int bond_xmit_xor(struct sk_buff skb->priority = 1; dev_queue_xmit(skb); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } } while ((slave = slave->next) != start_at); /* no suitable interface, frame not sent */ dev_kfree_skb(skb); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } @@ -2672,7 +2675,6 @@ static int bond_xmit_xor(struct sk_buff static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *dev) { struct bonding *bond = (struct bonding *) dev->priv; - unsigned long flags; int ret; if (!IS_UP(dev)) { /* bond down */ @@ -2713,7 +2715,7 @@ static int bond_xmit_activebackup(struct } } - read_lock_irqsave(&bond->lock, flags); + read_lock(&bond->lock); read_lock(&bond->ptrlock); if (bond->current_slave != NULL) { /* one usable interface */ @@ -2721,7 +2723,7 @@ static int bond_xmit_activebackup(struct read_unlock(&bond->ptrlock); skb->priority = 1; ret = dev_queue_xmit(skb); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } else { @@ -2733,7 +2735,7 @@ static int bond_xmit_activebackup(struct printk(KERN_INFO "There was no suitable interface, so we don't transmit\n"); #endif dev_kfree_skb(skb); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock(&bond->lock); return 0; } @@ -2742,11 +2744,10 @@ static struct net_device_stats *bond_get bonding_t *bond = dev->priv; struct net_device_stats *stats = bond->stats, *sstats; slave_t *slave; - unsigned long flags; memset(bond->stats, 0, sizeof(struct net_device_stats)); - read_lock_irqsave(&bond->lock, flags); + read_lock_bh(&bond->lock); for (slave = bond->prev; slave != (slave_t *)bond; slave = slave->prev) { sstats = slave->dev->get_stats(slave->dev); @@ -2779,7 +2780,7 @@ static struct net_device_stats *bond_get } - read_unlock_irqrestore(&bond->lock, flags); + read_unlock_bh(&bond->lock); return stats; } @@ -2790,7 +2791,6 @@ static int bond_get_info(char *buf, char off_t begin = 0; u16 link; slave_t *slave = NULL; - unsigned long flags; while (bond != NULL) { /* @@ -2803,7 +2803,7 @@ static int bond_get_info(char *buf, char bond_mode_name()); if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - read_lock_irqsave(&bond->lock, flags); + read_lock_bh(&bond->lock); read_lock(&bond->ptrlock); if (bond->current_slave != NULL) { len += sprintf(buf + len, @@ -2811,7 +2811,7 @@ static int bond_get_info(char *buf, char bond->current_slave->dev->name); } read_unlock(&bond->ptrlock); - read_unlock_irqrestore(&bond->lock, flags); + read_unlock_bh(&bond->lock); } len += sprintf(buf + len, "MII Status: "); @@ -2826,7 +2826,7 @@ static int bond_get_info(char *buf, char len += sprintf(buf + len, "Multicast Mode: %s\n", multicast_mode_name()); - read_lock_irqsave(&bond->lock, flags); + read_lock_bh(&bond->lock); for (slave = bond->prev; slave != (slave_t *)bond; slave = slave->prev) { len += sprintf(buf + len, "\nSlave Interface: %s\n", slave->dev->name); @@ -2839,7 +2839,7 @@ static int bond_get_info(char *buf, char len += sprintf(buf + len, "Link Failure Count: %d\n", slave->link_failure_count); } - read_unlock_irqrestore(&bond->lock, flags); + read_unlock_bh(&bond->lock); /* * Figure out the calcs for the /proc/net interface @@ -3239,7 +3239,7 @@ static int __init bonding_init(void) */ printk(KERN_WARNING "bonding_init(): %s primary device specified but has " - " no effect in %s mode\n", + "no effect in %s mode\n", primary, bond_mode_name()); primary = NULL; } -- | Shmulik Hen | | Israel Design Center (Jerusalem) | | LAN Access Division | | Intel Communications Group, Intel corp. | From shmulik.hen@intel.com Thu Apr 3 06:42:22 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 06:42:24 -0800 (PST) Received: from hermes.iil.intel.com (hermes.iil.intel.com [192.198.152.99]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33EgKDH012321 for ; Thu, 3 Apr 2003 06:42:21 -0800 Received: from petasus.iil.intel.com (petasus.iil.intel.com [143.185.77.3]) by hermes.iil.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h33Ec8Z06562 for ; Thu, 3 Apr 2003 14:38:08 GMT Received: from hasmsxvs01.iil.intel.com (hasmsxvs01.iil.intel.com [143.185.63.58]) by petasus.iil.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h33EiuJ07315 for ; Thu, 3 Apr 2003 14:44:56 GMT Received: from hasmsx17.iil.intel.com ([143.185.63.203]) by hasmsxvs01.iil.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040317472913534 ; Thu, 03 Apr 2003 17:47:29 +0300 Received: by hasmsx17.iil.intel.com with Internet Mail Service (5.5.2653.19) id ; Thu, 3 Apr 2003 17:42:13 +0300 Message-ID: From: "Hen, Shmulik" To: Jay Vosburgh , "Marom, Noam" , "Feldman, Scott" Cc: bonding-devel@lists.sourceforge.net, netdev@oss.sgi.com Subject: RE: [Bonding-devel] [patch] (2/8) Add 802.3ad support to bonding Date: Thu, 3 Apr 2003 17:42:06 +0300 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2162 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shmulik.hen@intel.com Precedence: bulk X-list: netdev Content-Length: 932 Lines: 23 > -----Original Message----- > From: Jay Vosburgh [mailto:fubar@us.ibm.com] > Sent: Thursday, April 03, 2003 4:01 AM > To: Hen, Shmulik; Marom, Noam; Feldman, Scott > Cc: bonding-devel@lists.sourceforge.net; netdev@oss.sgi.com > Subject: RE: [Bonding-devel] [patch] (2/8) Add 802.3ad > support to bonding > > If, however, I use "ifenslave -d bond0 ethX" (where ethX is > one of the active interfaces, by which I mean one with traffic flowing > over it), it takes a considerable amount of real time for bonding to > recover and transfer the connection to a new interface. It appears > that the deleted interface must be either the transmitting or > receiving interface (I'm not sure which), as sometimes it recovers > immediately. Removing an idle interface from the bond does not appear > to cause any stalls. > We'll be investigating this behavior and try to reproduce it in our lab (probably early next week). Shmulik. From davem@redhat.com Thu Apr 3 06:44:33 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 06:44:38 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33EiWDH012651 for ; Thu, 3 Apr 2003 06:44:33 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id GAA31901; Thu, 3 Apr 2003 06:39:38 -0800 Date: Thu, 03 Apr 2003 06:39:37 -0800 (PST) Message-Id: <20030403.063937.40841673.davem@redhat.com> To: shmulik.hen@intel.com Cc: bonding-devel@lists.sourceforge.net, bonding-announce@lists.sourceforge.net, netdev@oss.sgi.com, linux-net@vger.kernel.org, jgarzik@pobox.com Subject: Re: [bonding][patch] Change locking scheme From: "David S. Miller" In-Reply-To: References: X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2163 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 439 Lines: 11 From: shmulik.hen@intel.com Date: Thu, 3 Apr 2003 17:38:37 +0300 (IDT) This change is based on last week's discussion regarding the fact that holding a lock_irqsave doesn't prevent softirqs from running which can cause deadlocks in certain situations. BTW, current 2.5.x kernels will now spit out debugging messages when this locking rule is violated (ie. local_bh_enable() is called with processor interrupts disabled). From shmulik.hen@intel.com Thu Apr 3 06:46:02 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 06:46:06 -0800 (PST) Received: from hermes.iil.intel.com (hermes.iil.intel.com [192.198.152.99]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33Ek0DH012968 for ; Thu, 3 Apr 2003 06:46:01 -0800 Received: from petasus.iil.intel.com (petasus.iil.intel.com [143.185.77.3]) by hermes.iil.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h33EfmZ06930 for ; Thu, 3 Apr 2003 14:41:48 GMT Received: from hasmsxvs01.iil.intel.com (hasmsxvs01.iil.intel.com [143.185.63.58]) by petasus.iil.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h33EmaJ07605 for ; Thu, 3 Apr 2003 14:48:36 GMT Received: from hasmsx17.iil.intel.com ([143.185.63.203]) by hasmsxvs01.iil.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040317510605597 ; Thu, 03 Apr 2003 17:51:06 +0300 Received: by hasmsx17.iil.intel.com with Internet Mail Service (5.5.2653.19) id ; Thu, 3 Apr 2003 17:45:50 +0300 Message-ID: From: "Hen, Shmulik" To: "Eble, Dan" Cc: bond-devel , bond-announce , linux-netdev , linux-net , Jeff Garzik , "David S. Miller" Subject: RE: [bonding][patch] Change locking scheme Date: Thu, 3 Apr 2003 17:45:43 +0300 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) content-class: urn:content-classes:message Content-Type: text/plain; charset="iso-8859-1" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2165 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shmulik.hen@intel.com Precedence: bulk X-list: netdev Content-Length: 406 Lines: 15 > -----Original Message----- > From: Eble, Dan [mailto:DanE@aiinet.com] > Sent: Thursday, April 03, 2003 5:43 PM > To: Hen, Shmulik > Subject: RE: [bonding][patch] Change locking scheme > > > week or so, and so far problems were detected. It was tested in all > ^^^ > > Could you clarify this please? :-) Oops. Meant to say "and so far NO problems were detected." ;-) Shmulik. From davem@redhat.com Thu Apr 3 06:45:56 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 06:46:05 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33EjuDH012969 for ; Thu, 3 Apr 2003 06:45:56 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id GAA31916; Thu, 3 Apr 2003 06:41:07 -0800 Date: Thu, 03 Apr 2003 06:41:06 -0800 (PST) Message-Id: <20030403.064106.117336531.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCH] linux/net.h: bye bye struct net_proto From: "David S. Miller" In-Reply-To: <20030403144003.GA17155@conectiva.com.br> References: <20030403144003.GA17155@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2164 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 253 Lines: 10 From: Arnaldo Carvalho de Melo Date: Thu, 3 Apr 2003 11:40:03 -0300 Please consider pulling from: bk://kernel.bkbits.net/acme/net-2.5 Still the same tree, not yet updated to linus's. Pulled, thanks. From rddunlap@osdl.org Thu Apr 3 08:02:41 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 08:02:49 -0800 (PST) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h33G2cDH014605 for ; Thu, 3 Apr 2003 08:02:41 -0800 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h33G2ZW04608; Thu, 3 Apr 2003 08:02:35 -0800 Date: Thu, 3 Apr 2003 08:02:44 +0000 From: "Randy.Dunlap" To: "David S. Miller" Cc: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: [PATCH] snmp6 stats as %lu Message-Id: <20030403080244.6bb772e3.rddunlap@osdl.org> In-Reply-To: <20030403.044822.00469453.davem@redhat.com> References: <20030402122755.5dc3f022.rddunlap@osdl.org> <20030403.044822.00469453.davem@redhat.com> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2166 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 1296 Lines: 44 On Thu, 03 Apr 2003 04:48:22 -0800 (PST) "David S. Miller" wrote: | From: "Randy.Dunlap" | Date: Wed, 2 Apr 2003 12:27:55 +0000 | | ipv4/proc.c prints SNMP stats using %lu, | but ipv6/proc.c prints them using %ld. | | Is this difference intentional, planned, or an oversight, | or something else? | | Looks like an oversight to me, both should use the unsigned format. Here's the patch, on top of the seq_file conversion. Thanks, -- ~Randy patch_name: snmp6-ulong.patch patch_version: 2003-04-03.07:57:48 author: Randy.Dunlap description: modify /proc/net/snmp6 to use %lu instead of %ld for output product: Linux product_versions: 2.5.66 maintainer: Dave Miller (davem@redhat.com) diffstat: = net/ipv6/proc.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -Naur ./net/ipv6/proc.c%SN6ULF ./net/ipv6/proc.c --- ./net/ipv6/proc.c%SN6ULF Thu Apr 3 07:56:44 2003 +++ ./net/ipv6/proc.c Thu Apr 3 07:57:07 2003 @@ -156,7 +156,7 @@ int i; for (i=0; i; Thu, 3 Apr 2003 08:15:47 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id IAA32342; Thu, 3 Apr 2003 08:11:02 -0800 Date: Thu, 03 Apr 2003 08:11:01 -0800 (PST) Message-Id: <20030403.081101.64240524.davem@redhat.com> To: rddunlap@osdl.org Cc: linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [PATCH] snmp6 stats as %lu From: "David S. Miller" In-Reply-To: <20030403080244.6bb772e3.rddunlap@osdl.org> References: <20030402122755.5dc3f022.rddunlap@osdl.org> <20030403.044822.00469453.davem@redhat.com> <20030403080244.6bb772e3.rddunlap@osdl.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2167 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 334 Lines: 10 From: "Randy.Dunlap" Date: Thu, 3 Apr 2003 08:02:44 +0000 On Thu, 03 Apr 2003 04:48:22 -0800 (PST) "David S. Miller" wrote: | Looks like an oversight to me, both should use the unsigned format. Here's the patch, on top of the seq_file conversion. Applied, thanks Randy. From jheffner@psc.edu Thu Apr 3 19:22:10 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 03 Apr 2003 19:22:15 -0800 (PST) Received: from dexter.psc.edu (dexter.psc.edu [128.182.61.232]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h343M9DH005225 for ; Thu, 3 Apr 2003 19:22:10 -0800 Received: from dexter.psc.edu (localhost.psc.edu [127.0.0.1]) by dexter.psc.edu (8.12.8/8.12.5) with ESMTP id h343M3ea009523 for ; Thu, 3 Apr 2003 22:22:03 -0500 (EST) Received: from localhost (localhost [[UNIX: localhost]]) by dexter.psc.edu (8.12.8/8.12.8/Submit) with ESMTP id h343M3pO009520 for ; Thu, 3 Apr 2003 22:22:03 -0500 (EST) X-Authentication-Warning: dexter.psc.edu: jheffner owned process doing -bs Date: Thu, 3 Apr 2003 22:22:03 -0500 (EST) From: John Heffner To: Subject: loopback interface and soft irqs Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2170 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jheffner@psc.edu Precedence: bulk X-list: netdev Content-Length: 491 Lines: 15 I'm using 2.4.20, and I noticed that when doing an all-out tcp transfer over the loopback interface, the machine was actually spending lots of time in the idle loop. I looked at the device code and after loopback_xmit() calls netif_rx(), the softirq does not get run. I added a do_softirq() call at the end of loopback_xmit() and CPU utilization went up to 100% throughput significantly increased (about 2x). Is there a good reason for not running the soft irq here? Thanks, -John From Andrew.Morton@digeo.com Fri Apr 4 09:08:36 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Apr 2003 09:08:39 -0800 (PST) Received: from pao-ex01.pao.digeo.com ([12.47.58.55]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h34H8ZDH008033 for ; Fri, 4 Apr 2003 09:08:36 -0800 Received: from mnm ([172.17.144.18]) by pao-ex01.pao.digeo.com with Microsoft SMTPSVC(5.0.2195.5329); Thu, 3 Apr 2003 02:44:36 -0800 Date: Thu, 3 Apr 2003 02:45:17 -0800 From: Andrew Morton To: "Feldman, Scott" Cc: netdev@oss.sgi.com Subject: e100: "Freeing alive device f7dd8000, eth%d" Message-Id: <20030403024517.534a0760.akpm@digeo.com> X-Mailer: Sylpheed version 0.8.9 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 03 Apr 2003 10:44:37.0029 (UTC) FILETIME=[057A8550:01C2F9CE] X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2171 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@digeo.com Precedence: bulk X-list: netdev Content-Length: 2619 Lines: 52 Hi Scott. This message comes out all the time when e100 is being brought up. What's happening is that e100_found1() is starting up and calling netif_carrier_off() when the netdevice's refcount is zero. The link state change callback is queued and takes the refcount to 1. Then the callback is run while the refcount is still 1. So it calls netdev_finish_unregister(), which gets all upset because the netdevice has not actually shut down. Here's a call trace: #0 linkwatch_fire_event (dev=0xcfddb000) at include/asm/bitops.h:133 #1 0xc0295cb2 in e100_update_link_state (bdp=0xcfddb1c0) at include/linux/netdevice.h:663 #2 0xc029559a in e100_find_speed_duplex (bdp=0xcfddb1c0) at drivers/net/e100/e100_phy.c:495 #3 0xc0295ac6 in e100_auto_neg (bdp=0xcfddb1c0, force_restart=0) at drivers/net/e100/e100_phy.c:864 #4 0xc0295b14 in e100_phy_set_speed_duplex (bdp=0xcfddb1c0, force_restart=0 '\0') at drivers/net/e100/e100_phy.c:875 #5 0xc042dc7c in e100_phy_init (bdp=0xcfddb1c0) at drivers/net/e100/e100_phy.c:931 #6 0xc042d21d in e100_hw_init (bdp=0xcfddb1c0) at drivers/net/e100/e100_main.c:1389 #7 0xc042d09c in e100_init (bdp=0xcfddb1c0) at drivers/net/e100/e100_main.c:1287 #8 0xc042cb39 in e100_found1 (pcid=0xcfe5e000, ent=0xc04630c4) at drivers/net/e100/e100_main.c:643 #9 0xc0260973 in pci_device_probe (dev=0xcfe5e04c) at drivers/pci/pci-driver.c:53 #10 0xc02815f4 in bus_match (dev=0xcfe5e04c, drv=0xc03cf188) at drivers/base/bus.c:266 #11 0xc02816d6 in driver_attach (drv=0xc03cf188) at drivers/base/bus.c:331 #12 0xc0281972 in bus_add_driver (drv=0xc03cf188) at drivers/base/bus.c:447 #13 0xc0281d43 in driver_register (drv=0xc03cf188) at drivers/base/driver.c:87 #14 0xc0260a74 in pci_register_driver (drv=0xc03cf160) at drivers/pci/pci-driver.c:127 #15 0xc042cd36 in e100_init_module () at include/linux/pci.h:775 #16 0xc0418851 in do_initcalls () at init/main.c:490 #17 0xc04188c4 in do_basic_setup () at init/main.c:530 #18 0xc01050d2 in init (unused=0x0) at init/main.c:568 I'm not sure what the right fix is here - perhaps the driver just shouldn't be playing with link state at all in the probe handler, and this should actually happen in the open() routine. Also, it seems a bit bogus that anything at all happened when you did netif_carrier_off() in the probe() handler: static inline void netif_carrier_off(struct net_device *dev) { if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) linkwatch_fire_event(dev); } It seems to me more logical that drivers should come up in state "no carrier". But I guess it would break naive drivers if we made that change. From davem@redhat.com Fri Apr 4 17:40:36 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Apr 2003 17:40:47 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h351eZDH014796 for ; Fri, 4 Apr 2003 17:40:35 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id RAA05893; Fri, 4 Apr 2003 17:35:38 -0800 Date: Fri, 04 Apr 2003 17:35:38 -0800 (PST) Message-Id: <20030404.173538.03688224.davem@redhat.com> To: akpm@digeo.com Cc: netdev@oss.sgi.com Subject: Re: [2.5.66-mm3+debug] traces. From: "David S. Miller" In-Reply-To: <20030404172927.2b449167.akpm@digeo.com> References: <20030404172927.2b449167.akpm@digeo.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2172 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 649 Lines: 16 From: Andrew Morton Date: Fri, 4 Apr 2003 17:29:27 -0800 It is a bit worrisome that dev_kfree_skb() is now illegal if local interrupts are disabled. I'd expect there to be more instances. Why worrisome? It's an error, and now at least we'll know about it. This isn't a "is now illegal", it's always been illegal. You simply cannot take BH locks inside of IRQ disabling ones, this is true 2.4.x too it just doesn't BUG() on you there (you get a potential deadlock instead). This patch should go through the Tulip maintainer (Jeff I guess) especially since it's a fix that belongs in 2.4.x as well. Thanks Andrew. From Andrew.Morton@digeo.com Fri Apr 4 17:45:43 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Apr 2003 17:45:46 -0800 (PST) Received: from pao-ex01.pao.digeo.com ([12.47.58.55]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h351jgDH015111 for ; Fri, 4 Apr 2003 17:45:43 -0800 Received: from dhcp-139-229.pao.digeo.com ([172.17.140.233]) by pao-ex01.pao.digeo.com with Microsoft SMTPSVC(5.0.2195.5329); Fri, 4 Apr 2003 17:30:16 -0800 Date: Fri, 4 Apr 2003 17:29:27 -0800 From: Andrew Morton To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Fw: [2.5.66-mm3+debug] traces. Message-Id: <20030404172927.2b449167.akpm@digeo.com> X-Mailer: Sylpheed version 0.8.10 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart_Fri__4_Apr_2003_17:29:27_-0800_082ac940" X-OriginalArrivalTime: 05 Apr 2003 01:30:16.0339 (UTC) FILETIME=[E9637E30:01C2FB12] X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2173 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@digeo.com Precedence: bulk X-list: netdev Content-Length: 12142 Lines: 355 This is a multi-part message in MIME format. --Multipart_Fri__4_Apr_2003_17:29:27_-0800_082ac940 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Dave, Ian was hitting the BUG in local_bh_enable(). The call trace is below. This patch fixes it up: diff -puN drivers/net/tulip/dmfe.c~dmfe-kfree_skb-fix drivers/net/tulip/dmfe.c --- 25/drivers/net/tulip/dmfe.c~dmfe-kfree_skb-fix Fri Apr 4 17:26:33 2003 +++ 25-akpm/drivers/net/tulip/dmfe.c Fri Apr 4 17:26:41 2003 @@ -668,13 +668,13 @@ static int dmfe_start_xmit(struct sk_buf if ( db->tx_queue_cnt < TX_FREE_DESC_CNT ) netif_wake_queue(dev); - /* free this SKB */ - dev_kfree_skb(skb); - /* Restore CR7 to enable interrupt */ spin_unlock_irqrestore(&db->lock, flags); outl(db->cr7_data, dev->base_addr + DCR7); + /* free this SKB */ + dev_kfree_skb(skb); + return 0; } _ It is a bit worrisome that dev_kfree_skb() is now illegal if local interrupts are disabled. I'd expect there to be more instances. Begin forwarded message: Date: 05 Apr 2003 02:28:30 +0200 From: Ian Kumlien To: Andrew Morton Subject: [2.5.66-mm3+debug] traces. Hi, I'm currently to tired to proof read these to see if they are the same or not... i think they are... And i don't trust 2.5.x's makesystem to keep track any more =) Anyways, I added em all to this mail, i HOPE that you have no limitations on your mail account and so on. I also hope that your on a dsl or simular connection =). btw, it seems to happen on every nfs access. I'll explore the possibilities of using the pure tulip network driver tomorrow... irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] nanosleep_wake_up+0x0/0x10 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 irqs are enabled Call Trace: [] local_bh_enable+0x74/0x80 [] svc_write_space+0x2a/0x90 [] __kfree_skb+0x69/0xf0 [] sock_wfree+0x49/0x50 [] sock_wfree+0x0/0x50 [] __kfree_skb+0x5d/0xf0 [] dmfe_start_xmit+0x150/0x240 [] dev_queue_xmit_nit+0x9d/0xf0 [] qdisc_restart+0x65/0x140 [] dev_queue_xmit+0x200/0x2b0 [] ip_output+0x109/0x220 [] ip_push_pending_frames+0x296/0x380 [] udp_push_pending_frames+0xfd/0x210 [] udp_sendmsg+0x24d/0x880 [] ip_append_data+0x664/0x750 [] __ip_route_output_key+0x2d/0xf0 [] inet_sendmsg+0x4d/0x60 [] sock_sendmsg+0x9e/0xd0 [] inet_sendmsg+0x4d/0x60 [] sock_no_sendpage+0xa4/0xb0 [] udp_sendpage+0x1a1/0x2c0 [] inet_sendpage+0x67/0xd0 [] svc_sendto+0xb1/0x270 [] svc_udp_sendto+0x21/0x40 [] svc_send+0x78/0xf0 [] svcauth_unix_release+0x38/0x40 [] nfsd_dispatch+0x0/0x1f0 [] svc_process+0x1fc/0x680 [] nfsd+0x1b9/0x350 [] nfsd+0x0/0x350 [] kernel_thread_helper+0x5/0x18 -- Ian Kumlien --Multipart_Fri__4_Apr_2003_17:29:27_-0800_082ac940 Content-Type: application/pgp-signature; name="signature.asc" Content-Disposition: attachment; filename="signature.asc" Content-Transfer-Encoding: base64 LS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0KVmVyc2lvbjogR251UEcgdjEuMC43IChHTlUv TGludXgpCgppRDhEQlFBK2ppTXQ3RjNFdXljNTFOOFJBb0puQUtDcTFBV1lORkNwVERraHlsQ25t bW9YaUhDNllBQ2ZSTmQ3CjVEcWhZMVdrV01DUXl3Y2xnRHNoRVBzPQo9VWdTZwotLS0tLUVORCBQ R1AgU0lHTkFUVVJFLS0tLS0KCg== --Multipart_Fri__4_Apr_2003_17:29:27_-0800_082ac940-- From Andrew.Morton@digeo.com Fri Apr 4 18:13:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Apr 2003 18:13:38 -0800 (PST) Received: from pao-ex01.pao.digeo.com ([12.47.58.55]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h352DYDH015538 for ; Fri, 4 Apr 2003 18:13:35 -0800 Received: from mnm ([172.17.144.18]) by pao-ex01.pao.digeo.com with Microsoft SMTPSVC(5.0.2195.5329); Fri, 4 Apr 2003 18:13:29 -0800 Date: Fri, 4 Apr 2003 18:14:27 -0800 From: Andrew Morton To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [2.5.66-mm3+debug] traces. Message-Id: <20030404181427.5cf0c127.akpm@digeo.com> In-Reply-To: <20030404.173538.03688224.davem@redhat.com> References: <20030404172927.2b449167.akpm@digeo.com> <20030404.173538.03688224.davem@redhat.com> X-Mailer: Sylpheed version 0.8.9 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Apr 2003 02:13:29.0822 (UTC) FILETIME=[F33997E0:01C2FB18] X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2174 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@digeo.com Precedence: bulk X-list: netdev Content-Length: 447 Lines: 13 "David S. Miller" wrote: > > You simply cannot take BH locks inside of IRQ disabling > ones, this is true 2.4.x too it just doesn't BUG() on you there > (you get a potential deadlock instead). I don't recall seeing a description or discussion of this deadlock. Any pointers? > This patch should go through the Tulip maintainer (Jeff I guess) > especially since it's a fix that belongs in 2.4.x as well. Yup, I'll spam Jeff. From davem@redhat.com Fri Apr 4 18:32:14 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 04 Apr 2003 18:32:20 -0800 (PST) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h352WEDH015978 for ; Fri, 4 Apr 2003 18:32:14 -0800 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id SAA06134; Fri, 4 Apr 2003 18:27:17 -0800 Date: Fri, 04 Apr 2003 18:27:16 -0800 (PST) Message-Id: <20030404.182716.06393733.davem@redhat.com> To: akpm@digeo.com Cc: netdev@oss.sgi.com Subject: Re: [2.5.66-mm3+debug] traces. From: "David S. Miller" In-Reply-To: <20030404181427.5cf0c127.akpm@digeo.com> References: <20030404172927.2b449167.akpm@digeo.com> <20030404.173538.03688224.davem@redhat.com> <20030404181427.5cf0c127.akpm@digeo.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2175 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 1045 Lines: 32 From: Andrew Morton Date: Fri, 4 Apr 2003 18:14:27 -0800 "David S. Miller" wrote: > > You simply cannot take BH locks inside of IRQ disabling > ones, this is true 2.4.x too it just doesn't BUG() on you there > (you get a potential deadlock instead). I don't recall seeing a description or discussion of this deadlock. Any pointers? Search the archives for the subject "BUG or not? GFP_KERNEL with interrupts disabled." unfortunately it appears a lot of that thread got privatized and I don't have any logs. The long and short of it is: spin_lock_irq(); anything which does local_bh_{enable,disable}() spin_unlock_irq(); and similar are illegal. local_bh_enable() invokes do_softirq() if softints are pending, do_softirq() enables cpu interrupts, which would result in a deadlock in the above case (because an interrupt could arrive and try to take the IRQ spinlock taken by spin_lock_irq()). Therefore it's a bug, and it's a bug everywhere BUG() check or not. :-) From ahu@outpost.ds9a.nl Sat Apr 5 08:50:19 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Apr 2003 08:50:26 -0800 (PST) Received: from outpost.ds9a.nl (postfix@outpost.ds9a.nl [213.244.168.210]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h35GoHDH025107 for ; Sat, 5 Apr 2003 08:50:18 -0800 Received: by outpost.ds9a.nl (Postfix, from userid 1000) id 7B05C450E; Sat, 5 Apr 2003 18:50:16 +0200 (CEST) Date: Sat, 5 Apr 2003 18:50:16 +0200 From: bert hubert To: netdev@oss.sgi.com Subject: [fw@deneb.enyo.de: Route cache performance under stress] Message-ID: <20030405165016.GA32361@outpost.ds9a.nl> Mail-Followup-To: bert hubert , netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2177 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ahu@ds9a.nl Precedence: bulk X-list: netdev Content-Length: 2972 Lines: 78 Forwarded: ----- Forwarded message from Florian Weimer ----- To: linux-kernel@vger.kernel.org Subject: Route cache performance under stress From: Florian Weimer Date: Sat, 05 Apr 2003 18:37:43 +0200 X-Mailing-List: linux-kernel@vger.kernel.org Please read the following paper: Then look at the 2.4 route cache implementation. Short summary: It is possible to freeze machines with 1 GB of RAM and more with a stream of 400 packets per second with carefully chosen source addresses. Not good. The route cache is a DoS bottleneck in general (that's why I started looking at it). You have to apply rate-limits in the PREROUTING chain, otherwise a modest packet flood will push the machine off the network (even with truly random source addresses, not triggering hash collisions). The route cache partially defeats the purpose of SYN cookies, too, because the kernel keeps (transient) state for spoofed connection attempts in the route cache. The following patch can be applied in an emergency, if you face the hash collision DoS attack. It drastically limits the size of the cache (but not the bucket count), and decreases performance in some applications, but --- route.c 2003/04/05 12:41:51 1.1 +++ route.c 2003/04/05 12:42:42 @@ -2508,8 +2508,8 @@ rt_hash_table[i].chain = NULL; } - ipv4_dst_ops.gc_thresh = (rt_hash_mask + 1); - ip_rt_max_size = (rt_hash_mask + 1) * 16; + ipv4_dst_ops.gc_thresh = 512; + ip_rt_max_size = 2048; devinet_init(); ip_fib_init(); (Yeah, I know, it's stupid, but it might help in an emergency.) I wonder why the route cache is needed at all for hosts which don't forward any IP packets, and why it has to include the source addresses and TOS (for policy-based routing, probably). Most hosts simply don't face such complex routing decisions to make the cache a win. If you don't believe me, hook a Linux box to a packet generator (generating packets with random source addresses) and use iptables to drop the packets, in a first test run in the INPUT chain (after route cache), and in a second one in the PREROUTING chain (before route cache). I've observed an incredible difference (not in laboratory tests, but during actual DoS attacks). Netfilter ip_conntrack support might have similar issues, but you can't use it in a uncooperative environment anyway, at least in my experience. (Note that there appears to be no way to disable connection tracking while the code is in the kernel.) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ ----- End forwarded message ----- -- http://www.PowerDNS.com Open source, database driven DNS Software http://lartc.org Linux Advanced Routing & Traffic Control HOWTO From gandalf@wlug.westbo.se Sat Apr 5 10:17:14 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Apr 2003 10:17:18 -0800 (PST) Received: from tux.rsn.bth.se (postfix@tux.rsn.bth.se [194.47.143.135]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h35IHDDH028379 for ; Sat, 5 Apr 2003 10:17:14 -0800 Received: by tux.rsn.bth.se (Postfix, from userid 501) id 239BB36FCD; Sat, 5 Apr 2003 20:17:10 +0200 (CEST) Subject: Re: Route cache performance under stress From: Martin Josefsson To: Florian Weimer Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, bert hubert In-Reply-To: <8765pshpd4.fsf@deneb.enyo.de> References: <8765pshpd4.fsf@deneb.enyo.de> Content-Type: text/plain Content-Transfer-Encoding: 7bit Organization: Message-Id: <1049566629.25170.203.camel@tux.rsn.bth.se> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.3 Date: 05 Apr 2003 20:17:09 +0200 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2178 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gandalf@wlug.westbo.se Precedence: bulk X-list: netdev Content-Length: 1008 Lines: 24 On Sat, 2003-04-05 at 18:37, Florian Weimer wrote: > Netfilter ip_conntrack support might have similar issues, but you > can't use it in a uncooperative environment anyway, at least in my > experience. (Note that there appears to be no way to disable > connection tracking while the code is in the kernel.) It's correct that ip_conntrack has similar issues. There's been some work on the hashalgorithm used but no patch has been made yet. And yes it doesn't scale well at all (especially on SMP), I'm about to start working on this a bit. Hopefully I can improve it somewhat. If you've compiled ip_conntrack into your kernel there's only two ways to disable it and both needs code-modifications :) Install a netfilter-module that gets the packets before conntrack and steal the packets, the downside is that you will bypass the rest of iptables as well. Apply a patch from patch-o-matic that adds a NOTRACK target that instructs conntrack to not look at the packets marked by that target. -- /Martin From hadi@cyberus.ca Sat Apr 5 11:03:00 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Apr 2003 11:03:06 -0800 (PST) Received: from mx03.cyberus.ca (mx03.cyberus.ca [216.191.240.24]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h35J2wDH029473 for ; Sat, 5 Apr 2003 11:03:00 -0800 Received: from shell.cyberus.ca ([216.191.240.114]) by mx03.cyberus.ca with esmtp (Exim 4.10) id 191swM-000Nr1-00; Sat, 05 Apr 2003 14:02:58 -0500 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h35J2Kqu073085; Sat, 5 Apr 2003 14:02:20 -0500 (EST) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h35J2JjG073082; Sat, 5 Apr 2003 14:02:19 -0500 (EST) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Sat, 5 Apr 2003 14:02:19 -0500 (EST) From: jamal To: bert hubert cc: netdev@oss.sgi.com Subject: Re: [fw@deneb.enyo.de: Route cache performance under stress] In-Reply-To: <20030405165016.GA32361@outpost.ds9a.nl> Message-ID: <20030405134350.N68419@shell.cyberus.ca> References: <20030405165016.GA32361@outpost.ds9a.nl> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2179 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 3529 Lines: 94 On Sat, 5 Apr 2003, bert hubert wrote: > Forwarded: > > ----- Forwarded message from Florian Weimer ----- > > To: linux-kernel@vger.kernel.org > Subject: Route cache performance under stress > From: Florian Weimer > Date: Sat, 05 Apr 2003 18:37:43 +0200 > X-Mailing-List: linux-kernel@vger.kernel.org > > Please read the following paper: > > > > Then look at the 2.4 route cache implementation. > > Short summary: It is possible to freeze machines with 1 GB of RAM and > more with a stream of 400 packets per second with carefully chosen > source addresses. Not good. > I dont think the author has done any testing actually at the rate they claim to have to - if they did they wouldnt be wording it as "carefully chosen source addresses". > The route cache is a DoS bottleneck in general (that's why I started > looking at it). Yes it is - but not using the reasons described above. > You have to apply rate-limits in the PREROUTING > chain, otherwise a modest packet flood will push the machine off the > network (even with truly random source addresses, not triggering hash > collisions). The route cache partially defeats the purpose of SYN > cookies, too, because the kernel keeps (transient) state for spoofed > connection attempts in the route cache. > I think two issues are being mixed here: One the dst cache and two the SYN attacks. The TCP SYNs are more vulnerable than dst cache and rate control of SYNs may remedy the issue. > The following patch can be applied in an emergency, if you face the > hash collision DoS attack. It drastically limits the size of the > cache (but not the bucket count), and decreases performance in some > applications, but > > --- route.c 2003/04/05 12:41:51 1.1 > +++ route.c 2003/04/05 12:42:42 > @@ -2508,8 +2508,8 @@ > rt_hash_table[i].chain = NULL; > } > > - ipv4_dst_ops.gc_thresh = (rt_hash_mask + 1); > - ip_rt_max_size = (rt_hash_mask + 1) * 16; > + ipv4_dst_ops.gc_thresh = 512; > + ip_rt_max_size = 2048; > And why could this not have been done in /proc? Is this supposed to cure something? > > I wonder why the route cache is needed at all for hosts which don't > forward any IP packets, and why it has to include the source addresses > and TOS (for policy-based routing, probably). Most hosts simply don't > face such complex routing decisions to make the cache a win. > > If you don't believe me, hook a Linux box to a packet generator > (generating packets with random source addresses) and use iptables to > drop the packets, in a first test run in the INPUT chain (after route > cache), and in a second one in the PREROUTING chain (before route > cache). I've observed an incredible difference (not in laboratory > tests, but during actual DoS attacks). > > Netfilter ip_conntrack support might have similar issues, but you > can't use it in a uncooperative environment anyway, at least in my > experience. (Note that there appears to be no way to disable > connection tracking while the code is in the kernel.) There are issues with dst cache no doubt. contracking on the other hand is appaling. In any case i think it is extremely dangerous to read some academic paper and start waving hands around about how it applies here. Do some tests and come up with data of where things need to be improved. Just pointing a finger at hashing is insufficient (infact i dont think hashing is the primary issue based on some experiments foo and i did) cheers, jamal From fw@deneb.enyo.de Sat Apr 5 14:55:54 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Apr 2003 14:56:06 -0800 (PST) Received: from mail.enyo.de (gw.enyo.de [212.9.189.178]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h35MtpDH000658 for ; Sat, 5 Apr 2003 14:55:53 -0800 Received: from [212.9.189.171] (helo=deneb.enyo.de) by mail.enyo.de with esmtp (Exim 3.34 #2) id 191wZe-0003NV-00 for netdev@oss.sgi.com; Sun, 06 Apr 2003 00:55:46 +0200 Received: from fw by deneb.enyo.de with local (Exim 3.34 #4) id 191wZe-0001pc-00 for netdev@oss.sgi.com; Sun, 06 Apr 2003 00:55:46 +0200 To: netdev@oss.sgi.com Subject: Re: [fw@deneb.enyo.de: Route cache performance under stress] From: Florian Weimer References: <20030405165016.GA32361@outpost.ds9a.nl> <20030405134350.N68419@shell.cyberus.ca> Date: Sun, 06 Apr 2003 00:55:46 +0200 In-Reply-To: <20030405134350.N68419@shell.cyberus.ca> (jamal's message of "Sat, 5 Apr 2003 14:02:19 -0500 (EST)") Message-ID: <873ckwftal.fsf@deneb.enyo.de> User-Agent: Gnus/5.090017 (Oort Gnus v0.17) Emacs/21.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2180 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fw@deneb.enyo.de Precedence: bulk X-list: netdev Content-Length: 2730 Lines: 78 jamal writes: >> Short summary: It is possible to freeze machines with 1 GB of RAM and >> more with a stream of 400 packets per second with carefully chosen >> source addresses. Not good. >> > > I dont think the author has done any testing actually at the rate they > claim to have to - if they did they wouldnt be wording it as "carefully > chosen source addresses". Why don't you ask the author the wording is unclear? >> The route cache is a DoS bottleneck in general (that's why I started >> looking at it). > > Yes it is - but not using the reasons described above. Have you actually read the paper? Do you understand its implications for the dst cache? > I think two issues are being mixed here: One the dst cache and two > the SYN attacks. The TCP SYNs are more vulnerable than dst cache > and rate control of SYNs may remedy the issue. Currently, the dst cache (which is a misnomer, as it includes the source address and TOS field) is not only a bottleneck, you can actually abuse it for DoS attacks. Some people told me that the general performance issues are rather well-known. Why aren't they being addressed? > And why could this not have been done in /proc? Ugh, thanks. I didn't notice that this part is actually tunable. > Is this supposed to cure something? Garbage collection is much more aggressive and the chains attached to the bucket are kept much shorter, so less CPU time is spent processing them. > In any case i think it is extremely dangerous to read some academic > paper Have you read it? I doubt it. > and start waving hands around about how it applies here. I discovered the paper *after* writing the DoS tool. I wrote the DoS tool *after* investigating why a server froze during a 2 Mbit/s SYN flood which was being dropped by an iptables rule (in the INPUT chain, admittedly). Please stop your ad hominem attacks. > Do some tests and come up with data of where things need to be > improved. I have already done this, and I think I have provided the necessary information to reproduce this. For obvious reasons, I don't want to release the DoS tool before a real fix is available. > Just pointing a finger at hashing is insufficient I'm not pointing a finger at hashing, but at hash collisions. > (infact i dont think hashing is the primary issue based on some > experiments foo and i did) Where can I read about your testing methods? There must be some flaw because reality looks quite different. Maybe you tested with non-random source addresses, or some "Internet mix" traffic. Such tests look fine on glossy paper, but you shouldn't assume that they tell anything about the robustness of networking devices in the presence of malicious traffic. From hadi@cyberus.ca Sat Apr 5 15:49:23 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Apr 2003 15:49:32 -0800 (PST) Received: from mx02.cyberus.ca (mx02.cyberus.ca [216.191.240.26]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h35NnMDH001277 for ; Sat, 5 Apr 2003 15:49:23 -0800 Received: from shell.cyberus.ca ([216.191.240.114]) by mx02.cyberus.ca with esmtp (Exim 4.10) id 191xPV-000Ary-00; Sat, 05 Apr 2003 18:49:21 -0500 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h35Nmhqu073545; Sat, 5 Apr 2003 18:48:43 -0500 (EST) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h35NmgWd073542; Sat, 5 Apr 2003 18:48:43 -0500 (EST) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Sat, 5 Apr 2003 18:48:42 -0500 (EST) From: jamal To: Florian Weimer cc: netdev@oss.sgi.com Subject: Re: [fw@deneb.enyo.de: Route cache performance under stress] In-Reply-To: <873ckwftal.fsf@deneb.enyo.de> Message-ID: <20030405180607.P68419@shell.cyberus.ca> References: <20030405165016.GA32361@outpost.ds9a.nl> <20030405134350.N68419@shell.cyberus.ca> <873ckwftal.fsf@deneb.enyo.de> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2181 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 4033 Lines: 122 On Sun, 6 Apr 2003, Florian Weimer wrote: > jamal writes: > > Why don't you ask the author the wording is unclear? I meant whoever said that 400pps would cause a DOS. I didnt see the dst cache test being described in the source, so i assume it is someone else other than people who wrote the tool. > > > Yes it is - but not using the reasons described above. > > Have you actually read the paper? Do you understand its implications > for the dst cache? I skimmed through it and got their message. Yes, i understand the implications ;-> > > > I think two issues are being mixed here: One the dst cache and two > > the SYN attacks. The TCP SYNs are more vulnerable than dst cache > > and rate control of SYNs may remedy the issue. > > Currently, the dst cache (which is a misnomer, as it includes the > source address and TOS field) is not only a bottleneck, you can > actually abuse it for DoS attacks. > yes you can. > Some people told me that the general performance issues are rather > well-known. Why aren't they being addressed? > "Addressed" is a strong word but certainly they are being looked into (for some time now). If you are enthusiastic and want to help, send private mail to me. > > Is this supposed to cure something? > > Garbage collection is much more aggressive and the chains attached to > the bucket are kept much shorter, so less CPU time is spent processing > them. You may find that aggressive gc is one of your problems infact. > > > In any case i think it is extremely dangerous to read some academic > > paper > > Have you read it? I doubt it. > The skimming was good enough to get the mesage. I'll read it in more details later after killing a small branch. > > and start waving hands around about how it applies here. > > I discovered the paper *after* writing the DoS tool. > > I wrote the DoS tool *after* investigating why a server froze during a > 2 Mbit/s SYN flood which was being dropped by an iptables rule (in the > INPUT chain, admittedly). > I dont see the correlation of syn attacks and the dst cache in your description. Can you collect some profiles? 400pps is peanuts for the dst cache even on a 386. OTOH, this may be an issue for a SYN DOS. > Please stop your ad hominem attacks. > Relax. > > Do some tests and come up with data of where things need to be > > improved. > > I have already done this, and I think I have provided the necessary > information to reproduce this. For obvious reasons, I don't want to > release the DoS tool before a real fix is available. > There are a lot of tools already being used by kiddies out of there but its a good idea not to arm them with one more. Please collect some profiles and send them privately. > > Just pointing a finger at hashing is insufficient > > I'm not pointing a finger at hashing, but at hash collisions. > I know thats what the paper says - but this is exactly what i have problems with: In the little study we did, its not the collisions that kill us rather the fact we are being forced into the slow path the majority of times. Please collect the profiles and send me the tool as well. > > (infact i dont think hashing is the primary issue based on some > > experiments foo and i did) > > Where can I read about your testing methods? There must be some flaw > because reality looks quite different. > > Maybe you tested with non-random source addresses, or some "Internet > mix" traffic. Such tests look fine on glossy paper, but you shouldn't > assume that they tell anything about the robustness of networking > devices in the presence of malicious traffic. Actually try varying the dst address, it gets more interesting. Our data was collected on a real ISP which hosts a lot of web servers and was being constantly DOSed. I dont think you can get more real world than that. Talk to me privately about our tests - i am a little conservative about wowing people with results without doing appropriate analysis. It is possible you hit a different unrelated issue. cheers, jamal From scott.feldman@intel.com Sat Apr 5 22:34:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 05 Apr 2003 22:34:55 -0800 (PST) Received: from hermes.fm.intel.com (fmr01.intel.com [192.55.52.18]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h366YiDH010666 for ; Sat, 5 Apr 2003 22:34:45 -0800 Received: from petasus.fm.intel.com (petasus.fm.intel.com [10.1.192.37]) by hermes.fm.intel.com (8.11.6p2/8.11.6/d: outer.mc,v 1.51 2002/09/23 20:43:23 dmccart Exp $) with ESMTP id h366V2g01114 for ; Sun, 6 Apr 2003 06:31:02 GMT Received: from fmsmsxvs043.fm.intel.com (fmsmsxvs043.fm.intel.com [132.233.42.129]) by petasus.fm.intel.com (8.11.6p2/8.11.6/d: inner.mc,v 1.28 2003/01/13 19:44:39 dmccart Exp $) with SMTP id h366SnO12694 for ; Sun, 6 Apr 2003 06:28:49 GMT Received: from [134.134.3.166] ([134.134.3.166]) by fmsmsxvs043.fm.intel.com (NAVGW 2.5.2.11) with SMTP id M2003040522323906737 ; Sat, 05 Apr 2003 22:32:39 -0800 Date: Sat, 5 Apr 2003 22:24:20 -0800 (PST) From: Scott Feldman X-X-Sender: scott.feldman@localhost.localdomain To: Andrew Morton cc: netdev@oss.sgi.com Subject: Re: e100: "Freeing alive device f7dd8000, eth%d" In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2182 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev Content-Length: 1083 Lines: 37 On Thu, 3 Apr 2003, Andrew Morton wrote: > This message comes out all the time when e100 is being brought up. [cut] > I'm not sure what the right fix is here - perhaps the driver just > shouldn't be playing with link state at all in the probe handler, and > this should actually happen in the open() routine. This should do the trick, but I'd like to get some testing on it in the QA lab before giving thumbs up. -scott --- linux-2.5.66/drivers/net/e100/e100_phy.c.orig Sat Apr 5 21:57:42 2003 +++ linux-2.5.66/drivers/net/e100/e100_phy.c Sat Apr 5 22:00:44 2003 @@ -995,14 +995,13 @@ { unsigned char link; - /* Logical AND PHY link & netif_running */ - link = e100_get_link_state(bdp) && netif_running(bdp->device); + link = e100_get_link_state(bdp); if (link) { - if (!netif_carrier_ok(bdp->device)) + if(!netif_carrier_ok(bdp->device) && netif_running(bdp->device)) netif_carrier_on(bdp->device); } else { - if (netif_carrier_ok(bdp->device)) + if(netif_carrier_ok(bdp->device) && netif_running(bdp->device)) netif_carrier_off(bdp->device); } From fw@deneb.enyo.de Sun Apr 6 05:09:03 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Apr 2003 05:09:13 -0700 (PDT) Received: from mail.enyo.de (gw.enyo.de [212.9.189.178]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h36C91DH018334 for ; Sun, 6 Apr 2003 05:09:03 -0700 Received: from [212.9.189.171] (helo=deneb.enyo.de) by mail.enyo.de with esmtp (Exim 3.34 #2) id 1928x9-0004JW-00; Sun, 06 Apr 2003 14:08:51 +0200 Received: from fw by deneb.enyo.de with local (Exim 3.34 #4) id 1928x9-0000dw-00; Sun, 06 Apr 2003 14:08:51 +0200 To: jamal Cc: netdev@oss.sgi.com Subject: Re: [fw@deneb.enyo.de: Route cache performance under stress] From: Florian Weimer References: <20030405165016.GA32361@outpost.ds9a.nl> <20030405134350.N68419@shell.cyberus.ca> <873ckwftal.fsf@deneb.enyo.de> <20030405180607.P68419@shell.cyberus.ca> Date: Sun, 06 Apr 2003 14:08:51 +0200 In-Reply-To: <20030405180607.P68419@shell.cyberus.ca> (jamal's message of "Sat, 5 Apr 2003 18:48:42 -0500 (EST)") Message-ID: <87n0j3ltf0.fsf@deneb.enyo.de> User-Agent: Gnus/5.090017 (Oort Gnus v0.17) Emacs/21.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2183 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fw@deneb.enyo.de Precedence: bulk X-list: netdev Content-Length: 2083 Lines: 55 jamal writes: > I meant whoever said that 400pps would cause a DOS. I didnt see the dst > cache test being described in the source, so i assume it is someone else > other than people who wrote the tool. Ah, I see. I'm sorry for the confusion. > I skimmed through it and got their message. Yes, i understand the > implications ;-> Good! 8-) >> > Is this supposed to cure something? >> >> Garbage collection is much more aggressive and the chains attached to >> the bucket are kept much shorter, so less CPU time is spent processing >> them. > > You may find that aggressive gc is one of your problems infact. I don't think so. During a DoS attack with spoofed source addresses, the dst cache quickly fills up, and the overwhelming majority of the entries is useless (they won't be used again). The slabinfo line looks like this: ip_dst_cache 116477 131080 192 6554 6554 1 There are only 8192 hash buckets on this system, and if we assume that the entries are uniformly distributed over the buckets (which is not necessarily true), the code in ip_route_input() has to look at 14 or 15 cache entries before the miss is detected. I can hardly see how this is efficient. > I dont see the correlation of syn attacks and the dst cache in your > description. Can you collect some profiles? On the machine above, the dst cache has 2**17 entries. Imagine what happens if all these entries are chained to the same bucket, and the chain has to be traversed for each packet. > I know thats what the paper says - but this is exactly what i have > problems with: In the little study we did, its not the collisions that > kill us rather the fact we are being forced into the slow path the > majority of times. Please collect the profiles and send me the tool as > well. Okay, I'm going to do this (if I can figure out how to read the profiling data). > Our data was collected on a real ISP which hosts a lot of web > servers and was being constantly DOSed. I dont think you can get > more real world than that. Did you look at a router, or at a host? From hadi@cyberus.ca Sun Apr 6 08:15:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Apr 2003 08:15:43 -0700 (PDT) Received: from mx01.cyberus.ca (mx01.cyberus.ca [216.191.240.22]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h36FFWDH020100 for ; Sun, 6 Apr 2003 08:15:35 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx01.cyberus.ca with esmtp (Exim 4.10) id 192Brl-00086d-00; Sun, 06 Apr 2003 11:15:29 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h36FEoqu075492; Sun, 6 Apr 2003 11:14:50 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h36FEo03075489; Sun, 6 Apr 2003 11:14:50 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Sun, 6 Apr 2003 11:14:50 -0400 (EDT) From: jamal To: Florian Weimer cc: netdev@oss.sgi.com Subject: Re: [fw@deneb.enyo.de: Route cache performance under stress] In-Reply-To: <87n0j3ltf0.fsf@deneb.enyo.de> Message-ID: <20030406110728.G68419@shell.cyberus.ca> References: <20030405165016.GA32361@outpost.ds9a.nl> <20030405134350.N68419@shell.cyberus.ca> <873ckwftal.fsf@deneb.enyo.de> <20030405180607.P68419@shell.cyberus.ca> <87n0j3ltf0.fsf@deneb.enyo.de> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2184 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 1775 Lines: 48 On Sun, 6 Apr 2003, Florian Weimer wrote: > > You may find that aggressive gc is one of your problems infact. > > I don't think so. During a DoS attack with spoofed source addresses, > the dst cache quickly fills up, and the overwhelming majority of the > entries is useless (they won't be used again). The slabinfo line > looks like this: > > ip_dst_cache 116477 131080 192 6554 6554 1 > > There are only 8192 hash buckets on this system, and if we assume that > the entries are uniformly distributed over the buckets (which is not > necessarily true), the code in ip_route_input() has to look at 14 or > 15 cache entries before the miss is detected. I can hardly see how > this is efficient. > Do: cat /proc/net/rt_cache_stat Should give us a lot more info. > > I dont see the correlation of syn attacks and the dst cache in your > > description. Can you collect some profiles? > > On the machine above, the dst cache has 2**17 entries. Imagine what > happens if all these entries are chained to the same bucket, and the > chain has to be traversed for each packet. Yes, in that (worse case) scenario, you have two effects one of walking a lot of elements before finding you have a cache miss and then being forced into a slow path after all that pain. The cache miss is not as expensive compared to the slow path execution. Youd have to walk a lot entries to get the same effect as being forced one time into slow path. Again, this is my qualm with the papers general pov. > > Our data was collected on a real ISP which hosts a lot of web > > servers and was being constantly DOSed. I dont think you can get > > more real world than that. > > Did you look at a router, or at a host? As a router, but the hash compute shouldnt matter. cheers, jamal From jmorris@intercode.com.au Sun Apr 6 09:35:32 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Apr 2003 09:35:37 -0700 (PDT) Received: from blackbird.intercode.com.au (IDENT:root@blackbird.intercode.com.au [203.32.101.10]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h36GZSDH020952 for ; Sun, 6 Apr 2003 09:35:30 -0700 Received: from localhost (jmorris@localhost) by blackbird.intercode.com.au (8.11.6p2/8.9.3) with ESMTP id h36GYY726428; Mon, 7 Apr 2003 02:34:35 +1000 Date: Mon, 7 Apr 2003 02:34:34 +1000 (EST) From: James Morris To: "David S. Miller" cc: kuznet@ms2.inr.ac.ru, Jeff Garzik , Subject: [PATCH] skb_headlen() cleanup Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2185 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@intercode.com.au Precedence: bulk X-list: netdev Content-Length: 8537 Lines: 258 A few bits of code in the drivers and networking are using: skb->len - skb->data_len which is what skb_headlen() calculates. The patch below (against recent 2.5 bk) converts these to use skb_headlen(). drivers/net/8139cp.c | 2 +- drivers/net/acenic.c | 2 +- drivers/net/e100/e100_main.c | 4 ++-- drivers/net/sungem.c | 2 +- drivers/net/sunhme.c | 2 +- drivers/net/tg3.c | 12 ++++++------ drivers/net/typhoon.c | 2 +- net/core/datagram.c | 4 ++-- net/core/skbuff.c | 10 +++++----- net/ipv4/tcp_output.c | 2 +- net/xfrm/xfrm_algo.c | 4 ++-- 11 files changed, 23 insertions(+), 23 deletions(-) - James -- James Morris diff -urN -X dontdiff bk.pending/drivers/net/8139cp.c bk.w2/drivers/net/8139cp.c --- bk.pending/drivers/net/8139cp.c Fri Apr 4 12:30:30 2003 +++ bk.w2/drivers/net/8139cp.c Mon Apr 7 02:01:10 2003 @@ -826,7 +826,7 @@ * Otherwise we could race with the device. */ first_eor = eor; - first_len = skb->len - skb->data_len; + first_len = skb_headlen(skb); first_mapping = pci_map_single(cp->pdev, skb->data, first_len, PCI_DMA_TODEVICE); cp->tx_skb[entry].skb = skb; diff -urN -X dontdiff bk.pending/drivers/net/acenic.c bk.w2/drivers/net/acenic.c --- bk.pending/drivers/net/acenic.c Fri Apr 4 12:30:30 2003 +++ bk.w2/drivers/net/acenic.c Mon Apr 7 02:04:17 2003 @@ -2829,7 +2829,7 @@ int i, len = 0; mapping = ace_map_tx_skb(ap, skb, NULL, idx); - flagsize = ((skb->len - skb->data_len) << 16); + flagsize = (skb_headlen(skb) << 16); if (skb->ip_summed == CHECKSUM_HW) flagsize |= BD_FLG_TCP_UDP_SUM; #if ACENIC_DO_VLAN diff -urN -X dontdiff bk.pending/drivers/net/e100/e100_main.c bk.w2/drivers/net/e100/e100_main.c --- bk.pending/drivers/net/e100/e100_main.c Fri Apr 4 12:30:33 2003 +++ bk.w2/drivers/net/e100/e100_main.c Mon Apr 7 02:00:24 2003 @@ -2199,10 +2199,10 @@ (tcb->tbd_ptr)->tbd_buf_addr = cpu_to_le32(pci_map_single(bdp->pdev, skb->data, - (skb->len - skb->data_len), + skb_headlen(skb), PCI_DMA_TODEVICE)); (tcb->tbd_ptr)->tbd_buf_cnt = - cpu_to_le16(skb->len - skb->data_len); + cpu_to_le16(skb_headlen(skb)); for (i = 0; i < skb_shinfo(skb)->nr_frags; i++, tbd_arr_ptr++, frag++) { diff -urN -X dontdiff bk.pending/drivers/net/sungem.c bk.w2/drivers/net/sungem.c --- bk.pending/drivers/net/sungem.c Fri Apr 4 12:30:33 2003 +++ bk.w2/drivers/net/sungem.c Mon Apr 7 02:02:18 2003 @@ -894,7 +894,7 @@ /* We must give this initial chunk to the device last. * Otherwise we could race with the device. */ - first_len = skb->len - skb->data_len; + first_len = skb_headlen(skb); first_mapping = pci_map_page(gp->pdev, virt_to_page(skb->data), ((unsigned long) skb->data & ~PAGE_MASK), first_len, PCI_DMA_TODEVICE); diff -urN -X dontdiff bk.pending/drivers/net/sunhme.c bk.w2/drivers/net/sunhme.c --- bk.pending/drivers/net/sunhme.c Fri Apr 4 12:30:33 2003 +++ bk.w2/drivers/net/sunhme.c Mon Apr 7 02:02:31 2003 @@ -2319,7 +2319,7 @@ /* We must give this initial chunk to the device last. * Otherwise we could race with the device. */ - first_len = skb->len - skb->data_len; + first_len = skb_headlen(skb); first_mapping = hme_dma_map(hp, skb->data, first_len, DMA_TODEVICE); entry = NEXT_TX(entry); diff -urN -X dontdiff bk.pending/drivers/net/tg3.c bk.w2/drivers/net/tg3.c --- bk.pending/drivers/net/tg3.c Fri Apr 4 12:30:33 2003 +++ bk.w2/drivers/net/tg3.c Mon Apr 7 02:03:25 2003 @@ -1751,7 +1751,7 @@ pci_unmap_single(tp->pdev, pci_unmap_addr(ri, mapping), - (skb->len - skb->data_len), + skb_headlen(skb), PCI_DMA_TODEVICE); ri->skb = NULL; @@ -2316,7 +2316,7 @@ int len; if (i == 0) - len = skb->len - skb->data_len; + len = skb_headlen(skb); else len = skb_shinfo(skb)->frags[i-1].size; pci_unmap_single(tp->pdev, @@ -2401,7 +2401,7 @@ int would_hit_hwbug; unsigned long flags; - len = (skb->len - skb->data_len); + len = skb_headlen(skb); /* No BH disabling for tx_lock here. We are running in BH disabled * context and TX reclaim runs via tp->poll inside of a software @@ -2520,7 +2520,7 @@ i = 0; while (entry != last_plus_one) { if (i == 0) - len = skb->len - skb->data_len; + len = skb_headlen(skb); else len = skb_shinfo(skb)->frags[i-1].size; @@ -2593,7 +2593,7 @@ u32 len, entry, base_flags, mss; unsigned long flags; - len = (skb->len - skb->data_len); + len = skb_headlen(skb); /* No BH disabling for tx_lock here. We are running in BH disabled * context and TX reclaim runs via tp->poll inside of a software @@ -2829,7 +2829,7 @@ pci_unmap_single(tp->pdev, pci_unmap_addr(txp, mapping), - (skb->len - skb->data_len), + skb_headlen(skb), PCI_DMA_TODEVICE); txp->skb = NULL; diff -urN -X dontdiff bk.pending/drivers/net/typhoon.c bk.w2/drivers/net/typhoon.c --- bk.pending/drivers/net/typhoon.c Fri Apr 4 12:30:33 2003 +++ bk.w2/drivers/net/typhoon.c Mon Apr 7 02:04:21 2003 @@ -844,7 +844,7 @@ } else { int i, len; - len = skb->len - skb->data_len; + len = skb_headlen(skb); skb_dma = pci_map_single(tp->tx_pdev, skb->data, len, PCI_DMA_TODEVICE); txd->flags = TYPHOON_FRAG_DESC | TYPHOON_DESC_VALID; diff -urN -X dontdiff bk.pending/net/core/datagram.c bk.w2/net/core/datagram.c --- bk.pending/net/core/datagram.c Fri Apr 4 12:31:09 2003 +++ bk.w2/net/core/datagram.c Mon Apr 7 02:05:40 2003 @@ -220,7 +220,7 @@ int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset, struct iovec *to, int len) { - int start = skb->len - skb->data_len; + int start = skb_headlen(skb); int i, copy = start - offset; /* Copy header. */ @@ -295,7 +295,7 @@ int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset, u8 *to, int len, unsigned int *csump) { - int start = skb->len - skb->data_len; + int start = skb_headlen(skb); int pos = 0; int i, copy = start - offset; diff -urN -X dontdiff bk.pending/net/core/skbuff.c bk.w2/net/core/skbuff.c --- bk.pending/net/core/skbuff.c Fri Apr 4 12:31:09 2003 +++ bk.w2/net/core/skbuff.c Mon Apr 7 02:06:02 2003 @@ -932,7 +932,7 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len) { int i, copy; - int start = skb->len - skb->data_len; + int start = skb_headlen(skb); if (offset > (int)skb->len - len) goto fault; @@ -1009,7 +1009,7 @@ unsigned int skb_checksum(const struct sk_buff *skb, int offset, int len, unsigned int csum) { - int start = skb->len - skb->data_len; + int start = skb_headlen(skb); int i, copy = start - offset; int pos = 0; @@ -1085,7 +1085,7 @@ unsigned int skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to, int len, unsigned int csum) { - int start = skb->len - skb->data_len; + int start = skb_headlen(skb); int i, copy = start - offset; int pos = 0; @@ -1170,9 +1170,9 @@ if (skb->ip_summed == CHECKSUM_HW) csstart = skb->h.raw - skb->data; else - csstart = skb->len - skb->data_len; + csstart = skb_headlen(skb); - if (csstart > skb->len - skb->data_len) + if (csstart > skb_headlen(skb)) BUG(); memcpy(to, skb->data, csstart); diff -urN -X dontdiff bk.pending/net/ipv4/tcp_output.c bk.w2/net/ipv4/tcp_output.c --- bk.pending/net/ipv4/tcp_output.c Fri Apr 4 12:31:10 2003 +++ bk.w2/net/ipv4/tcp_output.c Mon Apr 7 02:05:29 2003 @@ -354,7 +354,7 @@ static void skb_split(struct sk_buff *skb, struct sk_buff *skb1, u32 len) { int i; - int pos = skb->len - skb->data_len; + int pos = skb_headlen(skb); if (len < pos) { /* Split line is inside header. */ diff -urN -X dontdiff bk.pending/net/xfrm/xfrm_algo.c bk.w2/net/xfrm/xfrm_algo.c --- bk.pending/net/xfrm/xfrm_algo.c Fri Apr 4 12:31:11 2003 +++ bk.w2/net/xfrm/xfrm_algo.c Mon Apr 7 02:05:48 2003 @@ -445,7 +445,7 @@ void skb_icv_walk(const struct sk_buff *skb, struct crypto_tfm *tfm, int offset, int len, icv_update_fn_t icv_update) { - int start = skb->len - skb->data_len; + int start = skb_headlen(skb); int i, copy = start - offset; struct scatterlist sg; @@ -521,7 +521,7 @@ int skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len) { - int start = skb->len - skb->data_len; + int start = skb_headlen(skb); int i, copy = start - offset; int elt = 0; From fw@deneb.enyo.de Sun Apr 6 09:42:20 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Apr 2003 09:42:23 -0700 (PDT) Received: from mail.enyo.de (gw.enyo.de [212.9.189.178]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h36GgIDH021311 for ; Sun, 6 Apr 2003 09:42:19 -0700 Received: from [212.9.189.171] (helo=deneb.enyo.de) by mail.enyo.de with esmtp (Exim 3.34 #2) id 192DDf-0006nO-00; Sun, 06 Apr 2003 18:42:11 +0200 Received: from fw by deneb.enyo.de with local (Exim 3.34 #4) id 192DDf-0000WI-00; Sun, 06 Apr 2003 18:42:11 +0200 To: jamal Cc: netdev@oss.sgi.com Subject: Re: [fw@deneb.enyo.de: Route cache performance under stress] From: Florian Weimer Date: Sun, 06 Apr 2003 18:42:11 +0200 In-Reply-To: <20030406110728.G68419@shell.cyberus.ca> (jamal's message of "Sun, 6 Apr 2003 11:14:50 -0400 (EDT)") Message-ID: <87wui71st8.fsf@deneb.enyo.de> User-Agent: Gnus/5.090017 (Oort Gnus v0.17) Emacs/21.2 (gnu/linux) References: <20030405165016.GA32361@outpost.ds9a.nl> <20030405134350.N68419@shell.cyberus.ca> <873ckwftal.fsf@deneb.enyo.de> <20030405180607.P68419@shell.cyberus.ca> <87n0j3ltf0.fsf@deneb.enyo.de> <20030406110728.G68419@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2186 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fw@deneb.enyo.de Precedence: bulk X-list: netdev Content-Length: 510 Lines: 17 jamal writes: > cat /proc/net/rt_cache_stat > Should give us a lot more info. I'll try to obtain the data points you requested. >> > Our data was collected on a real ISP which hosts a lot of web >> > servers and was being constantly DOSed. I dont think you can get >> > more real world than that. >> >> Did you look at a router, or at a host? > > As a router, but the hash compute shouldnt matter. Slow path ist faster on hosts than on routers which substantial routing tables, isn't it? From Robert.Olsson@data.slu.se Sun Apr 6 10:10:26 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 06 Apr 2003 10:10:49 -0700 (PDT) Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h36HAPDH021786 for ; Sun, 6 Apr 2003 10:10:26 -0700 Received: (from robert@localhost) by robur.slu.se (8.9.3p2/8.9.3) id TAA10232; Sun, 6 Apr 2003 19:20:56 +0200 From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16016.25080.233350.191885@robur.slu.se> Date: Sun, 6 Apr 2003 19:20:56 +0200 To: Florian Weimer Cc: jamal , netdev@oss.sgi.com Subject: Re: [fw@deneb.enyo.de: Route cache performance under stress] In-Reply-To: <87wui71st8.fsf@deneb.enyo.de> References: <20030405165016.GA32361@outpost.ds9a.nl> <20030405134350.N68419@shell.cyberus.ca> <873ckwftal.fsf@deneb.enyo.de> <20030405180607.P68419@shell.cyberus.ca> <87n0j3ltf0.fsf@deneb.enyo.de> <20030406110728.G68419@shell.cyberus.ca> <87wui71st8.fsf@deneb.enyo.de> X-Mailer: VM 6.92 under Emacs 19.34.1 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2187 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Content-Length: 321 Lines: 16 Florian Weimer writes: > jamal writes: > > > cat /proc/net/rt_cache_stat > > Should give us a lot more info. You can use rtstat to read it. robur.slu.se: /pub/Linux/net-development/rt_cache_stat/rtstat.c It's in iproute2 package too but it seems to be an older version. Cheers. -ro From davem@redhat.com Mon Apr 7 00:04:58 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Apr 2003 00:05:03 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h3774tDH031661 for ; Mon, 7 Apr 2003 00:04:56 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA15462; Sun, 6 Apr 2003 23:58:58 -0700 Date: Sun, 06 Apr 2003 23:58:58 -0700 (PDT) Message-Id: <20030406.235858.74068211.davem@redhat.com> To: jmorris@intercode.com.au Cc: kuznet@ms2.inr.ac.ru, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [PATCH] skb_headlen() cleanup From: "David S. Miller" In-Reply-To: References: X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2188 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 355 Lines: 13 From: James Morris Date: Mon, 7 Apr 2003 02:34:34 +1000 (EST) A few bits of code in the drivers and networking are using: skb->len - skb->data_len which is what skb_headlen() calculates. The patch below (against recent 2.5 bk) converts these to use skb_headlen(). Applied, thanks James. From chris@txrx.org Mon Apr 7 07:52:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Apr 2003 07:52:29 -0700 (PDT) Received: from mailinbound.uhc.com (gw3.uhc.com [168.183.16.145]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h37EqNDH019602 for ; Mon, 7 Apr 2003 07:52:24 -0700 Received: from tinkerbell.uhc.com (tinkerbell.uhc.com [10.7.249.45]) by mailinbound.uhc.com (8.11.6/8.11.6) with ESMTP id h37EqMe25974 for ; Mon, 7 Apr 2003 09:52:22 -0500 Subject: identification field in ip datagrams From: Chris Brookes To: netdev@oss.sgi.com Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.8 (1.0.8-11) Date: 07 Apr 2003 09:52:22 -0500 Message-Id: <1049727143.13680.42.camel@tinkerbell.uhc.com> Mime-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2189 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chris@txrx.org Precedence: bulk X-list: netdev Content-Length: 3173 Lines: 85 Hello, I'm pre-testing the deployment of some Cisco 11000 series content switches which amongst other things will load balance a few million DNS queries per day. During the testing it appeared that the CSS device was correctly distributing UDP53 based queries between 2 real name servers for all tested client systems apart from ones running Linux. I did some investigating and it turns out Linux systems are putting out small IP datagrams that can't/won't fragment with the IP identification field set to zero. I looked through the relevant RFC and it seems to spend a lot of time describing how to use the identification field for handling datagram fragmentation, but has no advice for what to do with the field when the datagram won't fragment. I see from the kernel source that there's been an implementation decision to set the field to zero. Can we consider changing this? I've checked AIX, Solaris, OpenBSD and even some Windows TCP/IP stack implementations and they all pick a random number regardless of the datagram not fragmenting, so we'd be more in line with the "de facto behavior" for that scenario? I'm not much of a C programmer but in an effort to see whether fixing the ID field would solve my original problem, in the development kernel (2.5.66) I hacked net/ipv4/ip_output.c like this: --- ip_output.c.orig 2003-04-06 12:55:04.000000000 -0500 +++ ip_output.c 2003-04-06 12:56:10.000000000 -0500 @@ -1142,11 +1142,7 @@ iph->tos = inet->tos; iph->tot_len = htons(skb->len); iph->frag_off = df; - if (!df) { - __ip_select_ident(iph, &rt->u.dst, 0); - } else { - iph->id = htons(inet->id++); - } + __ip_select_ident(iph, &rt->u.dst, 0); iph->ttl = ttl; iph->protocol = sk->protocol; iph->saddr = rt->rt_src; And that did fix my issue for those development kernels. On the 2.4.21 series, I changed include/net/ip.h like this: --- ip.h.orig 2003-04-07 09:42:37.000000000 -0500 +++ ip.h 2003-04-06 22:42:35.000000000 -0500 @@ -190,18 +190,9 @@ static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, struct sock *sk) { - if (iph->frag_off&__constant_htons(IP_DF)) { - /* This is only to work around buggy Windows95/2000 - * VJ compression implementations. If the ID field - * does not change, they drop every other packet in - * a TCP stream using header compression. - */ - iph->id = ((sk && sk->daddr) ? htons(sk->protinfo.af_inet.id++) : 0); - } else - __ip_select_ident(iph, dst); + __ip_select_ident(iph, dst); } - /* * Map a multicast IP onto multicast MAC for type ethernet. */ And again, that did seem to give the small datagrams good identification fields. I expect if anyone was going to change the implementation to give all datagrams identification fields, they'd want to do the patch themselves ;-) but in the meantime, is what I've done likely to negatively impact anything else? Regards Chris Brookes From srompf@isg.de Mon Apr 7 09:48:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Apr 2003 09:48:41 -0700 (PDT) Received: from mail.isg.de (rzfoobar.is-asp.com [217.11.194.155]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h37GmYDH023554 for ; Mon, 7 Apr 2003 09:48:35 -0700 Received: from isg.de (Bd04d.pppool.de [213.7.208.77]) by mail.isg.de (Postfix) with ESMTP id 395F511AFEBF; Mon, 7 Apr 2003 18:48:22 +0200 (CEST) Message-ID: <3E91AC1B.D914760B@isg.de> Date: Mon, 07 Apr 2003 18:49:31 +0200 From: Stefan Rompf X-Mailer: Mozilla 4.79 [en] (X11; U; Linux 2.4.20 i686) X-Accept-Language: en MIME-Version: 1.0 To: Scott Feldman Cc: Andrew Morton , netdev@oss.sgi.com Subject: Re: e100: "Freeing alive device f7dd8000, eth%d" References: Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2190 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: srompf@isg.de Precedence: bulk X-list: netdev Content-Length: 471 Lines: 17 Hi, Scott Feldman wrote: > This should do the trick, but I'd like to get some testing on it in the QA > lab before giving thumbs up. [...] > + if(!netif_carrier_ok(bdp->device) && netif_running(bdp->device)) even though this will avoid the problem, I think it is the wrong solution: Your code is still calling operating system functions on a netdevice that has not been register_netdevice()d yet. This will invite problems of all kind. Cheers, Stefan From niv@us.ibm.com Mon Apr 7 13:53:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Apr 2003 13:53:53 -0700 (PDT) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.12.3/8.12.5) with SMTP id h37KrcfH008813 for ; Mon, 7 Apr 2003 13:53:45 -0700 Received: from westrelay05.boulder.ibm.com (westrelay05.boulder.ibm.com [9.17.193.33]) by e35.co.us.ibm.com (8.12.9/8.12.2) with ESMTP id h37KrNs5099972; Mon, 7 Apr 2003 16:53:23 -0400 Received: from w-nivedita.beaverton.ibm.com (d03av01.boulder.ibm.com [9.17.193.81]) by westrelay05.boulder.ibm.com (8.12.8/NCO/VER6.5) with ESMTP id h37KrGAM125818; Mon, 7 Apr 2003 14:53:17 -0600 Date: Mon, 7 Apr 2003 13:53:16 -0700 (PDT) From: Nivedita Singhvi X-X-Sender: nivedita@w-nivedita.beaverton.ibm.com To: David Miller cc: netdev@oss.sgi.com, Randy Dunlap Subject: [Patch 2.5.65+] missing SNMP stats Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2191 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 3064 Lines: 96 This patch provides support for those SNMP TCP counters currently not supported: RtoAlgorithm RtoMin RtoMax MaxConn EstabResets Randy (Dunlap) worked up his own patch and this is a merge of his and mine which I had done a while back with Mark Price which I had cleaned up but not resubmitted yet. (Thanks, Randy) thanks, Nivedita diff -urN linux-2.5.65/include/net/tcp.h linux-2.5.65mibp/include/net/tcp.h --- linux-2.5.65/include/net/tcp.h Mon Mar 17 13:43:41 2003 +++ linux-2.5.65mibp/include/net/tcp.h Fri Apr 4 12:04:59 2003 @@ -31,6 +31,7 @@ #include #include #include +#include #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) #include #endif @@ -639,6 +640,8 @@ #define TCP_INC_STATS_BH(field) SNMP_INC_STATS_BH(tcp_statistics, field) #define TCP_INC_STATS_USER(field) SNMP_INC_STATS_USER(tcp_statistics, field) #define TCP_DEC_STATS(field) SNMP_DEC_STATS(tcp_statistics, field) +#define TCP_ADD_STATS_BH(field, val) SNMP_ADD_STATS_BH(tcp_statistics, field, val) +#define TCP_ADD_STATS_USER(field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val) extern __inline__ void tcp_put_port(struct sock *sk); extern void tcp_inherit_port(struct sock *sk, struct sock *child); @@ -1397,6 +1400,9 @@ break; case TCP_CLOSE: + if (oldstate == TCP_CLOSE_WAIT || oldstate == TCP_ESTABLISHED) + TCP_INC_STATS(TcpEstabResets); + sk->prot->unhash(sk); if (sk->prev && !(sk->userlocks&SOCK_BINDPORT_LOCK)) tcp_put_port(sk); @@ -1877,4 +1883,13 @@ tp->snd_una + tp->snd_wnd)); } +static inline void tcp_mib_init(void) +{ + /* See RFC 2012 */ + TCP_ADD_STATS_USER(TcpRtoAlgorithm, 1); + TCP_ADD_STATS_USER(TcpRtoMin, TCP_RTO_MIN*1000/HZ); + TCP_ADD_STATS_USER(TcpRtoMax, TCP_RTO_MAX*1000/HZ); + TCP_ADD_STATS_USER(TcpMaxConn, -1); +} + #endif /* _TCP_H */ diff -urN linux-2.5.65/net/ipv4/af_inet.c linux-2.5.65mibp/net/ipv4/af_inet.c --- linux-2.5.65/net/ipv4/af_inet.c Mon Mar 17 13:43:42 2003 +++ linux-2.5.65mibp/net/ipv4/af_inet.c Fri Apr 4 11:34:38 2003 @@ -1110,6 +1110,8 @@ } } + (void) tcp_mib_init(); + return 0; } diff -urN linux-2.5.65/net/ipv4/proc.c linux-2.5.65mibp/net/ipv4/proc.c --- linux-2.5.65/net/ipv4/proc.c Fri Apr 4 12:27:06 2003 +++ linux-2.5.65mibp/net/ipv4/proc.c Mon Apr 7 10:26:34 2003 @@ -143,9 +143,15 @@ "InSegs OutSegs RetransSegs InErrs OutRsts\nTcp:"); for (i = 0; - i < offsetof(struct tcp_mib, __pad) / sizeof(unsigned long); i++) - seq_printf(seq, " %lu", - fold_field((void **) tcp_statistics, i)); + i < offsetof(struct tcp_mib, __pad) / sizeof(unsigned long); i++) { + if (i == (offsetof(struct tcp_mib, TcpMaxConn) / sizeof(unsigned long))) + /* MaxConn field is negative, RFC 2012 */ + seq_printf(seq, " %ld", + fold_field((void **) tcp_statistics, i)); + else + seq_printf(seq, " %lu", + fold_field((void **) tcp_statistics, i)); + } seq_printf(seq, "\nUdp: InDatagrams NoPorts InErrors OutDatagrams\n" "Udp:"); From davem@redhat.com Mon Apr 7 22:08:22 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 07 Apr 2003 22:08:31 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3858LFu029103 for ; Mon, 7 Apr 2003 22:08:22 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id WAA17538; Mon, 7 Apr 2003 22:02:51 -0700 Date: Mon, 07 Apr 2003 22:02:50 -0700 (PDT) Message-Id: <20030407.220250.00554166.davem@redhat.com> To: niv@us.ibm.com Cc: netdev@oss.sgi.com, rddunlap@osdl.org Subject: Re: [Patch 2.5.65+] missing SNMP stats From: "David S. Miller" In-Reply-To: References: X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2192 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 310 Lines: 10 From: Nivedita Singhvi Date: Mon, 7 Apr 2003 13:53:16 -0700 (PDT) This patch provides support for those SNMP TCP counters currently not supported: Applied, thanks a lot. Could one of you two be so kind as to submit a 2.4.x variant of this patch? This fix belongs in 2.4.x From lda@skarven.net Tue Apr 8 10:22:19 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Apr 2003 10:22:29 -0700 (PDT) Received: from skarven.net (host-65-122-61-34.winux.com [65.122.61.34] (may be forged)) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h38HMBFu024659 for ; Tue, 8 Apr 2003 10:22:12 -0700 Received: from fwi0.skarven.net ([192.168.136.2] helo=skarven.net) by skarven.net with esmtp (Exim 4.05) id 192wnL-0008Fv-00; Tue, 08 Apr 2003 13:22:03 -0400 Received: from lda by skarven.net with local (Exim 4.12) id 192wkm-00037t-00; Tue, 08 Apr 2003 13:19:24 -0400 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Q3zDsRpNtQ" Content-Transfer-Encoding: 7bit Message-ID: <16019.1179.697600.659029@eagle.skarven.net> Date: Tue, 8 Apr 2003 13:19:23 -0400 To: netdev@oss.sgi.com From: lkml@winux.com Cc: "David S. Miller" , Alexey Kuznetsov Subject: sequence number problem with zero length window size X-Mailer: VM 7.04 under 21.5 (beta11) "cabbage" XEmacs Lucid X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2194 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lkml@winux.com Precedence: bulk X-list: netdev Content-Length: 1086525 Lines: 14906 --Q3zDsRpNtQ Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit I think I found a problem with IPv4/TCP sequence numbers when the window length goes to zero. This IS NOT the problem I'm reporting: We send data to a client that we believe has a problem. It acks packets but doesn't open the window size. Eventually, the window size goes to zero. This IS the problem I'm reporting: When the window size goes to zero, the sender (Linux 2.4.19) sends a packet with the wrong sequence number. In the attached trace, see packets starting at number 5470, time stamp 695.453571. Here the client acks for sequence number ....741 but the sender then sends a packet with sequence number ...740. Looks like a bug. Larry --Q3zDsRpNtQ Content-Type: application/octet-stream Content-Disposition: attachment; filename="trace2" Content-Transfer-Encoding: base64 1MOyoQIABAAAAAAAAAAAAAAoAAABAAAAO/CSPuMdAACCAAAAggAAAAAH6QoWXAACs50B5AgA RRAAdPXNQABABkdoQXo9KEF6PSIAFpFpYFEOOGAhpQaAGCrAanQAAAEBCApANqc4CR2z2wjV ZUIC4ptFqkk+2vru38leAdVQfa7J3+F3UyWHtyyjuebeyf4j3TPWmUqHZjVfVKaI9jXB7knv YF+U697hLvk78JI+EiIAAEIAAABCAAAAAAKznQHkAAfpChZcCABFEAA0v/1AAD4Gf3hBej0i QXo9KJFpABZgIaUGYFEOeIAQSYiGHQAAAQEICgkds9xANqc4PfCSPlWNBgBCAAAAQgAAAAAC s50B5AAH6QoWXAgARQAANJlQQAA/BqU1QXo9IkF6PSiTKBtYjYrZQS3RJHCAEBbQIc8AAAEB CAoNQ7qhAEIRKz3wkj6ZxgYAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVCEAAfQZrfUF6 PShBej0iG1iTKC3RJHCNitlCgBAAADhdAAABAQgKAEIRbA1DuqFJ8JI+NyIJAEoAAABKAAAA AAKznQHkAAfpChZcCABFAAA8Oi9AAD8GBE9Bej0iQXo9KJUPG1gYjIVOAAAAAKACFtAZEgAA AgQFtAQCCAoNQ79hAAAAAAEDAwBJ8JI+k1wJAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABA lQlAAH0Ga3BBej0oQXo9IhtYlQ90egQfGIyFT7AS+vB3NQAAAgQFZAEDAwABAQgKAAAAAAAA AAABAQQCSfCSPvtdCQBCAAAAQgAAAAACs50B5AAH6QoWXAgARQAANDowQAA/BgRWQXo9IkF6 PSiVDxtYGIyFT3R6BCCAEBbQzyoAAAEBCAoNQ79jAAAAAEnwkj55XgkAbgAAAG4AAAAAArOd AeQAB+kKFlwIAEUAAGA6MUAAPwYEKUF6PSJBej0olQ8bWBiMhU90egQggBgW0B4UAAABAQgK DUO/YwAAAAAxfDE0NzIyNTd8MTA0OTgxNzE2MnwxLjB8MXwyOTY0fGhlbGxvIHdvcmxkCknw kj6vfQwAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVCkAAfQZre0F6PShBej0iG1iVD3R6 BCAYjIV7gBD6xNjeAAABAQgKAEIR6Q1Dv2NJ8JI+0H8MAMgBAADIAQAAAAKznQHkAAfpChZc CABFAAG6OjJAAD8GAs5Bej0iQXo9KJUPG1gYjIV7dHoEIIAYFtDUKAAAAQEICg1Dv3cAQhHp MnwxNDcyMjU4fDEwNDk4MTcxNjN8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCjN8MTQ3MjI1OXwx MDQ5ODE3MTY0fDEuMHwxfDY1MXxoZWxsbyB3b3JsZAo0fDE0NzIyNjB8MTA0OTgxNzE2NXwx LjB8MXw2NTR8aGVsbG8gd29ybGQKNXwxNDcyMjYxfDEwNDk4MTcxNjV8MS4wfDF8NjU0fGhl bGxvIHdvcmxkCjZ8MTQ3MjI2MnwxMDQ5ODE3MTY1fDEuMHwxfDE2MHxoZWxsbyB3b3JsZAo3 fDE0NzIyNjN8MTA0OTgxNzE2NXwxLjB8MXwzMjd8aGVsbG8gd29ybGQKOHwxNDcyMjY0fDEw NDk4MTcxNjV8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCjl8MTQ3MjI2NXwxMDQ5ODE3MTY1fDEu MHwxfDI5MTV8aGVsbG8gd29ybGQKMTB8MTQ3MjI2NnwxMDQ5ODE3MTY1fDEuMHwxfDM1NzN8 aGVsbG8gd29ybGQKSvCSPtORAABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJULQAB9Bmt6 QXo9KEF6PSIbWJUPdHoEIBiMhwGAEPk+2MgAAAEBCAoAQhHrDUO/d0rwkj6bYAMAbwAAAG8A AAAAArOdAeQAB+kKFlwIAEUAAGE6M0AAPwYEJkF6PSJBej0olQ8bWBiMhwF0egQggBgW0Kow AAABAQgKDUO/oABCEesxMXwxNDcyMjY3fDEwNDk4MTcxNjV8MS4wfDF8MTIwM3xoZWxsbyB3 b3JsZApK8JI+vJMFAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lQxAAH0Ga3lBej0oQXo9 IhtYlQ90egQgGIyHLoAQ+RHYmwAAAQEICgBCEe8NQ7+gSvCSPqeNCABCAAAAQgAAAAACs50B 5AAH6QoWXAgARQAANJlRQAA/BqU0QXo9IkF6PSiTKBtYjYrZQS3RJHCAEBbQHG0AAAEBCAoN Q7/CAEIRbErwkj6rxggAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVDUAAfQZreEF6PShB ej0iG1iTKC3RJHCNitlCgBAAADK4AAABAQgKAEIR8A1Dv8JK8JI+BQILAG4AAABuAAAAAAKz nQHkAAfpChZcCABFAABgOjRAAD8GBCZBej0iQXo9KJUPG1gYjIcudHoEIIAYFtBlOgAAAQEI Cg1Dv9IAQhHvMTJ8MTQ3MjI2OHwxMDQ5ODE3MTY2fDEuMHwxfDY1MXxoZWxsbyB3b3JsZApK 8JI+6+sNAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lQ5AAH0Ga3dBej0oQXo9IhtYlQ90 egQgGIyHWoAQ+OXYZAAAAQEICgBCEfQNQ7/SS/CSPnGJDABvAAAAbwAAAAACs50B5AAH6QoW XAgARQAAYTo1QAA/BgQkQXo9IkF6PSiVDxtYGIyHWnR6BCCAGBbQpi4AAAEBCAoNQ8BAAEIR 9DEzfDE0NzIyNjl8MTA0OTgxNzE2N3wxLjB8MXwyMDAxfGhlbGxvIHdvcmxkCkzwkj7WFwAA QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVD0AAfQZrdkF6PShBej0iG1iVD3R6BCAYjIeH gBD4uNfrAAABAQgKAEIR/w1DwEBM8JI+/xgAAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABh OjZAAD8GBCNBej0iQXo9KJUPG1gYjIeHdHoEIIAYFtCh6QAAAQEICg1DwFIAQhH/MTR8MTQ3 MjI3MHwxMDQ5ODE3MTY3fDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKTPCSPjxuAwBCAAAAQgAA AAAH6QoWXAACs50B5AgARQAANJUQQAB9Bmt1QXo9KEF6PSIbWJUPdHoEIBiMh7SAEPiL19cA AAEBCAoAQhIBDUPAUkzwkj4piQwAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE6N0AAPwYE IkF6PSJBej0olQ8bWBiMh7R0egQggBgW0KJnAAABAQgKDUPApABCEgExNXwxNDcyMjcxfDEw NDk4MTcxNjh8MS4wfDF8MTEyMnxoZWxsbyB3b3JsZApM8JI+Ch0PAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0lRFAAH0Ga3RBej0oQXo9IhtYlQ90egQgGIyH4YAQ+F7XfQAAAQEICgBC EgkNQ8CkTPCSPmkeDwDJAAAAyQAAAAACs50B5AAH6QoWXAgARQAAuzo4QAA/BgPHQXo9IkF6 PSiVDxtYGIyH4XR6BCCAGBbQ5PwAAAEBCAoNQ8C1AEISCTE2fDE0NzIyNzJ8MTA0OTgxNzE2 OHwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjE3fDE0NzIyNzN8MTA0OTgxNzE2OHwxLjB8MXwy NDQwfGhlbGxvIHdvcmxkCjE4fDE0NzIyNzR8MTA0OTgxNzE2OHwxLjB8MXwxMjAzfGhlbGxv IHdvcmxkCk3wkj40MQMAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVEkAAfQZrc0F6PShB ej0iG1iVD3R6BCAYjIhogBD319dqAAABAQgKAEISCw1DwLVO8JI+7awDAEIAAABCAAAAAAKz nQHkAAfpChZcCABFAAA0edFAAD8GxLRBej0iQXo9KJKbG1gC0dwpODR7d4AQFtBF+AAAAQEI Cg1DwTIAQg1lTvCSPpblAwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJUTQAB9BmtyQXo9 KEF6PSIbWJKbODR7dwLR3CqAEAAAWBcAAAEBCAoAQhIVDUPBMk7wkj7FhwgAQQEAAEEBAAAB AAzMzMwAB+uexW4BM6qqAwAADCAAArSBpgABAA5Ta2FydmVuX2d3AAIAEQAAAAEBAcwABEF6 PSEAAwARRmFzdEV0aGVybmV0MAAEAAgAAAABAAUA00Npc2NvIEludGVybmV0d29yayBPcGVy YXRpbmcgU3lzdGVtIFNvZnR3YXJlIApJT1MgKHRtKSBDMTcwMCBTb2Z0d2FyZSAoQzE3MDAt WS1NKSwgVmVyc2lvbiAxMi4xKDMpLCBSRUxFQVNFIFNPRlRXQVJFIChmYzEpCkNvcHlyaWdo dCAoYykgMTk4Ni0yMDAwIGJ5IGNpc2NvIFN5c3RlbXMsIEluYy4KQ29tcGlsZWQgV2VkIDA1 LUp1bC0wMCAxNzowNyBieSBjbW9uZwAGAA5jaXNjbyAxNzIwAAcACUF9NZweAAsABQFQ8JI+ JH4AAG4AAABuAAAAAAKznQHkAAfpChZcCABFAABgOjlAAD8GBCFBej0iQXo9KJUPG1gYjIho dHoEIIAYFtBUyQAAAQEICg1DweUAQhILMTl8MTQ3MjI3NXwxMDQ5ODE3MTY5fDEuMHwxfDc5 OXxoZWxsbyB3b3JsZApQ8JI+NXoCAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lRRAAH0G a3FBej0oQXo9IhtYlQ90egQgGIyIlIAQ96vWHAAAAQEICgBCEikNQ8HlUPCSPoJ7AgD0AAAA 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 HEAAfQZraUF6PShBej0iG1iVD3R6BCAYjIrbgBD68M49AAABAQgKAEISXw1DxAJV8JI+vqIJ AG4AAABuAAAAAAKznQHkAAfpChZcCABFAABgOkJAAD8GBBhBej0iQXo9KJUPG1gYjIrbdHoE IIAYFtBZ1QAAAQEICg1DxBQAQhJfMzN8MTQ3MjI4OXwxMDQ5ODE3MTc2fDEuMHwxfDQ4Mnxo ZWxsbyB3b3JsZApV8JI+4vcMAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lR1AAH0Ga2hB ej0oQXo9IhtYlQ90egQgGIyLB4AQ+sTOKQAAAQEICgBCEmENQ8QUVfCSPjD5DACcAAAAnAAA AAACs50B5AAH6QoWXAgARQAAjjpDQAA/BgPpQXo9IkF6PSiVDxtYGIyLB3R6BCCAGBbQ6dsA AAEBCAoNQ8QqAEISYTM0fDE0NzIyOTB8MTA0OTgxNzE3N3wxLjB8MXwyODU4fGhlbGxvIHdv cmxkCjM1fDE0NzIyOTF8MTA0OTgxNzE3N3wxLjB8MXwzNDAzfGhlbGxvIHdvcmxkClbwkj75 CwEAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVHkAAfQZrZ0F6PShBej0iG1iVD3R6BCAY jIthgBD6as4QAAABAQgKAEISZA1DxCpW8JI+nkYIAG4AAABuAAAAAAKznQHkAAfpChZcCABF AABgOkRAAD8GBBZBej0iQXo9KJUPG1gYjIthdHoEIIAYFtBS9QAAAQEICg1DxHAAQhJkMzZ8 MTQ3MjI5MnwxMDQ5ODE3MTc3fDEuMHwxfDY1NHxoZWxsbyB3b3JsZApW8JI+ng8LAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0lR9AAH0Ga2ZBej0oQXo9IhtYlQ90egQgGIyLjYAQ+j7N xAAAAQEICgBCEmoNQ8RwVvCSPkARCwD0AAAA9AAAAAACs50B5AAH6QoWXAgARQAA5jpFQAA/ BgOPQXo9IkF6PSiVDxtYGIyLjXR6BCCAGBbQJxoAAAEBCAoNQ8SCAEISajM3fDE0NzIyOTN8 MTA0OTgxNzE3N3wxLjB8MXwzMjd8aGVsbG8gd29ybGQKMzh8MTQ3MjI5NHwxMDQ5ODE3MTc3 fDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAozOXwxNDcyMjk1fDEwNDk4MTcxNzh8MS4wfDF8MjQ0 MHxoZWxsbyB3b3JsZAo0MHwxNDcyMjk2fDEwNDk4MTcxNzh8MS4wfDF8Mjg1OHxoZWxsbyB3 b3JsZApW8JI+AWYOAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lSBAAH0Ga2VBej0oQXo9 IhtYlQ90egQgGIyMP4AQ+YzNsAAAAQEICgBCEmwNQ8SCVvCSPpRnDgBvAAAAbwAAAAACs50B 5AAH6QoWXAgARQAAYTpGQAA/BgQTQXo9IkF6PSiVDxtYGIyMP3R6BCCAGBbQlHYAAAEBCAoN Q8SYAEISbDQxfDE0NzIyOTd8MTA0OTgxNzE3OHwxLjB8MXwzNDAzfGhlbGxvIHdvcmxkClfw kj4uegIAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVIUAAfQZrZEF6PShBej0iG1iVD3R6 BCAYjIxsgBD5X82XAAABAQgKAEISbw1DxJhX8JI+Gc4JAG4AAABuAAAAAAKznQHkAAfpChZc CABFAABgOkdAAD8GBBNBej0iQXo9KJUPG1gYjIxsdHoEIIAYFtBIawAAAQEICg1DxN4AQhJv NDJ8MTQ3MjI5OHwxMDQ5ODE3MTc5fDEuMHwxfDc5OXxoZWxsbyB3b3JsZApX8JI+2X0MAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0lSJAAH0Ga2NBej0oQXo9IhtYlQ90egQgGIyMmIAQ +TPNSwAAAQEICgBCEnUNQ8TeV/CSPhZ/DACcAAAAnAAAAAACs50B5AAH6QoWXAgARQAAjjpI QAA/BgPkQXo9IkF6PSiVDxtYGIyMmHR6BCCAGBbQ63wAAAEBCAoNQ8TvAEISdTQzfDE0NzIy OTl8MTA0OTgxNzE3OXwxLjB8MXwzNDIwfGhlbGxvIHdvcmxkCjQ0fDE0NzIzMDB8MTA0OTgx NzE3OXwxLjB8MXwxMzEwfGhlbGxvIHdvcmxkCljwkj4ekgAAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSVI0AAfQZrYkF6PShBej0iG1iVD3R6BCAYjIzygBD42c04AAABAQgKAEISdw1D xO9Y8JI+epMAAMgAAADIAAAAAAKznQHkAAfpChZcCABFAAC6OklAAD8GA7dBej0iQXo9KJUP G1gYjIzydHoEIIAYFtCboAAAAQEICg1DxQUAQhJ3NDV8MTQ3MjMwMXwxMDQ5ODE3MTc5fDEu MHwxfDE2MHxoZWxsbyB3b3JsZAo0NnwxNDcyMzAyfDEwNDk4MTcxNzl8MS4wfDF8MzExNnxo ZWxsbyB3b3JsZAo0N3wxNDcyMzAzfDEwNDk4MTcxNzl8MS4wfDF8MzExNnxoZWxsbyB3b3Js ZApY8JI+dugDAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lSRAAH0Ga2FBej0oQXo9IhtY lQ90egQgGIyNeIAQ+FPNIAAAAQEICgBCEnkNQ8UFWPCSPpTbDABuAAAAbgAAAAACs50B5AAH 6QoWXAgARQAAYDpKQAA/BgQQQXo9IkF6PSiVDxtYGIyNeHR6BCCAGBbQY+EAAAEBCAoNQ8VW AEISeTQ4fDE0NzIzMDR8MTA0OTgxNzE4MHwxLjB8MXwyMTN8aGVsbG8gd29ybGQKWfCSPv1U AABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJUlQAB9BmtgQXo9KEF6PSIbWJUPdHoEIBiM jaSAEPgnzMcAAAEBCAoAQhKBDUPFVlnwkj5IVgAAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUA AGE6S0AAPwYEDkF6PSJBej0olQ8bWBiMjaR0egQggBgW0KMoAAABAQgKDUPFaABCEoE0OXwx NDcyMzA1fDEwNDk4MTcxODB8MS4wfDF8MTEyMnxoZWxsbyB3b3JsZApZ8JI+ZasDAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0lSZAAH0Ga19Bej0oQXo9IhtYlQ90egQgGIyN0YAQ9/rM swAAAQEICgBCEoMNQ8VoWfCSPn1iDgBuAAAAbgAAAAACs50B5AAH6QoWXAgARQAAYDpMQAA/ BgQOQXo9IkF6PSiVDxtYGIyN0XR6BCCAGBbQXRUAAAEBCAoNQ8XEAEISgzUwfDE0NzIzMDZ8 MTA0OTgxNzE4MXwxLjB8MXw1MjR8aGVsbG8gd29ybGQKWvCSPjrDAQBCAAAAQgAAAAAH6QoW XAACs50B5AgARQAANJUnQAB9BmteQXo9KEF6PSIbWJUPdHoEIBiMjf2AEPfOzE4AAAEBCAoA QhKMDUPFxFvwkj4BqAAAbgAAAG4AAAAAArOdAeQAB+kKFlwIAEUAAGA6TUAAPwYEDUF6PSJB ej0olQ8bWBiMjf10egQggBgW0GJvAAABAQgKDUPGMgBCEow1MXwxNDcyMzA3fDEwNDk4MTcx ODJ8MS4wfDF8MjMwfGhlbGxvIHdvcmxkClvwkj5xMQMAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSVKEAAfQZrXUF6PShBej0iG1iVD3R6BCAYjI4pgBD3osvVAAABAQgKAEISlw1DxjJb 8JI+zTIDAMgAAADIAAAAAAKznQHkAAfpChZcCABFAAC6Ok5AAD8GA7JBej0iQXo9KJUPG1gY jI4pdHoEIIAYFtC7/gAAAQEICg1DxkIAQhKXNTJ8MTQ3MjMwOHwxMDQ5ODE3MTgyfDEuMHwx fDEzMTB8aGVsbG8gd29ybGQKNTN8MTQ3MjMwOXwxMDQ5ODE3MTgyfDEuMHwxfDMyN3xoZWxs byB3b3JsZAo1NHwxNDcyMzEwfDEwNDk4MTcxODJ8MS4wfDF8MjAwMXxoZWxsbyB3b3JsZApb 8JI+/4cGAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lSlAAH0Ga1xBej0oQXo9IhtYlQ90 egQgGIyOr4AQ9xzLwwAAAQEICgBCEpkNQ8ZCW/CSPqyJBgCcAAAAnAAAAAACs50B5AAH6QoW XAgARQAAjjpPQAA/BgPdQXo9IkF6PSiVDxtYGIyOr3R6BCCAGBbQ69QAAAEBCAoNQ8ZYAEIS mTU1fDE0NzIzMTF8MTA0OTgxNzE4MnwxLjB8MXwzNDIwfGhlbGxvIHdvcmxkCjU2fDE0NzIz MTJ8MTA0OTgxNzE4MnwxLjB8MXw5NjYyfGhlbGxvIHdvcmxkClvwkj553gkAQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSVKkAAfQZrW0F6PShBej0iG1iVD3R6BCAYjI8JgBD2wsurAAAB AQgKAEISmw1Dxlhc8JI+8y0CAG4AAABuAAAAAAKznQHkAAfpChZcCABFAABgOlBAAD8GBApB ej0iQXo9KJUPG1gYjI8JdHoEIIAYFtBW5QAAAQEICg1DxqAAQhKbNTd8MTQ3MjMxM3wxMDQ5 ODE3MTgzfDEuMHwxfDMyN3xoZWxsbyB3b3JsZApc8JI+t58EAEIAAABCAAAAAAfpChZcAAKz nQHkCABFAAA0lStAAH0Ga1pBej0oQXo9IhtYlQ90egQgGIyPNYAQ9pbLXAAAAQEICgBCEqIN Q8agXPCSPh+hBABuAAAAbgAAAAACs50B5AAH6QoWXAgARQAAYDpRQAA/BgQJQXo9IkF6PSiV DxtYGIyPNXR6BCCAGBbQVp0AAAEBCAoNQ8awAEISojU4fDE0NzIzMTR8MTA0OTgxNzE4M3wx LjB8MXw2NTR8aGVsbG8gd29ybGQKXPCSPj/2BwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA NJUsQAB9BmtZQXo9KEF6PSIbWJUPdHoEIBiMj2GAEPZqy0oAAAEBCAoAQhKkDUPGsFzwkj6w 9wcAnAAAAJwAAAAAArOdAeQAB+kKFlwIAEUAAI46UkAAPwYD2kF6PSJBej0olQ8bWBiMj2F0 egQggBgW0O6iAAABAQgKDUPGxgBCEqQ1OXwxNDcyMzE1fDEwNDk4MTcxODN8MS4wfDF8MjAw MXxoZWxsbyB3b3JsZAo2MHwxNDcyMzE2fDEwNDk4MTcxODN8MS4wfDF8OTY2MnxoZWxsbyB3 b3JsZApc8JI+rkwLAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lS1AAH0Ga1hBej0oQXo9 IhtYlQ90egQgGIyPu4AQ9hDLMgAAAQEICgBCEqYNQ8bGXfCSPtbEBgBvAAAAbwAAAAACs50B 5AAH6QoWXAgARQAAYTpTQAA/BgQGQXo9IkF6PSiVDxtYGIyPu3R6BCCAGBbQmDQAAAEBCAoN Q8ciAEISpjYxfDE0NzIzMTd8MTA0OTgxNzE4NHwxLjB8MXwzNDAzfGhlbGxvIHdvcmxkCl3w kj5tZAkAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVLkAAfQZrV0F6PShBej0iG1iVD3R6 BCAYjI/ogBD148rNAAABAQgKAEISrw1DxyJd8JI+G2YJAJwAAACcAAAAAAKznQHkAAfpChZc CABFAACOOlRAAD8GA9hBej0iQXo9KJUPG1gYjI/odHoEIIAYFtDnrgAAAQEICg1DxzMAQhKv NjJ8MTQ3MjMxOHwxMDQ5ODE3MTg0fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKNjN8MTQ3MjMx OXwxMDQ5ODE3MTg0fDEuMHwxfDM0MDN8aGVsbG8gd29ybGQKXfCSPuW6DABCAAAAQgAAAAAH 6QoWXAACs50B5AgARQAANJUvQAB9BmtWQXo9KEF6PSIbWJUPdHoEIBiMkEKAEPrwxVMAAAEB CAoAQhKxDUPHM17wkj5LsgUAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE6VUAAPwYEBEF6 PSJBej0olQ8bWBiMkEJ0egQggBgW0JdDAAABAQgKDUPHfwBCErE2NHwxNDcyMzIwfDEwNDk4 MTcxODV8MS4wfDF8MTUwOHxoZWxsbyB3b3JsZApe8JI+iicJAEIAAABCAAAAAAfpChZcAAKz nQHkCABFAAA0lTBAAH0Ga1VBej0oQXo9IhtYlQ90egQgGIyQb4AQ+sPE/wAAAQEICgBCErkN Q8d/XvCSPkYpCQD1AAAA9QAAAAACs50B5AAH6QoWXAgARQAA5zpWQAA/BgN9QXo9IkF6PSiV DxtYGIyQb3R6BCCAGBbQjV4AAAEBCAoNQ8eVAEISuTY1fDE0NzIzMjF8MTA0OTgxNzE4NXwx LjB8MXwxNzg3fGhlbGxvIHdvcmxkCjY2fDE0NzIzMjJ8MTA0OTgxNzE4NXwxLjB8MXwyMzB8 aGVsbG8gd29ybGQKNjd8MTQ3MjMyM3wxMDQ5ODE3MTg1fDEuMHwxfDEyMDN8aGVsbG8gd29y bGQKNjh8MTQ3MjMyNHwxMDQ5ODE3MTg1fDEuMHwxfDI0NDB8aGVsbG8gd29ybGQKXvCSPuV9 DABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJUxQAB9BmtUQXo9KEF6PSIbWJUPdHoEIBiM kSKAEPoQxOcAAAEBCAoAQhK7DUPHlV7wkj6QfwwAnAAAAJwAAAAAArOdAeQAB+kKFlwIAEUA AI46V0AAPwYD1UF6PSJBej0olQ8bWBiMkSJ0egQggBgW0ObrAAABAQgKDUPHqwBCErs2OXwx NDcyMzI1fDEwNDk4MTcxODZ8MS4wfDF8MzQyMHxoZWxsbyB3b3JsZAo3MHwxNDcyMzI2fDEw NDk4MTcxODZ8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZApf8JI+NpIAAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0lTJAAH0Ga1NBej0oQXo9IhtYlQ90egQgGIyRfIAQ+bbEzwAAAQEICgBC Er0NQ8erX/CSPqyTAABvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTpYQAA/BgQBQXo9IkF6 PSiVDxtYGIyRfHR6BCCAGBbQjbQAAAEBCAoNQ8fBAEISvTcxfDE0NzIzMjd8MTA0OTgxNzE4 NnwxLjB8MXwyODU4fGhlbGxvIHdvcmxkCl/wkj596AMAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSVM0AAfQZrUkF6PShBej0iG1iVD3R6BCAYjJGpgBD5icS3AAABAQgKAEISvw1Dx8Ff 8JI+zDcHAG4AAABuAAAAAAKznQHkAAfpChZcCABFAABgOllAAD8GBAFBej0iQXo9KJUPG1gY jJGpdHoEIIAYFtBM0QAAAQEICg1Dx+0AQhK/NzJ8MTQ3MjMyOHwxMDQ5ODE3MTg2fDEuMHwx fDY1NHxoZWxsbyB3b3JsZApf8JI+u5UKAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lTRA AH0Ga1FBej0oQXo9IhtYlQ90egQgGIyR1YAQ+V3EhgAAAQEICgBCEsQNQ8ftX/CSPueWCgBv AAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTpaQAA/BgP/QXo9IkF6PSiVDxtYGIyR1XR6BCCA GBbQjxUAAAEBCAoNQ8gDAEISxDczfDE0NzIzMjl8MTA0OTgxNzE4N3wxLjB8MXwyNjIzfGhl bGxvIHdvcmxkCl/wkj4l7A0AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVNUAAfQZrUEF6 PShBej0iG1iVD3R6BCAYjJICgBD5MMRuAAABAQgKAEISxg1DyANg8JI+O0YKAG4AAABuAAAA AAKznQHkAAfpChZcCABFAABgOltAAD8GA/9Bej0iQXo9KJUPG1gYjJICdHoEIIAYFtBJAgAA AQEICg1DyGUAQhLGNzR8MTQ3MjMzMHwxMDQ5ODE3MTg4fDEuMHwxfDMyN3xoZWxsbyB3b3Js ZApg8JI+Ha8NAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lTZAAH0Ga09Bej0oQXo9IhtY lQ90egQgGIySLoAQ+QTEAgAAAQEICgBCEtANQ8hlYfCSPu9GCgBvAAAAbwAAAAACs50B5AAH 6QoWXAgARQAAYTpcQAA/BgP9QXo9IkF6PSiVDxtYGIySLnR6BCCAGBbQf/EAAAEBCAoNQ8jJ AEIS0Dc1fDE0NzIzMzF8MTA0OTgxNzE4OXwxLjB8MXw5NjYyfGhlbGxvIHdvcmxkCmHwkj4b cg0AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVN0AAfQZrTkF6PShBej0iG1iVD3R6BCAY jJJbgBD418OUAAABAQgKAEIS2g1DyMlh8JI+f3MNAPQAAAD0AAAAAAKznQHkAAfpChZcCABF AADmOl1AAD8GA3dBej0iQXo9KJUPG1gYjJJbdHoEIIAYFtBFUQAAAQEICg1DyN0AQhLaNzZ8 MTQ3MjMzMnwxMDQ5ODE3MTg5fDEuMHwxfDk2NjJ8aGVsbG8gd29ybGQKNzd8MTQ3MjMzM3wx MDQ5ODE3MTg5fDEuMHwxfDE2MHxoZWxsbyB3b3JsZAo3OHwxNDcyMzM0fDEwNDk4MTcxODl8 MS4wfDF8NjU0fGhlbGxvIHdvcmxkCjc5fDE0NzIzMzV8MTA0OTgxNzE4OXwxLjB8MXwyNjIz fGhlbGxvIHdvcmxkCmLwkj44hgEAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVOEAAfQZr TUF6PShBej0iG1iVD3R6BCAYjJMNgBD4JcN+AAABAQgKAEIS3A1DyN1i8JI+qocBAG8AAABv AAAAAAKznQHkAAfpChZcCABFAABhOl5AAD8GA/tBej0iQXo9KJUPG1gYjJMNdHoEIIAYFtCH 4AAAAQEICg1DyPMAQhLcODB8MTQ3MjMzNnwxMDQ5ODE3MTg5fDEuMHwxfDM0MjB8aGVsbG8g d29ybGQKYvCSPuTcBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJU5QAB9BmtMQXo9KEF6 PSIbWJUPdHoEIBiMkzqAEPf4w2YAAAEBCAoAQhLeDUPI82Lwkj6Z3gQAnAAAAJwAAAAAArOd AeQAB+kKFlwIAEUAAI46X0AAPwYDzUF6PSJBej0olQ8bWBiMkzp0egQggBgW0M5NAAABAQgK DUPJCQBCEt44MXwxNDcyMzM3fDEwNDk4MTcxODl8MS4wfDF8MzQyMHxoZWxsbyB3b3JsZAo4 MnwxNDcyMzM4fDEwNDk4MTcxODl8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZApi8JI+bzMIAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0lTpAAH0Ga0tBej0oQXo9IhtYlQ90egQgGIyTlIAQ 957DTgAAAQEICgBCEuANQ8kJYvCSPnLaDgBuAAAAbgAAAAACs50B5AAH6QoWXAgARQAAYDpg QAA/BgP6QXo9IkF6PSiVDxtYGIyTlHR6BCCAGBbQVmMAAAEBCAoNQ8lLAEIS4DgzfDE0NzIz Mzl8MTA0OTgxNzE5MHwxLjB8MXwxNjB8aGVsbG8gd29ybGQKY/CSPnz0AgBCAAAAQgAAAAAH 6QoWXAACs50B5AgARQAANJU7QAB9BmtKQXo9KEF6PSIbWJUPdHoEIBiMk8CAEPdywwUAAAEB CAoAQhLnDUPJS2Pwkj5l9gIATwEAAE8BAAAAArOdAeQAB+kKFlwIAEUAAUE6YUAAPwYDGEF6 PSJBej0olQ8bWBiMk8B0egQggBgW0LEMAAABAQgKDUPJYQBCEuc4NHwxNDcyMzQwfDEwNDk4 MTcxOTB8MS4wfDF8Nzk5fGhlbGxvIHdvcmxkCjg1fDE0NzIzNDF8MTA0OTgxNzE5MHwxLjB8 MXwxMjAzfGhlbGxvIHdvcmxkCjg2fDE0NzIzNDJ8MTA0OTgxNzE5MHwxLjB8MXwxMjAzfGhl bGxvIHdvcmxkCjg3fDE0NzIzNDN8MTA0OTgxNzE5MHwxLjB8MXwxMjAzfGhlbGxvIHdvcmxk Cjg4fDE0NzIzNDR8MTA0OTgxNzE5MHwxLjB8MXwyNjIzfGhlbGxvIHdvcmxkCjg5fDE0NzIz NDV8MTA0OTgxNzE5MHwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCmPwkj4RSwYAQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSVPEAAfQZrSUF6PShBej0iG1iVD3R6BCAYjJTNgBD2ZcLtAAAB AQgKAEIS6Q1DyWFj8JI+8RIJADwAAAA8AAAAAAKznQHkAAfpChZcCAYAAQgABgQAAQAH6QoW XEF6PSIAAAAAAABBej0oAAAAAAAAAAAAAAAAAAAAAAAAY/CSPgITCQAqAAAAKgAAAAAH6QoW XAACs50B5AgGAAEIAAYEAAIAArOdAeRBej0oAAfpChZcQXo9ImTwkj4SHwEAbwAAAG8AAAAA ArOdAeQAB+kKFlwIAEUAAGE6YkAAPwYD90F6PSJBej0olQ8bWBiMlM10egQggBgW0I5PAAAB AQgKDUPJuQBCEuk5MHwxNDcyMzQ2fDEwNDk4MTcxOTF8MS4wfDF8MjAwMXxoZWxsbyB3b3Js ZApk8JI+ymIEAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lT1AAH0Ga0hBej0oQXo9IhtY lQ90egQgGIyU+oAQ9jjCjAAAAQEICgBCEvINQ8m5ZPCSPv5jBADIAAAAyAAAAAACs50B5AAH 6QoWXAgARQAAujpjQAA/BgOdQXo9IkF6PSiVDxtYGIyU+nR6BCCAGBbQjVEAAAEBCAoNQ8nO AEIS8jkxfDE0NzIzNDd8MTA0OTgxNzE5MXwxLjB8MXwyMzB8aGVsbG8gd29ybGQKOTJ8MTQ3 MjM0OHwxMDQ5ODE3MTkxfDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKOTN8MTQ3MjM0OXwxMDQ5 ODE3MTkxfDEuMHwxfDMzMDF8aGVsbG8gd29ybGQKZPCSPku5BwBCAAAAQgAAAAAH6QoWXAAC s50B5AgARQAANJU+QAB9BmtHQXo9KEF6PSIbWJUPdHoEIBiMlYCAEPWywnUAAAEBCAoAQhL0 DUPJzmTwkj5LZwwAQgAAAEIAAAAAArOdAeQAB+kKFlwIAEUAADSZUkAAPwalM0F6PSJBej0o kygbWI2K2UEt0SRwgBAW0BGoAAABAQgKDUPKAwBCEfBk8JI+IqAMAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0lT9AAH0Ga0ZBej0oQXo9IhtYkygt0SRwjYrZQoAQAAAncQAAAQEICgBC EvYNQ8oDZfCSPvmmAgBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTpkQAA/BgP1QXo9IkF6 PSiVDxtYGIyVgHR6BCCAGBbQjBkAAAEBCAoNQ8onAEIS9Dk0fDE0NzIzNTB8MTA0OTgxNzE5 MnwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCmXwkj4Q0QUAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSVQEAAfQZrRUF6PShBej0iG1iVD3R6BCAYjJWtgBD68LyoAAABAQgKAEIS/Q1Dyidl 8JI+l9IFAMkAAADJAAAAAAKznQHkAAfpChZcCABFAAC7OmVAAD8GA5pBej0iQXo9KJUPG1gY jJWtdHoEIIAYFtDFsAAAAQEICg1DyjsAQhL9OTV8MTQ3MjM1MXwxMDQ5ODE3MTkyfDEuMHwx fDE1MDh8aGVsbG8gd29ybGQKOTZ8MTQ3MjM1MnwxMDQ5ODE3MTkyfDEuMHwxfDEyMDN8aGVs bG8gd29ybGQKOTd8MTQ3MjM1M3wxMDQ5ODE3MTkyfDEuMHwxfDM0MjB8aGVsbG8gd29ybGQK ZfCSPm0nCQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVBQAB9BmtEQXo9KEF6PSIbWJUP dHoEIBiMljSAEPppvJIAAAEBCAoAQhL/DUPKO2jwkj6I3AUAbwAAAG8AAAAAArOdAeQAB+kK FlwIAEUAAGE6ZkAAPwYD80F6PSJBej0olQ8bWBiMljR0egQggBgW0IgZAAABAQgKDUPLaABC Ev85OHwxNDcyMzU0fDEwNDk4MTcxOTR8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZApo8JI+hHAI AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lUJAAH0Ga0NBej0oQXo9IhtYlQ90egQgGIyW YYAQ+jy7SAAAAQEICgBCExwNQ8toaPCSPtlxCACdAAAAnQAAAAACs50B5AAH6QoWXAgARQAA jzpnQAA/BgPEQXo9IkF6PSiVDxtYGIyWYXR6BCCAGBbQdqEAAAEBCAoNQ8t5AEITHDk5fDE0 NzIzNTV8MTA0OTgxNzE5NHwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCjEwMHwxNDcyMzU2fDEw NDk4MTcxOTV8MS4wfDF8MTUwOHxoZWxsbyB3b3JsZApo8JI+5cYLAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0lUNAAH0Ga0JBej0oQXo9IhtYlQ90egQgGIyWvIAQ+eG7NAAAAQEICgBC Ex8NQ8t5afCSPkJDBAAqAAAAKgAAAAAH6QoWXAACs50B5AgGAAEIAAYEAAEAArOdAeRBej0o AAAAAAAAQXo9Imnwkj4ZRAQAPAAAADwAAAAAArOdAeQAB+kKFlwIBgABCAAGBAACAAfpChZc QXo9IgACs50B5EF6PSgAAAAAAAAAAAAAAAAAAAAAAABp8JI+bukIAG8AAABvAAAAAAKznQHk AAfpChZcCABFAABhOmhAAD8GA/FBej0iQXo9KJUPG1gYjJa8dHoEIIAYFtApTgAAAQEICg1D y+AAQhMfMTAxfDE0NzIzNTd8MTA0OTgxNzE5NnwxLjB8MXw3OTl8aGVsbG8gd29ybGQKafCS PuuJCwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVEQAB9BmtBQXo9KEF6PSIbWJUPdHoE IBiMlumAEPm0usQAAAEBCAoAQhMoDUPL4Gzwkj7tmwoAbwAAAG8AAAAAArOdAeQAB+kKFlwI AEUAAGE6aUAAPwYD8EF6PSJBej0olQ8bWBiMlul0egQggBgW0CzmAAABAQgKDUPNFwBCEygx MDJ8MTQ3MjM1OHwxMDQ5ODE3MTk4fDEuMHwxfDUyNHxoZWxsbyB3b3JsZAps8JI+VikOAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0lUVAAH0Ga0BBej0oQXo9IhtYlQ90egQgGIyXFoAQ +Ye5bQAAAQEICgBCE0gNQ80XbPCSPnYrDgBmAgAAZgIAAAACs50B5AAH6QoWXAgARQACWDpq QAA/BgH4QXo9IkF6PSiVDxtYGIyXFnR6BCCAGBbQ9bMAAAEBCAoNQ80uAEITSDEwM3wxNDcy MzU5fDEwNDk4MTcxOTh8MS4wfDF8MzIyNXxoZWxsbyB3b3JsZAoxMDR8MTQ3MjM2MHwxMDQ5 ODE3MTk4fDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKMTA1fDE0NzIzNjF8MTA0OTgxNzE5OXwx LjB8MXw3OTl8aGVsbG8gd29ybGQKMTA2fDE0NzIzNjJ8MTA0OTgxNzE5OXwxLjB8MXwyMzB8 aGVsbG8gd29ybGQKMTA3fDE0NzIzNjN8MTA0OTgxNzE5OXwxLjB8MXwyMzB8aGVsbG8gd29y bGQKMTA4fDE0NzIzNjR8MTA0OTgxNzE5OXwxLjB8MXwzMzAxfGhlbGxvIHdvcmxkCjEwOXwx NDcyMzY1fDEwNDk4MTcxOTl8MS4wfDF8MjQ0MHxoZWxsbyB3b3JsZAoxMTB8MTQ3MjM2Nnwx MDQ5ODE3MTk5fDEuMHwxfDk2NjJ8aGVsbG8gd29ybGQKMTExfDE0NzIzNjd8MTA0OTgxNzE5 OXwxLjB8MXwzNTczfGhlbGxvIHdvcmxkCjExMnwxNDcyMzY4fDEwNDk4MTcxOTl8MS4wfDF8 MzU3M3xoZWxsbyB3b3JsZAoxMTN8MTQ3MjM2OXwxMDQ5ODE3MjAwfDEuMHwxfDY1NHxoZWxs byB3b3JsZAoxMTR8MTQ3MjM3MHwxMDQ5ODE3MjAwfDEuMHwxfDEyMDN8aGVsbG8gd29ybGQK bfCSPmw9AgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVGQAB9Bms/QXo9KEF6PSIbWJUP dHoEIBiMmTqAEPdjuVQAAAEBCAoAQhNKDUPNLm3wkj71PgIAngAAAJ4AAAAAArOdAeQAB+kK FlwIAEUAAJA6a0AAPwYDv0F6PSJBej0olQ8bWBiMmTp0egQggBgW0PNKAAABAQgKDUPNRABC E0oxMTV8MTQ3MjM3MXwxMDQ5ODE3MjAwfDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKMTE2fDE0 NzIzNzJ8MTA0OTgxNzIwMHwxLjB8MXwzNDIwfGhlbGxvIHdvcmxkCm3wkj4alAUAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSVR0AAfQZrPkF6PShBej0iG1iVD3R6BCAYjJmWgBD3B7k7 AAABAQgKAEITTQ1DzURt8JI+1C0PAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhOmxAAD8G A+1Bej0iQXo9KJUPG1gYjJmWdHoEIIAYFtAvlAAAAQEICg1DzZkAQhNNMTE3fDE0NzIzNzN8 MTA0OTgxNzIwMXwxLjB8MXw2NTR8aGVsbG8gd29ybGQKbvCSPnQAAgBCAAAAQgAAAAAH6QoW XAACs50B5AgARQAANJVIQAB9Bms9QXo9KEF6PSIbWJUPdHoEIBiMmcOAEPbauN8AAAEBCAoA QhNUDUPNmW7wkj75AQIAzAAAAMwAAAAAArOdAeQAB+kKFlwIAEUAAL46bUAAPwYDj0F6PSJB ej0olQ8bWBiMmcN0egQggBgW0AkUAAABAQgKDUPNpgBCE1QxMTh8MTQ3MjM3NHwxMDQ5ODE3 MjAxfDEuMHwxfDMxMTZ8aGVsbG8gd29ybGQKMTE5fDE0NzIzNzV8MTA0OTgxNzIwMXwxLjB8 MXwyNTY2fGhlbGxvIHdvcmxkCjEyMHwxNDcyMzc2fDEwNDk4MTcyMDF8MS4wfDF8MTIwM3xo ZWxsbyB3b3JsZApu8JI+FlcFAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lUlAAH0GazxB ej0oQXo9IhtYlQ90egQgGIyaTYAQ9lC40AAAAQEICgBCE1YNQ82mb/CSPrhxAQBwAAAAcAAA AAACs50B5AAH6QoWXAgARQAAYjpuQAA/BgPqQXo9IkF6PSiVDxtYGIyaTXR6BCCAGBbQt6MA AAEBCAoNQ84HAEITVjEyMXwxNDcyMzc3fDEwNDk4MTcyMDJ8MS4wfDF8Mjg1OHxoZWxsbyB3 b3JsZApv8JI+r24DAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lUpAAH0GaztBej0oQXo9 IhtYlQ90egQgGIyae4AQ9iK4ZgAAAQEICgBCE18NQ84HcPCSPqNyAQBwAAAAcAAAAAACs50B 5AAH6QoWXAgARQAAYjpvQAA/BgPpQXo9IkF6PSiVDxtYGIyae3R6BCCAGBbQwgsAAAEBCAoN Q85rAEITXzEyMnwxNDcyMzc4fDEwNDk4MTcyMDN8MS4wfDF8MTEyMnxoZWxsbyB3b3JsZApw 8JI+/twEAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lUtAAH0GazpBej0oQXo9IhtYlQ90 egQgGIyaqYAQ9fS39wAAAQEICgBCE2oNQ85rcPCSPrLeBABSAQAAUgEAAAACs50B5AAH6QoW XAgARQABRDpwQAA/BgMGQXo9IkF6PSiVDxtYGIyaqXR6BCCAGBbQVU8AAAEBCAoNQ86BAEIT ajEyM3wxNDcyMzc5fDEwNDk4MTcyMDN8MS4wfDF8MTYwfGhlbGxvIHdvcmxkCjEyNHwxNDcy MzgwfDEwNDk4MTcyMDN8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCjEyNXwxNDcyMzgxfDEwNDk4 MTcyMDN8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCjEyNnwxNDcyMzgyfDEwNDk4MTcyMDN8MS4w fDF8NjU0fGhlbGxvIHdvcmxkCjEyN3wxNDcyMzgzfDEwNDk4MTcyMDN8MS4wfDF8MjkxNXxo ZWxsbyB3b3JsZAoxMjh8MTQ3MjM4NHwxMDQ5ODE3MjAzfDEuMHwxfDI1NjZ8aGVsbG8gd29y bGQKcPCSPrwzCABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVMQAB9Bms5QXo9KEF6PSIb WJUPdHoEIBiMm7mAEPrwsdMAAAEBCAoAQhNsDUPOgXHwkj4R+QIAbwAAAG8AAAAAArOdAeQA B+kKFlwIAEUAAGE6cUAAPwYD6EF6PSJBej0olQ8bWBiMm7l0egQggBgW0CURAAABAQgKDUPO 2QBCE2wxMjl8MTQ3MjM4NXwxMDQ5ODE3MjA0fDEuMHwxfDQ4MnxoZWxsbyB3b3JsZApx8JI+ RUsGAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lU1AAH0GazhBej0oQXo9IhtYlQ90egQg GIyb5oAQ+sOxcgAAAQEICgBCE3UNQ87ZcfCSPrFMBgCeAAAAngAAAAACs50B5AAH6QoWXAgA RQAAkDpyQAA/BgO4QXo9IkF6PSiVDxtYGIyb5nR6BCCAGBbQ6boAAAEBCAoNQ87uAEITdTEz MHwxNDcyMzg2fDEwNDk4MTcyMDR8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAoxMzF8MTQ3MjM4 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 LjAzMDQwOA0KePCSPsInBAB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAareeQAB9BkixQXo9 KEF6PSIAFbdtucf5/N36O/xQGPbGOZYAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEg Y29ubmVjdGlvbiBmb3IgMzYxOTk4NzYub3V0LjAzMDQwOC4NCnjwkj6xKAQAPgAAAD4AAAAA B+kKFlwAArOdAeQIAEUAADC3n0AAfQZI6kF6PShBej0iABS33tGO0CsAAAAAcAL68DGTAAAC BAVkAQEEAnjwkj5/KgQAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBON0AAPwbwUkF6PSJB ej0ot94AFOMxnaDRjtAscBJhCEpIAAABAQQCAgQFtHjwkj7cYQQANgAAADYAAAAAB+kKFlwA ArOdAeQIAEUAACi3oEAAfQZI8UF6PShBej0iABS33tGO0CzjMZ2hUBD9XNq3AAB48JI+tWkE ALsDAAC7AwAAAAKznQHkAAfpChZcCABFAAOtTjhAAD8G7NRBej0iQXo9KLfeABTjMZ2h0Y7Q LFAYYQg2mwAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzE2NyBNTj0zNjE5OTg3Ni5vdXQg U1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iUm9zQnVzaW5lc3Mi IAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgUnVzc2lhbiBBbWJhc3NhZG9yIHRv IElyYXEgc3RheXMgaW4gU3lyaWEKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0 ZUxpbmUuLi4gIE1vc2NvdywgUnVzc2lhLCBBcHIgMDgsIDIwMDMgKFJvc0J1c2luZXNzQ29u c3VsdGluZyB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHly aWdodCAoQykgMjAwMywgUm9zQnVzaW5lc3NDb25zdWx0aW5nLiBBbGwgUmlnaHRzIFJlc2Vy dmVkCgoKLi4uCgoKUm9zQnVzaW5lc3MKClJ1c3NpYW4gQW1iYXNzYWRvciB0byBJcmFxIFZs YWRpbWlyIFRpdGFyZW5rbyBpcyBjdXJyZW50bHkgaW4gU3lyaWEsCndoZXJlIGhlIGlzIGlu IGNoYXJnZSBvZiB0aGUgcHJvY2VzcyBvZiBldmFjdWF0aW5nIHRoZSBSdXNzaWFuIEVtYmFz c3kgaW4KQmFnaGRhZCwgdGhlIHByZXNzIGFuZCBpbmZvcm1hdGlvbiBkZXBhcnRtZW50IG9m IHRoZSBSdXNzaWFuIEZvcmVpZ24KTWluaXN0cnkgcmVwb3J0ZWQuIEVhcmxpZXIsIHNvbWUg bWFzcyBtZWRpYSBzb3VyY2VzIHJlcG9ydGVkIHRoYXQgdGhlCkFtYmFzc2Fkb3Igd2FzIHJl dHVybmluZyB0byBCYWdoZGFkLiBBdCB0aGUgc2FtZSB0aW1lLCBhIGdyb3VwIG9mIFJ1c3Np YW4KZGlwbG9tYXRzIGFuZCBqb3VybmFsaXN0cyBsZWZ0IERhbWFzY3VzIGFuZCBpdCBpcyB0 byBhcnJpdmUgaW4gTW9zY293IGF0CmFib3V0IDIwOjAwLgoKLi4uICAJIAoKS2V5V29yZHMu Li4gIAogICAgaXJhcQogICAgbWVkaWEKICAgIHJ1c3NpYQogICAgc3lyaWEKCnjwkj62aQQA PAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChOOUAAPwbwWEF6PSJBej0ot94AFOMxoSbRjtAs UBFhCHOGAAAAAAAAAAB48JI+iroEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot6FAAH0G SPBBej0oQXo9IgAUt97RjtAs4zGhJ1AQ+dfatgAAePCSPkvFBAA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLeiQAB9BkjvQXo9KEF6PSIAFLfe0Y7QLOMxoSdQEfnX2rUAAHjwkj6/xgQA PAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChOOkAAPwbwV0F6PSJBej0ot94AFOMxoSfRjtAt UBBhCHOFAAAAAAAAAAB48JI+ZZ0FADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTjtAAD8G 8FZBej0iQXo9KLdtABXd+jv8ucf6PlAQYQjMDQAAAAAAAAAAePCSPgnWBQBOAAAATgAAAAAH 6QoWXAACs50B5AgARQAAQLejQAB9BkjWQXo9KEF6PSIAFbdtucf6Pt36O/xQGPbGZzkAADIy NiBUcmFuc2ZlciBjb21wbGV0ZS4NCnjwkj4ZSwcAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUA AChOPEAAPwbwVUF6PSJBej0ot20AFd36O/y5x/pWUBBhCMv1AAAAAAAAAAB48JI+F9MNAG8A AABvAAAAAAKznQHkAAfpChZcCABFAABhOnxAAD8GA91Bej0iQXo9KJUPG1gYjJ7CdHoEIIAY FtAo1AAAAQEICg1D0dwAQhOkMTQ2fDE0NzI0MDJ8MTA0OTgxNzIxMHwxLjB8MXw1MjR8aGVs bG8gd29ybGQKefCSPnsMAQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVYQAB9BmstQXo9 KEF6PSIbWJUPdHoEIBiMnu+AEPe6riIAAAEBCAoAQhPCDUPR3Hnwkj4RDgEAUgEAAFIBAAAA ArOdAeQAB+kKFlwIAEUAAUQ6fUAAPwYC+UF6PSJBej0olQ8bWBiMnu90egQggBgW0DWOAAAB AQgKDUPR7ABCE8IxNDd8MTQ3MjQwM3wxMDQ5ODE3MjEwfDEuMHwxfDIxM3xoZWxsbyB3b3Js ZAoxNDh8MTQ3MjQwNHwxMDQ5ODE3MjEwfDEuMHwxfDIwMDF8aGVsbG8gd29ybGQKMTQ5fDE0 NzI0MDV8MTA0OTgxNzIxMXwxLjB8MXw1MjR8aGVsbG8gd29ybGQKMTUwfDE0NzI0MDZ8MTA0 OTgxNzIxMXwxLjB8MXw1MjR8aGVsbG8gd29ybGQKMTUxfDE0NzI0MDd8MTA0OTgxNzIxMXwx LjB8MXwyMTN8aGVsbG8gd29ybGQKMTUyfDE0NzI0MDh8MTA0OTgxNzIxMXwxLjB8MXwyODU4 fGhlbGxvIHdvcmxkCnnwkj7bYgQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVWUAAfQZr LEF6PShBej0iG1iVD3R6BCAYjJ//gBD2qq4QAAABAQgKAEITxA1D0ex58JI+U2QEAMoAAADK AAAAAAKznQHkAAfpChZcCABFAAC8On5AAD8GA4BBej0iQXo9KJUPG1gYjJ//dHoEIIAYFtDq cwAAAQEICg1D0gIAQhPEMTUzfDE0NzI0MDl8MTA0OTgxNzIxMnwxLjB8MXw2NTR8aGVsbG8g d29ybGQKMTU0fDE0NzI0MTB8MTA0OTgxNzIxMnwxLjB8MXw3OTl8aGVsbG8gd29ybGQKMTU1 fDE0NzI0MTF8MTA0OTgxNzIxMnwxLjB8MXwyNTY2fGhlbGxvIHdvcmxkCnnwkj6OuQcAQgAA AEIAAAAAB+kKFlwAArOdAeQIAEUAADSVWkAAfQZrK0F6PShBej0iG1iVD3R6BCAYjKCHgBD2 Iq34AAABAQgKAEITxg1D0gJ68JI+ByQDAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhOn9A AD8GA9pBej0iQXo9KJUPG1gYjKCHdHoEIIAYFtAgXgAAAQEICg1D0l4AQhPGMTU2fDE0NzI0 MTJ8MTA0OTgxNzIxM3wxLjB8MXw5ODh8aGVsbG8gd29ybGQKevCSPlrRBQBCAAAAQgAAAAAH 6QoWXAACs50B5AgARQAANJVbQAB9BmsqQXo9KEF6PSIbWJUPdHoEIBiMoLSAEPX1rZMAAAEB CAoAQhPPDUPSXnrwkj620gUAngAAAJ4AAAAAArOdAeQAB+kKFlwIAEUAAJA6gEAAPwYDqkF6 PSJBej0olQ8bWBiMoLR0egQggBgW0MUZAAABAQgKDUPSbwBCE88xNTd8MTQ3MjQxM3wxMDQ5 ODE3MjEzfDEuMHwxfDI1NjZ8aGVsbG8gd29ybGQKMTU4fDE0NzI0MTZ8MTA0OTgxNzIxM3wx LjB8MXwyODU4fGhlbGxvIHdvcmxkCnrwkj7EJwkAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSVXEAAfQZrKUF6PShBej0iG1iVD3R6BCAYjKEQgBD1ma2AAAABAQgKAEIT0Q1D0m978JI+ pnQDAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhOoFAAD8GA9hBej0iQXo9KJUPG1gYjKEQ dHoEIIAYFtAccgAAAQEICg1D0sQAQhPRMTU5fDE0NzI0MTd8MTA0OTgxNzIxNHwxLjB8MXwy MzB8aGVsbG8gd29ybGQKe/CSPkWUBQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVdQAB9 BmsoQXo9KEF6PSIbWJUPdHoEIBiMoT2AEPrwp58AAAEBCAoAQhPZDUPSxHvwkj6zlQUAcAAA AHAAAAAAArOdAeQAB+kKFlwIAEUAAGI6gkAAPwYD1kF6PSJBej0olQ8bWBiMoT10egQggBgW 0LBoAAABAQgKDUPS0gBCE9kxNjB8MTQ3MjQxOHwxMDQ5ODE3MjE0fDEuMHwxfDI2MjN8aGVs bG8gd29ybGQKe/CSPsHqCABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVeQAB9BmsnQXo9 KEF6PSIbWJUPdHoEIBiMoWuAEPrCp48AAAEBCAoAQhPbDUPS0nzwkj47qwQAbwAAAG8AAAAA ArOdAeQAB+kKFlwIAEUAAGE6g0AAPwYD1kF6PSJBej0olQ8bWBiMoWt0egQggBgW0ByQAAAB AQgKDUPTMABCE9sxNjF8MTQ3MjQxOXwxMDQ5ODE3MjE1fDEuMHwxfDk4OHxoZWxsbyB3b3Js ZAp88JI+dgIHAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lV9AAH0GayZBej0oQXo9IhtY lQ90egQgGIyhmIAQ+pWnKQAAAQEICgBCE+MNQ9MwfPCSPjQEBwCeAAAAngAAAAACs50B5AAH 6QoWXAgARQAAkDqEQAA/BgOmQXo9IkF6PSiVDxtYGIyhmHR6BCCAGBbQ5FEAAAEBCAoNQ9M/ AEIT4zE2MnwxNDcyNDIwfDEwNDk4MTcyMTV8MS4wfDF8MTEyMnxoZWxsbyB3b3JsZAoxNjN8 MTQ3MjQyMXwxMDQ5ODE3MjE1fDEuMHwxfDI2MjN8aGVsbG8gd29ybGQKfPCSPuJYCgBCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJVgQAB9BmslQXo9KEF6PSIbWJUPdHoEIBiMofSAEPo5 pxcAAAEBCAoAQhPmDUPTP33wkj6SzQUAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJOPUAA PwbwOkF6PSJBej0ot20AFd36O/y5x/pWUBhhCLr4AABERUxFIDM2MTk5ODc3Lm91dC4wMzA0 MDgNCn3wkj59CgYAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG63pEAAfQZIp0F6PShBej0i ABW3bbnH+lbd+jwWUBj2rK8VAAA1NTAgMzYxOTk4Nzcub3V0LjAzMDQwODogVGhlIHN5c3Rl bSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KffCSPvYdBgBRAAAAUQAAAAAC s50B5AAH6QoWXAgARQAAQ04+QAA/BvA4QXo9IkF6PSi3bQAV3fo8FrnH+pxQGGEIAtoAAFBP UlQgNjUsMTIyLDYxLDM0LDE4MywyMjYNCn3wkj75MQYAcAAAAHAAAAAAArOdAeQAB+kKFlwI AEUAAGI6hUAAPwYD00F6PSJBej0olQ8bWBiMofR0egQggBgW0LHKAAABAQgKDUPTngBCE+Yx NjR8MTQ3MjQyMnwxMDQ5ODE3MjE2fDEuMHwxfDk2NjJ8aGVsbG8gd29ybGQKffCSPqdYBgBU AAAAVAAAAAAH6QoWXAACs50B5AgARQAARrelQAB9BkjOQXo9KEF6PSIAFbdtucf6nN36PDFQ GPaQeOQAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCn3wkj7hXQYAUAAAAFAAAAAA ArOdAeQAB+kKFlwIAEUAAEJOP0AAPwbwOEF6PSJBej0ot20AFd36PDG5x/q6UBhhCKhDAABT VE9SIDM2MTk5ODc3Lm91dC4wMzA0MDgNCn3wkj5jpwYAeAAAAHgAAAAAB+kKFlwAArOdAeQI AEUAAGq3pkAAfQZIqUF6PShBej0iABW3bbnH+rrd+jxLUBj2djjYAAAxNTAgT3BlbmluZyBC SU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5ODc3Lm91dC4wMzA0MDguDQp9 8JI+wh8HAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwt6dAAH0GSOJBej0oQXo9IgAUt+KL 1QpWAAAAAHAC+vA9HgAAAgQFZAEBBAJ98JI+2CEHAD4AAAA+AAAAAAKznQHkAAfpChZcCABF AAAwTkBAAD8G8ElBej0iQXo9KLfiABTjVlBSi9UKV3ASYQii/AAAAQEEAgIEBbR98JI+FFoH ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot6hAAH0GSOlBej0oQXo9IgAUt+KL1QpX41ZQ U1AQ/VwzbAAAffCSPhhiBwCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE5BQAA/BursQXo9 IkF6PSi34gAU41ZQU4vVCldQEGEIH9YAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTcxNjgg TU49MzYxOTk4Nzcub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQ Rk49Ik0yIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIEdBUlRORVI6IElCTSBp bnRyb2R1Y2VzIHBvd2VyZnVsLCBsb3dlciBjb3N0IHN0b3JhZ2Ugc29sdXRpb25zIGZvciBt ZWRpdW0tc2l6ZWQgYnVzaW5lc3NlcwoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpE YXRlTGluZS4uLiAgU29tZXJzLCBOZXcgWW9yaywgQXByIDA4LCAyMDAzIChNMiBQUkVTU1dJ UkUgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICAoQykxOTk0LTIw MDMgTTIgQ09NTVVOSUNBVElPTlMgTFRECgoKLi4uCgoKTTIKCklCTSB0b2RheSBpcyBpbnRy b2R1Y2luZyBhIG5ldyBlbnRyeS1sZXZlbCBzdG9yYWdlIHNlcnZlciB0aGF0IGlzIG1vcmUK c2NhbGFibGUsIHlldCBjb3N0cyBsZXNzIHRoYW4gYSBzaW1pbGFybHkgY29uZmlndXJlZCBj b21wZXRpbmcgcHJvZHVjdApmcm9tIEVNQy4gSW4gYWRkaXRpb24sIElCTSBpcyBkZWxpdmVy aW5nIGFuIEV4cHJlc3MgdmVyc2lvbiBvZiBpdHMgVGl2b2xpClN0b3JhZ2UgUmVzb3VyY2Ug TWFuYWdlciBzb2Z0d2FyZSB0byBleHRlbmQgaXRzIHN0b3JhZ2UgbWFuYWdlbWVudApzb2Z0 d2FyZSBmYW1pbHkgdG8gZW5hYmxlIG1lZGl1bS1zaXplZCBidXNpbmVzc2VzIHRvIG9wdGlt YWxseSBtYW5hZ2UKdGhlaXIgc3RvcmFnZSBlbnZpcm9ubWVudHMuCgpXaXRoIGEgc3RhcnRp bmcgYmFzZSBwcmljZSBvZiAkMTQsOTk1LCB0aGUgSUJNIFRvdGFsU3RvcmFnZSBGQVN0VDYw MCBjYW4KcHJvdmlkZSB1cCB0byB0aHJlZSB0aW1lcyB0aGUgSS9PIHBlcmZvcm1hbmNlIGFu ZCB0aHJvdWdocHV0IG9mIHRoZQpwcmV2aW91cyBGQVN0VDIwMCBtb2RlbC4gVGhlIFRpdm9s aSBTUk0gRXhwcmVzcyBFZGl0aW9uLCBwcmljZWQgYXQgJDY1CnBlciBkZXNrdG9wLCBpcyBk ZXNpZ25lZCB0byBkZWxpdmVyIGNvbXByZWhlbnNpdmUgc3RvcmFnZSByZXNvdXJjZQptb25p dG9yaW5nIGFuZCBwbGFubmluZyB0b29scyBmb3IgaGV0ZXJvZ2VuZW91cyBzdG9yYWdlIGVu dmlyb25tZW50cy4KCkluZHVzdHJ5IHJlc2VhcmNoIHNob3dzIHRoYXQgbWVkaXVtLXNpemVk IGJ1c2luZXNzZXMgd2lsbCBhY2NvdW50IGZvcgphcHByb3hpbWF0ZWx5ICQxNTAgYmlsbGlv biBvZiBJVCBzcGVuZGluZyBnbG9iYWxseSBpbiB0aGUgbmV4dCBmZXcgeWVhcnMuCgpUb2dl dGhlciwgdGhlc2Ugc29sdXRpb25zIG9mZmVyIG1lZGl1bSBidXNpbmVzc2VzIHJ1bm5pbmcg TGludXgsIFdpbmRvd3MKYW5kIFVOSVggYXBwbGljYXRpb25zLCBhbiBlbnRlcnByaXNlLWxp a33wkj6QYgcAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxOQkAAPwbq60F6PSJBej0ot+IA FONWVbeL1QpXUBhhCGQeAABlIGNhcGFiaWxpdHkgZm9yIG1hbmFnaW5nCmhldGVyb2dlbmVv dXMgc3RvcmFnZSBuZXR3b3JrcyBhdCBhbiBhZmZvcmRhYmxlIGNvc3QuIEJ1aWx0IHdpdGgg SUJNCmF1dG9ub21pYyBjYXBhYmlsaXRpZXMsIHdoaWNoIGFsbG93cyBmb3Igc2VsZi1kaWFn bm9zaXMgYW5kIHJlcGFpciwgSUJNJ3MKRkFTdFQgYW5kIFRpdm9saSBTUk0gRXhwcmVzcyBj YW4gaGVscCBtYW5hZ2UgYnVzaW5lc3MgZGF0YSBtb3JlCmVmZmljaWVudGx5LgoKIkNvc3Qg YW5kIGVhc2Ugb2YgdXNlIGFyZSB0aGUgdHdvIGtleSBjb25jZXJucyBmb3IgbWVkaXVtLXNp emVkCmJ1c2luZXNzZXMsIiBzYWlkIFJvbGFuZCBIYWdhbiwgdmljZSBwcmVzaWRlbnQgb2Yg c3RvcmFnZSBtYXJrZXRpbmcsIElCTQpTeXN0ZW1zIEdyb3VwLgoKIlRvZGF5LCBJQk0gaXMg ZGVsaXZlcmluZyBhIHNldCBvZiBzdG9yYWdlIG5ldHdvcmtpbmcgc29sdXRpb25zIGRlc2ln bmVkCmFuZCBwcmljZWQgZm9yIHRoZXNlIGN1c3RvbWVycywgd2hpbGUgcHJvdmlkaW5nIGhp Z2ggcGVyZm9ybWFuY2UKdGVjaG5vbG9neSBuZWVkZWQgZm9yIHRvZGF5J3Mgb24tZGVtYW5k IG5ldHdvcmtlZCBzdG9yYWdlIGVudmlyb25tZW50LiIKCkhpZ2hsaWdodHMgb2YgdGhlIElC TSBUb3RhbFN0b3JhZ2UgRkFTdFQ2MDAgaW5jbHVkZToKCiogTW9yZSB0aGFuIHRocmVlIHRp bWVzIHRoZSBJL08gcGVyZm9ybWFuY2UgYW5kIHN1c3RhaW5lZCB0aHJvdWdocHV0IG9mCnRo ZSBGQVN0VDIwMCwgdGhlIHByZXZpb3VzIGVudHJ5LWxldmVsIG9mZmVyaW5nIGluIHRoZSBG QVN0VCBmYW1pbHkgb2YKcHJvZHVjdHMKCiogQXZlcmFnZSBjdXN0b21lciBjb25maWd1cmF0 aW9uIHByaWNlZCBiZWxvdyBjb21wZXRpdGl2ZSBzb2x1dGlvbnMKdG9nZXRoZXIgd2l0aCBs b25nZXIgYW5kIG1vcmUgZXh0ZW5zaXZlIHdhcnJhbnRpZXMKCiogU3VwcG9ydCBmb3IgVU5J WCBwbGF0Zm9ybXMgKEFJWCwgU3VuLCBIUCksIExpbnV4IGFuZCBXaW5kb3dzCmVudmlyb25t ZW50cywgbWFraW5nIGl0IGFtb25nIHRoZSBtb3N0IGludGVyb3BlcmFibGUgc29sdXRpb24g aW4gaXRzCmNsYXNzCgoqIEF1dG9ub21pYyBmdW5jdGlvbnMgc3VjaCBhcyBEeW5hbWljIENh cGFjaXR5IEFkZGl0aW9uLCB3aGljaCBhbGxvd3MKdW51c2VkIHN0b3JhZ2UgdG8gYmUgYnJv dWdodCBvbmxpbmUgd2l0aG91dCBzdG9wcGluZyBvcGVyYXRpb25zLCBhbmQ7CkZBU3RUIFNl cnZpY2UgQWxlcnQsIHdoaWNoIGlzIGNhcGFibGUgb2YgYXV0b21hdGljYWxseSBhbGVydGlu ZyBJQk0gaWYgYQpwcm9ibGVtIG9jY3Vycy4KClRoZSBGQVN0VDYwMCBpcyBkZXNpZ25lZCB0 byBiZSBhbiBlbnRyeS1sZXZlbCBzdG9yYWdlIHNlcnZlciB0aGF0LCB3aXRoCnR98JI+BWMH AJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTkNAAD8G6upBej0iQXo9KLfiABTjVlsbi9UK V1AYYQjZzwAAaGUgYXBwcm9wcmlhdGUgZXhwYW5zaW9uIHVuaXRzLCBjYW4gc2NhbGUgdXAg dG8gc2l4IHRlcmFieXRlcywKZmFjaWxpdGF0aW5nIHN0b3JhZ2UgY29uc29saWRhdGlvbiBm b3IgbWVkaXVtLXNpemVkIGJ1c2luZXNzZXMuIFRoZQpGQVN0VDYwMCB1c2VzIHRoZSBsYXRl c3QgaW4gc3RvcmFnZSBuZXR3b3JraW5nIHRlY2hub2xvZ3kgaW5jbHVkaW5nIDIKR2JwcyBG aWJyZSBDaGFubmVsIGZvciBzdG9yYWdlIG5ldHdvcmtzLiBBcyBwYXJ0IG9mIHRoZSBJQk0g RkFTdFQgZmFtaWx5LAp0aGUgTW9kZWwgNjAwIHVzZXMgdGhlIHNhbWUgY29tbW9uIHN0b3Jh Z2UgbWFuYWdlbWVudCBzb2Z0d2FyZSBhbmQgaGlnaApwZXJmb3JtYW5jZSBoYXJkd2FyZSBk ZXNpZ24sIGhlbHBpbmcgdG8gcHJvdmlkZSBjdXN0b21lcnMgd2l0aAplbnRlcnByaXNlLWxp a2UgY2FwYWJpbGl0aWVzIGZvdW5kIGF0IGhpZ2gtZW5kIG1vZGVscywgYnV0IGF0IGEgbXVj aApsb3dlciBjb3N0LgoKVGhlIEZBU3RUNjAwIHdpbGwgYmUgZ2VuZXJhbGx5IGF2YWlsYWJs ZSBBcHJpbCAxNSwgMjAwMy4KClRpdm9saSBFeHByZXNzIE9mZmVyaW5nIFByb3ZpZGVzIEFm Zm9yZGFibGUgU3RvcmFnZSBNYW5hZ2VtZW50CgpJQk0gVGl2b2xpIFN0b3JhZ2UgUmVzb3Vy Y2UgTWFuYWdlciBFeHByZXNzIEVkaXRpb24gaXMgZGVzaWduZWQgZm9yCmRlcGxveW1lbnQg b24gc2luZ2xlIHByb2Nlc3NvciBkZXNrdG9wcy4gSXQgcHJvdmlkZXMgYSBjb3N0IGVmZmVj dGl2ZSB3YXkKZm9yIG1pZC1zaXplZCBidXNpbmVzc2VzIHRvIGV4dGVuZCBTUk0gZnVuY3Rp b25hbGl0eSB0byB0aGUgc3RhbmQtYWxvbmUKY2xpZW50IHNvIHN0b3JhZ2UgY2FuIGJlIG1h bmFnZWQgYWNyb3NzIHRoZWlyIGVudGlyZSBlbnRlcnByaXNlLiBBcyBhIGtleQpjb21wb25l bnQgb2YgSUJNIFRpdm9saSdzIHN0b3JhZ2UgcmVzb3VyY2UgbWFuYWdlbWVudCBmYW1pbHks IElCTSBUaXZvbGkKU1JNIEV4cHJlc3MgcHJvdmlkZXMgY3VzdG9tZXJzIHRoZSBhYmlsaXR5 IHRvIGNlbnRyYWxpemUgY2xpZW50IGFzc2V0CmluZm9ybWF0aW9uLCBwZXJmb3JtIGNhcGFj aXR5IHBsYW5uaW5nLCBhcyB3ZWxsIGFzIHNldCBzdG9yYWdlIHBvbGljaWVzCmF0IHRoZSBj bGllbnQgbGV2ZWwuCgpJQk0gVGl2b2xpIFN0b3JhZ2UgUmVzb3VyY2UgTWFuYWdlciBwcm92 aWRlcyBhIGNvbXByZWhlbnNpdmUgSmF2YS1iYXNlZApzdG9yYWdlIG1hbmFnZW1lbnQgdG9v bCB0byBwcm9hY3RpdmVseSBwcmVkaWN0IG5lZWQgYW5kIG1hbmFnZSByZXNvdXJjZXMuCgpJ Qk0gVGl2b2xpIFN0b3JhZ2UgUmVzb3VyY2UgTWFuYWdlciBFeHByZXNzIEVkaXRpb24gd2ls bCBiZSBnZW5lcmFsbHkKYXZhaWxhYmxlIEFwcmlsIDI1LCAyMDAzffCSPl/dBwA2AAAANgAA AAAH6QoWXAACs50B5AgARQAAKLepQAB9BkjoQXo9KEF6PSIAFLfii9UKV+NWWxtQEP1cKKQA AH3wkj7C4AcAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxOREAAPwbq6UF6PSJBej0ot+IA FONWYH+L1QpXUBBhCOixAAAuCgpUb3RhbFN0b3JhZ2UgUHJvdmVuCgpJQk0gaXMgYWxzbyBh bm5vdW5jaW5nIDE2IG5ldyBhZGRpdGlvbnMgdG8gdGhlIElCTSBUb3RhbFN0b3JhZ2UgUHJv dmVuCnByb2dyYW0uIFRoZSBUb3RhbFN0b3JhZ2UgUHJvdmVuIHByb2dyYW0gaGVscHMgaWRl bnRpZnkgc3RvcmFnZSBzb2x1dGlvbnMKYW5kIGNvbmZpZ3VyYXRpb25zIGZvciBjdXN0b21l cnMgdGhhdCBoYXZlIGJlZW4gcHJlLXRlc3RlZCBmb3IKaW50ZXJvcGVyYWJpbGl0eSBoZWxw aW5nIHRvIHN1cHBvcnQgZmFzdGVyIGFuZCBtb3JlIHJlbGlhYmxlCmluc3RhbGxhdGlvbnMg Zm9yIGN1c3RvbWVycy4gT25lIG9mIHRoZSBsYXRlc3QgY29tcGFuaWVzIHRvIGNvbXBsZXRl IHRoZQpwcm9ncmFtIGlzIE51R2VuZXNpcyBUZWNobm9sb2dpZXMgQ29ycCAsIGEgbGVhZGVy IGluIHByb3ZpZGluZyBzY2llbnRpZmljCmRhdGEgbWFuYWdlbWVudCBzb2x1dGlvbnMuCgoi V2UgYXJlIG5vdyBxdWFsaWZpZWQgYXQgdGhlIGNvbXByZWhlbnNpdmUgbGV2ZWwgZm9yIElC TSdzIFRvdGFsU3RvcmFnZQpQcm92ZW4gcHJvZ3JhbSwiIHNhaWQgQXNob2sgSm9zaGksIENo aWVmIFRlY2hub2xvZ3kgT2ZmaWNlciAmIFZQCkVuZ2luZWVyaW5nLCBOdUdlbmVzaXMuICJU aGUgSUJNIHN0b3JhZ2UgcGxhdGZvcm0gcHJvdmlkZXMgYSBzdHJvbmcKZm91bmRhdGlvbiBm b3IgdGhlIGVudGVycHJpc2Ugc2NhbGUgTnVHZW5lc2lzIFNETVMgcGxhdGZvcm0uIE91ciBt dXR1YWwKY3VzdG9tZXJzIGNhbiBiZSBhc3N1cmVkIHRoYXQgdGhlaXIgZW50ZXJwcmlzZS13 aWRlIGRhdGEgbWFuYWdlbWVudApyZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZCB0b2RheSBh bmQgZm9yIHllYXJzIHRvIGNvbWUuIgoKQWJvdXQgSUJNCgpJQk0gZGV2ZWxvcHMgYW5kIG1h bnVmYWN0dXJlcyB0aGUgaW5kdXN0cnkncyBtb3N0IGFkdmFuY2VkIGluZm9ybWF0aW9uCnRl Y2hub2xvZ2llcywgaW5jbHVkaW5nIGNvbXB1dGVyIHN5c3RlbXMsIHNvZnR3YXJlLCBuZXR3 b3JraW5nIHN5c3RlbXMsCnN0b3JhZ2UgZGV2aWNlcyBhbmQgbWljcm9lbGVjdHJvbmljcy4g SUJNIFN5c3RlbXMgR3JvdXAgYW5kIElCTSBUaXZvbGkKU29mdHdhcmUgb2ZmZXIgY3VzdG9t ZXJzIHdvcmxkd2lkZSB0aGUgbW9zdCBjb21wcmVoZW5zaXZlIHJhbmdlIG9mCnN0b3JhZ2Ug cHJvZHVjdHMgYXZhaWxhYmxlIHRvZGF5LiBUaGVzZSBzdG9yYWdlIHNvbHV0aW9ucyBhcmUg b2ZmZXJlZAp0aHJvdWdoIElCTSBhcyB3ZWxsIGFzIGEgbGFyZ2UgbmV0d29yayBvZiBJQk0g QnVzaW5lc3MgUGFydG5lcnMuIEZvciBtb3JlCmluZm9ybWF0aW9uLCB2aXNpdCB3d3cuaWJt LmNvbS90b3RhbHN0b3JhZ2Ugb3Igd3d3LnRpdm9saS5jb20vc3RvcmFnZS4KCk598JI+LOEH ACAFAAAgBQAAAAKznQHkAAfpChZcCABFAAUSTkVAAD8G62JBej0iQXo9KLfiABTjVmXji9UK V1ARYQg4YwAAT1RJQ0UgQU5EIERJU0NMQUlNRVI6IFRoaXMgZW1haWwgKGluY2x1ZGluZyBh dHRhY2htZW50cykgaXMKY29uZmlkZW50aWFsLiBJZiB5b3UgaGF2ZSByZWNlaXZlZCB0aGlz IGVtYWlsIGluIGVycm9yIHBsZWFzZSBub3RpZnkgdGhlCnNlbmRlciBpbW1lZGlhdGVseSBh bmQgZGVsZXRlIHRoaXMgZW1haWwgZnJvbSB5b3VyIHN5c3RlbSB3aXRob3V0IGNvcHlpbmcK b3IgZGlzc2VtaW5hdGluZyBpdCBvciBwbGFjaW5nIGFueSByZWxpYW5jZSB1cG9uIGl0cyBj b250ZW50cy4gV2UgY2Fubm90CmFjY2VwdCBsaWFiaWxpdHkgZm9yIGFueSBicmVhY2hlcyBv ZiBjb25maWRlbmNlIGFyaXNpbmcgdGhyb3VnaCB1c2Ugb2YKZW1haWwuIEFueSBvcGluaW9u cyBleHByZXNzZWQgaW4gdGhpcyBlbWFpbCAoaW5jbHVkaW5nIGF0dGFjaG1lbnRzKSBhcmUK dGhvc2Ugb2YgdGhlIGF1dGhvciBhbmQgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3Qgb3Vy IG9waW5pb25zLiBXZSB3aWxsCm5vdCBhY2NlcHQgcmVzcG9uc2liaWxpdHkgZm9yIGFueSBj b21taXRtZW50cyBtYWRlIGJ5IG91ciBlbXBsb3llZXMKb3V0c2lkZSB0aGUgc2NvcGUgb2Yg b3VyIGJ1c2luZXNzLiBXZSBkbyBub3Qgd2FycmFudCB0aGUgYWNjdXJhY3kgb3IKY29tcGxl dGVuZXNzIG9mIHN1Y2ggaW5mb3JtYXRpb24uCgpNMiBDb21tdW5pY2F0aW9ucyBMdGQgZGlz Y2xhaW1zIGFsbCBsaWFiaWxpdHkgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkCndpdGhpbiBN MiBQcmVzc1dJUkUuIERhdGEgc3VwcGxpZWQgYnkgbmFtZWQgcGFydHkvcGFydGllcy4gRnVy dGhlcgppbmZvcm1hdGlvbiBvbiBNMiBQcmVzc1dJUkUgY2FuIGJlIG9idGFpbmVkIGF0IGh0 dHA6Ly93d3cucHJlc3N3aXJlLm5ldApvbiB0aGUgd29ybGQgd2lkZSB3ZWIuIElucXVpcmll cyB0byBpbmZvQG0yLmNvbS4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGJ1c2luZXNz CiAgICBjb21wdXRlcgogICAgZGF0YStzdG9yYWdlCiAgICBlbWFpbAogICAgZW5naW5lZXJp bmcKICAgIGV4cGFuc2lvbgogICAgZmFtaWx5CiAgICBmb3VuZGF0aW9uCiAgICBoYXJkd2Fy ZQogICAgamF2YQogICAga25vd2xlZGdlK21hbmFnZW1lbnQKICAgIGxpbnV4CiAgICBtYW51 ZmFjdHVyZXIKICAgIG5ldHdvcmtpbmcKICAgIG9ubGluZQogICAgcHJlc2lkZW50CiAgICBw cm9kdWN0cwogICAgcmVzZWFyY2gKICAgIHNjaWVuY2UKICAgIHNvZnR3YXJlCiAgICB0ZWNo bm9sb2d5CiAgICB1bml4CiAgICB3ZWIKCn3wkj6BDggAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChORkAAPwbwS0F6PSJBej0ot20AFd36PEu5x/r8UBBhCMsAAAAAAAAAAAB98JI+LT8I ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot6pAAH0GSOdBej0oQXo9IgAUt+KL1QpX41Zl 41AQ/Vwd3AAAffCSPtpYCAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLerQAB9BkjmQXo9 KEF6PSIAFLfii9UKV+NWas5QEPhyHdsAAH3wkj6raggANgAAADYAAAAAB+kKFlwAArOdAeQI AEUAACi3rEAAfQZI5UF6PShBej0iABS34ovVClfjVmrOUBH4ch3aAAB98JI+5msIADwAAAA8 AAAAAAKznQHkAAfpChZcCABFAAAoTkdAAD8G8EpBej0iQXo9KLfiABTjVmrOi9UKWFAQYQi1 RAAAAAAAAAAAffCSPi9sCABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLetQAB9BkjMQXo9 KEF6PSIAFbdtucf6/N36PEtQGPZ2ZnwAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCn3wkj58 cAgAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVYUAAfQZrJEF6PShBej0iG1iVD3R6BCAY jKIigBD6C6awAAABAQgKAEIT7g1D05598JI+IXIIAJ0AAACdAAAAAAKznQHkAAfpChZcCABF AACPOoZAAD8GA6VBej0iQXo9KJUPG1gYjKIidHoEIIAYFtAITAAAAQEICg1D06wAQhPuMTY1 fDE0NzI0MjN8MTA0OTgxNzIxNnwxLjB8MXw2NTF8aGVsbG8gd29ybGQKMTY2fDE0NzI0MjR8 MTA0OTgxNzIxNnwxLjB8MXwzNDIwfGhlbGxvIHdvcmxkCn3wkj5rdQgAUAAAAFAAAAAAArOd AeQAB+kKFlwIAEUAAEJOSEAAPwbwL0F6PSJBej0ot20AFd36PEu5x/sUUBhhCL/qAABERUxF IDM2MTk5ODgxLm91dC4wMzA0MDgNCn3wkj5PsggAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUA AG63rkAAfQZInUF6PShBej0iABW3bbnH+xTd+jxlUBj2XK1eAAA1NTAgMzYxOTk4ODEub3V0 LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K ffCSPqm+CABRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ05JQAA/BvAtQXo9IkF6PSi3bQAV 3fo8ZbnH+1pQGGEIAM0AAFBPUlQgNjUsMTIyLDYxLDM0LDE4MywyMjcNCn3wkj75+AgAVAAA AFQAAAAAB+kKFlwAArOdAeQIAEUAAEa3r0AAfQZIxEF6PShBej0iABW3bbnH+1rd+jyAUBj2 QHgnAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQp98JI+EvwIAFAAAABQAAAAAAKz nQHkAAfpChZcCABFAABCTkpAAD8G8C1Bej0iQXo9KLdtABXd+jyAucf7eFAYYQitNQAAU1RP UiAzNjE5OTg4MS5vdXQuMDMwNDA4DQp98JI+7jkJAHgAAAB4AAAAAAfpChZcAAKznQHkCABF AABqt7BAAH0GSJ9Bej0oQXo9IgAVt225x/t43fo8mlAY9iY3IQAAMTUwIE9wZW5pbmcgQklO QVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTg4MS5vdXQuMDMwNDA4Lg0KffCS PuI6CQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLexQAB9BkjYQXo9KEF6PSIAFLfjbHzn awAAAABwAvrwf2AAAAIEBWQBAQQCffCSPis8CQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAA ME5LQAA/BvA+QXo9IkF6PSi34wAU41nZBmx852xwEmEIXIcAAAEBBAICBAW0ffCSPrxzCQA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLeyQAB9BkjfQXo9KEF6PSIAFLfjbHznbONZ2QdQ EP1c7PYAAH3wkj5JewkAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxOTEAAPwbq4UF6PSJB ej0ot+MAFONZ2QdsfOdsUBBhCK6sAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MTY4IE1O PTM2MTk5ODgxLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZO PSJQUiBOZXdzd2lyZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBDYXRlcnBp bGxhciBBbm5vdW5jZXMgU3VwcG9ydCBmb3IgRVBBIFByb2dyYW0gdG8gUmVkdWNlIEVtaXNz aW9ucyBvbiBTY2hvb2wKQnVzZXMKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0 ZUxpbmUuLi4gIFBFT1JJQSwgIElsbC4sIEFwciA4LCAyMDAzIC9QUk5ld3N3aXJlLUZpcnN0 Q2FsbCB2aWEgQ09NVEVYLyAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdo dCAoQykgMjAwMyBQUiBOZXdzd2lyZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgoKLi4uCgoK UFIgTmV3c3dpcmUKCkNhdGVycGlsbGFyIEluYyAoTllTRTogQ0FUKSB0b2RheSBhbm5vdW5j ZWQgc3VwcG9ydCBmb3IgYSBtYWpvcgppbml0aWF0aXZlIGJ5IHRoZSBVUyBFbnZpcm9ubWVu dGFsIFByb3RlY3Rpb24gQWdlbmN5IHRvIHN1YnN0YW50aWFsbHkKcmVkdWNlIGVtaXNzaW9u cyBmcm9tIHNjaG9vbCBidXNlcyBhY3Jvc3MgdGhlIFVuaXRlZCBTdGF0ZXMuIFRoZSBFUEEn cwpDbGVhbiBTY2hvb2wgQnVzIFVTQSBpbml0aWF0aXZlIHdpbGwgc2VlayBmZWRlcmFsIGZ1 bmRpbmcgYW5kIGluZHVzdHJ5CnRlY2hub2xvZ3kgc3VwcG9ydCB0byByZXRyb2ZpdCBleGlz dGluZyBzY2hvb2wgYnVzIGVuZ2luZXMgd2l0aCBuZXcsCmVtaXNzaW9uIHJlZHVjdGlvbiB0 ZWNobm9sb2d5LgoKVGhlIEVQQSB1bnZlaWxlZCB0aGUgQ2xlYW4gU2Nob29sIEJ1cyBVU0Eg aW5pdGlhdGl2ZSBhdCBldmVudHMgeWVzdGVyZGF5CmluIFBoaWxhZGVscGhpYSwgUGEuLCBh bmQgV2FzaGluZ3RvbiwgREMgLCBhdHRlbmRlZCBieSBFUEEgQWRtaW5pc3RyYXRvcgpDaHJp c3RpbmUgVG9kZCBXaGl0bWFuIGFuZCBpbmR1c3RyeSBsZWFkZXJzLCBpbmNsdWRpbmcgQ2F0 ZXJwaWxsYXIgVmljZQpQcmVzaWRlbnQgU2hlcnJpbCBXZXN0LiBUaGUgRVBBIHByb2dyYW0g d2lsbCBoZWxwIHNjaG9vbCBkaXN0cmljdHMgYW5kCnNjaG9vbCBidXMgZmxlZXQgb3BlcmF0 b3JzIGVpdGhlciByZXBsYWNlIG9sZGVyIGJ1c2VzIHdpdGggbmV3ZXIgbW9kZWxzCm9yIGlu c3RhbGwgbG93IGVtaXNzaW9uIGNvbnRyb2wgZGV2aWNlcyBvbiBleGlzdGluZyBidXNlcy4K CiJBcyB0aGUgd29ybGQgbGVhZGVyIGluIGVtaXNzaW9ucyByZWR1Y3Rpb24gdGVjaG5vbG9n eSwgQ2F0ZXJwaWxsYXIgaXMKd2VsbCBlcXVpcHBlZCB0byBwcm92aWRlIHRlY2hub2xvZ3kg c29sdXRpb25zIHRvIHNjaG9vbCBidXMgcmV0cm9maXQKcHJvZ3JhbXMgYXJvdW5kIHRoZSB9 8JI+xXsJAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTk1AAD8G6uBBej0iQXo9KLfjABTj Wd5rbHznbFAYYQgT2QAAY291bnRyeSwiIHNhaWQgV2VzdCwgd2hvIGlzIHRoZSBjb21wYW55 J3MgQ2hpZWYKVGVjaG5vbG9neSBPZmZpY2VyLiAiV2UgaGF2ZSBpbnZlc3RlZCBoZWF2aWx5 IGluIHRlY2hub2xvZ3kgdGhhdCBub3Qgb25seQpwcm92aWRlcyBjbGVhbiBkaWVzZWwgZW5n aW5lcyBmb3IgdGhlIGZ1dHVyZSwgYnV0IHN1YnN0YW50aWFsbHkgcmVkdWNlcwplbWlzc2lv bnMgZnJvbSBleGlzdGluZyBlbmdpbmVzLiIKCkNhdGVycGlsbGFyIGlzIHBvc2l0aW9uZWQg dG8gYmVjb21lIHRoZSBsYXJnZXN0IHN1cHBsaWVyIG9mIHNjaG9vbCBidXMKZW5naW5lcyBp biBOb3J0aCBBbWVyaWNhLiBUaGUgY29tcGFueSByZWNlbnRseSB3b24gYW4gYWdyZWVtZW50 IHRvIHN1cHBseQp0aGUgbWFqb3JpdHkgb2YgbmV3IGVuZ2luZXMgdG8gQmx1ZSBCaXJkIENv cnBvcmF0aW9uLCBhIGxlYWRpbmcgc3VwcGxpZXIKb2Ygc2Nob29sIGJ1c2VzIGluIE5vcnRo IEFtZXJpY2EuIEluIGFkZGl0aW9uLCBDYXRlcnBpbGxhciBpcyB0aGUgbGFyZ2VzdAplbmdp bmUgc3VwcGxpZXIgdG8gVGhvbWFzIEJ1aWx0LCBhIHN1YnNpZGlhcnkgb2YgRGFpbWxlckNo cnlzbGVyJ3MKRnJlaWdodGxpbmVyIERpdmlzaW9uLgoKQ2F0ZXJwaWxsYXIgcmVjZW50bHkg Zm9ybWVkIHRoZSBFbWlzc2lvbnMgUmV0cm9maXQgU29sdXRpb25zIEdyb3VwIHRvCnByb3Zp ZGUgZW1pc3Npb25zIHJlZHVjdGlvbiBvcHRpb25zIGZvciBtYWNoaW5lcywgdHJ1Y2tzIGFu ZCBidXNlcyB1c2VkCmluIGJvdGggb24tYW5kLW9mZi1yb2FkIGFwcGxpY2F0aW9ucy4gVGhl IGNvbXBhbnkgaXMgYWxyZWFkeSBpbnZvbHZlZCBpbgpzZXZlcmFsIHNjaG9vbCBidXMgcmV0 cm9maXQgcHJvZ3JhbXMgYXJvdW5kIHRoZSBjb3VudHJ5LiBNb3N0IHJlY2VudGx5LApDYXRl cnBpbGxhciB3b24gYSBjb250cmFjdCB0byBzdXBwbHkgdGhlIEJvc3RvbiBQdWJsaWMgU2No b29sIERpc3RyaWN0CndpdGggdGVjaG5vbG9neSB0aGF0IHdpbGwgcmVkdWNlIGRpZXNlbCBw YXJ0aWN1bGF0ZSBlbWlzc2lvbnMgb24gc2Nob29sCmJ1c2VzIGJ5IG1vcmUgdGhhbiA5MCBw ZXJjZW50LgoKQ2F0ZXJwaWxsYXIgaGFzIHJlZHVjZWQgb24taGlnaHdheSBkaWVzZWwgZW1p c3Npb25zIGluIHRydWNrcyBhbmQgYnVzZXMKYnkgbmVhcmx5IDkwIHBlcmNlbnQgc2luY2Ug MTk4OCBhbmQgd2lsbCByZWR1Y2UgdGhvc2UgZW1pc3Npb25zIGFub3RoZXIKOTAgcGVyY2Vu dCBieSAyMDA3LiBUaGUgY29tcGFueSByZWNlbnRseSBsYXVuY2hlZCBhIG5ldyBsaW5lIG9m IGVuZ2luZXMKZXF1aXBwZWQgd2l0aCBsb3cgZW1pc3Npb24sIEFDRVJUKFRNKSB0ZWNobm9s b2d5IHRoYXQgd2lsbCBwb3dlciBzY2hvb2wKYW5kIHRyYW5zaXQgYnVzZXMgffCSPjN8CQBH BQAARwUAAAACs50B5AAH6QoWXAgARQAFOU5OQAA/BusyQXo9IkF6PSi34wAU41njz2x852xQ GGEIC58AAGFuZCBvbi1oaWdod2F5IHRydWNrcy4gVGhlIHRlY2hub2xvZ3kgd2lsbCBhbHNv IGhlbHAKdGhlIGNvbXBhbnkgbWVldCBmdXR1cmUgRVBBIGVtaXNzaW9ucyByZWd1bGF0aW9u cyBpbiBib3RoCm9uLWFuZC1vZmYtaGlnaHdheSBlbmdpbmVzLgoKRm9yIG1vcmUgdGhhbiA3 NSB5ZWFycywgQ2F0ZXJwaWxsYXIgSW5jIGhhcyBiZWVuIGJ1aWxkaW5nIHRoZSB3b3JsZCdz CmluZnJhc3RydWN0dXJlIGFuZCwgaW4gcGFydG5lcnNoaXAgd2l0aCBpdHMgd29ybGR3aWRl IGRlYWxlciBuZXR3b3JrLCBpcwpkcml2aW5nIHBvc2l0aXZlIGFuZCBzdXN0YWluYWJsZSBj aGFuZ2Ugb24gZXZlcnkgY29udGluZW50LiBXaXRoIDIwMDIKc2FsZXMgYW5kIHJldmVudWVz IG9mICQyMC4xNSBiaWxsaW9uLCBDYXRlcnBpbGxhciBpcyBhIHRlY2hub2xvZ3kgbGVhZGVy CmFuZCB0aGUgd29ybGQncyBsZWFkaW5nIG1hbnVmYWN0dXJlciBvZiBjb25zdHJ1Y3Rpb24g YW5kIG1pbmluZwplcXVpcG1lbnQsIGRpZXNlbCBhbmQgbmF0dXJhbCBnYXMgZW5naW5lcyBh bmQgaW5kdXN0cmlhbCBnYXMgdHVyYmluZXMuCk1vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxh YmxlIGF0IHd3dy5jYXQuY29tIC4KCiAKCkNvbXBvbmVudHMgb2YgdGhlIENhdGVycGlsbGFy IHByb2dyYW0gZGVzY3JpYmVkIGFib3ZlIHdlcmUgaW5pdGlhbGx5CnVuZGVydGFrZW4gcHVy c3VhbnQgdG8gYW4gYWdyZWVtZW50IHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgaW4gY29ubmVj dGlvbgp3aXRoIHNldHRsZW1lbnQgb2YgZGlzcHV0ZWQgY2xhaW1zIGluIGFuIGVuZm9yY2Vt ZW50IGFjdGlvbiB1bmRlciB0aGUKQ2xlYW4gQWlyIEFjdC4KClNPVVJDRSBDYXRlcnBpbGxh ciBJbmMKCkNhcmwgTSAgVm9seiwgQ2F0ZXJwaWxsYXIgQ29ycG9yYXRlIFB1YmxpYyBBZmZh aXJzLAorMS0zMDktNjc1LTU4MTksIHZvbHpfY2FybF9tQGNhdC5jb20KCmh0dHA6Ly93d3cu Q0FULmNvbQoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgY29uc3RydWN0aW9uCiAgICBj b250cmFjdAogICAgZGVhbGVyCiAgICBlbnZpcm9ubWVudGFsK3Byb3RlY3Rpb24rYWdlbmN5 CiAgICBlcGEKICAgIGZlZGVyYWwKICAgIGdhc29saW5lCiAgICBpbmR1c3RyaWFsCiAgICBt YW51ZmFjdHVyZXIKICAgIG1pbmluZwogICAgbmF0dXJhbCtnYXMKICAgIG5vcnRoK2FtZXJp Y2EKICAgIG55c2UKICAgIHBhcnRuZXJzaGlwCiAgICBwZW5uc3lsdmFuaWEKICAgIHByZXNp ZGVudAogICAgcmVndWxhdGlvbnMKICAgIHNhbGVzCiAgICB0ZWNobm9sb2d5CiAgICB3YXNo aW5ndG9uCgp98JI+NHwJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTk9AAD8G8EJBej0i QXo9KLfjABTjWejgbHznbFARYQh5cQAAAAAAAAAAffCSPhD2CQA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLezQAB9BkjeQXo9KEF6PSIAFLfjbHznbONZ489QEP1c4i4AAH3wkj6GEQoA NgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi3tEAAfQZI3UF6PShBej0iABS342x852zjWejh UBD4S+ItAAB98JI+sBsKADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot7VAAH0GSNxBej0o QXo9IgAUt+NsfOds41no4VAR+EviLAAAffCSPsscCgA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKE5QQAA/BvBBQXo9IkF6PSi34wAU41no4Wx8521QEGEIeXAAAAAAAAAAAH3wkj6apgoA PAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChOUUAAPwbwQEF6PSJBej0ot20AFd36PJq5x/u6 UBBhCMnzAAAAAAAAAAB98JI+Fd8KAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAt7ZAAH0G SMNBej0oQXo9IgAVt225x/u63fo8mlAY9iZlvwAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0K ffCSPlzoCgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk5SQAA/BvAlQXo9IkF6PSi3bQAV 3fo8mrnH+9JQGGEIu90AAERFTEUgMzYxOTk4ODQub3V0LjAzMDQwOA0KffCSPnFqCwB8AAAA fAAAAAAH6QoWXAACs50B5AgARQAAbre3QAB9BkiUQXo9KEF6PSIAFbdtucf70t36PLRQGPYM rJ4AADU1MCAzNjE5OTg4NC5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRo ZSBmaWxlIHNwZWNpZmllZC4gDQp98JI+FHYLAFEAAABRAAAAAAKznQHkAAfpChZcCABFAABD TlNAAD8G8CNBej0iQXo9KLdtABXd+jy0ucf8GFAYYQj+vwAAUE9SVCA2NSwxMjIsNjEsMzQs MTgzLDIyOA0KffCSPnewCwBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARre4QAB9Bki7QXo9 KEF6PSIAFbdtucf8GN36PM9QGPXwd2oAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4N Cn3wkj7GswsAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJOVEAAPwbwI0F6PSJBej0ot20A Fd36PM+5x/w2UBhhCKkoAABTVE9SIDM2MTk5ODg0Lm91dC4wMzA0MDgNCn3wkj44xwsAQgAA AEIAAAAAB+kKFlwAArOdAeQIAEUAADSVYkAAfQZrI0F6PShBej0iG1iVD3R6BCAYjKJ9gBD5 sKafAAABAQgKAEIT8Q1D06x98JI+UfELAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqt7lA AH0GSJZBej0oQXo9IgAVt225x/w23fo86VAY9dY2YQAAMTUwIE9wZW5pbmcgQklOQVJZIG1v ZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTg4NC5vdXQuMDMwNDA4Lg0KffCSPsRcDAA+ AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLe6QAB9BkjPQXo9KEF6PSIAFLfktvHMuAAAAABw AvrwT50AAAIEBWQBAQQCffCSPt9eDAA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME5VQAA/ BvA0QXo9IkF6PSi35AAU41xpVLbxzLlwEmEInHMAAAEBBAICBAW0ffCSPoOWDAA2AAAANgAA AAAH6QoWXAACs50B5AgARQAAKLe7QAB9BkjWQXo9KEF6PSIAFLfktvHMueNcaVVQEP1cLOMA AH3wkj4vnwwANQQAADUEAAAAArOdAeQAB+kKFlwIAEUABCdOVkAAPwbsPEF6PSJBej0ot+QA FONcaVW28cy5UBhhCDBVAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MTY5IE1OPTM2MTk5 ODg0Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJSb3NC dXNpbmVzcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBGaW5hbmNlIE1pbmlz dHJ5IHBvc3RzIFExIGJ1ZGdldCBmaWd1cmVzCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4u ICAKCkRhdGVMaW5lLi4uICBNb3Njb3csIFJ1c3NpYSwgQXByIDA4LCAyMDAzIChSb3NCdXNp bmVzc0NvbnN1bHRpbmcgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4u ICBDb3B5cmlnaHQgKEMpIDIwMDMsIFJvc0J1c2luZXNzQ29uc3VsdGluZy4gQWxsIFJpZ2h0 cyBSZXNlcnZlZAoKCi4uLgoKClJvc0J1c2luZXNzCgpBY2NvcmRpbmcgdG8gYSBwcmVsaW1p bmFyeSBlc3RpbWF0aW9uLCB0aGUgZmVkZXJhbCBidWRnZXQgcmVjZWl2ZWQKNTgwLjJibiBy dWJsZXMgKCQxOC41M2JuKSBpbiByZXZlbnVlcyBpbiB0aGUgcGVyaW9kIGZyb20gSmFudWFy eSB0byBNYXJjaAoyMDAzLCB3aGljaCB3YXMgMTA1LjYgcGVyY2VudCBvZiB0aGUgcGxhbm5l ZCB2b2x1bWUuIFRoZXNlIHJldmVudWVzIHdlcmUKMjAuOSBwZXJjZW50IG9mIHRoZSBHRFAs IHdoaWNoIHdhcyAwLjIgcGVyY2VudCBoaWdoZXIgdGhhbiBpbiAyMDAyLCB0aGUKcHJlc3Mg c2VydmljZSBvZiB0aGUgRmluYW5jZSBNaW5pc3RyeSByZXBvcnRlZC4gRXhwZW5zZXMgYW1v dW50ZWQgdG8KNTc4LjJibiBydWJsZXMgKCQxOC40NykgaW4gdGhlIHJlcG9ydGVkIHBlcmlv ZCwgd2hpY2ggd2FzIDk2LjEgcGVyY2VudCBvZgp0aGUgcGxhbm5lZCB2b2x1bWUuIEFjY29y ZGluZyB0byBhIHByZWxpbWluYXJ5IGVzdGltYXRpb24sIHRoZSBmZWRlcmFsCmJ1ZGdldCBo YWQgYSAxLjlibiBydWJsZSAoJDYwLjdtKSBzdXJwbHVzIGluIHRoZSBmaXJzdCBxdWFydGVy IG9mIDIwMDMuCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBidWRnZXQKICAgIGZpbmFu Y2UKICAgIHJ1YmxlCgp98JI+MJ8MADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTldAAD8G 8DpBej0iQXo9KLfkABTjXG1UtvHMuVARYQjFNwAAAAAAAAAAffCSPtDzDAA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLe8QAB9BkjVQXo9KEF6PSIAFLfktvHMueNcbVVQEPldLOIAAH3w kj7/Ag0ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi3vUAAfQZI1EF6PShBej0iABS35Lbx zLnjXG1VUBH5XSzhAAB98JI+VQQNADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTlhAAD8G 8DlBej0iQXo9KLfkABTjXG1VtvHMulAQYQjFNgAAAAAAAAAAffCSPkhmDQA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKE5ZQAA/BvA4QXo9IkF6PSi3bQAV3fo86bnH/HhQEGEIyOYAAAAA AAAAAH3wkj4Vnw0ATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC3vkAAfQZIu0F6PShBej0i ABW3bbnH/Hjd+jzpUBj11mUCAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQp98JI+NKkNAFAA AABQAAAAAAKznQHkAAfpChZcCABFAABCTlpAAD8G8B1Bej0iQXo9KLdtABXd+jzpucf8kFAY YQi50AAAREVMRSAzNjE5OTg4NS5vdXQuMDMwNDA4DQp98JI+yuYNAHwAAAB8AAAAAAfpChZc AAKznQHkCABFAABut79AAH0GSIxBej0oQXo9IgAVt225x/yQ3fo9A1AY9byr4AAANTUwIDM2 MTk5ODg1Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3Bl Y2lmaWVkLiANCn3wkj6x9A0AUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENOW0AAPwbwG0F6 PSJBej0ot20AFd36PQO5x/zWUBhhCPyyAABQT1JUIDY1LDEyMiw2MSwzNCwxODMsMjI5DQp9 8JI+uC4OAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGt8BAAH0GSLNBej0oQXo9IgAVt225 x/zW3fo9HlAY9aB2rQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KffCSPk8zDgBQ AAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk5cQAA/BvAbQXo9IkF6PSi3bQAV3fo9HrnH/PRQ GGEIpxsAAFNUT1IgMzYxOTk4ODUub3V0LjAzMDQwOA0KffCSPhTBDgB4AAAAeAAAAAAH6QoW XAACs50B5AgARQAAarfBQAB9BkiOQXo9KEF6PSIAFbdtucf89N36PThQGPrwMDkAADE1MCBP cGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk4ODUub3V0LjAz MDQwOC4NCn3wkj7SOQ8APgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC3wkAAfQZIx0F6PShB ej0iABS35bR0FfEAAAAAcAL68AjhAAACBAVkAQEEAn3wkj7GOw8APgAAAD4AAAAAArOdAeQA B+kKFlwIAEUAADBOXUAAPwbwLEF6PSJBej0ot+UAFONfun60dBXycBJhCASKAAABAQQCAgQF tH7wkj7EMQAANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi3w0AAfQZIzkF6PShBej0iABS3 5bR0FfLjX7p/UBD9XJT5AAB+8JI++joAAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTl5A AD8G6s9Bej0iQXo9KLflABTjX7p/tHQV8lAQYQi3HQAAWFlaWlkuLi4gIFRDPTIgVE09MTA0 OTgxNzE2OSBNTj0zNjE5OTg4NS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJD b210ZXgiIFBGTj0iTTIiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgVUsgR292 ZXJubWVudDogT2ZzdGVkIGFwcG9pbnRzIG5ldyBFYXJseSBZZWFycyBEaXJlY3RvcgoKLi4u ICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChN MiBQUkVTU1dJUkUgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICAo QykxOTk0LTIwMDMgTTIgQ09NTVVOSUNBVElPTlMgTFRECgoKLi4uCgoKTTIKClRoZSBPZmZp Y2UgZm9yIFN0YW5kYXJkcyBpbiBFZHVjYXRpb24gdG9kYXkgYW5ub3VuY2VkIHRoZSBhcHBv aW50bWVudCBvZgpNYXVyaWNlIFNtaXRoIHRvIHRoZSBwb3N0IG9mIERpcmVjdG9yIG9mIEVh cmx5IFllYXJzLgoKTXIgU21pdGgsIGEgbWVtYmVyIG9mIEhlciBNYWplc3R5J3MgSW5zcGVj dG9yYXRlIChITUkpIHdpdGggT2ZzdGVkIHNpbmNlCjE5OTYsIHdpbGwgdGFrZSB1cCBwb3Np dGlvbiBpbW1lZGlhdGVseSBhZnRlciBjb3ZlcmluZyB0aGUgcG9zdCBhcyBBY3RpbmcKRWFy bHkgWWVhcnMgRGlyZWN0b3Igc2luY2UgbGFzdCBTZXB0ZW1iZXIuIFByaW9yIHRvIHdvcmtp bmcgaW4gT2ZzdGVkLCBNcgpTbWl0aCBoZWxkIHNlbmlvciBtYW5hZ2VtZW50IHBvc3RzIGlu IHNvY2lhbCBzZXJ2aWNlcyBhbmQgZWR1Y2F0aW9uIGluCmxvY2FsIGF1dGhvcml0aWVzIGlu IHRoZSBub3J0aCB3ZXN0IG9mIEVuZ2xhbmQuCgpIZXIgTWFqZXN0eSdzIENoaWVmIEluc3Bl Y3RvciBvZiBTY2hvb2xzIERhdmlkIEJlbGwgc2FpZDogIlRoZXNlIGFyZQpleGNpdGluZyBh bmQgY2hhbGxlbmdpbmcgdGltZXMgZm9yIE9mc3RlZC4gSSBhbSBjb25maWRlbnQgdGhhdCwg d2l0aCB0aGUKYXBwb2ludG1lbnQgb2YgTWF1cmljZSBTbWl0aCBhcyBPZnN0ZWQncyBuZXcg RGlyZWN0b3Igb2YgRWFybHkgWWVhcnMgYW5kCnRoZSBvdGhlciBzZW5pb3IgYXBwb2ludG1l bnRzIEkgaGF2ZSBjb25maXJtZWQgdG9kYXksIE9mc3RlZCBjYW4Kc3VjY2Vzc2Z1bGx5IGNv bnRpbnVlIHRvIGluc3BlY3QgYW5kIHJlZ3VsYXRlIHJpZ29yb3VzbHkgYXMgd2VsbCBhcwpw cm92aWRlIHRoZSBoaWdoZXN0IHF1YWxpdHkgaW5kZXBlbmRlbnQgYW5kIGltcGFydGlhbCBp bmZvcm1hdGlvbiBhbmQKYWR2aWNlIHRvIHBhcmVudHMsIGdvdmVybm1lbnQgYW5kIHRoZSBl ZHVjYXRpb24gYW5kIGNhcmUgc2VjdG9ycy4gSSBsb29rCmZvcndhcmQgdG8gd29ya2luZyB3 aXRoIG15IG5ldyBjb2xsZWFndWVzIG92ZXIgdGhlIG1vbnRocyBhbmQgeWVhcnMKYWhlYWQu IgoKSW4gYWRkfvCSPnQ7AACaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE5fQAA/BurOQXo9 IkF6PSi35QAU41+/47R0FfJQGGEI0n0AAGl0aW9uIHRvIHRoZSBhcHBvaW50bWVudCBvZiB0 aGUgbmV3IEVhcmx5IFllYXJzIERpcmVjdG9yLCBNciBCZWxsCmFsc28gYW5ub3VuY2VkIGEg bnVtYmVyIG9mIGZ1cnRoZXIgc2VuaW9yIG1hbmFnZW1lbnQgbW92ZXMgZm9sbG93aW5nIGFu CmludGVybmFsIHJlb3JnYW5pc2F0aW9uLgoKRGF2aWQgVGF5bG9yIGJlY29tZXMgdGhlIE9m c3RlZCdzIHNpbmdsZSBEaXJlY3RvciBvZiBJbnNwZWN0aW9uIGZvbGxvd2luZwp0aGUgcmV0 aXJlbWVudCBvZiBmZWxsb3cgRGlyZWN0b3Igb2YgSW5zcGVjdGlvbiBFbGl6YWJldGggUGFz c21vcmUuCgpPZnN0ZWQgd2lsbCBhbHNvIGJlIGNyZWF0aW5nIGEgbmV3IFN1YmplY3QgYW5k IFF1YWxpdHkgQXNzdXJhbmNlCkRpdmlzaW9uLCB0byBiZSBmb3JtZWQgZnJvbSB0aGUgZXhp c3RpbmcgQ3VycmljdWx1bSBBZHZpY2UgYW5kIEluc3BlY3Rpb24KRGl2aXNpb24gYW5kIHRo ZSBJbnNwZWN0aW9uIFF1YWxpdHkgRGl2aXNpb24uCgpNciBCZWxsIGNvbmZpcm1lZCB0aGUg YXBwb2ludG1lbnQgb2YgZm91ciBuZXcgZGl2aXNpb25hbCBtYW5hZ2VyIHBvc3RzOgoKLS0g U3ViamVjdCBhbmQgUXVhbGl0eSBBc3N1cmFuY2UgRGl2aXNpb24gKFNRQUQpIC0gTWlyaWFt IFJvc2VuIEhNSSwKY3VycmVudGx5IHdvcmtpbmcgaW4gT2ZzdGVkJ3MgTG9jYWwgRWR1Y2F0 aW9uIEF1dGhvcml0eSBJbnNwZWN0aW9uCkRpdmlzaW9uCgotLSBMb2NhbCBFZHVjYXRpb24g QXV0aG9yaXR5IEluc3BlY3Rpb24gRGl2aXNpb24gKExFQUlEKSAtIFNoZWlsYSBCcm93bgpI TUksIGN1cnJlbnRseSB3b3JraW5nIGluIE9mc3RlZCdzIFBvc3QtQ29tcHVsc29yeSBFZHVj YXRpb24gRGl2aXNpb24KCi0tIFNjaG9vbCBJbXByb3ZlbWVudCBEaXZpc2lvbiAoU0lEKSAt IEFuZHkgUmVpZCBITUksIGN1cnJlbnRseSB3b3JraW5nCmluIHRoaXMgRGl2aXNpb24KCi0t IFByaW1hcnkgRWR1Y2F0aW9uIERpdmlzaW9uIChQRUQpIC0gUm9nZXIgU2hpcHBhbSBITUks IGN1cnJlbnRseQp3b3JraW5nIGluIE9mc3RlZCdzIEluc3BlY3Rpb24gUXVhbGl0eSBEaXZp c2lvbi4KClRoZXNlIGFwcG9pbnRtZW50cyB3aWxsIHRha2UgZWZmZWN0IGF0IGRhdGVzIHRv IGJlIGFubm91bmNlZCBvdmVyIHRoZQpzdW1tZXIgYW5kIGF1dHVtbi4KCk5PVEVTIFRPIEVE SVRPUlMKCjEuIE9mc3RlZCBpcyBhIG5vbi1taW5pc3RlcmlhbCBnb3Zlcm5tZW50IGRlcGFy dG1lbnQgZXN0YWJsaXNoZWQgdW5kZXIKdGhlIEVkdWNhdGlvbiAoU2Nob29scykgQWN0IDE5 OTIgdG8gdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlCmluc3BlY3Rpb24gb2YgYWxsIHNj aG9vbHMgaW4gRW5nbGFuZC4gSXRzIHJvbGUgYWxzbyBpbmNsdWRlcyB0aGUKaW5zcGVjdGlv bn7wkj65OwAA6gIAAOoCAAAAArOdAeQAB+kKFlwIAEUAAtxOYEAAPwbtfUF6PSJBej0ot+UA FONfxUe0dBXyUBhhCHeZAAAgb2YgbG9jYWwgZWR1Y2F0aW9uIGF1dGhvcml0aWVzLCB0ZWFj aGVyIHRyYWluaW5nIGluc3RpdHV0aW9ucwphbmQgeW91dGggd29yay4gRHVyaW5nIDIwMDEs IE9mc3RlZCBiZWNhbWUgcmVzcG9uc2libGUgZm9yIGluc3BlY3RpbmcgYWxsCjE2LTE5IGVk dWNhdGlvbiBhbmQgZm9yIHRoZSByZWd1bGF0aW9uIG9mIGVhcmx5IHllYXJzIGNoaWxkY2Fy ZSwKaW5jbHVkaW5nIGNoaWxkbWluZGVycy4KCkNPTlRBQ1Q6IEdlbmVyYWwgZW5xdWlyaWVz IFRlbDogKzQ0ICgwKTIwIDc0MjEgNjc0NCBXV1c6Cmh0dHA6Ly93d3cub2ZzdGVkLmdvdi51 awoKTTIgQ29tbXVuaWNhdGlvbnMgTHRkIGRpc2NsYWltcyBhbGwgbGlhYmlsaXR5IGZvciBp bmZvcm1hdGlvbiBwcm92aWRlZAp3aXRoaW4gTTIgUHJlc3NXSVJFLiBEYXRhIHN1cHBsaWVk IGJ5IG5hbWVkIHBhcnR5L3BhcnRpZXMuIEZ1cnRoZXIKaW5mb3JtYXRpb24gb24gTTIgUHJl c3NXSVJFIGNhbiBiZSBvYnRhaW5lZCBhdCBodHRwOi8vd3d3LnByZXNzd2lyZS5uZXQKb24g dGhlIHdvcmxkIHdpZGUgd2ViLiBJbnF1aXJpZXMgdG8gaW5mb0BtMi5jb20uCgouLi4gIAkg CgpLZXlXb3Jkcy4uLiAgCiAgICBlZGl0b3JzCiAgICBlZHVjYXRpb24KICAgIGVuZ2xhbmQK ICAgIGdvdmVybm1lbnQKICAgIGxvY2FsCiAgICBzdGFuZGFyZHMKICAgIHRyYWluaW5nCiAg ICB3ZWIKCn7wkj67OwAAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChOYUAAPwbwMEF6PSJB ej0ot+UAFONfx/u0dBXyUBFhCCPRAAAAAAAAAAB+8JI+1rUAADYAAAA2AAAAAAfpChZcAAKz nQHkCABFAAAot8RAAH0GSM1Bej0oQXo9IgAUt+W0dBXy41/FR1AQ/VyKMQAAfvCSPibCAAA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLfFQAB9BkjMQXo9KEF6PSIAFLfltHQV8uNfx/xQ EPqoijAAAH7wkj4BzAAANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi3xkAAfQZIy0F6PShB ej0iABS35bR0FfLjX8f8UBH6qIovAAB+8JI+Os0AADwAAAA8AAAAAAKznQHkAAfpChZcCABF AAAoTmJAAD8G8C9Bej0iQXo9KLflABTjX8f8tHQV81AQYQgj0AAAAAAAAAAAfvCSPrfiAAA8 AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE5jQAA/BvAuQXo9IkF6PSi3bQAV3fo9OLnH/TZQ EGEIx9kAAAAAAAAAAH7wkj7jGgEATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC3x0AAfQZI skF6PShBej0iABW3bbnH/Tbd+j04UBj68F7bAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQp+ 8JI+wiQBAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCTmRAAD8G8BNBej0iQXo9KLdtABXd +j04ucf9TlAYYQi2wwAAREVMRSAzNjE5OTg4Ny5vdXQuMDMwNDA4DQp+8JI+CWEBAHwAAAB8 AAAAAAfpChZcAAKznQHkCABFAABut8hAAH0GSINBej0oQXo9IgAVt225x/1O3fo9UlAY+tal twAANTUwIDM2MTk5ODg3Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhl IGZpbGUgc3BlY2lmaWVkLiANCn7wkj7JbQEAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENO ZUAAPwbwEUF6PSJBej0ot20AFd36PVK5x/2UUBhhCASlAABQT1JUIDY1LDEyMiw2MSwzNCwx ODMsMjMwDQp+8JI+OqcBAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGt8lAAH0GSKpBej0o QXo9IgAVt225x/2U3fo9bVAY+rpwhgAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K fvCSPo6qAQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk5mQAA/BvARQXo9IkF6PSi3bQAV 3fo9bbnH/bJQGGEIpA4AAFNUT1IgMzYxOTk4ODcub3V0LjAzMDQwOA0KfvCSPiZaAgB4AAAA eAAAAAAH6QoWXAACs50B5AgARQAAarfKQAB9BkiFQXo9KEF6PSIAFbdtucf9st36PYdQGPqg L3oAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk4 ODcub3V0LjAzMDQwOC4NCn7wkj6xkwIAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC3y0AA fQZIvkF6PShBej0iABS35rnG7yYAAAAAcAL68CpYAAACBAVkAQEEAn7wkj5JlQIAPgAAAD4A AAAAArOdAeQAB+kKFlwIAEUAADBOZ0AAPwbwIkF6PSJBej0ot+YAFONg8D65xu8ncBJhCPA/ AAABAQQCAgQFtH7wkj65zQIANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi3zEAAfQZIxUF6 PShBej0iABS35rnG7yfjYPA/UBD9XICvAAB+8JI+59QCAKsEAACrBAAAAAKznQHkAAfpChZc CABFAASdTmhAAD8G67RBej0iQXo9KLfmABTjYPA/ucbvJ1AYYQjQjQAAWFlaWlkuLi4gIFRD PTIgVE09MTA0OTgxNzE3MCBNTj0zNjE5OTg4Ny5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRl eCIgUEZOPSJDb210ZXgiIFBGTj0iRmVkQml6T3BzIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVh ZExpbmUuLi4gIERPT1IsIEFDQ0VTUyBBQ1JGVAoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4u LiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChGZWRCaXpPcHBzIHZpYSBDT01URVgp IC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IChjKSAyMDAzIEZlZGVy YWwgSW5mb3JtYXRpb24gJiBOZXdzIERpc3BhdGNoLCBJbmMuCgoKLi4uCgoKRmVkQml6T3Bz CgpOT1RJQ0UgVFlQRTogQ09OVFJBQ1QgQVdBUkQKClNPVVJDRTogUHVibGlzaGVkIGluIEZl ZEJpek9wcHMKCkRBVEUgUE9TVEVEOiAwNy1BUFItMDMKCk9GRklDRSBBRERSRVNTOiBERUZF TlNFIEdFTkVSQUwgU1VQUExZIENFTlRFUiA4MDAwIEpFRkYgREFWSVMgSFdZClJJQ0hNT05E LCBWQSAyMzI5Ny01MyAxMgoKQ0xBU1NJRklDQVRJT04gQ09ERTogMTUgLSBBaXJjcmFmdCAm IGFpcmZyYW1lIHN0cnVjdHVyYWwgY29tcG9uZW50cwoKU1VCSkVDVDogRE9PUiwgQUNDRVNT IEFDUkZUCgpTT0xJQ0lUQVRJT04gTlVNQkVSOiBTUDA0NzAtMDMtUS1IQjcyCgpBV0FSRCBO VU1CRVI6IFNQMDQ3MC0wMy1NLUJKNjcKCkFXQVJEIEFNT1VOVDogJDU5LDAzMAoKTElORSBO VU1CRVI6IDAwMDEgVEhST1VHSCAwMDAyCgpBV0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQg VE86IEEgJiBPIENPTVBPU0lURVMgTCBMLiBDIERCQSBIT05FWUNPTUIgQ09NUE9TSVRFIE9G IEFNQVJJTExPCjIwMDUgQiBBViBFTlVFIEJVSUxESU5HIDcwMDAgQU1BUklMTE8gVFggNzkx MTEtMTE0MwoKQVJDSElWRSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFDVDogTi9BCgpJTlRFUk5F VCBBRERSRVNTOgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJkcy9T UDA0NzAtMDMtTS1CSjY3TG4wMDAxX19fVEhST1VHSF9fMDAwMi5odG1sCgouLi4gIAkgCgpL ZXlXb3Jkcy4uLiAgCiAgICBhaXJjcmFmdAogICAgY29udHJhY3QKICAgIGRlZmVuc2UKICAg IGludGVybmV0CiAgICBzdHJ1Y3R1cmFsCiAgICB0ZXhhcwogICAgdmlyZ2luaWEKCn7wkj7o 1AIAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChOaUAAPwbwKEF6PSJBej0ot+YAFONg9LS5 xu8nUBFhCBiOAAAAAAAAAAB+8JI+uiwDADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot81A AH0GSMRBej0oQXo9IgAUt+a5xu8n42D0tVAQ+OeArgAAfvCSPrI8AwA2AAAANgAAAAAH6QoW XAACs50B5AgARQAAKLfOQAB9BkjDQXo9KEF6PSIAFLfmucbvJ+Ng9LVQEfjngK0AAH7wkj4j PgMAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChOakAAPwbwJ0F6PSJBej0ot+YAFONg9LW5 xu8oUBBhCBiNAAAAAAAAAAB+8JI+08gDADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTmtA AD8G8CZBej0iQXo9KLdtABXd+j2Hucf99FAQYQjGzAAAAAAAAAAAfvCSPsgBBABOAAAATgAA AAAH6QoWXAACs50B5AgARQAAQLfPQAB9BkiqQXo9KEF6PSIAFbdtucf99N36PYdQGPqgXh4A ADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCn7wkj5jCgQAUAAAAFAAAAAAArOdAeQAB+kKFlwI AEUAAEJObEAAPwbwC0F6PSJBej0ot20AFd36PYe5x/4MUBhhCLS2AABERUxFIDM2MTk5ODg4 Lm91dC4wMzA0MDgNCn7wkj71vgQAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG630EAAfQZI e0F6PShBej0iABW3bbnH/gzd+j2hUBj6hqT5AAA1NTAgMzYxOTk4ODgub3V0LjAzMDQwODog VGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KfvCSPgXLBABR AAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ05tQAA/BvAJQXo9IkF6PSi3bQAV3fo9obnH/lJQ GGEIApgAAFBPUlQgNjUsMTIyLDYxLDM0LDE4MywyMzENCn7wkj5EBQUAVAAAAFQAAAAAB+kK FlwAArOdAeQIAEUAAEa30UAAfQZIokF6PShBej0iABW3bbnH/lLd+j28UBj6am/JAAAyMDAg UE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQp+8JI+UQgFAFAAAABQAAAAAAKznQHkAAfpChZc CABFAABCTm5AAD8G8AlBej0iQXo9KLdtABXd+j28ucf+cFAYYQiiAQAAU1RPUiAzNjE5OTg4 OC5vdXQuMDMwNDA4DQp+8JI+xbAFAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqt9JAAH0G SH1Bej0oQXo9IgAVt225x/5w3fo91lAY+lAuvAAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUg ZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTg4OC5vdXQuMDMwNDA4Lg0KfvCSPnOxBQA+AAAA PgAAAAAH6QoWXAACs50B5AgARQAAMLfTQAB9Bki2QXo9KEF6PSIAFLfndCNfzAAAAABwAvrw /1QAAAIEBWQBAQQCfvCSPgSzBQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME5vQAA/BvAa QXo9IkF6PSi35wAU42QmHnQjX81wEmEIj1kAAAEBBAICBAW0fvCSPmPrBQA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLfUQAB9Bki9QXo9KEF6PSIAFLfndCNfzeNkJh9QEP1cH8kAAH7w kj558wUAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxOcEAAPwbqvUF6PSJBej0ot+cAFONk Jh90I1/NUBBhCHsjAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MTcwIE1OPTM2MTk5ODg4 Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJQUiBOZXdz d2lyZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBTcGhlcmEgUmVsZWFzZXMg SG9zdGluZ0RpcmVjdG9yIDMuNiBmb3IgV2luZG93cwoKLi4uICAJIAoKQnlMaW5lLi4uICAK Ci4uLiAgCgpEYXRlTGluZS4uLiAgTkVXVE9OLCAgTWFzcy4sIEFwciA4LCAyMDAzIC9QUk5l d3N3aXJlIHZpYSBDT01URVgvIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJp Z2h0IChDKSAyMDAzIFBSIE5ld3N3aXJlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4K CgpQUiBOZXdzd2lyZQoKU3BoZXJhIENvcnBvcmF0aW9uLCB0aGUgbGVhZGluZyBnbG9iYWwg cHJvdmlkZXIgb2YgV2ViIGhvc3RpbmcgYXV0b21hdGlvbgphbmQgbWFuYWdlbWVudCBzb2Z0 d2FyZSwgdG9kYXkgYW5ub3VuY2VkIGdlbmVyYWwgYXZhaWxhYmlsaXR5IG9mCkhvc3RpbmdE aXJlY3RvcihSKSAzLjYgZm9yIFdpbmRvd3MsIGFkZGluZyBleHRlbmRlZCBjYXBhYmlsaXRp ZXMgdG8Kc3VwcG9ydCBkeW5hbWljIGFuZCBjb21wbGV4IFdlYiBzaXRlcy4gSG9zdGluZ0Rp cmVjdG9yIGlzIGEgbWFqb3IKY29tcG9uZW50IG9mIFNwaGVyYSdzIEhvc3RpbmdCdXNpbmVz cyBTdWl0ZShUTSkgcHJvZHVjdCBmYW1pbHksIGEKY29tcGxldGUgV2ViIGhvc3RpbmcgYXV0 b21hdGlvbiBhbmQgbWFuYWdlbWVudCBzb2x1dGlvbi4gU3BoZXJhCmluY29ycG9yYXRlZCBp bnB1dCBmcm9tIGl0cyBXZWIgaG9zdGluZyBjdXN0b21lciBiYXNlIHRvIG1ha2UKSG9zdGlu Z0RpcmVjdG9yIGZvciBXaW5kb3dzIHRoZSBzdXBlcmlvciBjaG9pY2UgZm9yIGNvc3QgcmVk dWN0aW9uIGFuZAppbXByb3ZlZCBhY2NvdW50IHJldGVudGlvbi4KCkhvc3RpbmdEaXJlY3Rv ciAzLjYsIHRoZSB0aGlyZCBnZW5lcmF0aW9uIG9mIFNwaGVyYSdzIFdpbmRvd3MgcGxhdGZv cm0sCmRlbGl2ZXJzIGVuaGFuY2VkIHByb2R1Y3Rpdml0eSB0b29scyBhbmQgdXBkYXRlZCBW YWx1ZUFwcHMoUikgdGhhdApjb21iaW5lIHRvIGNyZWF0ZSBhIGZsZXhpYmxlLCBzZWxmLXNl cnZpY2UsIG9wZXJhdGluZyBlbnZpcm9ubWVudCBmb3IKdG9kYXkncyBXZWIgaG9zdGluZyBj b21wYW5pZXMgYW5kIGNhcnJpZXJzLiBLZXkgZmVhdHVyZXMgb2YgdGhlIHJlbGVhc2UKaW5j bHVkZToKCi0tIEVtYWlsIFNlcnZlciBTb2Z0d2FyZSBEZXZlbG9wZXIncyBLaXQgKFNESyk6 IFNwaGVyYSBjdXJyZW50bHkgb2ZmZXJzCmZ1bGwgaW50ZWdyYXRpb24gd2l0aCB0aHJlZSBs ZWFkaW5nIG1haWwgc2VydmVyczogSXBzd2l0Y2ggSU1haWwsClJvY2tsaWZ+8JI+8vMFAJoF AACaBQAAAAKznQHkAAfpChZcCABFAAWMTnFAAD8G6rxBej0iQXo9KLfnABTjZCuDdCNfzVAY YQjuJAAAZmUgTWFpbFNpdGUgYW5kIFhNYWlsLCBhIGZyZWUgZW1haWwgc2VydmVyIHNvbHV0 aW9uLiBGb3IgaG9zdGluZwpwcm92aWRlcnMgdGhhdCB1c2UgYW4gYWx0ZXJuYXRpdmUgc29s dXRpb24sIFNwaGVyYSdzIEVtYWlsIFNlcnZlciBTREsKY29udmVuaWVudGx5IGVuYWJsZXMg dGhlIGludGVncmF0aW9uIG9mIGFueSBtYWlsIHNlcnZlciB3aXRoIHRoZSBTcGhlcmEKcGxh dGZvcm0uCgotLSBFeHRlbmRlZCBWYWx1ZUFwcHM6ICdQb2ludCAmIENsaWNrJyB1dGlsaXRp ZXMgdG8gaW50ZWdyYXRlIHBvcHVsYXIgV2ViCmhvc3RpbmcgYXBwbGljYXRpb25zIGluY2x1 ZGluZyBNaXZhLCBNaWNyb3NvZnQgRnJvbnRQYWdlMjAwMiwgQVNQLm5ldCwKQ29sZCBGdXNp b24gTVggLCBTZXJ2ZXIgU2lkZSBJbmNsdWRlcyAoU1NJKSwgUEhQLCBQZXJsIGFuZCBQeXRo b24uCgotLSBCYW5kd2lkdGggRW5mb3JjZW1lbnQ6IFRoZSBTcGhlcmEgc29sdXRpb24gZmVh dHVyZXMgYW4gaW5ub3ZhdGl2ZSwKZWFzeS10by11c2UgdG9vbCBmb3IgbW9uaXRvcmluZyBh bmQgZW5mb3JjaW5nIGJhbmR3aWR0aCBjb25zdW1wdGlvbi4KQmFuZHdpZHRoIGVuZm9yY2Vt ZW50IGdpdmVzIGhvc3RpbmcgcHJvdmlkZXJzIG5ldyByZXZlbnVlIG9wcG9ydHVuaXRpZXMK d2l0aCB0aGUgYWJpbGl0eSB0byBjaGFyZ2UgcHJlbWl1bXMgZm9yIHZhcnlpbmcgYmFuZHdp ZHRoIGNvbnN1bXB0aW9uCmxldmVscyBhbmQgb3ZlcmFnZXMuCgotLSBSZWdpb25hbGl6ZWQg V2luZG93cyBTdXBwb3J0OiBIb3N0aW5nRGlyZWN0b3IgMy42IGZvciBXaW5kb3dzIGFkZHMK c3VwcG9ydCBmb3IgcmVnaW9uYWwgdmVyc2lvbnMgb2YgV2luZG93cywgZXhwYW5kaW5nIG9u IFNwaGVyYSdzCm11bHRpbGluZ3VhbCBHVUkgY2FwYWJpbGl0aWVzIGNyaXRpY2FsIHRvIHNl YW1sZXNzIGdsb2JhbCBidXNpbmVzcy4KCiJUaGUgV2luZG93cyBob3N0aW5nIG1hcmtldCBp cyBjb250aW51aW5nIHRvIGdyb3cgYXQgYSBjb25zaWRlcmFibGUgcGFjZS4KQXMgaXQgYmVn aW5zIHRvIGdhaW4gZ3JvdW5kIGFzIGFuIGFsdGVybmF0aXZlIHBsYXRmb3JtLCB3ZSBuZWVk IHRvIGJlCnN1cHBvcnRpdmUgb2YgbWFya2V0IG5lZWRzLiBPdXIgY3VzdG9tZXJzIGFyZSB2 ZXJ5IGludGVyZXN0ZWQgaW4gaGF2aW5nIGEKbXVsdGktcGxhdGZvcm0gZW52aXJvbm1lbnQg dG8gc3VzdGFpbiB0aGVpciBncm93aW5nIHVzZXIgYmFzZS4gVGhlIGtleSBpcwpiZWluZyBh YmxlIHRvIG9mZmVyIGVxdWl2YWxlbnQsIGR5bmFtaWMgZnVuY3Rpb25hbGl0eSBpbiBib3Ro IExpbnV4IGFuZApXaW5kb3dzIHBsYXRmb3Jtcy4gV2Ugb2ZmZXIgdW5pZm9ybWl0eSBpbiBi b3RoIGF0IGEgdGltZSB0aGF0IFdpbmRvd3MgaXMKY2F0Y2hpfvCSPmX0BQCaBQAAmgUAAAAC s50B5AAH6QoWXAgARQAFjE5yQAA/Buq7QXo9IkF6PSi35wAU42Qw53QjX81QGGEI278AAG5n IHVwIGFzIGFuIGFsdGVybmF0aXZlIFdlYiBob3N0aW5nIHBsYXRmb3JtLCIgc2F5cyBSb3kg U2FhciwgdmljZQpwcmVzaWRlbnQgcHJvZHVjdCBtYW5hZ2VtZW50LCBTcGhlcmEuCgoiU3Bo ZXJhIGhhcyBnYWluZWQgZ3JvdW5kIGluIGJvdGggbWF0dXJpdHkgYW5kIHN0YWJpbGl0eSBv ZiB0aGUgV2luZG93cwpwcm9kdWN0IGFuZCBoYXMgdGFrZW4gYSBzb2xpZCBzdGVwIGZvcndh cmQgaW4gc3VwcG9ydGluZyB0aGUgbmVlZHMgb2YKdGhpcyBob3N0aW5nIG1hcmtldCwiIHNh aWQgQ291bnNlIEJyb2RlcnMsIGFuYWx5c3Qgd2l0aCByZXNlYXJjaCBmaXJtCkN1cnJlbnQg QW5hbHlzaXMuICJJdCB3aWxsIHJhaXNlIHRoZSBiYXIgZm9yIHBsYXllcnMgaW4gdGhpcyBz cGFjZS4iCgpBYm91dCBTcGhlcmEKClNwaGVyYSBDb3Jwb3JhdGlvbiBpcyBhIGdsb2JhbCBs ZWFkZXIgaW4gV2ViIGhvc3RpbmcgYXV0b21hdGlvbiBhbmQKbWFuYWdlbWVudCBzb2Z0d2Fy ZS4gU3BoZXJhIHByb3ZpZGVzIHZhbHVlIHRvIGhvc3RpbmcgcHJvdmlkZXJzIGFuZApyZXNl bGxlcnMgdGhyb3VnaCBzZXJ2aWNlIGRpZmZlcmVudGlhdGlvbiwgaW5jcmVhc2VkIG9wZXJh dGlvbmFsCmVmZmljaWVuY2llcywgZW5oYW5jZWQgY3VzdG9tZXIgc2F0aXNmYWN0aW9uIGFu ZCBpbmNyZWFzZWQgcHJvZml0YWJpbGl0eS4KU3BoZXJhJ3MgSG9zdGluZ0J1c2luZXNzIFN1 aXRlKFRNKSwgd2hpY2ggaW5jbHVkZXMgSG9zdGluZ0RpcmVjdG9yKFIpIGFuZApSZXNlbGxl ckRpcmVjdG9yKFRNKSwgZGVsaXZlcnMgaW1tZWRpYXRlIFJPSSBieSBnZW5lcmF0aW5nIG5l dyByZXZlbnVlCm9wcG9ydHVuaXRpZXMsIHNsYXNoaW5nIGNvc3RzIGFuZCB3aW5uaW5nIGN1 c3RvbWVyIGxveWFsdHkuIEhlYWRxdWFydGVyZWQKaW4gTmV3dG9uLCBNQSwgd2l0aCBFTUVB IG9mZmljZXMgaW4gTG9uZG9uLCBTcGhlcmEgaXMgYmFja2VkIGJ5CndlbGwtZXN0YWJsaXNo ZWQgZ2xvYmFsIHZlbnR1cmUgY2FwaXRhbCBmaXJtcyBpbmNsdWRpbmcgSlZQLCBUTGNvbQpD YXBpdGFsIFBhcnRuZXJzLCBHZW1pbmkgSXNyYWVsIEZ1bmRzLCBWaXNpb24gQ2FwaXRhbCwg QmFuayBvZiBBbWVyaWNhCmFuZCBSZXV0ZXJzIEdyZWVuaG91c2UgRnVuZC4gRm9yIG1vcmUg aW5mb3JtYXRpb24sIHZpc2l0IHd3dy5zcGhlcmEuY29tLApvciBjYWxsIDEtODY2LVNQSEVS QS0xLgoKU3BoZXJhLCBIb3N0aW5nQnVzaW5lc3MgU3VpdGUsIEhvc3RpbmdEaXJlY3RvciBh bmQgUmVzZWxsZXJEaXJlY3RvciBhcmUKdHJhZGVtYXJrcyBvZiBTcGhlcmEgQ29ycG9yYXRp b24uIEFsbCBvdGhlciB0cmFkZW1hcmtzIGFyZSB0aGUgcHJvcGVydHkKb2YgdGhlaXIgcmVz cGVjdGl2ZSBvd25lcnMgYW5kIHVzZWQgZm9yIH7wkj42MQYAbwAAAG8AAAAAArOdAeQAB+kK FlwIAEUAAGE6h0AAPwYD0kF6PSJBej0olQ8bWBiMon10egQggBgW0BeUAAABAQgKDUPUAgBC E/ExNjd8MTQ3MjQyNXwxMDQ5ODE3MjE3fDEuMHwxfDc5OXxoZWxsbyB3b3JsZAp+8JI+0W4G ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot9VAAH0GSLxBej0oQXo9IgAUt+d0I1/N42Qw 51AQ/VwVAQAAfvCSPjJxBgDjAgAA4wIAAAACs50B5AAH6QoWXAgARQAC1U5zQAA/Bu1xQXo9 IkF6PSi35wAU42Q2S3QjX81QGWEICkEAAGlkZW50aWZpY2F0aW9uIHB1cnBvc2Ugb25seS4K CiAgICBDb250YWN0CiAgICAgU2FuZHJhIEZhdGhpCiAgICAgQWZmZWN0IFN0cmF0ZWdpZXMK ICAgICBQaG9uZTogMjAxLTg2Mi0wNzc2CiAgICAgc2FuZHJhQGFmZmVjdHN0cmF0ZWdpZXMu Y29tCgogICAgIFJvYmluIEhvZHVzCiAgICAgU3BoZXJhCiAgICAgUGhvbmU6IDYxNy02MTQt MTgyMgogICAgIHJob2R1c0BzcGhlcmEuY29tCgpTT1VSQ0UgU3BoZXJhIENvcnBvcmF0aW9u CgpTYW5kcmEgRmF0aGkgb2YgQWZmZWN0IFN0cmF0ZWdpZXMsICsxLTIwMS04NjItMDc3NiwK c2FuZHJhQGFmZmVjdHN0cmF0ZWdpZXMuY29tOyBvciBSb2JpbiBIb2R1cyBvZiBTcGhlcmEs ICsxLTYxNy02MTQtMTgyMiwKcmhvZHVzQHNwaGVyYS5jb20KCmh0dHA6Ly93d3cuc3BoZXJh LmNvbQoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYmFuZHdpZHRoCiAgICBidXNpbmVz cwogICAgZW1haWwKICAgIGVudmlyb25tZW50CiAgICBob3N0aW5nCiAgICBpc3JhZWwKICAg IGxpbnV4CiAgICBsb25kb24KICAgIG1hcmtldAogICAgbWFzc2FjaHVzZXR0cwogICAgcHJl c2lkZW50CiAgICBwcm9kdWN0K21hbmFnZW1lbnQKICAgIHByb2R1Y3Rpdml0eQogICAgcmVz ZWFyY2gKICAgIHNvZnR3YXJlCiAgICB1dGlsaXRpZXMKICAgIHZlbnR1cmUrY2FwaXRhbAog ICAgd2ViCgp+8JI+krwGADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot9ZAAH0GSLtBej0o QXo9IgAUt+d0I1/N42Q4+VAQ/VwM7wAAfvCSPrfJBgA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLfXQAB9Bki6QXo9KEF6PSIAFLfndCNfzeNkOPlQEf1cDO4AAH7wkj6pygYAPAAAADwA AAAAArOdAeQAB+kKFlwIAEUAAChOdEAAPwbwHUF6PSJBej0ot+cAFONkOPl0I1/OUBBhCKlC AAAAAAAAAAB+8JI+SiQHADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTnVAAD8G8BxBej0i QXo9KLdtABXd+j3Wucf+slAQYQjFvwAAAAAAAAAAfvCSPpVcBwBOAAAATgAAAAAH6QoWXAAC s50B5AgARQAAQLfYQAB9BkihQXo9KEF6PSIAFbdtucf+st36PdZQGPpQXWEAADIyNiBUcmFu c2ZlciBjb21wbGV0ZS4NCn7wkj4sZQcAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJOdkAA PwbwAUF6PSJBej0ot20AFd36Pda5x/7KUBhhCLKpAABERUxFIDM2MTk5ODg5Lm91dC4wMzA0 MDgNCn7wkj5ioQcAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG632UAAfQZIckF6PShBej0i ABW3bbnH/srd+j3wUBj6NqQ7AAA1NTAgMzYxOTk4ODkub3V0LjAzMDQwODogVGhlIHN5c3Rl bSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KfvCSPi6tBwBRAAAAUQAAAAAC s50B5AAH6QoWXAgARQAAQ053QAA/Bu//QXo9IkF6PSi3bQAV3fo98LnH/xBQGGEIAIsAAFBP UlQgNjUsMTIyLDYxLDM0LDE4MywyMzINCn7wkj7A5wcAVAAAAFQAAAAAB+kKFlwAArOdAeQI AEUAAEa32kAAfQZImUF6PShBej0iABW3bbnH/xDd+j4LUBj6Gm8MAAAyMDAgUE9SVCBjb21t YW5kIHN1Y2Nlc3NmdWwuDQp+8JI+G+sHAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCTnhA AD8G7/9Bej0iQXo9KLdtABXd+j4Lucf/LlAYYQif9AAAU1RPUiAzNjE5OTg4OS5vdXQuMDMw NDA4DQp+8JI+jTMIAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lWNAAH0GayJBej0oQXo9 IhtYlQ90egQgGIyiqoAQ+YOmQgAAAQEICgBCE/gNQ9QCfvCSPgY1CACeAAAAngAAAAACs50B 5AAH6QoWXAgARQAAkDqIQAA/BgOiQXo9IkF6PSiVDxtYGIyiqnR6BCCAGBbQwVUAAAEBCAoN Q9QPAEIT+DE2OHwxNDcyNDI2fDEwNDk4MTcyMTd8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZAox Njl8MTQ3MjQyN3wxMDQ5ODE3MjE3fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKfvCSPjI5CAB4 AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarfbQAB9Bkh0QXo9KEF6PSIAFbdtucf/Lt36PiVQ GPoALf4AADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYx OTk4ODkub3V0LjAzMDQwOC4NCn7wkj6BPwgAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC3 3EAAfQZIrUF6PShBej0iABS36HSdZLoAAAAAcAL68PnrAAACBAVkAQEEAn7wkj72QAgAPgAA AD4AAAAAArOdAeQAB+kKFlwIAEUAADBOeUAAPwbwEEF6PSJBej0ot+gAFONm1TN0nWS7cBJh CNrYAAABAQQCAgQFtH7wkj4ReQgANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi33UAAfQZI tEF6PShBej0iABS36HSdZLvjZtU0UBD9XGtIAAB+8JI+PoAIAJoFAACaBQAAAAKznQHkAAfp ChZcCABFAAWMTnpAAD8G6rNBej0iQXo9KLfoABTjZtU0dJ1ku1AQYQh4+QAAWFlaWlkuLi4g IFRDPTIgVE09MTA0OTgxNzE3MSBNTj0zNjE5OTg4OS5vdXQgU1JDPWNvbXRleCBQRk49IkNv bXRleCIgUEZOPSJDb210ZXgiIFBGTj0iQnVzaW5lc3NXaXJlIiAKCi4uLiAgCgoKLi4uIAkg CgoKSGVhZExpbmUuLi4gIEtpbWNvIFJlYWx0eSBDb3Jwb3JhdGlvbiBJbnZpdGVzIFlvdSB0 bwpKb2luIEl0cyBGaXJzdCBRdWFydGVyIEVhcm5pbmdzIENvbmZlcmVuY2UgQ2FsbAoKLi4u ICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgTkVXIEhZREUgUEFSSywg Ti5ZLiwgQXByIDgsIDIwMDMgKEJVU0lORVNTIFdJUkUpIC0tCgoKCi4uLgoKQ29weXJpZ2h0 TGluZS4uLiAgQ29weXJpZ2h0IChDKSAyMDAzIEJ1c2luZXNzIFdpcmUuICBBbGwgcmlnaHRz IHJlc2VydmVkLgoKCi4uLgoKCkJ1c2luZXNzV2lyZQoKS2ltY28gUmVhbHR5IENvcnBvcmF0 aW9uJ3MgKE5ZU0U6IEtJTSkgZmlyc3QgcXVhcnRlciBlYXJuaW5ncyByZWxlYXNlIGlzCnNj aGVkdWxlZCBmb3IgTW9uZGF5LCBBcHJpbCAyOCwgMjAwMyBhZnRlciB0aGUgbWFya2V0IGNs b3NlLgoKWW91IGFyZSBpbnZpdGVkIHRvIGxpc3RlbiB0byBtYW5hZ2VtZW50J3MgY29uZmVy ZW5jZSBjYWxsIHByZXNlbnRhdGlvbgp3aGljaCB3aWxsIGJlIGJyb2FkY2FzdCBsaXZlIG92 ZXIgdGhlIEludGVybmV0IG9uIFR1ZXNkYXksIEFwcmlsIDI5LCAyMDAzCmF0IDEwOjMwIEFN IEVUCgpXaGF0OiAgIEtpbWNvIFJlYWx0eSBDb3Jwb3JhdGlvbiBGaXJzdCBRdWFydGVyIEZp bmFuY2lhbCBSZXN1bHRzCgpXaGVuOiAgIDEwOjMwIEFNICAgRVQgICwgQXByaWwgMjksIDIw MDMKCldoZXJlOiAgaHR0cDovL3d3dy5raW1jb3JlYWx0eS5jb20vaW52ZXN0b3IvbWVldGlu Zy5hc3AKCkhvdzogICAgTGl2ZSBvdmVyIHRoZSBJbnRlcm5ldCAtIHNpbXBseSBsb2cgb24g dG8gdGhlIFdlYiBhdCB0aGUKICAgICAgICBhZGRyZXNzIGFib3ZlCgpJZiB5b3UgYXJlIHVu YWJsZSB0byBwYXJ0aWNpcGF0ZSBkdXJpbmcgdGhlIGxpdmUgd2ViY2FzdCwgYXVkaW8gZnJv bSB0aGUKY29uZmVyZW5jZSBjYWxsIHdpbGwgYmUgYXJjaGl2ZWQgb24gS2ltY28gUmVhbHR5 J3Mgd2Vic2l0ZSwKd3d3LmtpbWNvcmVhbHR5LmNvbS4gVG8gYWNjZXNzIHRoZSByZXBsYXks IGNsaWNrIG9uIEludmVzdG9ycy4KCkFsdGVybmF0aXZlbHksIGlmIHlvdSBhcmUgbm90IGFi bGUgdG8gYWNjZXNzIHRoZSBjYWxsIG9uIHRoZSB3ZWIsIHlvdSBjYW4KbGlzdGVuIGxpdmUg YnkgcGhvbmUgYnkgY2FsbGluZyAxLTgwMC05MTUtNDgzNiAoQWNjZXNzIENvZGU6IDI4ODMx MikuIEEKdGFwZWQgcHJlc2VudGF0aW9uIG9mIHRoZSBjYWxsIGNhbiBiZSBhY2Nlc3NlZCB0 aHJvdWdoIG1pZG5pZ2h0LCBUdWVzfvCSPpqACAC7AwAAuwMAAAACs50B5AAH6QoWXAgARQAD rU57QAA/BuyRQXo9IkF6PSi36AAU42bamHSdZLtQGGEIqJUAAGRheSwKTWF5IDYsIDIwMDMu IFRvIGFjY2VzcyB0aGUgdGFwZWQgcHJlc2VudGF0aW9uLCBwbGVhc2UgZGlhbCAxLTgwMC00 MjgtNjA1MQphbmQgZW50ZXIgY29uZmlybWF0aW9uIG51bWJlcjogMjg4MzEyLgoKS2ltY28s IGEgcHVibGljbHktdHJhZGVkIHJlYWwgZXN0YXRlIGludmVzdG1lbnQgdHJ1c3QsIGhhcyBz cGVjaWFsaXplZCBpbgpzaG9wcGluZyBjZW50ZXIgYWNxdWlzaXRpb25zLCBkZXZlbG9wbWVu dCBhbmQgbWFuYWdlbWVudCBmb3IgbW9yZSB0aGFuIDMwCnllYXJzLCBhbmQgb3ducyBhbmQg b3BlcmF0ZXMgdGhlIG5hdGlvbidzIGxhcmdlc3QgcG9ydGZvbGlvIG9mCm5laWdoYm9yaG9v ZCBhbmQgY29tbXVuaXR5IHNob3BwaW5nIGNlbnRlcnMgd2l0aCBpbnRlcmVzdHMgaW4gNjA3 CnByb3BlcnRpZXMgY29tcHJpc2luZyBhcHByb3hpbWF0ZWx5IDkwIG1pbGxpb24gc3F1YXJl IGZlZXQgb2YgbGVhc2FibGUKc3BhY2UgbG9jYXRlZCB0aHJvdWdob3V0IDQxIHN0YXRlcywg Q2FuYWRhIGFuZCBNZXhpY28KCktpbWNvIFJlYWx0eSBDb3Jwb3JhdGlvbgpTY290dCBPbnVm cmV5LCA1MTYvODY5LTcxOTAKc29udWZyZXlAa2ltY29yZWFsdHkuY29tLgoKaHR0cDovL3d3 dy5idXNpbmVzc3dpcmUuY29tCgpUb2RheSdzIE5ld3MgT24gVGhlIE5ldCAtIEJ1c2luZXNz IFdpcmUncyBmdWxsIGZpbGUgb24gdGhlIEludGVybmV0CndpdGggSHlwZXJsaW5rcyB0byB5 b3VyIGhvbWUgcGFnZS4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGFjcXVpc2l0aW9u CiAgICBjYW5hZGEKICAgIGNvbW11bml0eQogICAgY29uZmVyZW5jZQogICAgZWFybmluZ3MK ICAgIGZpbmFuY2lhbCtyZXN1bHRzCiAgICBpbnZlc3RtZW50CiAgICBtZXhpY28KICAgIG55 c2UKICAgIHJlYWwrZXN0YXRlCgp+8JI+m4AIADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo TnxAAD8G8BVBej0iQXo9KLfoABTjZt4ddJ1ku1ARYQj+sgAAAAAAAAAAfvCSPr/vCAA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLfeQAB9BkizQXo9KEF6PSIAFLfodJ1ku+Nm3h5QEP1c Yl4AAH7wkj4wFgkANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi330AAfQZIskF6PShBej0i ABS36HSdZLvjZt4eUBH9XGJdAAB+8JI+QBcJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo Tn1AAD8G8BRBej0iQXo9KLfoABTjZt4edJ1kvFAQYQj+sQAAAAAAAAAAfvCSPlm8CQA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKE5+QAA/BvATQXo9IkF6PSi3bQAV3fo+JbnH/3BQEGEI xLIAAAAAAAAAAH7wkj6q9AkATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC34EAAfQZImUF6 PShBej0iABW3bbnH/3Dd+j4lUBj6AFykAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQp+8JI+ 5PwJAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCTn9AAD8G7/hBej0iQXo9KLdtABXd+j4l ucf/iFAYYQi3mwAAREVMRSAzNjE5OTg5My5vdXQuMDMwNDA4DQp+8JI+2zoKAHwAAAB8AAAA AAfpChZcAAKznQHkCABFAABut+FAAH0GSGpBej0oQXo9IgAVt225x/+I3fo+P1AY+eaihAAA NTUwIDM2MTk5ODkzLm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZp bGUgc3BlY2lmaWVkLiANCn7wkj6KRgoAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENOgEAA Pwbv9kF6PSJBej0ot20AFd36Pj+5x//OUBhhCP59AABQT1JUIDY1LDEyMiw2MSwzNCwxODMs MjMzDQp+8JI+VYEKAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGt+JAAH0GSJFBej0oQXo9 IgAVt225x//O3fo+WlAY+cpuTwAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KfvCS PpqGCgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk6BQAA/Bu/2QXo9IkF6PSi3bQAV3fo+ WrnH/+xQGGEIpOYAAFNUT1IgMzYxOTk4OTMub3V0LjAzMDQwOA0KfvCSPuP0CgB4AAAAeAAA AAAH6QoWXAACs50B5AgARQAAarfjQAB9BkhsQXo9KEF6PSIAFbdtucf/7N36PnRQGPmwLEcA ADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk4OTMu b3V0LjAzMDQwOC4NCn7wkj5raAsAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC35EAAfQZI pUF6PShBej0iABS36bFuo10AAAAAcAL68H52AAACBAVkAQEEAn7wkj4XagsAPgAAAD4AAAAA ArOdAeQAB+kKFlwIAEUAADBOgkAAPwbwB0F6PSJBej0ot+kAFONotM6xbqNecBJhCH/GAAAB AQQCAgQFtH7wkj7yiQsAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVZEAAfQZrIUF6PShB ej0iG1iVD3R6BCAYjKMGgBD5J6YzAAABAQgKAEIT+g1D1A9+8JI+W6ILADYAAAA2AAAAAAfp ChZcAAKznQHkCABFAAAot+VAAH0GSKxBej0oQXo9IgAUt+mxbqNe42i0z1AQ/VwQNgAAfvCS PtCpCwCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE6DQAA/BuqqQXo9IkF6PSi36QAU42i0 z7Fuo15QEGEIzswAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTcxNzIgTU49MzYxOTk4OTMu b3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVyRG93 Sm9uZXMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgT0RKIFVTREEgVGV4YXMt T0sgRGFpbHkgRGlyZWN0IFNsdHIgQ2F0dGxlIE5lZyBQdXJjaCBTdW0gLSBBcHIgOAoKLi4u ICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChP REogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQg MjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0eSBOZXdzIChPREopLiBBbGwgcmlnaHRzIHJl c2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9uZXMKCkxNX0NUMTE4ClN0IEpvc2VwaCwgTU8g ICAgVHVlIEFwciAwOCwgMjAwMyAgICBVU0RBIE1hcmtldCBOZXdzIFNlcnZpY2UKClRYL09L L05NIERBSUxZIERJUkVDVCBTTEFVR0hURVIgQ0FUVExFIC0gTkVHT1RJQVRFRCBQVVJDSEFT RVMgLSBTdW1tYXJ5ClJvdW5kdXAgZm9yOiBNb25kYXkgNC83LzIwMDMKCkRvbWVzdGljIHNv dXJjZSBvbmx5LiBMaXZlIHNhbGVzIGJhc2VkIG9uIG5ldCB3ZWlnaHRzIEZPQiB0aGUgZmVl ZGxvdAphZnRlciBhIDMtNCUgc2hyaW5rLiBEcmVzc2VkIHNhbGVzIGJhc2VkIG9uIGhvdCBj YXJjYXNzIHdlaWdodHMgZGVsaXZlcmVkCnRvIHRoZSBwbGFudC4KCkNvbmZpcm1lZDogICAg ICAgICA2MzUgICAgICAgICAgICBXZWVrIGFnbzogICAgICA0NzQgICAgICAgICAgWWVhciBh Z286CjM5MApXZWVrIHRvIERhdGU6ICAgICAgNjM1ICAgICAgICAgICAgV2VlayBhZ286ICAg ICAgNDc0ICAgICAgICAgIFllYXIgYWdvOgozOTAKClRyYWRpbmcgYW5kIGRlbWFuZCBhdCBh IG5lYXIgc3RhbmRzdGlsbCBNb25kYXkuIE5vdCBlbm91Z2ggc2FsZXMgdG8KZXN0YWJsaXNo IG1hcmtldCB0cmVuZC4gVGhlIGxhdGVzdCBlc3RhYmxpc2hlZCBtYXJrZXQgd2FzIFRodXJz ZGF5IHdpdGgKbGl2ZSBzYWxlcyBpbiB0aGUgUGFuaGFuZGxlIGF0IDc5LjAwLgoKICAgICAg ICAgICAgICAgICAgICAgSGVhZCAgICBXdGQgQXZnICAgIEF2ZyBXdCAgICBXdGQgQXZnICAg ICAgUHJpY2UgICAgIFd0ZApBdmcKICAgICAgICAgICAgICAgICAgICBDb3VudCAgIERyZXNz IFBjdCAgICBSYW5nZSAgICAgV2VpZ2h0ICAgICAgUmFuZ2UgICAgICBQcmljZQpTVEVFUiAt IExJVkUgLSBGT0IKIE92ZXIgODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgICAg LSAgICAgICAgICAgICAgICAgICAgICAtCiA2NSAtIDgwJSBDaG9pY2UgICAgICAgICAgICAg ICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQogMzUgLX7wkj5IqgsAmgUA AJoFAAAAArOdAeQAB+kKFlwIAEUABYxOhEAAPwbqqUF6PSJBej0ot+kAFONoujOxbqNeUBhh CCyrAAAgNjUlIENob2ljZSAgICAgIDQ4MCAgICAgNjMuNyAgIDEsMTUwLTEsMjAwICAxLDE2 OC4yICAgNzguMDAtNzkuMDAKNzguODgKICAwIC0gMzUlIENob2ljZSAgICAgICAgICAgICAg ICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAtCiBUb3RhbCBhbGwgZ3JhZGVz ICAgICA0ODAgICAgIDYzLjcgICAxLDE1MC0xLDIwMCAgMSwxNjguMiAgIDc4LjAwLTc5LjAw Cjc4Ljg4CgpTVEVFUiAtIERSRVNTRUQgLSBERUxJVkVSRUQgTm8gdHJhZGUgcmVwb3J0ZWQu CgpIRUlGRVIgLSBMSVZFIC0gRk9CIE5vIHRyYWRlIHJlcG9ydGVkLgoKSEVJRkVSIC0gRFJF U1NFRCAtIERFTElWRVJFRCBObyB0cmFkZSByZXBvcnRlZC4KCk1JWEVEIFNURUVSL0hFSUZF UiAtIExJVkUgLSBGT0IKIE92ZXIgODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAg ICAgLSAgICAgICAgICAgICAgICAgICAgICAtCiA2NSAtIDgwJSBDaG9pY2UgICAgICAgICAg ICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQogMzUgLSA2NSUgQ2hv aWNlICAgICAgMTU1ICAgICA2My43ICAgMSwyNTAtMSwyNTAgIDEsMjUwLjAgICA3OC4wMC03 OC4wMAo3OC4wMAogIDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAgICAt ICAgICAgICAgICAgICAgICAgICAgIC0KIFRvdGFsIGFsbCBncmFkZXMgICAgIDE1NSAgICAg NjMuNyAgIDEsMjUwLTEsMjUwICAxLDI1MC4wICAgNzguMDAtNzguMDAKNzguMDAKCk1JWEVE IFNURUVSL0hFSUZFUiAtIERSRVNTRUQgLSBERUxJVkVSRUQgTm8gdHJhZGUgcmVwb3J0ZWQu CgpBTEwgQkVFRiBUWVBFIFNURUVSUyBBTkQgSEVJRkVSUyAtIExJVkUgLSBGT0IKIFRvdGFs IGFsbCBncmFkZXMgICAgIDYzNSAgICAgNjMuNyAgIDEsMTUwLTEsMjUwICAxLDE4OC4yICAg NzguMDAtNzkuMDAKNzguNjYKCkFMTCBCRUVGIFRZUEUgU1RFRVJTIEFORCBIRUlGRVJTIC0g RFJFU1NFRCAtIERFTElWRVJFRAogVG90YWwgYWxsIGdyYWRlcyAgICAgICAgICAgICAgICAg ICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KCkRBSVJZQlJFRCBTVEVFUi9IRUlG RVIgLSBMSVZFIC0gRk9CIE5vIHRyYWRlIHJlcG9ydGVkLgoKREFJUllCUkVEIFNURUVSL0hF SUZFUiAtIERSRVNTRUQgLSBERUxJVkVSRUQgTm8gdHJhZGUgcmVwb3J0ZWQuCgpNSVhFRCBT VEVFUi9IRUlGRVIvQ09XIC0gTElWRSAtIEZPQiBObyB0cmFkZSByZXBvcnRlZC4KCk1JWEVE IFNURUVSL0hFSUZFUi9DT1cgLSBEUkVTU0VEIC0gREVMSVZFUkVEIE5vIHRyYWRlIHJlcG9y dGVkLgoKVFgvT0svTk0gLSBOTSxPSyxUWAoKU291cmNlOiAgICBVU0RBIE1hcmtldCBOZXdz IFNlcnZpY2UsIFN0ICBKb3NlcGgsIE1PCiAgICAgICAgICB+8JI+SKoLACwBAAAsAQAAAAKz nQHkAAfpChZcCABFAAEeToVAAD8G7xZBej0iQXo9KLfpABTjaL+XsW6jXlAYYQhVZAAAIDgx Ni0yMzgtMDY3OCAgICAgIGVtYWlsOiAgc3Rqb2UubGdtbkB1c2RhLmdvdgoKd3d3LmFtcy51 c2RhLmdvdi9tbnJlcG9ydHMvbG1fY3QxMTgudHh0IDExMzBDCgouCgouLi4gIAkgCgpLZXlX b3Jkcy4uLiAgCiAgICBlbWFpbAogICAgbWFya2V0CiAgICBuZXcrbWV4aWNvCiAgICBzYWxl cwogICAgdGV4YXMKICAgIHRyYWRlCiAgICB1c2RhCiAgICBNRUFUT3JpZ2luIEFzc2lnbmVk Qnk9Ik9zdGVyRG93Sm9uZXMiIC8+VVNEQQoKfvCSPluqCwA8AAAAPAAAAAACs50B5AAH6QoW XAgARQAAKE6GQAA/BvALQXo9IkF6PSi36QAU42jAjbFuo15QEWEIoMsAAAAAAAAAAH7wkj4c JQwANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi35kAAfQZIq0F6PShBej0iABS36bFuo17j aL+XUBD9XAVuAAB+8JI+QyYMADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot+dAAH0GSKpB ej0oQXo9IgAUt+mxbqNe42jAjlAQ/GYFbQAAfvCSPpUvDAA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLfoQAB9BkipQXo9KEF6PSIAFLfpsW6jXuNowI5QEfxmBWwAAH7wkj6wMAwAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChOh0AAPwbwCkF6PSJBej0ot+kAFONowI6xbqNfUBBh CKDKAAAAAAAAAAB+8JI+d3sMADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTohAAD8G8AlB ej0iQXo9KLdtABXd+j50ucgALlAQYQjDpQAAAAAAAAAAfvCSPoCzDABOAAAATgAAAAAH6QoW XAACs50B5AgARQAAQLfpQAB9BkiQQXo9KEF6PSIAFbdtucgALt36PnRQGPmwW+cAADIyNiBU cmFuc2ZlciBjb21wbGV0ZS4NCn7wkj67uwwAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJO iUAAPwbv7kF6PSJBej0ot20AFd36PnS5yABGUBhhCLOOAABERUxFIDM2MTk5ODk2Lm91dC4w MzA0MDgNCn7wkj4eFQ0AfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG636kAAfQZIYUF6PShB ej0iABW3bbnIAEbd+j6OUBj5lqHEAAA1NTAgMzYxOTk4OTYub3V0LjAzMDQwODogVGhlIHN5 c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KfvCSPn4iDQBRAAAAUQAA AAACs50B5AAH6QoWXAgARQAAQ06KQAA/Bu/sQXo9IkF6PSi3bQAV3fo+jrnIAIxQGGEI/HAA AFBPUlQgNjUsMTIyLDYxLDM0LDE4MywyMzQNCn7wkj7mXA0AVAAAAFQAAAAAB+kKFlwAArOd AeQIAEUAAEa360AAfQZIiEF6PShBej0iABW3bbnIAIzd+j6pUBj5em2SAAAyMDAgUE9SVCBj b21tYW5kIHN1Y2Nlc3NmdWwuDQp+8JI+5mENAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABC TotAAD8G7+xBej0iQXo9KLdtABXd+j6pucgAqlAYYQig2QAAU1RPUiAzNjE5OTg5Ni5vdXQu MDMwNDA4DQp+8JI+gQgOAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqt+xAAH0GSGNBej0o QXo9IgAVt225yACq3fo+w1AY+WArhwAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBj b25uZWN0aW9uIGZvciAzNjE5OTg5Ni5vdXQuMDMwNDA4Lg0KfvCSPmQJDgA+AAAAPgAAAAAH 6QoWXAACs50B5AgARQAAMLftQAB9BkicQXo9KEF6PSIAFLfqf9/ojAAAAABwAvrwatUAAAIE BWQBAQQCfvCSPiMLDgA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME6MQAA/Bu/9QXo9IkF6 PSi36gAU42sPm3/f6I1wEmEIEVYAAAEBBAICBAW0fvCSPhhDDgA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLfuQAB9BkijQXo9KEF6PSIAFLfqf9/ojeNrD5xQEP1cocUAAH7wkj6tSw4A mAUAAJgFAAAAArOdAeQAB+kKFlwIAEUABYpOjUAAPwbqokF6PSJBej0ot+oAFONrD5x/3+iN UBhhCLiUAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MTcyIE1OPTM2MTk5ODk2Lm91dCBT UkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJPc3RlckRvd0pvbmVz IiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIE9ESiBVU0RBIEthbnNhcyBEYWls eSBEaXJlY3QgU2x0ciBDYXR0bGUgTmVnIFB1cmNoIFN1bSAtIEFwciA4CgouLi4gIAkgCgpC eUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKE9ESiB2aWEg Q09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAyMDAzIE9z dGVyRG93Sm9uZXMgQ29tbW9kaXR5IE5ld3MgKE9ESikuIEFsbCByaWdodHMgcmVzZXJ2ZWQu CgoKLi4uCgoKT3N0ZXJEb3dKb25lcwoKTE1fQ1QxMjEKU3QgSm9zZXBoLCBNTyAgICBUdWUg QXByIDA4LCAyMDAzICAgIFVTREEgTWFya2V0IE5ld3MgU2VydmljZQoKS0FOU0FTIERBSUxZ IERJUkVDVCBTTEFVR0hURVIgQ0FUVExFIC0gTkVHT1RJQVRFRCBQVVJDSEFTRVMgLSBTdW1t YXJ5ClJvdW5kdXAgZm9yOiBNb25kYXkgNC83LzIwMDMKCkRvbWVzdGljIHNvdXJjZSBvbmx5 LiBMaXZlIHNhbGVzIGJhc2VkIG9uIG5ldCB3ZWlnaHRzIEZPQiB0aGUgZmVlZGxvdAphZnRl ciBhIDMtNCUgc2hyaW5rLiBEcmVzc2VkIHNhbGVzIGJhc2VkIG9uIGhvdCBjYXJjYXNzIHdl aWdodHMgZGVsaXZlcmVkCnRvIHRoZSBwbGFudC4KCkNvbmZpcm1lZDogICAgICAgICAgNzQg ICAgICAgICAgICBXZWVrIGFnbzogICAgMSw1OTAgICAgICAgICAgWWVhciBhZ286CjU3Cldl ZWsgdG8gRGF0ZTogICAgICAgNzQgICAgICAgICAgICBXZWVrIGFnbzogICAgMSw1OTAgICAg ICAgICAgWWVhciBhZ286CjU3CgpUcmFkaW5nIGF0IGEgc3RhbmRzdGlsbCBNb25kYXkuIE5v dCBlbm91Z2ggc2FsZXMgdG8gZXN0YWJsaXNoIGEgbWFya2V0CnRyZW5kLiBMYXRlc3QgZXN0 YWJsaXNoZWQgbWFya2V0IHdhcyBUaHVyc2RheSB3aXRoIGxpdmUgc2FsZXMgYXQgNzkuMDAs CmRyZXNzZWQgc2FsZXMgMTI2LjAwLTEyNy4wMC4KCk5vIHJlcG9ydGFibGUgdHJhZGUuCgpL QU5TQVMgLSBLUwoKU291cmNlOiAgICBVU0RBIE1hcmtldCBOZXdzIFNlcnZpY2UsIFN0ICBK b3NlcGgsIE1PCiAgICAgICAgICAgODE2LTIzOC0wNjc4ICAgICAgZW1haWw6ICBzdGpvZS5s Z21uQHVzZGEuZ292Cgp3d3cuYW1zLnVzZGEuZ292L21ucmVwb3J0cy9sbV9jdDEyMS50eHQg MTEzMEMKCi4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGVtYWlsCiAgICBrYW5zYXMK ICAgIG1hcmtldAogICAgc2FsZXMKICAgIHRyYWRlCiAgICB1c2RhCiAgICBNRUFUT3JpZ2lu IEFzc2lnbmVkQnk9Ik9zdGVyRG93Sm9uZXMiIC8+VVNEQQoKfvCSPq5LDgA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKE6OQAA/BvADQXo9IkF6PSi36gAU42sU/n/f6I1QEWEIOLcAAAAA AAAAAH7wkj7AqQ4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi370AAfQZIokF6PShBej0i ABS36n/f6I3jaxT/UBD3+qHEAAB+8JI+rbkOADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo t/BAAH0GSKFBej0oQXo9IgAUt+p/3+iN42sU/1AR9/qhwwAAfvCSPvm6DgA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKE6PQAA/BvACQXo9IkF6PSi36gAU42sU/3/f6I5QEGEIOLYAAAAA AAAAAH/wkj7/RgAAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChOkEAAPwbwAUF6PSJBej0o t20AFd36PsO5yADsUBBhCMKYAAAAAAAAAAB/8JI+Fn8AAE4AAABOAAAAAAfpChZcAAKznQHk CABFAABAt/FAAH0GSIhBej0oQXo9IgAVt225yADs3fo+w1AY+WBbKgAAMjI2IFRyYW5zZmVy IGNvbXBsZXRlLg0Kf/CSPjKLAABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk6RQAA/Bu/m QXo9IkF6PSi3bQAV3fo+w7nIAQRQGGEIr4EAAERFTEUgMzYxOTk4OTkub3V0LjAzMDQwOA0K f/CSPq3IAAB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrfyQAB9BkhZQXo9KEF6PSIAFbdt ucgBBN36Pt1QGPlGoQQAADU1MCAzNjE5OTg5OS5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNh bm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQp/8JI+TNcAAFEAAABRAAAAAAKznQHk AAfpChZcCABFAABDTpJAAD8G7+RBej0iQXo9KLdtABXd+j7ducgBSlAYYQj6YwAAUE9SVCA2 NSwxMjIsNjEsMzQsMTgzLDIzNQ0Kf/CSPqMRAQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAA RrfzQAB9BkiAQXo9KEF6PSIAFbdtucgBSt36PvhQGPkqbNUAADIwMCBQT1JUIGNvbW1hbmQg c3VjY2Vzc2Z1bC4NCn/wkj4HFgEAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJOk0AAPwbv 5EF6PSJBej0ot20AFd36Pvi5yAFoUBhhCJzMAABTVE9SIDM2MTk5ODk5Lm91dC4wMzA0MDgN Cn/wkj52aQEAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq39EAAfQZIW0F6PShBej0iABW3 bbnIAWjd+j8SUBj5ECrHAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rp b24gZm9yIDM2MTk5ODk5Lm91dC4wMzA0MDguDQp/8JI+nGwBAD4AAAA+AAAAAAfpChZcAAKz nQHkCABFAAAwt/VAAH0GSJRBej0oQXo9IgAUt+uYmIYPAAAAAHAC+vC0mAAAAgQFZAEBBAJ/ 8JI+rW4BAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwTpRAAD8G7/VBej0iQXo9KLfrABTj bmromJiGEHASYQj/yAAAAQEEAgIEBbR/8JI+GKcBADYAAAA2AAAAAAfpChZcAAKznQHkCABF AAAot/ZAAH0GSJtBej0oQXo9IgAUt+uYmIYQ425q6VAQ/VyQOAAAf/CSPliwAQCaBQAAmgUA AAACs50B5AAH6QoWXAgARQAFjE6VQAA/BuqYQXo9IkF6PSi36wAU425q6ZiYhhBQEGEITOEA AFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTcxNzMgTU49MzYxOTk4OTkub3V0IFNSQz1jb210 ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVyRG93Sm9uZXMiIAoKLi4u ICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgT0RKIFVTREEgTmVicmFza2EgRGFpbHkgRGly ZWN0IFNsdHIgQ2F0dGxlIE5lZyBQdXJjaCBTdW0gLSBBcHIgOAoKLi4uICAJIAoKQnlMaW5l Li4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChPREogdmlhIENPTVRF WCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRv d0pvbmVzIENvbW1vZGl0eSBOZXdzIChPREopLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4u LgoKCk9zdGVyRG93Sm9uZXMKCkxNX0NUMTI0ClN0IEpvc2VwaCwgTU8gICAgVHVlIEFwciAw OCwgMjAwMyAgICBVU0RBIE1hcmtldCBOZXdzIFNlcnZpY2UKCk5FQlJBU0tBIERBSUxZIERJ UkVDVCBTTEFVR0hURVIgQ0FUVExFIC0gTkVHT1RJQVRFRCBQVVJDSEFTRVMgLSBTdW1tYXJ5 ClJvdW5kdXAgZm9yOiBNb25kYXkgNC83LzIwMDMKCkRvbWVzdGljIHNvdXJjZSBvbmx5LiBM aXZlIHNhbGVzIGJhc2VkIG9uIG5ldCB3ZWlnaHRzIEZPQiB0aGUgZmVlZGxvdAphZnRlciBh IDMtNCUgc2hyaW5rLiBEcmVzc2VkIHNhbGVzIGJhc2VkIG9uIGhvdCBjYXJjYXNzIHdlaWdo dHMgZGVsaXZlcmVkCnRvIHRoZSBwbGFudC4KCkNvbmZpcm1lZDogICAgICAgICAxMjYgICAg ICAgICAgICBXZWVrIGFnbzogICAgbm9uZSAgICAgICAgICAgWWVhciBhZ286CjU2NQpXZWVr IHRvIERhdGU6ICAgICAgMTI2ICAgICAgICAgICAgV2VlayBhZ286ICAgIG5vbmUgICAgICAg ICAgIFllYXIgYWdvOgo1NjUKClRyYWRpbmcgYW5kIGRlbWFuZCBhdCBhIG5lYXIgc3RhbmRz dGlsbC4gTm90IGVub3VnaCBzYWxlcyB0byBlc3RhYmxpc2ggYQptYXJrZXQgdHJlbmQuIExh dGVzdCBlc3RhYmxpc2hlZCBtYXJrZXQgd2FzIFRodXJzZGF5IHdpdGggbGl2ZSBzYWxlcyBh dAo3OS4wMCB0byBtb3N0bHkgODAuMDAsIGRyZXNzZWQgc2FsZXMgYXQgbW9zdGx5IDEyOS4w MC4KCiAgICAgICAgICAgICAgICAgICAgIEhlYWQgICAgV3RkIEF2ZyAgICBBdmcgV3QgICAg V3RkIEF2ZyAgICAgIFByaWNlICAgICBXdGQKQXZnCiAgICAgICAgICAgICAgICAgICAgQ291 bnQgICBEcmVzcyBQY3QgICAgUmFuZ2UgICAgIFdlaWdodCAgICAgIFJhbmdlICAgICAgUHJp Y2UKU1RFRVIgLSBMSVZFIC0gRk9CCiBObyB0cmFkZSByZXBvcnRlZC4KClNURUVSIC0gRFJF U1NFRCAtIERFTElWRVJFRCBObyB0cmFkZSByZXBvcnRlZC4KCkhFSUZFUiAtIExJVkUgLSBG T0IgTm8gdHJhZGUgcmVwb3J0ZWQuCgpIRUlGRVIgLX/wkj7HsAEAQwUAAEMFAAAAArOdAeQA B+kKFlwIAEUABTVOlkAAPwbq7kF6PSJBej0ot+sAFONucE2YmIYQUBhhCP8eAAAgRFJFU1NF RCAtIERFTElWRVJFRCBObyB0cmFkZSByZXBvcnRlZC4KCk1JWEVEIFNURUVSL0hFSUZFUiAt IExJVkUgLSBGT0IKIE92ZXIgODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgICAg LSAgICAgICAgICAgICAgICAgICAgICAtCiA2NSAtIDgwJSBDaG9pY2UgICAgICAxMjYgICAg IDYyLjcgICAxLDIwMC0xLDIwMCAgMSwyMDAuMCAgIDc5LjAwLTc5LjAwCjc5LjAwCiAzNSAt IDY1JSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAg ICAgICAgLQogIDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAgICAtICAg ICAgICAgICAgICAgICAgICAgIC0KIFRvdGFsIGFsbCBncmFkZXMgICAgIDEyNiAgICAgNjIu NyAgIDEsMjAwLTEsMjAwICAxLDIwMC4wICAgNzkuMDAtNzkuMDAKNzkuMDAKCk1JWEVEIFNU RUVSL0hFSUZFUiAtIERSRVNTRUQgLSBERUxJVkVSRUQgTm8gdHJhZGUgcmVwb3J0ZWQuCgpB TEwgQkVFRiBUWVBFIFNURUVSUyBBTkQgSEVJRkVSUyAtIExJVkUgLSBGT0IKIFRvdGFsIGFs bCBncmFkZXMgICAgIDEyNiAgICAgNjIuNyAgIDEsMjAwLTEsMjAwICAxLDIwMC4wICAgNzku MDAtNzkuMDAKNzkuMDAKCkFMTCBCRUVGIFRZUEUgU1RFRVJTIEFORCBIRUlGRVJTIC0gRFJF U1NFRCAtIERFTElWRVJFRAogVG90YWwgYWxsIGdyYWRlcyAgICAgICAgICAgICAgICAgICAg ICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KCkRBSVJZQlJFRCBTVEVFUi9IRUlGRVIg LSBMSVZFIC0gRk9CIE5vIHRyYWRlIHJlcG9ydGVkLgoKREFJUllCUkVEIFNURUVSL0hFSUZF UiAtIERSRVNTRUQgLSBERUxJVkVSRUQgTm8gdHJhZGUgcmVwb3J0ZWQuCgpNSVhFRCBTVEVF Ui9IRUlGRVIvQ09XIC0gTElWRSAtIEZPQiBObyB0cmFkZSByZXBvcnRlZC4KCk1JWEVEIFNU RUVSL0hFSUZFUi9DT1cgLSBEUkVTU0VEIC0gREVMSVZFUkVEIE5vIHRyYWRlIHJlcG9ydGVk LgoKTkVCUkFTS0EgLSBORQoKU291cmNlOiAgICBVU0RBIE1hcmtldCBOZXdzIFNlcnZpY2Us IFN0ICBKb3NlcGgsIE1PCiAgICAgICAgICAgODE2LTIzOC0wNjc4ICAgICAgZW1haWw6ICBz dGpvZS5sZ21uQHVzZGEuZ292Cgp3d3cuYW1zLnVzZGEuZ292L21ucmVwb3J0cy9sbV9jdDEy NC50eHQgMTEzMEMKCi4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGVtYWlsCiAgICBt YXJrZXQKICAgIG5lYnJhc2thCiAgICBzYWxlcwogICAgdHJhZGUKICAgIHVzZGEKICAgIE1F QVRPcmlnaW4gQXNzaWduZWRCeT0iT3N0ZXJEb3dKb25lcyIgLz5VU0RBCgp/8JI+yLABADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoTpdAAD8G7/pBej0iQXo9KLfrABTjbnVamJiGEFAR YQgiGwAAAAAAAAAAf/CSPjopAgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLf3QAB9Bkia QXo9KEF6PSIAFLfrmJiGEONudVtQEP1chcYAAH/wkj4eMgIANgAAADYAAAAAB+kKFlwAArOd AeQIAEUAACi3+EAAfQZImUF6PShBej0iABS365iYhhDjbnVbUBH9XIXFAAB/8JI+dTMCADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoTphAAD8G7/lBej0iQXo9KLfrABTjbnVbmJiGEVAQ YQgiGgAAAAAAAAAAf/CSPqXeAgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE6ZQAA/Bu/4 QXo9IkF6PSi3bQAV3fo/ErnIAapQEGEIwYsAAAAAAAAAAH/wkj4fFwMATgAAAE4AAAAAB+kK FlwAArOdAeQIAEUAAEC3+UAAfQZIgEF6PShBej0iABW3bbnIAard+j8SUBj5EFptAAAyMjYg VHJhbnNmZXIgY29tcGxldGUuDQp/8JI+Y4wEADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo TppAAD8G7/dBej0iQXo9KLdtABXd+j8SucgBwlAQYQjBcwAAAAAAAAAAf/CSPl8yBgBwAAAA cAAAAAACs50B5AAH6QoWXAgARQAAYjqJQAA/BgPPQXo9IkF6PSiVDxtYGIyjBnR6BCCAGBbQ rd4AAAEBCAoNQ9RmAEIT+jE3MHwxNDcyNDI4fDEwNDk4MTcyMTh8MS4wfDF8MzU3M3xoZWxs byB3b3JsZAp/8JI+66EJAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lWVAAH0GayBBej0o QXo9IhtYlQ90egQgGIyjNIAQ+Pml0wAAAQEICgBCFAMNQ9Rmf/CSPnujCQBwAAAAcAAAAAAC s50B5AAH6QoWXAgARQAAYjqKQAA/BgPOQXo9IkF6PSiVDxtYGIyjNHR6BCCAGBbQpZgAAAEB CAoNQ9R8AEIUAzE3MXwxNDcyNDI5fDEwNDk4MTcyMTh8MS4wfDF8MjkxNXxoZWxsbyB3b3Js ZAp/8JI+Y/gMAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lWZAAH0Gax9Bej0oQXo9IhtY lQ90egQgGIyjYoAQ+MuluwAAAQEICgBCFAUNQ9R8gPCSPgG5BwBwAAAAcAAAAAACs50B5AAH 6QoWXAgARQAAYjqLQAA/BgPNQXo9IkF6PSiVDxtYGIyjYnR6BCCAGBbQrhAAAAEBCAoNQ9TU AEIUBTE3MnwxNDcyNDMwfDEwNDk4MTcyMTl8MS4wfDF8MTUwOHxoZWxsbyB3b3JsZAqA8JI+ ERALAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lWdAAH0Gax5Bej0oQXo9IhtYlQ90egQg GIyjkIAQ+J2lWgAAAQEICgBCFA4NQ9TUgPCSPpIRCwCeAAAAngAAAAACs50B5AAH6QoWXAgA RQAAkDqMQAA/BgOeQXo9IkF6PSiVDxtYGIyjkHR6BCCAGBbQym4AAAEBCAoNQ9TqAEIUDjE3 M3wxNDcyNDMxfDEwNDk4MTcyMTl8MS4wfDF8MTc4N3xoZWxsbyB3b3JsZAoxNzR8MTQ3MjQz MnwxMDQ5ODE3MjE5fDEuMHwxfDI4NTh8aGVsbG8gd29ybGQKgPCSPo5mDgBCAAAAQgAAAAAH 6QoWXAACs50B5AgARQAANJVoQAB9BmsdQXo9KEF6PSIbWJUPdHoEIBiMo+yAEPhBpUIAAAEB CAoAQhQQDUPU6oLwkj75wgUAPAAAADwAAAAAArOdAeQAB+kKFlwIBgABCAAGBAABAAfpChZc QXo9IgAAAAAAAEF6PSgAAAAAAAAAAAAAAAAAAAAAAACC8JI+DMMFACoAAAAqAAAAAAfpChZc AAKznQHkCAYAAQgABgQAAgACs50B5EF6PSgAB+kKFlxBej0ig/CSPifwCgBwAAAAcAAAAAAC s50B5AAH6QoWXAgARQAAYjqNQAA/BgPLQXo9IkF6PSiVDxtYGIyj7HR6BCCAGBbQrj8AAAEB CAoNQ9YVAEIUEDE3NXwxNDcyNDMzfDEwNDk4MTcyMjJ8MS4wfDF8MzMwMXxoZWxsbyB3b3Js ZAqD8JI+jq8NAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lWlAAH0GaxxBej0oQXo9IhtY lQ90egQgGIykGoAQ+BOj+QAAAQEICgBCFC4NQ9YVg/CSPhyxDQAnAQAAJwEAAAACs50B5AAH 6QoWXAgARQABGTqOQAA/BgMTQXo9IkF6PSiVDxtYGIykGnR6BCCAGBbQ9jwAAAEBCAoNQ9Yn AEIULjE3NnwxNDcyNDM0fDEwNDk4MTcyMjN8MS4wfDF8MTUwOHxoZWxsbyB3b3JsZAoxNzd8 MTQ3MjQzNXwxMDQ5ODE3MjIzfDEuMHwxfDIxM3xoZWxsbyB3b3JsZAoxNzh8MTQ3MjQzNnwx MDQ5ODE3MjIzfDEuMHwxfDIwMDF8aGVsbG8gd29ybGQKMTc5fDE0NzI0Mzd8MTA0OTgxNzIy M3wxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCjE4MHwxNDcyNDM4fDEwNDk4MTcyMjN8MS4wfDF8 MjQ0MHxoZWxsbyB3b3JsZAqE8JI+p8MBAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lWpA AH0GaxtBej0oQXo9IhtYlQ90egQgGIyk/4AQ9y6j5QAAAQEICgBCFDANQ9YnhPCSPtQNAwBQ AAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk6bQAA/Bu/cQXo9IkF6PSi3bQAV3fo/ErnIAcJQ GGEItn0AAERFTEUgMzYxOTk5MDAub3V0LjAzMDQwOA0KhPCSPtVKAwB8AAAAfAAAAAAH6QoW XAACs50B5AgARQAAbrf6QAB9BkhRQXo9KEF6PSIAFbdtucgBwt36PyxQGPj2qU8AADU1MCAz NjE5OTkwMC5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNw ZWNpZmllZC4gDQqE8JI+ZlgDAFEAAABRAAAAAAKznQHkAAfpChZcCABFAABDTpxAAD8G79pB ej0iQXo9KLdtABXd+j8sucgCCFAYYQj4VgAAUE9SVCA2NSwxMjIsNjEsMzQsMTgzLDIzNg0K hPCSPoCSAwBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrf7QAB9Bkh4QXo9KEF6PSIAFbdt ucgCCN36P0dQGPjabBgAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCoTwkj7ylQMA UAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJOnUAAPwbv2kF6PSJBej0ot20AFd36P0e5yAIm UBhhCKPIAABTVE9SIDM2MTk5OTAwLm91dC4wMzA0MDgNCoTwkj7VQQQAeAAAAHgAAAAAB+kK FlwAArOdAeQIAEUAAGq3/EAAfQZIU0F6PShBej0iABW3bbnIAibd+j9hUBj4wDMSAAAxNTAg T3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTAwLm91dC4w MzA0MDguDQqE8JI+mLsEAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwt/1AAH0GSIxBej0o QXo9IgAUt+x68UucAAAAAHAC+vAMsgAAAgQFZAEBBAKE8JI+IL0EAD4AAAA+AAAAAAKznQHk AAfpChZcCABFAAAwTp5AAD8G7+tBej0iQXo9KLfsABTjgwLXevFLnXASYQi/3gAAAQEEAgIE BbSE8JI+i/UEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot/5AAH0GSJNBej0oQXo9IgAU t+x68Uud44MC2FAQ/VxQTgAAhPCSPp78BAB3BAAAdwQAAAACs50B5AAH6QoWXAgARQAEaU6f QAA/BuuxQXo9IkF6PSi37AAU44MC2HrxS51QGGEIL/wAAFhZWlpZLi4uICBUQz0yIFRNPTEw NDk4MTcxNzMgTU49MzYxOTk5MDAub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0i Q29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4u ICBCTE9DS0VSLCBUSFJVU1QgUkVWRVJTRVIKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4g IAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoRmVkQml6T3BwcyB2aWEgQ09NVEVYKSAt LQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAoYykgMjAwMyBGZWRlcmFs IEluZm9ybWF0aW9uICYgTmV3cyBEaXNwYXRjaCwgSW5jLgoKCi4uLgoKCkZlZEJpek9wcwoK Tk9USUNFIFRZUEU6IENPTlRSQUNUIEFXQVJECgpTT1VSQ0U6IFB1Ymxpc2hlZCBpbiBGZWRC aXpPcHBzCgpEQVRFIFBPU1RFRDogMDctQVBSLTAzCgpPRkZJQ0UgQUREUkVTUzogREVGRU5T RSBHRU5FUkFMIFNVUFBMWSBDRU5URVIgODAwMCBKRUZGIERBVklTIEhXWQpSSUNITU9ORCwg VkEgMjMyOTctNTMgMTIKCkNMQVNTSUZJQ0FUSU9OIENPREU6IDE1IC0gQWlyY3JhZnQgJiBh aXJmcmFtZSBzdHJ1Y3R1cmFsIGNvbXBvbmVudHMKClNVQkpFQ1Q6IEJMT0NLRVIsIFRIUlVT VCBSRVZFUlNFUgoKU09MSUNJVEFUSU9OIE5VTUJFUjogU1AwNDcwLTAzLVEtSEQ2OAoKQVdB UkQgTlVNQkVSOiBTUDA0NzAtMDMtTS1CSjIyCgpBV0FSRCBBTU9VTlQ6ICQ2OCw1ODYKCkxJ TkUgTlVNQkVSOiAwMDAxCgpBV0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQgVE86IEFFUk8g Q09NUE9ORU5UUyBJTkMgNTEyNCBLQUxURU5CUlVOIFJEIFBPIEJPWCAxNTczMCBGT1JUCldP UlRIIFRYIDc2MTE5LTY0MDAKCkFSQ0hJVkUgREFURTogMDQxOTIwMDMKCkNPTlRBQ1Q6IE4v QQoKSU5URVJORVQgQUREUkVTUzoKaHR0cDovL3d3dy5lcHMuZ292L3NwZy9ETEEvSjMvRFND Ui9Bd2FyZHMvU1AwNDcwLTAzLU0tQkoyMkxuMDAwMS5odG1sCgouLi4gIAkgCgpLZXlXb3Jk cy4uLiAgCiAgICBhaXJjcmFmdAogICAgY29udHJhY3QKICAgIGRlZmVuc2UKICAgIGludGVy bmV0CiAgICBzdHJ1Y3R1cmFsCiAgICB0ZXhhcwogICAgdmlyZ2luaWEKCoTwkj6f/AQAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChOoEAAPwbv8UF6PSJBej0ot+wAFOODBxl68UudUBFh COhgAAAAAAAAAACE8JI+ulIFADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAot/9AAH0GSJJB ej0oQXo9IgAUt+x68Uud44MHGlAQ+RtQTQAAhPCSPhhiBQA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLgAQAB9BkiRQXo9KEF6PSIAFLfsevFLneODBxpQEfkbUEwAAITwkj6GYwUAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChOoUAAPwbv8EF6PSJBej0ot+wAFOODBxp68UueUBBh COhfAAAAAAAAAACE8JI+zMYFADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTqJAAD8G7+9B ej0iQXo9KLdtABXd+j9hucgCaFAQYQjAfgAAAAAAAAAAhPCSPg7/BQBOAAAATgAAAAAH6QoW XAACs50B5AgARQAAQLgBQAB9Bkh4QXo9KEF6PSIAFbdtucgCaN36P2FQGPjAWbAAADIyNiBU cmFuc2ZlciBjb21wbGV0ZS4NCoTwkj6yCAYAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJO o0AAPwbv1EF6PSJBej0ot20AFd36P2G5yAKAUBhhCLRwAABERUxFIDM2MTk5OTAxLm91dC4w MzA0MDgNCoTwkj4rRQYAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG64AkAAfQZISUF6PShB ej0iABW3bbnIAoDd+j97UBj4pqiRAAA1NTAgMzYxOTk5MDEub3V0LjAzMDQwODogVGhlIHN5 c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KhPCSPjRRBgBRAAAAUQAA AAACs50B5AAH6QoWXAgARQAAQ06kQAA/Bu/SQXo9IkF6PSi3bQAV3fo/e7nIAsZQGGEI9kkA AFBPUlQgNjUsMTIyLDYxLDM0LDE4MywyMzcNCoTwkj7OiwYAVAAAAFQAAAAAB+kKFlwAArOd AeQIAEUAAEa4A0AAfQZIcEF6PShBej0iABW3bbnIAsbd+j+WUBj4imtbAAAyMDAgUE9SVCBj b21tYW5kIHN1Y2Nlc3NmdWwuDQqE8JI+KY8GAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABC TqVAAD8G79JBej0iQXo9KLdtABXd+j+WucgC5FAYYQihuwAAU1RPUiAzNjE5OTkwMS5vdXQu MDMwNDA4DQqE8JI+8+IGAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquARAAH0GSEtBej0o QXo9IgAVt225yALk3fo/sFAY+HAyVAAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBj b25uZWN0aW9uIGZvciAzNjE5OTkwMS5vdXQuMDMwNDA4Lg0KhPCSPnn+BgA+AAAAPgAAAAAH 6QoWXAACs50B5AgARQAAMLgFQAB9BkiEQXo9KEF6PSIAFLftVyXAegAAAABwAvrwu54AAAIE BWQBAQQChPCSPkEABwA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME6mQAA/Bu/jQXo9IkF6 PSi37QAU44ZD91clwHtwEmEILagAAAEBBAICBAW0hPCSPgU5BwA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLgGQAB9BkiLQXo9KEF6PSIAFLftVyXAe+OGQ/hQEP1cvhcAAITwkj6jQAcA mgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxOp0AAPwbqhkF6PSJBej0ot+0AFOOGQ/hXJcB7 UBBhCP85AABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MTc0IE1OPTM2MTk5OTAxLm91dCBT UkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJCdXNpbmVzc1dpcmUi IAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgVW5pdGVkIERvbWluaW9uIFJlYWx0 eSBUcnVzdDogRmlyc3QKUXVhcnRlciAyMDAzIEVhcm5pbmdzIENvbmZlcmVuY2UgQ2FsbAoK Li4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgTkVXIFlPUkssIEFw ciA4LCAyMDAzIChCVVNJTkVTUyBXSVJFKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4g IENvcHlyaWdodCAoQykgMjAwMyBCdXNpbmVzcyBXaXJlLiAgQWxsIHJpZ2h0cyByZXNlcnZl ZC4KCgouLi4KCgpCdXNpbmVzc1dpcmUKClVuaXRlZCBEb21pbmlvbiBSZWFsdHkgVHJ1c3Qg KE5ZU0U6VURSKSwgd2lsbCBob2xkIGl0cyBxdWFydGVybHkKY29uZmVyZW5jZSBjYWxsIHRv IGRpc2N1c3MgZmlyc3QgcXVhcnRlciByZXN1bHRzIGFuZCAyMDAzIG91dGxvb2sgb24KVHVl c2RheSwgQXByaWwgMjksIDIwMDMsIGF0IDE6MDAgcG0gRWFzdGVybiBUaW1lICgxMjowMCBw bSBDZW50cmFsIFRpbWUpLgoKVGhpcyBjYWxsIGlzIGJlaW5nIHdlYmNhc3QgYnkgQ0NCTiBh bmQgY2FuIGJlIGFjY2Vzc2VkIGF0IFVEUidzIHdlYiBzaXRlCmF0IHd3dy51ZHJ0LmNvbS4K ClRoZSB3ZWJjYXN0IGlzIGFsc28gYmVpbmcgZGlzdHJpYnV0ZWQgb3ZlciBDQ0JOJ3MgSW52 ZXN0b3IgRGlzdHJpYnV0aW9uCk5ldHdvcmsgdG8gYm90aCBpbnN0aXR1dGlvbmFsIGFuZCBp bmRpdmlkdWFsIGludmVzdG9ycy4gSW5kaXZpZHVhbAppbnZlc3RvcnMgY2FuIGxpc3RlbiB0 byB0aGUgY2FsbCB0aHJvdWdoIENDQk4ncyBpbmRpdmlkdWFsIGludmVzdG9yCmNlbnRlciBh dCB3d3cuY29tcGFueWJvYXJkcm9vbS5jb20gb3IgYnkgdmlzaXRpbmcgYW55IG9mIHRoZSBp bnZlc3RvcgpzaXRlcyBpbiBDQ0JOJ3MgSW5kaXZpZHVhbCBJbnZlc3RvciBOZXR3b3JrLiBJ bnN0aXR1dGlvbmFsIGludmVzdG9ycyBjYW4KYWNjZXNzIHRoZSBjYWxsIHZpYSBDQ0JOJ3Mg cGFzc3dvcmQtcHJvdGVjdGVkIGV2ZW50IG1hbmFnZW1lbnQgc2l0ZSwKU3RyZWV0RXZlbnRz ICh3d3cuc3RyZWV0ZXZlbnRzLmNvbSkuCgpBYm91dCBVbml0ZWQgRG9taW5pb24KClVuaXRl ZCBEb21pbmlvbiBpcyB0aGUgZm91cnRoIGxhcmdlc3QgYXBhcnRtZW50IFJFSVQsIG93bmlu ZyBhbmQKb3BlcmF0aW5nIGFwYXJ0bWVudCBjb21tdW5pdGllcyBuYXRpb253aWRlLiBUaGUg Q29tcGFueSBoYXMgYSB0aGlydHkKb25lLXllYXIgaGlzdG9yeSBkdXJpbmcgd2hpY2ggaXQg aGFzIHJhaXNlZCB0aGUgZGl2aWRlbmQgZWFjaCBvZiB0aGUgbGGE8JI+90AHAEQDAABEAwAA AAKznQHkAAfpChZcCABFAAM2TqhAAD8G7NtBej0iQXo9KLftABTjhklcVyXAe1AYYQgSmgAA c3QKdHdlbnR5LXNldmVuIHllYXJzLiBVbml0ZWQgRG9taW5pb24gaXMgaW5jbHVkZWQgaW4g dGhlIFMmUCBNaWRDYXAgNDAwCkluZGV4LiBUaGUgQ29tcGFueSBjdXJyZW50bHkgb3ducyA3 NCw0ODAgYXBhcnRtZW50IGhvbWVzIGFuZCBpcyB0aGUKZGV2ZWxvcGVyIG9mIDE3OCBob21l cyBjdXJyZW50bHkgdW5kZXIgY29uc3RydWN0aW9uLiBVbml0ZWQgRG9taW5pb24ncwpjb21t b24gc3RvY2sgaXMgdHJhZGVkIG9uIHRoZSBOZXcgWW9yayBTdG9jayBFeGNoYW5nZSB1bmRl ciB0aGUgc3ltYm9sClVEUi4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBVbml0ZWQg RG9taW5pb24gbWF5IGJlIGZvdW5kIG9uIGl0cyB3ZWIKc2l0ZSBhdCB3d3cudWRydC5jb20u CgpVbml0ZWQgRG9taW5pb24gUmVhbHR5IFRydXN0ClRvbSBUb29tZXksIDcyMC8yODMtNjE0 MQpFbGxhIE5leWxhbmQsIDcyMC8yODMtNjE0Ngpmb3IgVW5pdGVkIERvbWluaW9uIFJlYWx0 eSBUcnVzdApHZW5lcmFsIElucXVpcmllczoKQ2xhaXJlIEtvZW5lbWFuLCAzMTIvNjQwLTY3 NDUKCmh0dHA6Ly93d3cuYnVzaW5lc3N3aXJlLmNvbQoKVG9kYXkncyBOZXdzIE9uIFRoZSBO ZXQgLSBCdXNpbmVzcyBXaXJlJ3MgZnVsbCBmaWxlIG9uIHRoZSBJbnRlcm5ldAp3aXRoIEh5 cGVybGlua3MgdG8geW91ciBob21lIHBhZ2UuCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAg ICBjb25mZXJlbmNlCiAgICBjb25zdHJ1Y3Rpb24KICAgIGVhcm5pbmdzCiAgICBpbmRleAog ICAgbnlzZQogICAgcmVpdAogICAgd2ViCgqE8JI++EAHADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoTqlAAD8G7+hBej0iQXo9KLftABTjhkxqVyXAe1ARYQhR+QAAAAAAAAAAhPCSPuys BwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLgHQAB9BkiKQXo9KEF6PSIAFLftVyXAe+OG TGtQEP1ctaQAAITwkj4ltAcANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4CEAAfQZIiUF6 PShBej0iABS37VclwHvjhkxrUBH9XLWjAACE8JI+XbUHADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoTqpAAD8G7+dBej0iQXo9KLftABTjhkxrVyXAfFAQYQhR+AAAAAAAAAAAhPCSPmBd CAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE6rQAA/Bu/mQXo9IkF6PSi3bQAV3fo/sLnI AyZQEGEIv3EAAAAAAAAAAITwkj4elggATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC4CUAA fQZIcEF6PShBej0iABW3bbnIAybd+j+wUBj4cFjzAAAyMjYgVHJhbnNmZXIgY29tcGxldGUu DQqE8JI+C58IAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCTqxAAD8G78tBej0iQXo9KLdt ABXd+j+wucgDPlAYYQiyYwAAREVMRSAzNjE5OTkwMi5vdXQuMDMwNDA4DQqE8JI+FNwIAHwA AAB8AAAAAAfpChZcAAKznQHkCABFAABuuApAAH0GSEFBej0oQXo9IgAVt225yAM+3fo/ylAY +Fan0wAANTUwIDM2MTk5OTAyLm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQg dGhlIGZpbGUgc3BlY2lmaWVkLiANCoTwkj4S6AgAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUA AENOrUAAPwbvyUF6PSJBej0ot20AFd36P8q5yAOEUBhhCPQ8AABQT1JUIDY1LDEyMiw2MSwz NCwxODMsMjM4DQqE8JI+4CIJAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuAtAAH0GSGhB ej0oQXo9IgAVt225yAOE3fo/5VAY+DpqngAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVs Lg0KhPCSPj4mCQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk6uQAA/Bu/JQXo9IkF6PSi3 bQAV3fo/5bnIA6JQGGEIn64AAFNUT1IgMzYxOTk5MDIub3V0LjAzMDQwOA0KhPCSPphjCQB4 AAAAeAAAAAAH6QoWXAACs50B5AgARQAAargMQAB9BkhDQXo9KEF6PSIAFbdtucgDot36P/9Q GPggMZYAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYx OTk5MDIub3V0LjAzMDQwOC4NCoTwkj6VZAkAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC4 DUAAfQZIfEF6PShBej0iABS37romzPEAAAAAcAL68EwlAAACBAVkAQEEAoTwkj4QZgkAPgAA AD4AAAAAArOdAeQAB+kKFlwIAEUAADBOr0AAPwbv2kF6PSJBej0ot+4AFOOI7xO6JszycBJh CBMQAAABAQQCAgQFtITwkj6kngkANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4DkAAfQZI g0F6PShBej0iABS37romzPLjiO8UUBD9XKN/AACE8JI+K6YJAJoFAACaBQAAAAKznQHkAAfp ChZcCABFAAWMTrBAAD8G6n1Bej0iQXo9KLfuABTjiO8UuibM8lAQYQiiCQAAWFlaWlkuLi4g IFRDPTIgVE09MTA0OTgxNzE3NCBNTj0zNjE5OTkwMi5vdXQgU1JDPWNvbXRleCBQRk49IkNv bXRleCIgUEZOPSJDb210ZXgiIFBGTj0iT3N0ZXJEb3dKb25lcyIgCgouLi4gIAoKCi4uLiAJ IAoKCkhlYWRMaW5lLi4uICBPREogVVNEQSBUZXgvT0sgRGFpbHkgV3RnIEF2ZyBEaXJlY3Qg Q2F0dGxlIE5lZyBTYWxlcyAtIEFwciA4CgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAK CkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKE9ESiB2aWEgQ09NVEVYKSAtLQoKCgouLi4K CkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAyMDAzIE9zdGVyRG93Sm9uZXMgQ29tbW9k aXR5IE5ld3MgKE9ESikuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgoKLi4uCgoKT3N0ZXJEb3dK b25lcwoKTE1fQ1QxMjUKU3QgSm9zZXBoLCBNTyAgICBUdWUgQXByIDgsIDIwMDMgICAgIFVT REEgTWFya2V0IE5ld3MKClRFWEFTL09LTEFIT01BIERBSUxZIFdFSUdIVEVEIEFWRVJBR0Ug Q0FUVExFIFJFUE9SVCAtIE5FR09USUFURUQKUFVSQ0hBU0VTIFJlY2FwIGZvcjogTW9uZGF5 IDQvNy8wMwoKQ29uZmlybWVkOiAgICAgICAgNjM1ICAgICAgICAgV2VlayBBZ286ICAgICAg IDQ3NCAgICAgICAgTGFzdCBZZWFyOiAgICAgICAzOTAKV2VlayB0byBEYXRlOiAgICAgNjM1 ICAgICAgICAgV2VlayBBZ286ICAgICAgIDQ3NCAgICAgICAgTGFzdCBZZWFyOiAgICAgICAz OTAKCkxJVkUgRk9CIEJBU0lTIC0gQmVlZiBCcmVlZHMKCiAgICAgICAgICAgICAgICAgICAg ICAgICBIZWFkICAgICAgIFdlaWdodCAgICAgICBXdGQgQXZnICAgICAgUHJpY2UgICAgV3Rk IEF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICBSYW5nZSAgICAgICAg V2VpZ2h0ICAgICAgIFJhbmdlICAgICBQcmljZQpTVEVFUlMKIE92ZXIgODAlIENob2ljZSAg ICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgIC0KIDY1IC0g ODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAg ICAgIC0KIDM1IC0gNjUlIENob2ljZSAgICAgICAgICAgNDgwICAgIDEsMTUwLTEsMjAwICAg ICAxLDE2OCAgICA3OC4wMC03OS4wMCAgIDc4Ljg4CiAgMCAtIDM1JSBDaG9pY2UgICAgICAg ICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCiBUb3RhbCBhbGwg Z3JhZGVzICAgICAgICAgIDQ4MCAgICAxLDE1MC0xLDIwMCAgICAgMSwxNjggICAgNzguMDAt NzkuMDAgICA3OC44OApIRUlGRVJTCiBPdmVyIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAg ICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCiA2NSAtIDgwJSBDaG9pY2UgICAg ICAgICAgICAgICAgICAgICAgIC0ghPCSPqmmCQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAF jE6xQAA/Bup8QXo9IkF6PSi37gAU44j0eLomzPJQGGEIgnQAACAgICAgICAgICAgICAgICAg ICAgICAgLQogMzUgLSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAg ICAgICAgICAgICAgICAgICAgLQogIDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAg ICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQogVG90YWwgYWxsIGdyYWRlcyAgICAg ICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQoKRFJFU1NFRCBE RUxJVkVSRUQgQkFTSVMgLSBCZWVmIEJyZWVkcwoKICAgICAgICAgICAgICAgICAgICAgICAg IEhlYWQgICAgICAgV2VpZ2h0ICAgICAgIFd0ZCBBdmcgICAgICBQcmljZSAgICBXdGQgQXZn CiAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgIFJhbmdlICAgICAgICBXZWln aHQgICAgICAgUmFuZ2UgICAgIFByaWNlClNURUVSUwogT3ZlciA4MCUgQ2hvaWNlICAgICAg ICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQogNjUgLSA4MCUg Q2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAg LQogMzUgLSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAg ICAgICAgICAgICAgLQogIDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAt ICAgICAgICAgICAgICAgICAgICAgICAgLQogVG90YWwgYWxsIGdyYWRlcyAgICAgICAgICAg ICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQpIRUlGRVJTCiBPdmVyIDgw JSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAg ICAtCiA2NSAtIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAg ICAgICAgICAgICAgICAtCiAzNSAtIDY1JSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAg IC0gICAgICAgICAgICAgICAgICAgICAgICAtCiAgMCAtIDM1JSBDaG9pY2UgICAgICAgICAg ICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCiBUb3RhbCBhbGwgZ3Jh ZGVzICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCgpX RUVLTFkgQUNDVU1VTEFURUQgICAgIEhlYWQgQ291bnQgICAgQXZnIFdlaWdodCAgICAgIEF2 ZyBQcmljZQogTGl2ZSAgICBTdGVlciAgICAgICAgICAgICAgNDgwICAgICAgIDEsMTY4LjIw ICAgICAgICAgIDc4Ljg4CiBMaXZlICAgIEhlaWZlcgogRHJlc3NlZCBTdGVlcgogRHJlc3Nl ZCBIZWlmZXIKClNBTUUgUEVSSU9EIExBU1QgV0VFSyAgSGVhZCBDb3VudCAgICBBdmcgV2Vp Z2h0ICAgICAgQXZnIFByaWNlCiBMaXZlICAgIFN0ZWVyCiBMaXZlICAgIEhlaWZlcgogRHJl c3NlZCBTdGVlcgogRITwkj7XpgkAHgIAAB4CAAAAArOdAeQAB+kKFlwIAEUAAhBOskAAPwbt 90F6PSJBej0ot+4AFOOI+dy6JszyUBhhCP6ZAAByZXNzZWQgSGVpZmVyCgpTQU1FIFBFUklP RCBMQVNUIFlFQVIgIEhlYWQgQ291bnQgICAgQXZnIFdlaWdodCAgICAgIEF2ZyBQcmljZQog TGl2ZSAgICBTdGVlcgogTGl2ZSAgICBIZWlmZXIKIERyZXNzZWQgU3RlZXIgICAgICAgICAg ICAgIDEyMCAgICAgICAgIDc4My4zMCAgICAgICAgIDExMi4zMwogRHJlc3NlZCBIZWlmZXIK ClNvdXJjZTogICAgVVNEQSBNYXJrZXQgTmV3cyBTZXJ2aWNlLCBTdCAgSm9zZXBoLCBNTwog ICAgICAgICAgIDgxNi0yMzgtMDY3OCAgICBlbWFpbDogIHN0am9lLmxnbW5AdXNkYS5nb3YK Cnd3dy5hbXMudXNkYS5nb3YvbW5yZXBvcnRzL2xtX2N0MTI1LnR4dAoKMTEwMEMKCi4KCi4u LiAgCSAKCktleVdvcmRzLi4uICAKICAgIGJlZWYKICAgIGVtYWlsCiAgICBtYXJrZXQKICAg IG9rbGFob21hCiAgICBzYWxlcwogICAgdGV4YXMKICAgIHVzZGEKICAgIFVTREFPcmlnaW4g QXNzaWduZWRCeT0iT3N0ZXJEb3dKb25lcyIgLz4KCoTwkj7YpgkAPAAAADwAAAAAArOdAeQA B+kKFlwIAEUAAChOs0AAPwbv3kF6PSJBej0ot+4AFOOI+8S6JszyUBFhCDMjAAAAAAAAAACE 8JI+6yAKADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouA9AAH0GSIJBej0oQXo9IgAUt+66 Jszy44j53FAQ/VyYtwAAhPCSPmwoCgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLgQQAB9 BkiBQXo9KEF6PSIAFLfuuibM8uOI+8VQEPt0mLYAAITwkj4FMwoANgAAADYAAAAAB+kKFlwA ArOdAeQIAEUAACi4EUAAfQZIgEF6PShBej0iABS37romzPLjiPvFUBH7dJi1AACE8JI+HTQK ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTrRAAD8G791Bej0iQXo9KLfuABTjiPvFuibM 81AQYQgzIgAAAAAAAAAAhPCSPlfOCgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE61QAA/ Bu/cQXo9IkF6PSi3bQAV3fo//7nIA+RQEGEIvmQAAAAAAAAAAITwkj4kBwsATgAAAE4AAAAA B+kKFlwAArOdAeQIAEUAAEC4EkAAfQZIZ0F6PShBej0iABW3bbnIA+Td+j//UBj4IFg2AAAy MjYgVHJhbnNmZXIgY29tcGxldGUuDQqE8JI+cw8LAFAAAABQAAAAAAKznQHkAAfpChZcCABF AABCTrZAAD8G78FBej0iQXo9KLdtABXd+j//ucgD/FAYYQiwVgAAREVMRSAzNjE5OTkwMy5v dXQuMDMwNDA4DQqE8JI+/UsLAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABuuBNAAH0GSDhB ej0oQXo9IgAVt225yAP83fpAGVAY+AanFQAANTUwIDM2MTk5OTAzLm91dC4wMzA0MDg6IFRo ZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCoTwkj6mVwsAUQAA AFEAAAAAArOdAeQAB+kKFlwIAEUAAENOt0AAPwbvv0F6PSJBej0ot20AFd36QBm5yARCUBhh CPIvAABQT1JUIDY1LDEyMiw2MSwzNCwxODMsMjM5DQqE8JI+1ZELAFQAAABUAAAAAAfpChZc AAKznQHkCABFAABGuBRAAH0GSF9Bej0oQXo9IgAVt225yARC3fpANFAY9+pp4QAAMjAwIFBP UlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KhPCSPuCUCwBQAAAAUAAAAAACs50B5AAH6QoWXAgA RQAAQk64QAA/Bu+/QXo9IkF6PSi3bQAV3fpANLnIBGBQGGEInaEAAFNUT1IgMzYxOTk5MDMu b3V0LjAzMDQwOA0KhPCSPn7RCwB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAargVQAB9Bkg6 QXo9KEF6PSIAFbdtucgEYN36QE5QGPfQMNgAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRh dGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5MDMub3V0LjAzMDQwOC4NCoTwkj6M0wsAPgAAAD4A AAAAB+kKFlwAArOdAeQIAEUAADC4FkAAfQZIc0F6PShBej0iABS374sle4MAAAAAcAL68MyT AAACBAVkAQEEAoTwkj431QsAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBOuUAAPwbv0EF6 PSJBej0ot+8AFOOKsCmLJXuEcBJhCNJmAAABAQQCAgQFtITwkj7XDQwANgAAADYAAAAAB+kK FlwAArOdAeQIAEUAACi4F0AAfQZIekF6PShBej0iABS374sle4TjirAqUBD9XGLWAACE8JI+ HhUMAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTrpAAD8G6nNBej0iQXo9KLfvABTjirAq iyV7hFAQYQhhYgAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzE3NSBNTj0zNjE5OTkwMy5v dXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iTTIiIAoKLi4u ICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgVUsgR292ZXJubWVudDogTWFyaXRpbWUgYW5k IENvYXN0Z3VhcmQgQWdlbmN5IC0gQ29tbXVuaWNhdGluZyB3aXRoIEluZHVzdHJ5IGF0IEZp c2hpbmcgMjAwMwoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAg QXByIDA4LCAyMDAzIChNMiBQUkVTU1dJUkUgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5 cmlnaHRMaW5lLi4uICAoQykxOTk0LTIwMDMgTTIgQ09NTVVOSUNBVElPTlMgTFRECgoKLi4u CgoKTTIKClRoZSBNYXJpdGltZSBhbmQgQ29hc3RndWFyZCBBZ2VuY3kgKE1DQSkgd2lsbCBi ZSBhdCB0aGUgRmlzaGluZyAyMDAzCmV4aGliaXRpb24gaW4gR2xhc2dvdyBvbiB0aGUgMTAg QXByaWwgdGhyb3VnaCB0byB0aGUgMTIgQXByaWwgd2l0aCBhCndob2xlIGhvc3Qgb2YgYWN0 aXZpdGllcyBhbmQgaW5mb3JtYXRpb24gb24gYWxsIGFzcGVjdHMgb2YgU2FmZSBGaXNoaW5n LgoKVGhpcyB5ZWFyIHRoZSBNQ0EgaGFzIGZvY3VzZWQgb24gJ0NvbW11bmljYXRpbmcgd2l0 aCBJbmR1c3RyeScuIFRoaXMKcmVmbGVjdHMgdGhlIGpvaW50IGVmZm9ydHMgb2YgdGhlIE1D QSwgdGhlIEluZHVzdHJ5IGFuZCBvdGhlciBpbnRlcmVzdGVkCnBhcnRpZXMgdG8gZGV2ZWxv cCBhcHByb3ByaWF0ZSBzdGFuZGFyZHMgdG8gaW1wcm92ZSBmaXNoaW5nIHNhZmV0eS4KCldl IGhvcGUgdG8gc2VlIGFsbCBvZiB0aG9zZSB3b3JraW5nIGluIHRoZSBJbmR1c3RyeSwgaW4g d2hhdGV2ZXIgYXJlYSwgb24Kb3VyIHN0YW5kIEEwMi4gVGhpcyB5ZWFyIHdlIGhhdmUgdGhy ZWUgZnVsbCBkYXlzICgxMDowMCBhbSB0byA1OjAwIHAubS4KZWFjaCBkYXkgYW5kIDEwOjAw IGFtIHRvIDQ6MDAgcG0gb24gU2F0dXJkYXkpLgoKRXhwZXJ0cyB3aWxsIGJlIG9uIGhhbmQg dG8gYW5zd2VyIHF1ZXN0aW9ucyBvbiBhbGwgbWFubmVyIG9mIHRvcGljcwppbmNsdWRpbmc6 IFN0YWJpbGl0eTsgQ29kZSBDaGFuZ2VzOyBQcmVwYXJpbmcgWW91ciBWZXNzZWwgZm9yIFN1 cnZleTsKSGktTGluZSB0cmFuc2ZlciAocmVzY3VlIGhlbGljb3B0ZXIpOyBhbmQgQmlsZ2Ug TW9uaXRvcmluZzsgT24gbGluZQpyZWdpc3RyeSAoUmVnaXN0cnkgb2YgU2hpcHBpbmcgYW5k IFNlYW1lbikgQWxsIHZpc2l0b3JzIHRvIHRoZSBzdGFuZCB3aWxsCmJlIGFibGUgdG8gY29s bGVjdCBhIGZyZWUgU2FmZSBGaXNoaW5nIGd1aWRlIGZ1bGwgb2YgaW5mb3JtYXRpb24gb24K Zmxvb2RpbmcsIG1hY2hpbmVyeSwgc2luZ2xlIGhhbmRlZCBvcGVyYXRphPCSPqAVDACaBQAA mgUAAAACs50B5AAH6QoWXAgARQAFjE67QAA/BupyQXo9IkF6PSi37wAU44q1josle4RQGGEI 4scAAG9ucywgcG90dGluZyBhbmQgY3JlZWxpbmcuIFRoZQpndWlkZSBhbHNvIGluY2x1ZGVz IGJsYW5rIHBhZ2VzIGZvciBwZXJzb25hbCwgY3JldyBhbmQgdmVzc2VsIGRldGFpbHMgYXMK d2VsbCBhcyByZWNvcmRzIG9mIGVxdWlwbWVudCBhbmQgbWFpbnRlbmFuY2UgY2hlY2tsaXN0 LiBVc2VmdWwgdGVsZXBob25lCm51bWJlcnMsIHRpZGUgdGltZXRhYmxlcyBhbmQgYSBjYWxl bmRhciBhbHNvIGZlYXR1cmUgaW4gdGhlIHBhY2suIE5ldwpwYWdlcyB3aWxsIGFsc28gYmUg YXZhaWxhYmxlIGZvciB0aG9zZSB3aG8gYWxyZWFkeSBoYXZlIGEgY29weSBvZiB0aGUKZ3Vp ZGUuIFlvdSBjYW4gYWxzbyBhZGQgdG8geW91ciBndWlkZSBhIGxlYWZsZXQgb246ICdJdCBQ YXlzIHRvIGJlClByZXBhcmVkIGZvciBZb3VyIE5leHQgVmVzc2VsIFN1cnZleScsIHdoaWNo IHdpbGwgYXNzaXN0IGZpc2hlcm1lbiBpbgpwcmVwYXJpbmcgYW5kIHByZXNlbnRpbmcgdmVz c2VscyBmb3Igc3VydmV5LCBoZWxwaW5nIHRvIHNhdmUgYm90aCB0aW1lCmFuZCBtb25leS4K ClRoZSBNQ0Egd2lsbCBiZSBob2xkaW5nIGEgY29tcGV0aXRpb24gdGhhdCB3aWxsIGJlIHJ1 bm5pbmcgb3ZlciBhbGwgdGhyZWUKZGF5cyBnaXZpbmcgdmlzaXRvcnMgdGhlIG9wcG9ydHVu aXR5IHRvIHdpbjoKCi0tIEZBU1RGSU5EIHBsdXMgUGVyc29uYWwgTG9jYXRpb24gQmVhY29u IC0tIExpZmVqYWNrZXRzICh3aXRoIGxpZ2h0cykgLS0KU2V0IG9mIGZvdXIgRmlzaGVybWFu IFBpbG90IDIwMDMgQm9va3MKCkFsbCB0aG9zZSBvbiB0aGUgc3RhbmQgYXJlIHJlYWR5IHRv IGFzc2lzdCB5b3UgaW4gYW55IHdheSB0aGV5IGNhbiwKaW5jbHVkaW5nIHN0YWZmIGZyb20g dGhlIFJlZ2lzdHJ5IG9mIFNoaXBwaW5nIGFuZCBTZWFtYW4gd2hvIHdpbGwgYmUgYWJsZQp0 byBvZmZlciBmaXNoZXJtZW4gb24gbGluZSByZWdpc3RyYXRpb24uCgpTbyBpZiB5b3Ugd2Fu dCB0byBmaW5kIG91dCBtb3JlIGFib3V0IGhvdyB0aGUgSW5kdXN0cnkgYW5kIHRoZSBNQ0Eg YXJlCmNvbW11bmljYXRpbmcgdG9nZXRoZXIsIG9yIHlvdSBoYXZlIGFueXRoaW5nIGVsc2Ug dG8gZGlzY3VzcyBjb21lIGFsb25nCmFuZCBqb2luIHVzIHRoZXJlLgoKUHJlc3MgcmVsZWFz ZXMgYW5kIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFnZW5jeSBpcyBhdmFpbGFi bGUgb24KdGhlIFdlYiBhdCB3d3cubWNnYS5nb3YudWsKCk0yIENvbW11bmljYXRpb25zIEx0 ZCBkaXNjbGFpbXMgYWxsIGxpYWJpbGl0eSBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQKd2l0 aGluIE0yIFByZXNzV0lSRS4gRGF0YSBzdXBwbGllZCBieSBuYW1lZCBwYXJ0eS9wYXJ0aWVz LiBGdXJ0aGVyCmluZm9ybWF0aW9uIG9uIE0yIFByZXNzV4Twkj6hFQwABAEAAAQBAAAAArOd AeQAB+kKFlwIAEUAAPZOvEAAPwbvB0F6PSJBej0ot+8AFOOKuvKLJXuEUBhhCI4jAABJUkUg Y2FuIGJlIG9idGFpbmVkIGF0IGh0dHA6Ly93d3cucHJlc3N3aXJlLm5ldApvbiB0aGUgd29y bGQgd2lkZSB3ZWIuIElucXVpcmllcyB0byBpbmZvQG0yLmNvbS4KCi4uLiAgCSAKCktleVdv cmRzLi4uICAKICAgIGdvdmVybm1lbnQKICAgIG1hY2hpbmVyeQogICAgbW9uZXkKICAgIHBp bG90CiAgICBzaGlwcGluZwogICAgc3RhbmRhcmRzCiAgICB3ZWIKCoTwkj6iFQwAPAAAADwA AAAAArOdAeQAB+kKFlwIAEUAAChOvUAAPwbv1EF6PSJBej0ot+8AFOOKu8CLJXuEUBFhCPOT AAAAAAAAAACE8JI+/I8MADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouBhAAH0GSHlBej0o QXo9IgAUt++LJXuE44q68lAQ/VxYDgAAhPCSPq2RDAA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLgZQAB9Bkh4QXo9KEF6PSIAFLfviyV7hOOKu8FQEPyOWA0AAITwkj57mgwANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi4GkAAfQZId0F6PShBej0iABS374sle4TjirvBUBH8jlgM AACE8JI+b5sMADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTr5AAD8G79NBej0iQXo9KLfv ABTjirvBiyV7hVAQYQjzkgAAAAAAAAAAhPCSPlk/DQA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKE6/QAA/Bu/SQXo9IkF6PSi3bQAV3fpATrnIBKJQEGEIvVcAAAAAAAAAAITwkj5AeA0A TgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC4G0AAfQZIXkF6PShBej0iABW3bbnIBKLd+kBO UBj30Fd5AAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQqE8JI+LoENAFAAAABQAAAAAAKznQHk AAfpChZcCABFAABCTsBAAD8G77dBej0iQXo9KLdtABXd+kBOucgEulAYYQitSQAAREVMRSAz NjE5OTkwNS5vdXQuMDMwNDA4DQqE8JI+i74NAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABu uBxAAH0GSC9Bej0oQXo9IgAVt225yAS63fpAaFAY97amVgAANTUwIDM2MTk5OTA1Lm91dC4w MzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCoTw kj5Dyg0AUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENOwUAAPwbvtUF6PSJBej0ot20AFd36 QGi5yAUAUBhhCPohAABQT1JUIDY1LDEyMiw2MSwzNCwxODMsMjQwDQqE8JI+IwUOAFQAAABU AAAAAAfpChZcAAKznQHkCABFAABGuB1AAH0GSFZBej0oQXo9IgAVt225yAUA3fpAg1AY95pp JAAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KhPCSPmgIDgBQAAAAUAAAAAACs50B 5AAH6QoWXAgARQAAQk7CQAA/Bu+1QXo9IkF6PSi3bQAV3fpAg7nIBR5QGGEImpQAAFNUT1Ig MzYxOTk5MDUub3V0LjAzMDQwOA0KhPCSPlPBDgB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAA argeQAB9BkgxQXo9KEF6PSIAFbdtucgFHt36QJ1QGPeAMBkAADE1MCBPcGVuaW5nIEJJTkFS WSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5MDUub3V0LjAzMDQwOC4NCoTwkj49 wg4APgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC4H0AAfQZIakF6PShBej0iABS38HA326UA AAAAcAL68IdeAAACBAVkAQEEAoTwkj7Hww4APgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBO w0AAPwbvxkF6PSJBej0ot/AAFOOOo75wN9umcBJhCJmYAAABAQQCAgQFtITwkj5D/A4ANgAA ADYAAAAAB+kKFlwAArOdAeQIAEUAACi4IEAAfQZIcUF6PShBej0iABS38HA326bjjqO/UBD9 XCoIAACE8JI+6gMPAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTsRAAD8G6mlBej0iQXo9 KLfwABTjjqO/cDfbplAQYQhzkwAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzE3NSBNTj0z NjE5OTkwNS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0i T3N0ZXJEb3dKb25lcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBPREogVVNE QSBLYW5zIERhaWx5IFd0ZyBBdmcgRGlyZWN0IFNsdHIgQ2F0dGxlIE5lZyBTYWxlcyAtIEFw ciA4CgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgs IDIwMDMgKE9ESiB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENv cHlyaWdodCAyMDAzIE9zdGVyRG93Sm9uZXMgQ29tbW9kaXR5IE5ld3MgKE9ESikuIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCgoKLi4uCgoKT3N0ZXJEb3dKb25lcwoKTE1fQ1QxMjYKU3QgSm9z ZXBoLCBNTyAgICBUdWUgQXByIDgsIDIwMDMgICAgIFVTREEgTWFya2V0IE5ld3MKCktBTlNB UyBEQUlMWSBXRUlHSFRFRCBBVkVSQUdFIENBVFRMRSBSRVBPUlQgLSBORUdPVElBVEVEIFBV UkNIQVNFUyBSZWNhcApmb3I6IE1vbmRheSA0LzcvMDMKCkhlYWQgQ291bnQ6ICAgICAgICA3 NCAgICAgICAgIFdlZWsgQWdvOiAgICAgMSw1OTAgICAgICAgIExhc3QgWWVhcjogICAgICAg IDU3CldlZWsgdG8gRGF0ZTogICAgICA3NCAgICAgICAgIFdlZWsgQWdvOiAgICAgMSw1OTAg ICAgICAgIExhc3QgWWVhcjogICAgICAgIDU3CgpMSVZFIEZPQiBCQVNJUyAtIEJlZWYgQnJl ZWRzCgogICAgICAgICAgICAgICAgICAgICAgIEhlYWQgICAgICAgICBXZWlnaHQgICAgICAg IFd0ZCBBdmcgICBQcmljZSAgICBXdGQgQXZnCiAgICAgICAgICAgICAgICAgICAgICAgQ291 bnQgICAgICAgIFJhbmdlICAgICAgICAgV2VpZ2h0ICAgIFJhbmdlICAgICBQcmljZQpTVEVF UlMKIE92ZXIgODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAg ICAgICAgICAgICAtCiA2NSAtIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0g ICAgICAgICAgICAgICAgICAgICAgLQogMzUgLSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAg ICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KICAwIC0gMzUlIENob2ljZSAgICAg ICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAtCiBUb3RhbCBhbGwg Z3JhZGVzICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQpI RUlGRVJTCiBPdmVyIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAg ICAgICAgICAgICAgICAgLQogNjUgLSA4MCUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAg ICAtICAgICAgICAgICAgICAgICAgICAgIC0KIDM1IC0gNjUlIENob2ljZSAgICAgICAghPCS PnYEDwCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE7FQAA/BupoQXo9IkF6PSi38AAU446p I3A326ZQGGEIhm8AACAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQog IDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAg ICAgICAgIC0KIFRvdGFsIGFsbCBncmFkZXMgICAgICAgICAgICAgICAgICAgICAgLSAgICAg ICAgICAgICAgICAgICAgICAtCgpEUkVTU0VEIERFTElWRVJFRCBCQVNJUyAtIEJlZWYgQnJl ZWRzCgogICAgICAgICAgICAgICAgICAgICAgIEhlYWQgICAgICAgICBXZWlnaHQgICAgICAg IFd0ZCBBdmcgICBQcmljZSAgICBXdGQgQXZnCiAgICAgICAgICAgICAgICAgICAgICAgQ291 bnQgICAgICAgIFJhbmdlICAgICAgICAgV2VpZ2h0ICAgIFJhbmdlICAgICBQcmljZQpTVEVF UlMKIE92ZXIgODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAg ICAgICAgICAgICAtCiA2NSAtIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0g ICAgICAgICAgICAgICAgICAgICAgLQogMzUgLSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAg ICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KICAwIC0gMzUlIENob2ljZSAgICAg ICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAtCiBUb3RhbCBhbGwg Z3JhZGVzICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQpI RUlGRVJTCiBPdmVyIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAg ICAgICAgICAgICAgICAgLQogNjUgLSA4MCUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAg ICAtICAgICAgICAgICAgICAgICAgICAgIC0KIDM1IC0gNjUlIENob2ljZSAgICAgICAgICAg ICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAtCiAgMCAtIDM1JSBDaG9pY2Ug ICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQogVG90YWwg YWxsIGdyYWRlcyAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAg IC0KCldFRUtMWSBBQ0NVTVVMQVRFRCAgICAgSGVhZCBDb3VudCAgICBBdmcgV2VpZ2h0ICAg ICAgQXZnIFByaWNlCiBMaXZlICAgIFN0ZWVyCiBMaXZlICAgIEhlaWZlcgogRHJlc3NlZCBT dGVlcgogRHJlc3NlZCBIZWlmZXIKClNBTUUgUEVSSU9EIExBU1QgV0VFSyAgSGVhZCBDb3Vu dCAgICBBdmcgV2VpZ2h0ICAgICAgQXZnIFByaWNlCiBMaXZlICAgIFN0ZWVyICAgICAgICAg ICAgICA0NTcgICAgICAgMSwxNTUuNjAgICAgICAgICAgNzguMDAKIExpdmUgICAgSGVpZmVy ICAgICAgICAgICAxLDEzMyAgICAgICAxLDAzMy45MCAgICAgICAgICA3OC4wMAogRHJlc3Nl ZCBTdGVlcgogRHJlc3NlZCBIZWlmZXIKClNBTUUgUEVSSU9EIExBU1QgWYTwkj6TBA8AxgEA AMYBAAAAArOdAeQAB+kKFlwIAEUAAbhOxkAAPwbuO0F6PSJBej0ot/AAFOOOrodwN9umUBhh CJKjAABFQVIgIEhlYWQgQ291bnQgICAgQXZnIFdlaWdodCAgICAgIEF2ZyBQcmljZQogTGl2 ZSAgICBTdGVlcgogTGl2ZSAgICBIZWlmZXIKIERyZXNzZWQgU3RlZXIKIERyZXNzZWQgSGVp ZmVyCgpTb3VyY2U6ICAgIFVTREEgTWFya2V0IE5ld3MgU2VydmljZSwgU3QgIEpvc2VwaCwg TU8KICAgICAgICAgICA4MTYtMjM4LTA2NzggICAgZW1haWw6ICBzdGpvZS5sZ21uQHVzZGEu Z292Cgp3d3cuYW1zLnVzZGEuZ292L21ucmVwb3J0cy9sbV9jdDEyNi50eHQKCjExMDBDCgou CgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBiZWVmCiAgICBlbWFpbAogICAga2Fuc2Fz CiAgICBtYXJrZXQKICAgIHNhbGVzCiAgICB1c2RhCiAgICBNRUFUT3JpZ2luIEFzc2lnbmVk Qnk9Ik9zdGVyRG93Sm9uZXMiIC8+VVNEQQoKhPCSPpQEDwA8AAAAPAAAAAACs50B5AAH6QoW XAgARQAAKE7HQAA/Bu/KQXo9IkF6PSi38AAU446wF3A326ZQEWEIugMAAAAAAAAAAIXwkj5I PAAANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4IUAAfQZIcEF6PShBej0iABS38HA326bj jq6HUBD9XB9AAACF8JI+70EAADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouCJAAH0GSG9B ej0oQXo9IgAUt/BwN9um446wGFAQ+8wfPwAAhfCSPgRNAAA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLgjQAB9BkhuQXo9KEF6PSIAFLfwcDfbpuOOsBhQEfvMHz4AAIXwkj4LTgAAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChOyEAAPwbvyUF6PSJBej0ot/AAFOOOsBhwN9unUBBh CLoCAAAAAAAAAACF8JI+XOMAADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTslAAD8G78hB ej0iQXo9KLdtABXd+kCducgFYFAQYQi8SgAAAAAAAAAAhfCSPtwbAQBOAAAATgAAAAAH6QoW XAACs50B5AgARQAAQLgkQAB9BkhVQXo9KEF6PSIAFbdtucgFYN36QJ1QGPeAVrwAADIyNiBU cmFuc2ZlciBjb21wbGV0ZS4NCoXwkj5xIgEAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJO ykAAPwbvrUF6PSJBej0ot20AFd36QJ25yAV4UBhhCKo8AABERUxFIDM2MTk5OTA3Lm91dC4w MzA0MDgNCoXwkj47XwEAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG64JUAAfQZIJkF6PShB ej0iABW3bbnIBXjd+kC3UBj3ZqWXAAA1NTAgMzYxOTk5MDcub3V0LjAzMDQwODogVGhlIHN5 c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KhfCSPsBqAQBRAAAAUQAA AAACs50B5AAH6QoWXAgARQAAQ07LQAA/Bu+rQXo9IkF6PSi3bQAV3fpAt7nIBb5QGGEI+BQA AFBPUlQgNjUsMTIyLDYxLDM0LDE4MywyNDENCoXwkj4CpQEAVAAAAFQAAAAAB+kKFlwAArOd AeQIAEUAAEa4JkAAfQZITUF6PShBej0iABW3bbnIBb7d+kDSUBj3SmhnAAAyMDAgUE9SVCBj b21tYW5kIHN1Y2Nlc3NmdWwuDQqF8JI+G6gBAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABC TsxAAD8G76tBej0iQXo9KLdtABXd+kDSucgF3FAYYQiXhwAAU1RPUiAzNjE5OTkwNy5vdXQu MDMwNDA4DQqF8JI+/RwCAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquCdAAH0GSChBej0o QXo9IgAVt225yAXc3fpA7FAY9zAvWgAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBj b25uZWN0aW9uIGZvciAzNjE5OTkwNy5vdXQuMDMwNDA4Lg0KhfCSPhKVAgA+AAAAPgAAAAAH 6QoWXAACs50B5AgARQAAMLgoQAB9BkhhQXo9KEF6PSIAFLfxbtJA9wAAAABwAvrwI3EAAAIE BWQBAQQChfCSPp6WAgA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME7NQAA/Bu+8QXo9IkF6 PSi38QAU45BmP27SQPhwEmEIcygAAAEBBAICBAW0hfCSPoTOAgA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLgpQAB9BkhoQXo9KEF6PSIAFLfxbtJA+OOQZkBQEP1cA5gAAIXwkj4F1gIA mgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxOzkAAPwbqX0F6PSJBej0ot/EAFOOQZkBu0kD4 UBBhCMpjAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MjA2IE1OPTM2MTk5OTA3Lm91dCBT UkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJPc3RlckRvd0pvbmVz IiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIE9ESiBVU0RBIE5lYnIgRGFpbHkg V3RnIEF2ZyBEaXJlY3QgU2x0ciBDYXR0bGUgTmVnIFNhbGVzIC0gQXByIDgKCi4uLiAgCSAK CkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoT0RKIHZp YSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMg T3N0ZXJEb3dKb25lcyBDb21tb2RpdHkgTmV3cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZl ZC4KCgouLi4KCgpPc3RlckRvd0pvbmVzCgpMTV9DVDEyNwpTdCBKb3NlcGgsIE1PICAgIFR1 ZSBBcHIgOCwgMjAwMyAgICAgVVNEQSBNYXJrZXQgTmV3cwoKTkVCUkFTS0EgREFJTFkgV0VJ R0hURUQgQVZFUkFHRSBDQVRUTEUgUkVQT1JUIC0gTkVHT1RJQVRFRCBQVVJDSEFTRVMKUmVj YXAgZm9yOiBNb25kYXkgNC83LzAzCgpDb25maXJtZWQ6ICAgICAgICAxMjYgICAgICAgICBX ZWVrIEFnbzogICAgbm9uZSAgICAgICAgICBMYXN0IFllYXI6ICAgICAgIDU2NQpXZWVrIHRv IERhdGU6ICAgICAxMjYgICAgICAgICBXZWVrIEFnbzogICAgbm9uZSAgICAgICAgICBMYXN0 IFllYXI6ICAgICAgIDU2NQoKTElWRSBGT0IgQkFTSVMgLSBCZWVmIEJyZWVkcwoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgSGVhZCAgICAgIFdlaWdodCAgICAgIFd0ZCBBdmcgICAg ICBQcmljZSAgICAgIFd0ZApBdmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQg ICAgIFJhbmdlICAgICAgIFdlaWdodCAgICAgICBSYW5nZSAgICAgIFByaWNlClNURUVSUwog T3ZlciA4MCUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAg ICAgICAgICAgLQogNjUgLSA4MCUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAg ICAgICAgICAgICAgICAgICAgICAgLQogMzUgLSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAg ICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQogIDAgLSAzNSUgQ2hvaWNlICAg ICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQogVG90YWwg YWxsIGdyYWRlcyAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAg ICAgLQpIRUlGRVJTCiBPdmVyIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0g ICAgICAgICAgICAgICAgICAgICAgICAtCiA2NSAtIDgwJSBDaG9pY2UgICAgICAgICAgICAg ICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCiCF8JI+hdYCAJoFAACaBQAA AAKznQHkAAfpChZcCABFAAWMTs9AAD8G6l5Bej0iQXo9KLfxABTjkGukbtJA+FAYYQj3PAAA MzUgLSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAg ICAgICAgICAgLQogIDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAg ICAgICAgICAgICAgICAgICAgICAgLQogVG90YWwgYWxsIGdyYWRlcyAgICAgICAgICAgICAg ICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQoKRFJFU1NFRCBERUxJVkVSRUQg QkFTSVMgLSBCZWVmIEJyZWVkcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZCAg ICAgIFdlaWdodCAgICAgIFd0ZCBBdmcgICAgICBQcmljZSAgICAgIFd0ZApBdmcKICAgICAg ICAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgIFJhbmdlICAgICAgIFdlaWdodCAgICAg ICBSYW5nZSAgICAgIFByaWNlClNURUVSUwogT3ZlciA4MCUgQ2hvaWNlICAgICAgICAgICAg ICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQogNjUgLSA4MCUgQ2hvaWNl ICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQogMzUg LSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAg ICAgICAgLQogIDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAg ICAgICAgICAgICAgICAgICAgLQogVG90YWwgYWxsIGdyYWRlcyAgICAgICAgICAgICAgICAg ICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgLQpIRUlGRVJTCiBPdmVyIDgwJSBDaG9p Y2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCiA2 NSAtIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAg ICAgICAgICAtCiAzNSAtIDY1JSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAg ICAgICAgICAgICAgICAgICAgICAtCiAgMCAtIDM1JSBDaG9pY2UgICAgICAgICAgICAgICAg ICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCiBUb3RhbCBhbGwgZ3JhZGVzICAg ICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAtCgpXRUVLTFkg QUNDVU1VTEFURUQgICAgIEhlYWQgQ291bnQgICAgQXZnIFdlaWdodCAgICAgIEF2ZyBQcmlj ZQogTGl2ZSAgICBTdGVlcgogTGl2ZSAgICBIZWlmZXIKIERyZXNzZWQgU3RlZXIKIERyZXNz ZWQgSGVpZmVyCgpTQU1FIFBFUklPRCBMQVNUIFdFRUsgIEhlYWQgQ291bnQgICAgQXZnIFdl aWdodCAgICAgIEF2ZyBQcmljZQogTGl2ZSAgICBTdGVlcgogTGl2ZSAgICBIZWlmZXIKIERy ZXNzZWQgU3RlZXIKIERyZXNzZWQgSGVpZmVyCgpTQU1FIFBFUklPRCBMQVNUIFlFQVIgIEhl YWQgQ291bnQgICAgQXZnIFdlaWdodCAgICAgIEF2hfCSPqDWAgAAAgAAAAIAAAACs50B5AAH 6QoWXAgARQAB8k7QQAA/Bu33QXo9IkF6PSi38QAU45BxCG7SQPhQGGEIh6AAAGcgUHJpY2UK IExpdmUgICAgU3RlZXIKIExpdmUgICAgSGVpZmVyCiBEcmVzc2VkIFN0ZWVyICAgICAgICAg ICAgICAzNzAgICAgICAgICA3OTQuMzAgICAgICAgICAxMTAuMDAKIERyZXNzZWQgSGVpZmVy ICAgICAgICAgICAgIDE5NSAgICAgICAgIDc4Ny4wMCAgICAgICAgIDExMC4wMAoKU291cmNl OiAgICBVU0RBIE1hcmtldCBOZXdzIFNlcnZpY2UsIFN0ICBKb3NlcGgsIE1PCiAgICAgICAg ICAgODE2LTIzOC0wNjc4ICAgIGVtYWlsOiAgc3Rqb2UubGdtbkB1c2RhLmdvdgoKd3d3LmFt cy51c2RhLmdvdi9tbnJlcG9ydHMvbG1fY3QxMjcudHh0CgoxMTAwQwoKLgoKLi4uICAJIAoK S2V5V29yZHMuLi4gIAogICAgYmVlZgogICAgZW1haWwKICAgIG1hcmtldAogICAgbmVicmFz a2EKICAgIHNhbGVzCiAgICB1c2RhCiAgICBNRUFUT3JpZ2luIEFzc2lnbmVkQnk9Ik9zdGVy RG93Sm9uZXMiIC8+VVNEQQoKhfCSPqLWAgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE7R QAA/Bu/AQXo9IkF6PSi38QAU45By0m7SQPhQEWEIk1kAAAAAAAAAAIXwkj63UAMANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi4KkAAfQZIZ0F6PShBej0iABS38W7SQPjjkHEIUBD9XPjP AACF8JI+FFgDADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouCtAAH0GSGZBej0oQXo9IgAU t/Fu0kD445By01AQ+5L4zgAAhfCSPktjAwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLgs QAB9BkhlQXo9KEF6PSIAFLfxbtJA+OOQctNQEfuS+M0AAIXwkj6TZAMAPAAAADwAAAAAArOd AeQAB+kKFlwIAEUAAChO0kAAPwbvv0F6PSJBej0ot/EAFOOQctNu0kD5UBBhCJNYAAAAAAAA AACF8JI+eqIDADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTtNAAD8G775Bej0iQXo9KLdt ABXd+kDsucgGHlAQYQi7PQAAAAAAAAAAhfCSPtzaAwBOAAAATgAAAAAH6QoWXAACs50B5AgA RQAAQLgtQAB9BkhMQXo9KEF6PSIAFbdtucgGHt36QOxQGPcwVf8AADIyNiBUcmFuc2ZlciBj b21wbGV0ZS4NCoXwkj5a4gMAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJO1EAAPwbvo0F6 PSJBej0ot20AFd36QOy5yAY2UBhhCKgvAABERUxFIDM2MTk5OTA4Lm91dC4wMzA0MDgNCoXw kj66HwQAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG64LkAAfQZIHUF6PShBej0iABW3bbnI Bjbd+kEGUBj3FqTZAAA1NTAgMzYxOTk5MDgub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5u b3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KhfCSPmYrBABRAAAAUQAAAAACs50B5AAH 6QoWXAgARQAAQ07VQAA/Bu+hQXo9IkF6PSi3bQAV3fpBBrnIBnxQGGEI9gcAAFBPUlQgNjUs MTIyLDYxLDM0LDE4MywyNDINCoXwkj7DZQQAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa4 L0AAfQZIREF6PShBej0iABW3bbnIBnzd+kEhUBj2+meqAAAyMDAgUE9SVCBjb21tYW5kIHN1 Y2Nlc3NmdWwuDQqF8JI+Z2wEAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCTtZAAD8G76FB ej0iQXo9KLdtABXd+kEhucgGmlAYYQiVegAAU1RPUiAzNjE5OTkwOC5vdXQuMDMwNDA4DQqF 8JI+YKkEAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquDBAAH0GSB9Bej0oQXo9IgAVt225 yAaa3fpBO1AY9uAunAAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9u IGZvciAzNjE5OTkwOC5vdXQuMDMwNDA4Lg0KhfCSPlyqBAA+AAAAPgAAAAAH6QoWXAACs50B 5AgARQAAMLgxQAB9BkhYQXo9KEF6PSIAFLfyq6TXlAAAAABwAvrwUAAAAAIEBWQBAQQChfCS PumrBAA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME7XQAA/Bu+yQXo9IkF6PSi38gAU45JV 1auk15VwEmEIsB8AAAEBBAICBAW0hfCSPl3kBAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLgyQAB9BkhfQXo9KEF6PSIAFLfyq6TXleOSVdZQEP1cQI8AAIXwkj4U7AQAmgUAAJoFAAAA ArOdAeQAB+kKFlwIAEUABYxO2EAAPwbqVUF6PSJBej0ot/IAFOOSVdarpNeVUBBhCOYvAABY WVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MjA4IE1OPTM2MTk5OTA4Lm91dCBTUkM9Y29tdGV4 IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJNMiIgCgouLi4gIAoKCi4uLiAJIAoK CkhlYWRMaW5lLi4uICBVSyBHb3Zlcm5tZW50OiBGYWxjb25lciBjYWxscyBmb3IgZGViYXRl IG9uIHZpY3RpbXMKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4g IEFwciAwOCwgMjAwMyAoTTIgUFJFU1NXSVJFIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29w eXJpZ2h0TGluZS4uLiAgKEMpMTk5NC0yMDAzIE0yIENPTU1VTklDQVRJT05TIExURAoKCi4u LgoKCk0yCgpIb21lIE9mZmljZSBNaW5pc3RlciwgTG9yZCBGYWxjb25lciwgdG9kYXkgY2Fs bGVkIGZvciBhIGRlYmF0ZSBvbiB3aGV0aGVyCnZpY3RpbXMgc2hvdWxkIGhhdmUgbW9yZSBv ZiBhIHNheSBpbiB0aGUgcmVsZWFzZSBvZiBwcmlzb25lcnMuCgpTcGVha2luZyBhdCB0aGUg UGFyb2xlIEJvYXJkIEFubnVhbCBMZWN0dXJlLCBoZSB0YWxrZWQgb2YgdGhlIGltcG9ydGFu Y2UKb2YgZW5zdXJpbmcgdGhhdCB0aGUgbmVlZHMgb2YgdmljdGltcyBzaXQgYXQgdGhlIHZl cnkgaGVhcnQgb2YgdGhlCkNyaW1pbmFsIEp1c3RpY2UgU3lzdGVtIGFuZCBkaXNjdXNzZWQg YXJndW1lbnRzIGZvciBhbmQgYWdhaW5zdCB0aGUgdmlld3MKb2YgdmljdGltcyBiZWluZyB0 YWtlbiBpbnRvIGFjY291bnQgYXQgdGhlIHRpbWUgb2YgYW4gb2ZmZW5kZXIncyByZWxlYXNl LgoKTG9yZCBGYWxjb25lciBzYWlkOiAiVG9kYXkgeW91IGFyZSBsZXNzIGxpa2VseSB0byBi ZSBhIHZpY3RpbSBvZiBjcmltZQp0aGFuIGF0IGFueSB0aW1lIHNpbmNlIHRoZSBlYXJseSAx OTgwcyAtIGhvd2V2ZXIgbW9yZSBuZWVkcyB0byBiZSBkb25lLgoKIlZpY3RpbXMgb2YgY3Jp bWUgYW5kIHRoZWlyIGZhbWlsaWVzIGFyZSBlbnRpdGxlZCB0byBhIHByb3BlciBzeXN0ZW0g b2YKanVzdGljZS4gQnV0IG1hbnkgdmljdGltcyBmZWVsIHRoYXQgdGhlIHJpZ2h0cyBvZiB0 aG9zZSBhY2N1c2VkIG9mIGEKY3JpbWUgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlaXJzIGFu ZCBoYXZlIHNhaWQgdGhhdCB0aGV5IGhhdmUgZmVsdCAnbGVmdAppbiB0aGUgZGFyaycsIHZ1 bG5lcmFibGUsIGludGltaWRhdGVkIGFuZCBmcnVzdHJhdGVkLgoKIlRoZSB2aWN0aW0ncyB2 b2ljZSBpcyB0b28gb2Z0ZW4gc2h1bm5lZCBiZWNhdXNlIG9mIGNvbmNlcm4gb3ZlcgpvYmpl Y3Rpdml0eSAtIHllcyBpdCBpcyB1bmRlcnN0YW5kYWJseSBoYXJkIGZvciB2aWN0aW1zIHRv IGJlIG9iamVjdGl2ZQphbmQgbm8tb25lIGlzIHNheWluZyB0aGV5IHNob3VsZCBiZSBqdWRn ZSBhbmQganVyeSAtIGJ1dCB0aGF0IHNob3VsZCCF8JI+mewEAJoFAACaBQAAAAKznQHkAAfp ChZcCABFAAWMTtlAAD8G6lRBej0iQXo9KLfyABTjkls6q6TXlVAYYQhbkwAAbm90Cm1lYW4g dGhlaXIgZmVlbGluZ3MgZG8gbm90IG1hdHRlciwgaGFzIHRoaXMgc2h1dHRpbmcgb3V0IGdv bmUgdG9vIGZhcj8KCiJJIGtub3cgdGhhdCBtYW55IG9mIHlvdSB3b3VsZCBvcHBvc2UgdGhl IG5vdGlvbiB0aGF0IHRoZSB2aWN0aW0ncyB2aWV3CnNob3VsZCBiZSB0YWtlbiBpbnRvIGFj Y291bnQgd2hlbiBkZXRlcm1pbmluZyB0aGUgZGF0ZSBvZiByZWxlYXNlLiBJdCBpcwp0aGUg Y2FzZSB0aGF0IHRoZSB2YXN0IG1ham9yaXR5IG9mIHZpY3RpbXMgd291bGQsIGlmIGFza2Vk LCBzdGF0ZSB0aGF0CnRoZXkgd2FudCB0aGVpciBhdHRhY2tlciB0byByZW1haW4gaW5jYXJj ZXJhdGVkLiBJZiB0aGlzIGZhY3RvciBhbG9uZQpkZXRlcm1pbmVkIHJlbGVhc2UsIHRoZW4g cmVsZWFzZSBjb25zaWRlcmF0aW9uIG1pZ2h0IG5vdCBhbHdheXMgYmUgYW4Kb2JqZWN0aXZl IGV4ZXJjaXNlLiBIb3dldmVyLCB3aGVyZSB0aGVyZSBpcyBjbGVhciBldmlkZW5jZSB0aGF0 LCBmb3IKZXhhbXBsZSwgdGhlIG1lbnRhbCB3ZWxsIGJlaW5nIG9mIHRoZSB2aWN0aW0gd291 bGQgYmUgdW5kZXJtaW5lZCBieSB0aGUKb2ZmZW5kZXIgcmV0dXJuaW5nIHRvIHRoZSBjb21t dW5pdHksIHRoZW4gd2UgbXVzdCBzdXJlbHkgb3dlIGl0IHRvIHRoZQp2aWN0aW0gdG8gZW5z dXJlIHRoYXQgdGhpcyBpcyB0YWtlbiBpbnRvIGFjY291bnQgYXMgYSBmYWN0b3IgbWlsaXRh dGluZwphZ2FpbnN0IHJlbGVhc2UuCgoiVGhlcmUgYXJlIGNvbmZsaWN0aW5nIGludGVyZXN0 cyBhbmQgd2Ugd291bGQgbm90IHdhbnQgdG8gYWRkIHRvIHRoZQpidXJkZW4gb3IgdnVsbmVy YWJpbGl0eSBvZiB2aWN0aW1zIG9mIGNyaW1lIHRocm91Z2ggcmVzcG9uc2liaWxpdGllcyB0 aGF0CmFyZSBtb3JlIGFwcHJvcHJpYXRlbHkgYm9ybmUgYnkgdGhlIHJlbGV2YW50IGF1dGhv cml0aWVzIHdpdGhpbiB0aGUKQ3JpbWluYWwgSnVzdGljZSBTeXN0ZW0uIEhvd2V2ZXIsIHRo aXMgaXMgYW4gaW1wb3J0YW50IGRpc2N1c3Npb24gdGhhdCBJCmJlbGlldmUgaXQgaXMgY3J1 Y2lhbCBmb3IgdXMgdG8gaGF2ZS4iCgpOb3RlcyB0byBFZGl0b3JzCgoxLiBMb3JkIEZhbGNv bmVyIGlzIHNwZWFraW5nIGF0IDZwbSBvbiBUdWVzZGF5IDggQXByaWwsIGF0IHRoZSBQYXJv bGUKQm9hcmQgQW5udWFsIExlY3R1cmUgaW4gTG9uZG9uLgoKMi4gVGhlIENyaW1pbmFsIEp1 c3RpY2UgQmlsbCB3YXMgcHVibGlzaGVkIGluIE5vdmVtYmVyIDAyIGZvbGxvd2luZyB0aGUK cHVibGljYXRpb24gaW4gSnVseSAyMDAyIG9mIHRoZSBXaGl0ZSBQYXBlciAnSnVzdGljZSBm b3IgQWxsJy4gQSBWaWN0aW1zCm9mIENyaW1lIEJpbGwgd2lsbCBiZSBwdWJsaXNoZWQgd2hl biBwYXJsaWFtZW50YXJ5IHRpbWUghfCSPtLsBAB3AgAAdwIAAAACs50B5AAH6QoWXAgARQAC aU7aQAA/Bu12QXo9IkF6PSi38gAU45Jgnquk15VQGGEIpKYAAGFsbG93cy4KCjMuIFRoZSBW aWN0aW1zIGxlYWZsZXQgd2hpY2ggZGVzY3JpYmVzIHNvbWUgb2YgdGhlIG1lYXN1cmVzIHdl IGhhdmUgdGFrZW4Kc28gZmFyIGFuZCBvdXRsaW5lcyB0aG9zZSB3ZSB3aWxsIHRha2Ugd2Fz IGFsc28gcHVibGlzaGVkIGluIE5vdmVtYmVyIDAyLgpJdCBpcyBhdmFpbGFibGUgb24gdGhl IEhvbWUgT2ZmaWNlIHdlYnNpdGU6IHd3dy5ob21lb2ZmaWNlLmdvdi51awoKTTIgQ29tbXVu aWNhdGlvbnMgTHRkIGRpc2NsYWltcyBhbGwgbGlhYmlsaXR5IGZvciBpbmZvcm1hdGlvbiBw cm92aWRlZAp3aXRoaW4gTTIgUHJlc3NXSVJFLiBEYXRhIHN1cHBsaWVkIGJ5IG5hbWVkIHBh cnR5L3BhcnRpZXMuIEZ1cnRoZXIKaW5mb3JtYXRpb24gb24gTTIgUHJlc3NXSVJFIGNhbiBi ZSBvYnRhaW5lZCBhdCBodHRwOi8vd3d3LnByZXNzd2lyZS5uZXQKb24gdGhlIHdvcmxkIHdp ZGUgd2ViLiBJbnF1aXJpZXMgdG8gaW5mb0BtMi5jb20uCgouLi4gIAkgCgpLZXlXb3Jkcy4u LiAgCiAgICBjcmltZQogICAgZWRpdG9ycwogICAgZXhlcmNpc2UKICAgIGdvdmVybm1lbnQK ICAgIGxvbmRvbgogICAgd2ViCgqF8JI+0+wEADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo TttAAD8G77ZBej0iQXo9KLfyABTjkmLfq6TXlVARYQjP2QAAAAAAAAAAhfCSPpxnBQA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLgzQAB9BkheQXo9KEF6PSIAFLfyq6TXleOSYJ5QEP1c NccAAIXwkj4TcQUANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4NEAAfQZIXUF6PShBej0i ABS38quk15XjkmLgUBD7GzXGAACF8JI+9H4FADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo uDVAAH0GSFxBej0oQXo9IgAUt/KrpNeV45Ji4FAR+xs1xQAAhfCSPkSABQA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKE7cQAA/Bu+1QXo9IkF6PSi38gAU45Ji4Kuk15ZQEGEIz9gAAAAA AAAAAIXwkj56GAYAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChO3UAAPwbvtEF6PSJBej0o t20AFd36QTu5yAbcUBBhCLowAAAAAAAAAACF8JI+y1AGAE4AAABOAAAAAAfpChZcAAKznQHk CABFAABAuDZAAH0GSENBej0oQXo9IgAVt225yAbc3fpBO1AY9uBVQgAAMjI2IFRyYW5zZmVy IGNvbXBsZXRlLg0KhfCSPj1YBgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk7eQAA/Bu+Z QXo9IkF6PSi3bQAV3fpBO7nIBvRQGGEIpiIAAERFTEUgMzYxOTk5MDkub3V0LjAzMDQwOA0K hfCSPq+VBgB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrg3QAB9BkgUQXo9KEF6PSIAFbdt ucgG9N36QVVQGPbGpBsAADU1MCAzNjE5OTkwOS5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNh bm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQqF8JI+8KMGAFEAAABRAAAAAAKznQHk AAfpChZcCABFAABDTt9AAD8G75dBej0iQXo9KLdtABXd+kFVucgHOlAYYQjz+gAAUE9SVCA2 NSwxMjIsNjEsMzQsMTgzLDI0Mw0KhfCSPqveBgBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAA Rrg4QAB9Bkg7QXo9KEF6PSIAFbdtucgHOt36QXBQGPaqZu0AADIwMCBQT1JUIGNvbW1hbmQg c3VjY2Vzc2Z1bC4NCoXwkj4h4gYAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJO4EAAPwbv l0F6PSJBej0ot20AFd36QXC5yAdYUBhhCJNtAABTVE9SIDM2MTk5OTA5Lm91dC4wMzA0MDgN CoXwkj6dmQcAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq4OUAAfQZIFkF6PShBej0iABW3 bbnIB1jd+kGKUBj2kC3eAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rp b24gZm9yIDM2MTk5OTA5Lm91dC4wMzA0MDguDQqF8JI+hZoHAD4AAAA+AAAAAAfpChZcAAKz nQHkCABFAAAwuDpAAH0GSE9Bej0oQXo9IgAUt/Odr7HNAAAAAHAC+vCDuwAAAgQFZAEBBAKF 8JI+eJwHAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwTuFAAD8G76hBej0iQXo9KLfzABTj lUATna+xznASYQj5mQAAAQEEAgIEBbSF8JI+xdQHADYAAAA2AAAAAAfpChZcAAKznQHkCABF AAAouDtAAH0GSFZBej0oQXo9IgAUt/Odr7HO45VAFFAQ/VyKCQAAhfCSPt3bBwBqBAAAagQA AAACs50B5AAH6QoWXAgARQAEXE7iQAA/But7QXo9IkF6PSi38wAU45VAFJ2vsc5QGGEIGHEA AFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTcyMDggTU49MzYxOTk5MDkub3V0IFNSQz1jb210 ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoK Ci4uLiAJIAoKCkhlYWRMaW5lLi4uICBST0QsT1BFUkFUSU5HIExJTksKCi4uLiAgCSAKCkJ5 TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoRmVkQml6T3Bw cyB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAo YykgMjAwMyBGZWRlcmFsIEluZm9ybWF0aW9uICYgTmV3cyBEaXNwYXRjaCwgSW5jLgoKCi4u LgoKCkZlZEJpek9wcwoKTk9USUNFIFRZUEU6IENPTlRSQUNUIEFXQVJECgpTT1VSQ0U6IFB1 Ymxpc2hlZCBpbiBGZWRCaXpPcHBzCgpEQVRFIFBPU1RFRDogMDctQVBSLTAzCgpPRkZJQ0Ug QUREUkVTUzogREVGRU5TRSBHRU5FUkFMIFNVUFBMWSBDRU5URVIgODAwMCBKRUZGIERBVklT IEhXWQpSSUNITU9ORCwgVkEgMjMyOTctNTMgMTIKCkNMQVNTSUZJQ0FUSU9OIENPREU6IDE1 IC0gQWlyY3JhZnQgJiBhaXJmcmFtZSBzdHJ1Y3R1cmFsIGNvbXBvbmVudHMKClNVQkpFQ1Q6 IFJPRCxPUEVSQVRJTkcgTElOSwoKU09MSUNJVEFUSU9OIE5VTUJFUjogU1AwNDcwLTAzLVIt MDE4OAoKQVdBUkQgTlVNQkVSOiBTUDA0NzAtMDMtQy0xOTgwCgpBV0FSRCBBTU9VTlQ6ICQ5 Niw4MzAKCkxJTkUgTlVNQkVSOiAwMDAxCgpBV0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQg VE86IEFJIEQgQ09SUE9SQVRJT04gMjUwIExBVVJFTCBIRUlHSFRTIERSIFAuTy5CT1ggNjg1 IENMQVlUT04gR0EKMzA1MjUtMCA2ODUKCkFSQ0hJVkUgREFURTogMDQxOTIwMDMKCkNPTlRB Q1Q6IE4vQQoKSU5URVJORVQgQUREUkVTUzoKaHR0cDovL3d3dy5lcHMuZ292L3NwZy9ETEEv SjMvRFNDUi9Bd2FyZHMvU1AwNDcwLTAzLUMtMTk4MExuMDAwMS5odG1sCgouLi4gIAkgCgpL ZXlXb3Jkcy4uLiAgCiAgICBhaXJjcmFmdAogICAgY29udHJhY3QKICAgIGRlZmVuc2UKICAg IGdlb3JnaWEKICAgIGludGVybmV0CiAgICBzdHJ1Y3R1cmFsCiAgICB2aXJnaW5pYQoKhfCS Pt7bBwA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE7jQAA/Bu+uQXo9IkF6PSi38wAU45VE SJ2vsc5QEWEIIikAAAAAAAAAAIXwkj4EMggANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4 PEAAfQZIVUF6PShBej0iABS3852vsc7jlURJUBD5KIoIAACF8JI+eD0IADYAAAA2AAAAAAfp ChZcAAKznQHkCABFAAAouD1AAH0GSFRBej0oQXo9IgAUt/Odr7HO45VESVAR+SiKBwAAhfCS Pnk+CAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE7kQAA/Bu+tQXo9IkF6PSi38wAU45VE SZ2vsc9QEGEIIigAAAAAAAAAAIXwkj7HIAkAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChO 5UAAPwbvrEF6PSJBej0ot20AFd36QYq5yAeaUBBhCLkjAAAAAAAAAACF8JI+zVgJAE4AAABO AAAAAAfpChZcAAKznQHkCABFAABAuD5AAH0GSDtBej0oQXo9IgAVt225yAea3fpBilAY9pBU hQAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KhfCSPipgCQBQAAAAUAAAAAACs50B5AAH6QoW XAgARQAAQk7mQAA/Bu+RQXo9IkF6PSi3bQAV3fpBirnIB7JQGGEIrRQAAERFTEUgMzYxOTk5 MTEub3V0LjAzMDQwOA0KhfCSPrCdCQB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrg/QAB9 BkgMQXo9KEF6PSIAFbdtucgHst36QaRQGPZ2omYAADU1MCAzNjE5OTkxMS5vdXQuMDMwNDA4 OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQqF8JI+Y6kJ AFEAAABRAAAAAAKznQHkAAfpChZcCABFAABDTudAAD8G749Bej0iQXo9KLdtABXd+kGkucgH +FAYYQjx7QAAUE9SVCA2NSwxMjIsNjEsMzQsMTgzLDI0NA0KhfCSPtTjCQBUAAAAVAAAAAAH 6QoWXAACs50B5AgARQAARrhAQAB9BkgzQXo9KEF6PSIAFbdtucgH+N36Qb9QGPZaZjAAADIw MCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCoXwkj4E5wkAUAAAAFAAAAAAArOdAeQAB+kK FlwIAEUAAEJO6EAAPwbvj0F6PSJBej0ot20AFd36Qb+5yAgWUBhhCJpfAABTVE9SIDM2MTk5 OTExLm91dC4wMzA0MDgNCoXwkj5vJAoAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq4QUAA fQZIDkF6PShBej0iABW3bbnICBbd+kHZUBj2QCwpAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9k ZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTExLm91dC4wMzA0MDguDQqF8JI+aSkKAD4A AAA+AAAAAAfpChZcAAKznQHkCABFAAAwuEJAAH0GSEdBej0oQXo9IgAUt/S/6PkzAAAAAHAC +vAaGwAAAgQFZAEBBAKF8JI+QisKAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwTulAAD8G 76BBej0iQXo9KLf0ABTjmH0Xv+j5NHASYQhS8gAAAQEEAgIEBbSF8JI+RWMKADYAAAA2AAAA AAfpChZcAAKznQHkCABFAAAouENAAH0GSE5Bej0oQXo9IgAUt/S/6Pk045h9GFAQ/VzjYQAA hfCSPppqCgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE7qQAA/BupDQXo9IkF6PSi39AAU 45h9GL/o+TRQEGEI4CoAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTcyMTAgTU49MzYxOTk5 MTEub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVy RG93Sm9uZXMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgT0RKIFVTREEgQ29s byBEYWlseSBXdGcgQXZnIERpcmVjdCBTbHRyIENhdHRsZSBOZWcgU2FsZXMgLSBBcHIgOAoK Li4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAz IChPREogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmln aHQgMjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0eSBOZXdzIChPREopLiBBbGwgcmlnaHRz IHJlc2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9uZXMKCkxNX0NUMTI4ClN0IEpvc2VwaCwg TU8gICAgVHVlIEFwciA4LCAyMDAzICAgICBVU0RBIE1hcmtldCBOZXdzCgpDT0xPUkFETyBE QUlMWSBXRUlHSFRFRCBBVkVSQUdFIENBVFRMRSBSRVBPUlQgLSBORUdPVElBVEVEIFBVUkNI QVNFUwpSZWNhcCBmb3I6IE1vbmRheSA0LzcvMDMKCkNvbmZpcm1lZDogICAgICAgbm9uZSAg ICAgICAgIFdlZWsgQWdvOiAgICBub25lICAgICAgICAgIExhc3QgWWVhcjogICBub25lCldl ZWsgdG8gRGF0ZTogICAgbm9uZSAgICAgICAgIFdlZWsgQWdvOiAgICBub25lICAgICAgICAg IExhc3QgWWVhcjogICBub25lCgpMSVZFIEZPQiBCQVNJUyAtIEJlZWYgQnJlZWRzCgogICAg ICAgICAgICAgICAgICAgICAgICAgIEhlYWQgICAgICAgIFdlaWdodCAgICBXdGQgQXZnICAg IFByaWNlICAgIFd0ZCBBdmcKICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAg ICBSYW5nZSAgICAgV2VpZ2h0ICAgICBSYW5nZSAgICBQcmljZQpTVEVFUlMKIE92ZXIgODAl IENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAt CiA2NSAtIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAg ICAgICAgICAgLQogMzUgLSA2NSUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAg ICAgICAgICAgICAgICAgICAgIC0KICAwIC0gMzUlIENob2ljZSAgICAgICAgICAgICAgICAg ICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAtCiBUb3RhbCBhbGwgZ3JhZGVzICAgICAg ICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQoKSEVJRkVSUwogT3Zl ciA4MCUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAg ICAgIC0KIDY1IC0gODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAg ICAgICAgICAgICAgICAtCiAzNSAtIDY1JSBDaG9pY2UgICAgICAgICAgICAgIIXwkj4dawoA mgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxO60AAPwbqQkF6PSJBej0ot/QAFOOYgny/6Pk0 UBhhCGWqAAAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KICAwIC0gMzUlIENo b2ljZSAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAtCiBU b3RhbCBhbGwgZ3JhZGVzICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAg ICAgICAgLQoKRFJFU1NFRCBERUxJRVZFUkVEIEJBU0lTIC0gQmVlZiBCcmVlZHMKCiAgICAg ICAgICAgICAgICAgICAgICAgICAgSGVhZCAgICAgICAgV2VpZ2h0ICAgIFd0ZCBBdmcgICAg UHJpY2UgICAgV3RkIEF2ZwogICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAg IFJhbmdlICAgICBXZWlnaHQgICAgIFJhbmdlICAgIFByaWNlClNURUVSUwogT3ZlciA4MCUg Q2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0K IDY1IC0gODAlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAg ICAgICAgICAtCiAzNSAtIDY1JSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAg ICAgICAgICAgICAgICAgICAgLQogIDAgLSAzNSUgQ2hvaWNlICAgICAgICAgICAgICAgICAg ICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KIFRvdGFsIGFsbCBncmFkZXMgICAgICAg ICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgICAgICAgICAtCgpIRUlGRVJTCiBPdmVy IDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAg ICAgLQogNjUgLSA4MCUgQ2hvaWNlICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAg ICAgICAgICAgICAgIC0KIDM1IC0gNjUlIENob2ljZSAgICAgICAgICAgICAgICAgICAgICAg LSAgICAgICAgICAgICAgICAgICAgICAtCiAgMCAtIDM1JSBDaG9pY2UgICAgICAgICAgICAg ICAgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgLQogVG90YWwgYWxsIGdyYWRlcyAg ICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KCldFRUtMWSBB Q0NVTVVMQVRFRCAgICAgSGVhZCBDb3VudCAgICBBdmcgV2VpZ2h0ICAgICAgQXZnIFByaWNl CiBMaXZlICAgIFN0ZWVyCiBMaXZlICAgIEhlaWZlcgogRHJlc3NlZCBTdGVlcgogRHJlc3Nl ZCBIZWlmZXIKClNBTUUgUEVSSU9EIExBU1QgV0VFSyAgSGVhZCBDb3VudCAgICBBdmcgV2Vp Z2h0ICAgICAgQXZnIFByaWNlCiBMaXZlICAgIFN0ZWVyCiBMaXZlICAgIEhlaWZlcgogRHJl c3NlZCBTdGVlcgogRHJlc3NlZCBIZWlmZXIKClNBTUUgUEVSSU9EIExBU1QgWUVBUiAgSGVh ZCBDb3VudCAgICBBdmcgV2VpZ2h0ICAgICAgQXZnIFByaWNlCiBMaXZlICAgIFN0ZWVyCiBM aXZlICAgIEhlaWZlcgogRHJlc3NlZCBTdGVlcgogRHJlc3NlZCCF8JI+LWsKAGQBAABkAQAA AAKznQHkAAfpChZcCABFAAFWTuxAAD8G7ndBej0iQXo9KLf0ABTjmIfgv+j5NFAYYQi6+AAA SGVpZmVyCgpTb3VyY2U6ICAgIFVTREEgTWFya2V0IE5ld3MgU2VydmljZSwgU3QgIEpvc2Vw aCwgTU8KICAgICAgICAgICA4MTYtMjM4LTA2NzggICAgZW1haWw6ICBzdGpvZS5sZ21uQHVz ZGEuZ292Cgp3d3cuYW1zLnVzZGEuZ292L21ucmVwb3J0cy9sbV9jdDEyOC50eHQKCjExMDBD CgouCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBiZWVmCiAgICBjb2xvcmFkbwogICAg ZW1haWwKICAgIG1hcmtldAogICAgc2FsZXMKICAgIHVzZGEKICAgIE1FQVRPcmlnaW4gQXNz aWduZWRCeT0iT3N0ZXJEb3dKb25lcyIgLz5VU0RBCgqF8JI+LmsKADwAAAA8AAAAAAKznQHk AAfpChZcCABFAAAoTu1AAD8G76RBej0iQXo9KLf0ABTjmIkOv+j5NFARYQhzvwAAAAAAAAAA hfCSPuPlCgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLhEQAB9BkhNQXo9KEF6PSIAFLf0 v+j5NOOYh+BQEP1c2JkAAIXwkj4x6AoANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4RUAA fQZITEF6PShBej0iABS39L/o+TTjmIkPUBD8LtiYAACF8JI+if0KADYAAAA2AAAAAAfpChZc AAKznQHkCABFAAAouEZAAH0GSEtBej0oQXo9IgAUt/S/6Pk045iJD1AR/C7YlwAAhfCSPpn+ CgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE7uQAA/Bu+jQXo9IkF6PSi39AAU45iJD7/o +TVQEGEIc74AAAAAAAAAAIXwkj7AkQsAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChO70AA PwbvokF6PSJBej0ot20AFd36Qdm5yAhYUBBhCLgWAAAAAAAAAACF8JI+1skLAE4AAABOAAAA AAfpChZcAAKznQHkCABFAABAuEdAAH0GSDJBej0oQXo9IgAVt225yAhY3fpB2VAY9kBTyAAA MjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KhfCSPo8/DQA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKE7wQAA/Bu+hQXo9IkF6PSi3bQAV3fpB2bnICHBQEGEIt/4AAAAAAAAAAIbwkj5+FwsA cAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI6j0AAPwYDyUF6PSJBej0olQ8bWBiMpP90egQg gBgW0J/cAAABAQgKDUPXQgBCFDAxODF8MTQ3MjQzOXwxMDQ5ODE3MjI0fDEuMHwxfDI5MTV8 aGVsbG8gd29ybGQKhvCSPtCjDgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVrQAB9Bmsa QXo9KEF6PSIbWJUPdHoEIBiMpS2AEPcAoq4AAAEBCAoAQhRMDUPXQobwkj5rpQ4A+AAAAPgA AAAAArOdAeQAB+kKFlwIAEUAAOo6kEAAPwYDQEF6PSJBej0olQ8bWBiMpS10egQggBgW0AEE AAABAQgKDUPXWQBCFEwxODJ8MTQ3MjQ0MHwxMDQ5ODE3MjI1fDEuMHwxfDk4OHxoZWxsbyB3 b3JsZAoxODN8MTQ3MjQ0MXwxMDQ5ODE3MjI1fDEuMHwxfDc5OXxoZWxsbyB3b3JsZAoxODR8 MTQ3MjQ0MnwxMDQ5ODE3MjI1fDEuMHwxfDMzMDF8aGVsbG8gd29ybGQKMTg1fDE0NzI0NDN8 MTA0OTgxNzIyNXwxLjB8MXwxNzg3fGhlbGxvIHdvcmxkCofwkj7OtwIAQgAAAEIAAAAAB+kK FlwAArOdAeQIAEUAADSVbUAAfQZrGEF6PShBej0iG1iVD3R6BCAYjKXjgBD2SqKUAAABAQgK AEIUTw1D11mH8JI+vbkCACYBAAAmAQAAAAKznQHkAAfpChZcCABFAAEYOpFAAD8GAxFBej0i QXo9KJUPG1gYjKXjdHoEIIAYFtDpKQAAAQEICg1D128AQhRPMTg2fDE0NzI0NDR8MTA0OTgx NzIyNnwxLjB8MXwyMzB8aGVsbG8gd29ybGQKMTg3fDE0NzI0NDV8MTA0OTgxNzIyNnwxLjB8 MXwxNTA4fGhlbGxvIHdvcmxkCjE4OHwxNDcyNDQ2fDEwNDk4MTcyMjZ8MS4wfDF8MTYwfGhl bGxvIHdvcmxkCjE4OXwxNDcyNDQ3fDEwNDk4MTcyMjZ8MS4wfDF8MjQ0MHxoZWxsbyB3b3Js ZAoxOTB8MTQ3MjQ0OHwxMDQ5ODE3MjI2fDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKh/CSPngO BgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJVuQAB9BmsXQXo9KEF6PSIbWJUPdHoEIBiM pseAEPVmonwAAAEBCAoAQhRRDUPXb4jwkj5RaQAAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUA AGE6kkAAPwYDx0F6PSJBej0olQ8bWBiMpsd0egQggBgW0BAjAAABAQgKDUPXxABCFFExOTF8 MTQ3MjQ0OXwxMDQ5ODE3MjI3fDEuMHwxfDc5OXxoZWxsbyB3b3JsZAqI8JI+2noCAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0lW9AAH0GaxZBej0oQXo9IhtYlQ90egQgGIym9IAQ9Tmi HwAAAQEICgBCFFkNQ9fEiPCSPoJ8AgCcAAAAnAAAAAACs50B5AAH6QoWXAgARQAAjjqTQAA/ BgOZQXo9IkF6PSiVDxtYGIym9HR6BCCAGBbQvloAAAEBCAoNQ9fRAEIUWTE5MnwxNDcyNDUw fDEwNDk4MTcyMjd8MS4wfDF8MjEzfGhlbGxvIHdvcmxkCjE5M3wxNDcyNDUxfDEwNDk4MTcy Mjd8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCojwkj6B0QUAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSVcEAAfQZrFUF6PShBej0iG1iVD3R6BCAYjKdOgBD036IQAAABAQgKAEIUWw1D19GI 8JI+pZ4NACoAAAAqAAAAAAfpChZcAAKznQHkCAYAAQgABgQAAQACs50B5EF6PSgAAAAAAABB ej0iiPCSPo2fDQA8AAAAPAAAAAACs50B5AAH6QoWXAgGAAEIAAYEAAIAB+kKFlxBej0iAAKz nQHkQXo9KAAAAAAAAAAAAAAAAAAAAAAAAInwkj6b8AEAbwAAAG8AAAAAArOdAeQAB+kKFlwI AEUAAGE6lEAAPwYDxUF6PSJBej0olQ8bWBiMp050egQggBgW0BkwAAABAQgKDUPYMgBCFFsx OTR8MTQ3MjQ1MnwxMDQ5ODE3MjI4fDEuMHwxfDIzMHxoZWxsbyB3b3JsZAqJ8JI+E+kDAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0lXFAAH0GaxRBej0oQXo9IhtYlQ90egQgGIyne4AQ 9LKhpwAAAQEICgBCFGMNQ9gyifCSPnnqAwCcAAAAnAAAAAACs50B5AAH6QoWXAgARQAAjjqV QAA/BgOXQXo9IkF6PSiVDxtYGIyne3R6BCCAGBbQr1MAAAEBCAoNQ9g/AEIUYzE5NXwxNDcy NDUzfDEwNDk4MTcyMjh8MS4wfDF8NDgyfGhlbGxvIHdvcmxkCjE5NnwxNDcyNDU0fDEwNDk4 MTcyMjh8MS4wfDF8MzI3fGhlbGxvIHdvcmxkConwkj6jPwcAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSVckAAfQZrE0F6PShBej0iG1iVD3R6BCAYjKfVgBD0WKGXAAABAQgKAEIUZg1D 2D+K8JI+gHcDAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhOpZAAD8GA8NBej0iQXo9KJUP G1gYjKfVdHoEIIAYFtANKwAAAQEICg1D2KAAQhRmMTk3fDE0NzI0NTV8MTA0OTgxNzIyOXwx LjB8MXw0ODJ8aGVsbG8gd29ybGQKivCSPqECBwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA NJVzQAB9BmsSQXo9KEF6PSIbWJUPdHoEIBiMqAKAEPQroS0AAAEBCAoAQhRvDUPYoIrwkj73 AwcAngAAAJ4AAAAAArOdAeQAB+kKFlwIAEUAAJA6l0AAPwYDk0F6PSJBej0olQ8bWBiMqAJ0 egQggBgW0LrLAAABAQgKDUPYtwBCFG8xOTh8MTQ3MjQ1NnwxMDQ5ODE3MjI5fDEuMHwxfDE3 ODd8aGVsbG8gd29ybGQKMTk5fDE0NzI0NTd8MTA0OTgxNzIyOXwxLjB8MXwyMDAxfGhlbGxv IHdvcmxkCorwkj58uggAQQEAAEEBAAABAAzMzMwAB+uexW4BM6qqAwAADCAAArSBpgABAA5T a2FydmVuX2d3AAIAEQAAAAEBAcwABEF6PSEAAwARRmFzdEV0aGVybmV0MAAEAAgAAAABAAUA 00Npc2NvIEludGVybmV0d29yayBPcGVyYXRpbmcgU3lzdGVtIFNvZnR3YXJlIApJT1MgKHRt KSBDMTcwMCBTb2Z0d2FyZSAoQzE3MDAtWS1NKSwgVmVyc2lvbiAxMi4xKDMpLCBSRUxFQVNF IFNPRlRXQVJFIChmYzEpCkNvcHlyaWdodCAoYykgMTk4Ni0yMDAwIGJ5IGNpc2NvIFN5c3Rl bXMsIEluYy4KQ29tcGlsZWQgV2VkIDA1LUp1bC0wMCAxNzowNyBieSBjbW9uZwAGAA5jaXNj byAxNzIwAAcACUF9NZweAAsABQGK8JI+CVkKAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lXRAAH0GaxFBej0oQXo9IhtYlQ90egQgGIyoXoAQ88+hEwAAAQEICgBCFHINQ9i3i/CSPmv/ BABwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjqYQAA/BgPAQXo9IkF6PSiVDxtYGIyoXnR6 BCCAGBbQmnMAAAEBCAoNQ9kOAEIUcjIwMHwxNDcyNDU4fDEwNDk4MTcyMzB8MS4wfDF8MTc4 N3xoZWxsbyB3b3JsZAqL8JI+7HAIAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lXVAAH0G axBBej0oQXo9IhtYlQ90egQgGIyojIAQ86GgtAAAAQEICgBCFHoNQ9kOi/CSPk1yCABwAAAA cAAAAAACs50B5AAH6QoWXAgARQAAYjqZQAA/BgO/QXo9IkF6PSiVDxtYGIyojHR6BCCAGBbQ oioAAAEBCAoNQ9kkAEIUejIwMXwxNDcyNDU5fDEwNDk4MTcyMzB8MS4wfDF8MjQ0MHxoZWxs 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 AAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9LgAAAAAAAAAAAAAAAAAAAAAAAJHwkj6zAQEA PAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PS8AAAAA AAAAAAAAAAAAAAAAAACR8JI+OQgBADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH 657FbkF6PSEAAAAAAABBej0wAAAAAAAAAAAAAAAAAAAAAAAAkfCSPkEOAQA8AAAAPAAAAP// /////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9MQAAAAAAAAAAAAAAAAAA AAAAAJHwkj7XHgEAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAA AAAAAEF6PTIAAAAAAAAAAAAAAAAAAAAAAACR8JI+PyQBADwAAAA8AAAA////////AAfrnsVu CAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej0zAAAAAAAAAAAAAAAAAAAAAAAAkfCSPuwq AQA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9NAAA AAAAAAAAAAAAAAAAAAAAAJHwkj5FMQEAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAAB AAfrnsVuQXo9IQAAAAAAAEF6PTUAAAAAAAAAAAAAAAAAAAAAAACR8JI+tD0BADwAAAA8AAAA ////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej02AAAAAAAAAAAAAAAA AAAAAAAAkfCSPstDAQA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0h AAAAAAAAQXo9NwAAAAAAAAAAAAAAAAAAAAAAAJHwkj5qSwEAPAAAADwAAAD///////8AB+ue xW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PTgAAAAAAAAAAAAAAAAAAAAAAACR8JI+ yVABADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej05 AAAAAAAAAAAAAAAAAAAAAAAAkfCSPsGuAQA8AAAAPAAAAP///////wAH657FbggGAAEIAAYE AAEAB+uexW5Bej0hAAAAAAAAQXo9OgAAAAAAAAAAAAAAAAAAAAAAAJHwkj65tQEAPAAAADwA AAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PTsAAAAAAAAAAAAA AAAAAAAAAACR8JI+vLsBADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6 PSEAAAAAAABBej08AAAAAAAAAAAAAAAAAAAAAAAAkfCSPhvEAQA8AAAAPAAAAP///////wAH 657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9PQAAAAAAAAAAAAAAAAAAAAAAAJHw kj6tzgEAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6 PT4AAAAAAAAAAAAAAAAAAAAAAACT8JI+gEMLAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABh OqNAAD8GA7ZBej0iQXo9KJUPG1gYjKredHoEIIAYFtANIwAAAQEICg1D3FcAQhSxMjE0fDE0 NzI0NzJ8MTA0OTgxNzIzOHwxLjB8MXw2NTR8aGVsbG8gd29ybGQKk/CSPpw1DQBCAAAAQgAA AAAH6QoWXAACs50B5AgARQAANJWAQAB9BmsFQXo9KEF6PSIbWJUPdHoEIBiMqwuAEPEinRcA AAEBCAoAQhTODUPcV5Pwkj40Nw0AJwEAACcBAAAAArOdAeQAB+kKFlwIAEUAARk6pEAAPwYC /UF6PSJBej0olQ8bWBiMqwt0egQggBgW0E72AAABAQgKDUPcYwBCFM4yMTV8MTQ3MjQ3M3wx MDQ5ODE3MjM4fDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKMjE2fDE0NzI0NzR8MTA0OTgxNzIz OHwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjIxN3wxNDcyNDc1fDEwNDk4MTcyMzh8MS4wfDF8 MjIzNXxoZWxsbyB3b3JsZAoyMTh8MTQ3MjQ3NnwxMDQ5ODE3MjM5fDEuMHwxfDIzMHxoZWxs byB3b3JsZAoyMTl8MTQ3MjQ3N3wxMDQ5ODE3MjM5fDEuMHwxfDIwMDF8aGVsbG8gd29ybGQK lPCSPtdJAQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJWBQAB9BmsEQXo9KEF6PSIbWJUP dHoEIBiMq/CAEPA9nQkAAAEBCAoAQhTQDUPcY5Twkj6eGgIAcAAAAHAAAAAAArOdAeQAB+kK FlwIAEUAAGI6pUAAPwYDs0F6PSJBej0olQ8bWBiMq/B0egQggBgW0JoJAAABAQgKDUPcfwBC FNAyMjB8MTQ3MjQ3OHwxMDQ5ODE3MjM5fDEuMHwxfDIyMzV8aGVsbG8gd29ybGQKlPCSPgYQ BAA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9LAAA AAAAAAAAAAAAAAAAAAAAAJTwkj7eFQQAPgAAAD4AAAAAArOdAeQAB+uexW4IAEUAADD+R0AA dAY+P9kVcolBej0oB+IAUCMtwQMAAAAAcAL68NGKAAACBAW0AQEEApTwkj5gFgQAPAAAADwA AAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PSkAAAAAAAAAAAAA AAAAAAAAAACU8JI+ihsEADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6 PSEAAAAAAABBej0vAAAAAAAAAAAAAAAAAAAAAAAAlPCSPvkeBAA8AAAAPAAAAP///////wAH 657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9JwAAAAAAAAAAAAAAAAAAAAAAAJTw kj4nIwQAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6 PTkAAAAAAAAAAAAAAAAAAAAAAACU8JI+0yQEADwAAAA8AAAA////////AAfrnsVuCAYAAQgA BgQAAQAH657FbkF6PSEAAAAAAABBej02AAAAAAAAAAAAAAAAAAAAAAAAlPCSPoMmBAA8AAAA PAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9LQAAAAAAAAAA AAAAAAAAAAAAAJTwkj5ZKAQAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVu QXo9IQAAAAAAAEF6PTMAAAAAAAAAAAAAAAAAAAAAAACU8JI+/ykEADwAAAA8AAAA//////// AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej0wAAAAAAAAAAAAAAAAAAAAAAAA lPCSPq0rBAA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAA QXo9KgAAAAAAAAAAAAAAAAAAAAAAAJTwkj5cLQQAPAAAADwAAAD///////8AB+uexW4IBgAB CAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PTcAAAAAAAAAAAAAAAAAAAAAAACU8JI+DC8EADwA AAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej00AAAAAAAA AAAAAAAAAAAAAAAAlPCSPq8wBAA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+ue xW5Bej0hAAAAAAAAQXo9MQAAAAAAAAAAAAAAAAAAAAAAAJTwkj5uMgQAPAAAADwAAAD///// //8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PSsAAAAAAAAAAAAAAAAAAAAA AACU8JI+/TMEADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAA AABBej0uAAAAAAAAAAAAAAAAAAAAAAAAlPCSPqE1BAA8AAAAPAAAAP///////wAH657FbggG AAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9OAAAAAAAAAAAAAAAAAAAAAAAAJTwkj5INwQA PAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PSYAAAAA AAAAAAAAAAAAAAAAAACU8JI+DTkEADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH 657FbkF6PSEAAAAAAABBej01AAAAAAAAAAAAAAAAAAAAAAAAlPCSPrU6BAA8AAAAPAAAAP// /////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9MgAAAAAAAAAAAAAAAAAA AAAAAJTwkj40oAQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVgkAAfQZrA0F6PShBej0i G1iVD3R6BCAYjKwegBDwD5zrAAABAQgKAEIU0g1D3H+U8JI+C7cFADwAAAA8AAAA//////// AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej08AAAAAAAAAAAAAAAAAAAAAAAA lPCSPi+8BQA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAA QXo9PQAAAAAAAAAAAAAAAAAAAAAAAJTwkj7fvQUAPAAAADwAAAD///////8AB+uexW4IBgAB CAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PToAAAAAAAAAAAAAAAAAAAAAAACU8JI+qL8FADwA AAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej0+AAAAAAAA AAAAAAAAAAAAAAAAlPCSPlHBBQA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+ue xW5Bej0hAAAAAAAAQXo9OwAAAAAAAAAAAAAAAAAAAAAAAJTwkj6wTw4AbwAAAG8AAAAAArOd AeQAB+kKFlwIAEUAAGE6pkAAPwYDs0F6PSJBej0olQ8bWBiMrB50egQggBgW0ANKAAABAQgK DUPczwBCFNIyMjF8MTQ3MjQ3OXwxMDQ5ODE3MjQwfDEuMHwxfDk4OHxoZWxsbyB3b3JsZAqV 8JI+0AwBAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lYNAAH0GawJBej0oQXo9IhtYlQ90 egQgGIysS4AQ7+KckwAAAQEICgBCFNoNQ9zPlvCSPpSUAABwAAAAcAAAAAACs50B5AAH6QoW XAgARQAAYjqnQAA/BgOxQXo9IkF6PSiVDxtYGIysS3R6BCCAGBbQne0AAAEBCAoNQ909AEIU 2jIyMnwxNDcyNDgwfDEwNDk4MTcyNDF8MS4wfDF8MjIzNXxoZWxsbyB3b3JsZAqW8JI++3oC AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lYRAAH0GawFBej0oQXo9IhtYlQ90egQgGIys eYAQ77ScGgAAAQEICgBCFOUNQ909lvCSPmmPAgBKAAAASgAAAAACs50B5AAH6QoWXAgARQAA PAq3QAA+BjTHQXo9IkF6PSiRbgAWHkDdwQAAAACgAhbQxd4AAAIEBbQEAggKCR3XdgAAAAAB AwMAlvCSPqePAgBKAAAASgAAAAAH6QoWXAACs50B5AgARQAAPAAAQABABj1+QXo9KEF6PSIA FpFuHfJeEB5A3cKgEhagPvEAAAIEBbQEAggKQDbK0wkd13YBAwMAlvCSPhqRAgBCAAAAQgAA AAACs50B5AAH6QoWXAgARQAANAq4QAA+BjTOQXo9IkF6PSiRbgAWHkDdwh3yXhGAEBbQbYYA AAEBCAoJHdd2QDbK05bwkj6YkwIAWQAAAFkAAAAAB+kKFlwAArOdAeQIAEUAAEuUwkAAQAao rEF6PShBej0iABaRbh3yXhEeQN3CgBgWoADGAAABAQgKQDbK0wkd13ZTU0gtMS45OS1PcGVu U1NIXzMuNHAxCpbwkj5zlQIAQgAAAEIAAAAAArOdAeQAB+kKFlwIAEUAADQKuUAAPgY0zUF6 PSJBej0okW4AFh5A3cId8l4ogBAW0G1uAAABAQgKCR3Xd0A2ytOW8JI+zJUCAFgAAABYAAAA AAKznQHkAAfpChZcCABFAABKCrpAAD4GNLZBej0iQXo9KJFuABYeQN3CHfJeKIAYFtCFOgAA AQEICgkd13dANsrTU1NILTIuMC1PcGVuU1NIXzMuNXAxCpbwkj7flQIAQgAAAEIAAAAAB+kK FlwAArOdAeQIAEUAADSUw0AAQAaowkF6PShBej0iABaRbh3yXigeQN3YgBAWoG2IAAABAQgK QDbK0wkd13eW8JI+npgCAGICAABiAgAAAAKznQHkAAfpChZcCABFAAJUCrtAAD4GMqtBej0i QXo9KJFuABYeQN3YHfJeKIAYFtAa5QAAAQEICgkd13dANsrTAAACHAkU+bmtDo3EGlunIFRs 60LafQAAAD1kaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExLGRpZmZpZS1oZWxs bWFuLWdyb3VwMS1zaGExAAAAD3NzaC1yc2Esc3NoLWRzcwAAAGZhZXMxMjgtY2JjLDNkZXMt Y2JjLGJsb3dmaXNoLWNiYyxjYXN0MTI4LWNiYyxhcmNmb3VyLGFlczE5Mi1jYmMsYWVzMjU2 LWNiYyxyaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UAAABmYWVzMTI4LWNiYywzZGVzLWNi YyxibG93ZmlzaC1jYmMsY2FzdDEyOC1jYmMsYXJjZm91cixhZXMxOTItY2JjLGFlczI1Ni1j YmMscmlqbmRhZWwtY2JjQGx5c2F0b3IubGl1LnNlAAAAVWhtYWMtbWQ1LGhtYWMtc2hhMSxo bWFjLXJpcGVtZDE2MCxobWFjLXJpcGVtZDE2MEBvcGVuc3NoLmNvbSxobWFjLXNoYTEtOTYs aG1hYy1tZDUtOTYAAABVaG1hYy1tZDUsaG1hYy1zaGExLGhtYWMtcmlwZW1kMTYwLGhtYWMt cmlwZW1kMTYwQG9wZW5zc2guY29tLGhtYWMtc2hhMS05NixobWFjLW1kNS05NgAAAAlub25l LHpsaWIAAAAJbm9uZSx6bGliAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJbwkj7LmAIAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSUxEAAQAaowUF6PShBej0iABaRbh3yXigeQN/4gBAZgGiI AAABAQgKQDbK0wkd13eW8JI+WpoCAGICAABiAgAAAAfpChZcAAKznQHkCABFAAJUlMVAAEAG pqBBej0oQXo9IgAWkW4d8l4oHkDf+IAYGYB10QAAAQEICkA2ytMJHdd3AAACHAkUCvDcjzSF Cww+tc+KRVw1zAAAAD1kaWZmaWUtaGVsbG1hbi1ncm91cC1leGNoYW5nZS1zaGExLGRpZmZp ZS1oZWxsbWFuLWdyb3VwMS1zaGExAAAAD3NzaC1yc2Esc3NoLWRzcwAAAGZhZXMxMjgtY2Jj LDNkZXMtY2JjLGJsb3dmaXNoLWNiYyxjYXN0MTI4LWNiYyxhcmNmb3VyLGFlczE5Mi1jYmMs YWVzMjU2LWNiYyxyaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UAAABmYWVzMTI4LWNiYywz ZGVzLWNiYyxibG93ZmlzaC1jYmMsY2FzdDEyOC1jYmMsYXJjZm91cixhZXMxOTItY2JjLGFl czI1Ni1jYmMscmlqbmRhZWwtY2JjQGx5c2F0b3IubGl1LnNlAAAAVWhtYWMtbWQ1LGhtYWMt c2hhMSxobWFjLXJpcGVtZDE2MCxobWFjLXJpcGVtZDE2MEBvcGVuc3NoLmNvbSxobWFjLXNo YTEtOTYsaG1hYy1tZDUtOTYAAABVaG1hYy1tZDUsaG1hYy1zaGExLGhtYWMtcmlwZW1kMTYw LGhtYWMtcmlwZW1kMTYwQG9wZW5zc2guY29tLGhtYWMtc2hhMS05NixobWFjLW1kNS05NgAA AAlub25lLHpsaWIAAAAJbm9uZSx6bGliAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJbwkj7enwIA WgAAAFoAAAAAArOdAeQAB+kKFlwIAEUAAEwKvEAAPgY0skF6PSJBej0okW4AFh5A3/gd8mBI gBgZgDQSAAABAQgKCR3Xd0A2ytMAAAAUBiIAAAQAAAAIAAAAIAAAAAAAAACW8JI+C68CAOoB AADqAQAAAAfpChZcAAKznQHkCABFAAHclMZAAEAGpxdBej0oQXo9IgAWkW4d8mBIHkDgEIAY GYDXLgAAAQEICkA2ytQJHdd3AAABpAofAAABj2abo+1mHyJqCQvlZEortCCTcbePw+aEiglY IZk/WQhMpe4SBS+XfQHwZm8D9lc7GZ3+yauUWIwsYN47Pnz1CUWHkZ/MP7QKYcJh6JGg+R2f /I8wyhLPgJ3YKQ3XhvqLBB/6xXk8OPOHV+pnkEcqwmkhhbVUsARujAZcmDwKzI0vhatL7ffO IzAJIYyWkf5EJhWA1BSfHURxsLXfeeIkJSR068O3tUkJULtDi/SY55+HlEmLOjtfu0KCnDu+ pAZ/KMI75AN3uYa9VEPMzwJAW4zMqgnoF58BaNSWmZQXGmrZj4EBW8hOEKROHv0uCGLF0ar+ mQFHFaNoANvZpsUcAibMgqZR2uT3PVTE0QPBPRwVz4zKZ9XLOfA8ZvO3Rn+P/cxQdM0MGyU4 +/lWlxvzkxTO3SDhsQ3hbYbhC+f6WxpwautMNW9JgHoiByzQBVmvCoY3iJVmUZGeJqMV6tHS bnyY/Ez6NaDwTdQAopkaH/5bJx/t5UN1iWop+Wi+HVEbpGapKsPjdycJ/IFbFkm/7wAAAAEF AAAAAAAAAAAAAJbwkj5Y+wIA4gEAAOIBAAAAArOdAeQAB+kKFlwIAEUAAdQKvUAAPgYzKUF6 PSJBej0okW4AFh5A4BAd8mHwgBgdwFhMAAABAQgKCR3XeUA2ytQAAAGcByAAAAGPMV3XCuoS zmJ6WGWK/wR4osD4DgoFyquJHOuRb2oNN+1lFVm1LWLYNL2WU4lGJ6JZeBfYxQTLZ86ZvTn0 bjQX6R63xqGMCXx1OZJD71EsSqzGKtOuQyZC5XilDQheZp34eU816tLh8kEaHrK9LvtnADGF DWOyDkwz2K9tg+HWJEs1UNGuNd90UQNvivyo1C+fgYGbUFQRF+Qb/svf4JNr3LjxtMzFb90u cmZ+qZP6z+t2IwyhsRC5yLgjcehzzPu6sLg/7zoXeOPVAiR4AzetTM8Qcg2B32fKx4zyrVBq vqX8DFhF2bsU0YALwpWrqNLXtkPdHiWbXBuYZ+2UwfAnG50qmo8COH3XgSGkyfGldBTQcbfP QH8pMgCNStcSXvJxSCGIXc2/rOkYrTRJKAyyd+bFKGUhl8Dp7YCps64KQJkP8q4sI5sw2BAF GbxM699AIKjiEntau0ALKq6hEtq3IebWkrA7aGQHMqUvBtJMrXTSQdfQVnbgulVbEOwPzx1V N9jTiagQZV5AbQf2As5AAAAAAAAAAJbwkj6xYwMAIgMAACIDAAAAB+kKFlwAArOdAeQIAEUA AxSUx0AAQAal3kF6PShBej0iABaRbh3yYfAeQOGwgBgdwN7fAAABAQgKQDbK2Akd13kAAALM CyEAAACVAAAAB3NzaC1yc2EAAAABIwAAAIEA5gBe2iAHHrkFDlaem88U7N6VQDzE5mqKCna8 b8NiW+aJjUxxNUijNwzmKhZXcoGwcXssdFECZP9pWtlFblG9zn4wnL1CNIP43ugQ2OqBaF1f AR23GpY1M/ZySafAEWfEljpjfRp893MVwHJE4vR/U4kdgyVUwzmO0XMshUYUce0AAAGPAIU1 Wp7OEVUnXh5qQxD8/IQ7qDZgr2uEJnWHS3+zkxIiteisNp2pUZ83ArXxkU3xP5O1LW/b+4Ro 5xdXLcMRPDcejPha8TN8hrlVMEC+5K1OkaqAqMVB2vEoPI4dWMwkhg8uVu8sMm6kakNRfP64 4mSb4dKdIXx+zH5httpv3SzWYRQqQ3gSD6Z5UFw/N+thElsKI4VJaxuTsD95tyvKbDDZ9pYZ DK2eFiRW917M8ybdHHLlSly6+V92kyKv/xUYh9+3s2D7FP+pDBqED5wUwAL4mZoG+J9kwzUi F5SaT/9Rb8hkgVsvOuwnTfCcysJRaJBp/3vDp0j+IW7GmNNGEa9hjPCpmv9U+UTL7zc78tpf 9AHkGWBiaZEktbd31gqntBJcAMaarqh9otf7rvFoLXSCGbfoaSd35MWWLB1cofmvyTtgiKU0 G0CrNZxSJru9tFIeA3OFbPH+aIgbpEsW1hYVbU1noHu8RkYhNQHviWKt6lxXE8+Hc1HtXhcI dQbGIjFMYL9JwWpDhNCw3dkCAAAAjwAAAAdzc2gtcnNhAAAAgCRyKmSe1RqUeNij1CNP/Qr2 3LSnB85fu4WP/zgSJpe2ek7/iMr+qaVnaa27Jo8K3y2LoXFbf3fug7iZ4ttqCZZoyVRu02Lz QtzGOojKPH+Xur+8F0subbzFsCnmdR9CIA8WebV9CfyYg03sU8W+YJUiINLZBc68JzIgjxh8 /u0EAAAAAAAAAAAAAAAAAAAMChUAAAAAAAAAAAAAlvCSPuzFAwBSAAAAUgAAAAACs50B5AAH 6QoWXAgARQAARAq+QAA+BjS4QXo9IkF6PSiRbgAWHkDhsB3yZNCAGCKATOMAAAEBCAoJHdd+ QDbK2AAAAAwKFQAAAAAAAAAAAACW8JI+JVUEAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lMhAAEAGqL1Bej0oQXo9IgAWkW4d8mTQHkDhwIAQHcBbxQAAAQEICkA2yt8JHdd+lvCSPvBW BAByAAAAcgAAAAACs50B5AAH6QoWXAgARQAAZAq/QAA+BjSXQXo9IkF6PSiRbgAWHkDhwB3y ZNCAGCKABmwAAAEBCAoJHdeCQDbK38nM+ySlhNZiDL1PC3bqws4F7zZspl9utfjXWMhbd3Xm i+eIW81KST4+xjAZ+61wOpbwkj7/VgQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSUyUAA QAaovEF6PShBej0iABaRbh3yZNAeQOHwgBAdwFuRAAABAQgKQDbK3wkd14KW8JI+PFcEAHIA AAByAAAAAAfpChZcAAKznQHkCABFAABklMpAAEAGqItBej0oQXo9IgAWkW4d8mTQHkDh8IAY HcBuYwAAAQEICkA2yt8JHdeCBY1u6u2cjVfLdktcdMIAZv/8+EjBm16DYVx0tjBV6DfzHTBk l3Jsfx8+trM41jRNlvCSPphZBACCAAAAggAAAAACs50B5AAH6QoWXAgARQAAdArAQAA+BjSG QXo9IkF6PSiRbgAWHkDh8B3yZQCAGCKABsoAAAEBCAoJHdeCQDbK38ccdE9WR4fyJL12Zvi3 wnpnbNfhLYO1c24GejQWzOMXaPafSxQIea08unXePr+Z52ainR7L/U3uEUzSnkDtd3KW8JI+ blsEAIIAAACCAAAAAAfpChZcAAKznQHkCABFAAB0lMtAAEAGqHpBej0oQXo9IgAWkW4d8mUA HkDiMIAYHcB7EQAAAQEICkA2yt8JHdeCArsOe/b9iadjyPu8U9/pAdvrO6ZcpU40myV21TzH 8XeIT/yCqWe5idmvaCCk240n4SqtwQIgUUr7iuRRiNMIQZbwkj5yYQQAUgIAAFICAAAAArOd AeQAB+kKFlwIAEUAAkQKwUAAPgYytUF6PSJBej0okW4AFh5A4jAd8mVAgBgigFXtAAABAQgK CR3XgkA2yt/LeMCqOJc6NYwpS1kemZnawtSssgbcXNJ1aYowY7fNibrpcaR8bpsJtx48i97+ t5pZauY5gqBlzo7D8G6sorynbjjuLDEyKU/pNdgq9BnES/M8BuIzWoQO2YXsB7igrcNAQdMw eV2yAyd9PNeVyUJhylztFxZx/D2hRn7TcW0r5+jTcGNJ9CsnzKXWWI9UhoUzRcTRCHJDTeFs 7fUvVBbaSXy2V8DE/b41WMyKIb5XHLbnv1BCT7EnHiLj/4TJDmtd09bPOazdzu2ofYUMdNkX zNMcLcDZD98bc0+mY7lQVtMF7e0TL0rPhFJebM62F27mN+D7wG8qQkDM1JoyyRiQnudOE30p CIeAIp904CnvkV0i8NJZeMn6p88D/Bz39jdXYszZGvxiHsHQKAL7O8Im+08aoYfdxUaBLFVg R+tbshOIKER1+S49579BwGMWN2NidGBxuevJ5/hmjrAKpNYlvgHNXKIzuKJbUsZAKP32mocM 2Y+LTX20hVQTJx/GzKaDlU+7Gkqcgw3+d6HaXZtOQvLr66mr1irGrZ1zfRO+SQnuHFWBQwI4 5JxmGhZyzT4xlT/klo6hYvcabMD3G/TJmDj8y9fqPHgP4z9Bzj7f9OpW4sMJt/PDLaLl4FbJ avPvlH7BJj6edL4/M3uk5Yd+NakZBvb/XKblyCAlF3Id3GQlO6uSz7YOqL6OoJgR/0yW8JI+ 4GQEACICAAAiAgAAAAfpChZcAAKznQHkCABFAAIUlMxAAEAGptlBej0oQXo9IgAWkW4d8mVA HkDkQIAYIgA9wAAAAQEICkA2yt8JHdeCz/cLGq536zu4+0nVS77WF9U2FygdX03xqMl9QwPp nGBSYThvhWffmdkKoEe123FNHO5goFdmhrEKihanxqZOX7MMVXrum39P9HZLIlVnhg5EzEGK jtW+xfCKyV1DbJ0UmzvmzEhrvlXsXR0B3N9DdZdUR9fj5VFh4JM0nBu2kqvjhIOcWFr7K/LF ELhAkjHkizTwtUyCgOtwKfCT0cDSUWia0mJLpp/zKF+BSD0h3V9SfjgOpLMSVn1B4Y1klz2b atxcnDgLBTF4vqKEMScngeGTm9zyPaAg4WSfBrhxPy68yueURwVwRpW7iGGDnhIHaUtami7b 53FKc93zLXpIjUC16C9XNOTsgk5ph22cuDL2FvBtjpqpfPvw5vERyd7yyfAgnSVc5Xaa740l Pa6kKdbXWb9ioQ+oxZyagfHrFPyWL6psMq/+6d5s805L0T35ChK9ZeL5S5Q3pC9jUu38B37E ynRFQMxA4P0I2m9XgucwHdns/n0kFtl9z34tutrUT+kb3E3yBIbo8pguXbBqACEzFy4Wnzmx LH2ZFnHibXTxyeRXNqoy34Dt9kbjzI5QC4mpeuXJViQD1iXlFMkdm06poStS5OykXSrzLhrk 8mF39eM4yOO2+Xtfd/C+sbaplvCSPvJwBACCAgAAggIAAAACs50B5AAH6QoWXAgARQACdArC QAA+BjKEQXo9IkF6PSiRbgAWHkDkQB3yZyCAGChAXZ8AAAEBCAoJHdeDQDbK30fyDX9Zral6 NHKqTURCzQl4iNxk2kBS5381DDtPkon0XeQMJ4m0vMZqd4NOF34KEVyH0EnvhQ+B9sNRaogn Yxm+p56/aS1bCO+oLrvkjYD+yyoNphpkUX4j4gkCkdJucsiIC+DRvfXZoF+DM+BsBbAPkAFZ Cz7fn7WMYfYoZA46p2z9Xj1hFdbjlk/kEUOq9uSCV7GkOnHCoUhJ2EHSpGZTcZCPXgF8Cz5v NU55CCNo8NmQ1LqSI8dVn+jcd9llc3aGcjqE8bDcyBrDQCefpwxkKhQvS48yNBCu3pkij0Xo nmptg/V59Vg+9Ynh482JcfNs5gASc6tPHpOpmoAlsaF/FX/V7NwgYuUYLD6ty7/fXvNFWgbL ywQzBrYaB+jhJnUfCqCI/zZQOUmocJBJg7Y9ihm4DlkIk6of0ntWs/TS0nOb/eeK+oRSWEJl TOUU8ymWgF6tgdFX9jnvGJpIxDhldlZXLiS6nVKJXvIiU+qOUbTausoGTU879fIdwM4X/Oma Dp7SV+68VZ8QI3c/OgC8i8L9idZsExJEzkC/m+3ayeZfaY88ww0ycis42ZQHh8/tcDWk/42T gy4ryRpL4NnFa69qJ4Ze4hpDe+AgRAdzSZlt2t8CMuB5jXKIm3xPByTAHwf7xaLNPcAQteI0 dRV7/V9KdVrpZGBnlDagGgYq6li3P9ZWozNYrWAhzF9IL8z4nQFHpkZzAc56aDstr/grPPc6 dwO0Dt9ns+2u4rjT/5W4gIlrvj0rfl3XxrzbuJbwkj5qfgQAYgAAAGIAAAAAB+kKFlwAArOd AeQIAEUAAFSUzUAAQAaomEF6PShBej0iABaRbh3yZyAeQOaAgBgmQBaiAAABAQgKQDbK4Akd 14PEcRYEDZ5DIk6f1OG3ukce9HB4oX0ETwY7QpEOKJK51Jbwkj4tgQQAggAAAIIAAAAAArOd AeQAB+kKFlwIAEUAAHQKw0AAPgY0g0F6PSJBej0okW4AFh5A5oAd8mdAgBgoQDOvAAABAQgK CR3Xg0A2yuAB546J50bgTD2ZMtRfYMQ+a2DZVKK/vjYnBkorMloC7dE24qwqssQ7euxl4sqf wubcGaxlAIgRwP/BqqtwOhdMlvCSPqyFBAByAAAAcgAAAAAH6QoWXAACs50B5AgARQAAZJTO QABABqiHQXo9KEF6PSIAFpFuHfJnQB5A5sCAGCZAdkcAAAEBCApANsrgCR3XgwubEVCAteO3 CmdlgpdpcymAjRQLK4kATTkbwou1KuoAGAq5ZoRz9mg7oUYXJ9mIWpbwkj6omgQAAgIAAAIC AAAAArOdAeQAB+kKFlwIAEUAAfQKxEAAPgYzAkF6PSJBej0okW4AFh5A5sAd8mdwgBgoQAxj AAABAQgKCR3XhEA2yuASB9x3PrZXwZ5ITzGSgj8U+iriNHdaiRk8Xd3TkfPyEcTRp5VvfJaD RAfcQ1cMsBtEBcOwP0OwTmfUf9jz/qRi03jvI3pnwLSxkgxUM5nxIxNXbg/mR5Uewmzc0u3x 4wbe4Q7bMrYRBY0c3i8AMN1K8RcDs6qMreix6Kmr0S+TAVEteNLC/oak6khxK/erb/pOkVUh pCOzuFCn6L1A5YTVK+Ni+UtZ2kwlnI22n/GQoBSKiVwN8EgBQQxTDqu36cZDyuJp9zXISdmT 0sXOpOxuXKxc/MHoe0lTUZdUWlW9tO44AyJ30ICsdk/RVPTTLEJI/6ZIQjgab4H0kaGBfvy/ 9WfxRRd469N7rSn9LGYpytupGH439PWnOvh0ef3FISza3p3a90ylXGEceuF3FQsEFBU51ofY /T3DdZZZwGPVAeXtGS8bWCnUu2sB0m4mYJhP3DgF0kULn3ebaALI69/AOXZsMMj5FLZq0KTa CgZm5SIKoQESOsCnDi8giUmQQxwWWfshqSv9GD8qQebD3MUUfj4jzXwrafmGTevSbnBTqV2F 2YtDXlfxAMCmkxvdgFbTGPqF4K29/nTWz3lk5M9nlvCSPqmaBACyAAAAsgAAAAACs50B5AAH 6QoWXAgARRAApArFQAA+BjRBQXo9IkF6PSiRbgAWHkDogB3yZ3CAGChAW8wAAAEBCAoJHdeE QDbK4IjX3w6nMJKFYZFMEKmoXU1AEahfOt2RDc1vYXUl1vwcUciHq/lOyCGt3C1i3CQdTSXo VGfMT/tTfaXjHdfP2qjAdvLV/6hO/oJ1g9cCjorONkU/hUlY1R+QJrDCCjn4RnGdMUi69f3V bCRBy6dVrSyW8JI+yaQEAFUAAABVAAAAAAfrnsVuAAKznQHkCABFAABHyuFAAEARJnlBej0o wKgKAYALADUAM/g0F7MBAAABAAAAAAAAAjM0AjYxAzEyMgI2NQdpbi1hZGRyBGFycGEAAAwA AZbwkj7ztgQAcgAAAHIAAAAAB+kKFlwAArOdAeQIAEUQAGSUz0AAQAaodkF6PShBej0iABaR bh3yZ3AeQOjwgBgqwAJ0AAABAQgKQDbK4Qkd14T2Hoh5J0fFfwzO+KZuWdCCSd/7tgQnuTv8 5BepY8DZ7BZpeSTNvJJB67IX+w1xPLGW8JI+i8gEALIAAACyAAAAAAfpChZcAAKznQHkCABF EACklNBAAEAGqDVBej0oQXo9IgAWkW4d8megHkDo8IAYKsAI3wAAAQEICkA2yuEJHdeEd3i4 VmuRMVtklkXwYFFa8K7Vh0wrRU8goZJCDyqvKKpKwAo4TXuVqnOWld5forKQR/n3m64+3tZD A2+n6570W1YurBSVa7zfJVdIlkK3/C+UytBSXt9B9vdmpM5iYvBP+nwWCslhpoGb34NH4H/3 +Jbwkj4KUQUAQgAAAEIAAAAAArOdAeQAB+kKFlwIAEUQADQKxkAAPgY0sEF6PSJBej0okW4A Fh5A6PAd8mgQgBAoQEbIAAABAQgKCR3XiUA2yuGW8JI+0V0FAIIAAACCAAAAAAfpChZcAAKz nQHkCABFEAB0lNFAAEAGqGRBej0oQXo9IgAWkW4d8mgQHkDo8IAYKsBC0wAAAQEICkA2yuUJ HdeJUzSwArRr4j2pOmG8zmecUJTqcjFRUacrTIS4TnYE20VLABWSEjAXdKLGxV+R9e7FIeFz GUl17puAO5Dy/iJMbZbwkj7uXwUAQgAAAEIAAAAAArOdAeQAB+kKFlwIAEUQADQKx0AAPgY0 r0F6PSJBej0okW4AFh5A6PAd8mhQgBAoQEaEAAABAQgKCR3XiUA2yuWW8JI+oHQFAHIAAABy AAAAAAfpChZcAAKznQHkCABFEABklNJAAEAGqHNBej0oQXo9IgAWkW4d8mhQHkDo8IAYKsDe XgAAAQEICkA2yuYJHdeJXeWFy1rVJ2YzYkwfC6ugWvOkR5K/Y4TZHDnqRbZ5jMCUzdxireTg l9YLTO2vIDkElvCSPuN0BQByAAAAcgAAAAAH6QoWXAACs50B5AgARRAAZJTTQABABqhyQXo9 KEF6PSIAFpFuHfJogB5A6PCAGCrAOm4AAAEBCApANsrmCR3Xia344Z3jB/jI9jRRWM6lZKsc vjSLA10I/3uW5qnAWtILbDoYjdl9E6RxuTtEFxiam5bwkj7pdgUAQgAAAEIAAAAAArOdAeQA B+kKFlwIAEUQADQKyEAAPgY0rkF6PSJBej0okW4AFh5A6PAd8miwgBAoQEYjAAABAQgKCR3X iUA2yuaW8JI+N0oGAEYAAABGAAAAAAKznQHkAAfrnsVuCABFwAA4QGQAAPYBhGA/kEEOQXo9 KAMDhFQAAAAARQAAR8rhQAA0ETJ5QXo9KMCoCgGACwA1ADP4NJbwkj6xSgYAVQAAAFUAAAAA B+uexW4AArOdAeQIAEUAAEfK60AAQBEmb0F6PSjAqAoBgAsANQAz+DQXswEAAAEAAAAAAAAC MzQCNjEDMTIyAjY1B2luLWFkZHIEYXJwYQAADAABlvCSPmZ2CwByAAAAcgAAAAACs50B5AAH 6QoWXAgARRAAZArJQAA+BjR9QXo9IkF6PSiRbgAWHkDo8B3yaLCAGChAzmQAAAEBCAoJHdex QDbK5ptxpfJp5HNDRr8uVGhOHalaYkxoni38y74/DYEQ01Pqcs9MoZ0GsU9hjcB6Qq95Bpbw kj77dgsAcgAAAHIAAAAAB+kKFlwAArOdAeQIAEUQAGSU1EAAQAaocUF6PShBej0iABaRbh3y aLAeQOkggBgqwL8mAAABAQgKQDbLDQkd17G5vFSTMKxR9wqDqyDL+TC7Oyx4wRHUG3LeyvnJ S6Zw+Zb1ybk/hp3vtPB895LcxyaW8JI+9XgLAEIAAABCAAAAAAKznQHkAAfpChZcCABFEAA0 CspAAD4GNKxBej0iQXo9KJFuABYeQOkgHfJo4IAQKEBFdAAAAQEICgkd17FANssNl/CSPnM4 AAByAAAAcgAAAAACs50B5AAH6QoWXAgARRAAZArLQAA+BjR7QXo9IkF6PSiRbgAWHkDpIB3y aOCAGChAaJUAAAEBCAoJHdfLQDbLDZI3gbQ5fCRv7lNZHU/81DsaodBfHlyllIOBJcNt/2QN 2EK3RQfadvA63cKrDoC6bJfwkj7fOAAAcgAAAHIAAAAAB+kKFlwAArOdAeQIAEUQAGSU1UAA QAaocEF6PShBej0iABaRbh3yaOAeQOlQgBgqwK09AAABAQgKQDbLKAkd18sOXk3RJ8hkyi/U 4RzGLJPK71qe+r/StIj8wvbj1qg+eZQ3pJyYXXuONVNXKmnG8vCX8JI+zzoAAEIAAABCAAAA AAKznQHkAAfpChZcCABFEAA0CsxAAD4GNKpBej0iQXo9KJFuABYeQOlQHfJpEIAQKEBE3wAA AQEICgkd18tANssol/CSPnFfAQByAAAAcgAAAAACs50B5AAH6QoWXAgARRAAZArNQAA+BjR5 QXo9IkF6PSiRbgAWHkDpUB3yaRCAGChAMj0AAAEBCAoJHdfTQDbLKNwv5I64poMpNOFchM+Q Plfr5KMFvkTt6qHZxm6ZJLoQyqt9zdjWxeyqUO9A254jgJfwkj7JXwEAcgAAAHIAAAAAB+kK FlwAArOdAeQIAEUQAGSU1kAAQAaob0F6PShBej0iABaRbh3yaRAeQOmAgBgqwOL3AAABAQgK QDbLLwkd19O5lT11tNs+6P9bmz4ICjIFEgy4tuFqgdtOaMjzwsUkcY2Ifgl9XzzmqWWCudjs p/eX8JI+iWEBAEIAAABCAAAAAAKznQHkAAfpChZcCABFEAA0Cs5AAD4GNKhBej0iQXo9KJFu ABYeQOmAHfJpQIAQKEBEcAAAAQEICgkd19NANssvl/CSPmOnAwByAAAAcgAAAAACs50B5AAH 6QoWXAgARRAAZArPQAA+BjR3QXo9IkF6PSiRbgAWHkDpgB3yaUCAGChAJ8EAAAEBCAoJHdfi QDbLL28kSbyfkVKbrWXc/J8kw68BtDYVCsW14Hyju6Hm8mZPEhnFrb3Rnzw5sKMAsMRD4pfw kj63pwMAcgAAAHIAAAAAB+kKFlwAArOdAeQIAEUQAGSU10AAQAaobkF6PShBej0iABaRbh3y aUAeQOmwgBgqwJQ2AAABAQgKQDbLPgkd1+LVpgSjgNgYUNy0btAj5rBsdwiBmHvWRcIcVzZJ G4GufGaSQWmh4hFPmhhDlTpEz/GX8JI+qakDAEIAAABCAAAAAAKznQHkAAfpChZcCABFEAA0 CtBAAD4GNKZBej0iQXo9KJFuABYeQOmwHfJpcIAQKEBD8gAAAQEICgkd1+JANss+l/CSPrfQ BQByAAAAcgAAAAACs50B5AAH6QoWXAgARRAAZArRQAA+BjR1QXo9IkF6PSiRbgAWHkDpsB3y aXCAGChA68oAAAEBCAoJHdfwQDbLPltxGlfSKlaCGuIdVCUUWDmSkiGuQzp++3ZL9UIxMZZe Pj+FzBc3cBNTj/dv4bziQJfwkj4Q0QUAcgAAAHIAAAAAB+kKFlwAArOdAeQIAEUQAGSU2EAA QAaobUF6PShBej0iABaRbh3yaXAeQOnggBgqwJ2XAAABAQgKQDbLTAkd1/AxL4KHT3FabJ6G 92Gfx2sx7haY1cln0CnoV6U5GQk3cjja/8DWR54D+Z0+sDGbj4WX8JI+CNMFAEIAAABCAAAA AAKznQHkAAfpChZcCABFEAA0CtJAAD4GNKRBej0iQXo9KJFuABYeQOngHfJpoIAQKEBDdgAA AQEICgkd1/BANstMl/CSPoajBwByAAAAcgAAAAACs50B5AAH6QoWXAgARRAAZArTQAA+BjRz QXo9IkF6PSiRbgAWHkDp4B3yaaCAGChAYo0AAAEBCAoJHdf8QDbLTPf2L0buL6q74t5/Zx+8 IcOLWxMhaUnV/A7pZUZMt8i06L6u6oTRhMT4hiO7i3zMWZfwkj7aowcAcgAAAHIAAAAAB+kK FlwAArOdAeQIAEUQAGSU2UAAQAaobEF6PShBej0iABaRbh3yaaAeQOoQgBgqwEkwAAABAQgK QDbLWAkd1/yr2OAvJCBO7T0cSI7h+pO7MKx2XlaNEKle0d1OlN/ZCVKSQwx7YdMW/fNPkXms mTuX8JI+jKUHAEIAAABCAAAAAAKznQHkAAfpChZcCABFEAA0CtRAAD4GNKJBej0iQXo9KJFu ABYeQOoQHfJp0IAQKEBC/gAAAQEICgkd1/xANstYl/CSPpXvCQByAAAAcgAAAAACs50B5AAH 6QoWXAgARRAAZArVQAA+BjRxQXo9IkF6PSiRbgAWHkDqEB3yadCAGChAuxoAAAEBCAoJHdgL QDbLWPGxiHdwSr467zA/blxWU//eH/ai7S+bvZplVeJdsaQs00dbpabBfPcD1LNKJtF/jJfw kj7n7wkAcgAAAHIAAAAAB+kKFlwAArOdAeQIAEUQAGSU2kAAQAaoa0F6PShBej0iABaRbh3y adAeQOpAgBgqwGofAAABAQgKQDbLZwkd2Asq9Plajmp3bR8me7DrW7lqOOuTpEcChQkdG/Z7 yMx4z3NTev/Mo7nWAGajL1NgEoKX8JI+lfEJAEIAAABCAAAAAAKznQHkAAfpChZcCABFEAA0 CtZAAD4GNKBBej0iQXo9KJFuABYeQOpAHfJqAIAQKEBCgAAAAQEICgkd2AtANstnl/CSPrAC DAByAAAAcgAAAAACs50B5AAH6QoWXAgARRAAZArXQAA+BjRvQXo9IkF6PSiRbgAWHkDqQB3y agCAGChAVgYAAAEBCAoJHdgYQDbLZ6MRaC862eYumVsNPJb4JTU95N7xorHqsnXmcKRqZB3Q /EGrrmNKH0I/CwKcfpZZcZfwkj4EAwwAcgAAAHIAAAAAB+kKFlwAArOdAeQIAEUQAGSU20AA QAaoakF6PShBej0iABaRbh3yagAeQOpwgBgqwHJXAAABAQgKQDbLdQkd2BiGScXqXiaQgQqR MO777h8ZPfGikpZYen7PBQuwJnooMMskfmnpfWhXpNnNgCJD8QWX8JI++wQMAEIAAABCAAAA AAKznQHkAAfpChZcCABFEAA0CthAAD4GNJ5Bej0iQXo9KJFuABYeQOpwHfJqMIAQKEBCBQAA AQEICgkd2BhANst1l/CSPp5sDgByAAAAcgAAAAACs50B5AAH6QoWXAgARRAAZArZQAA+BjRt QXo9IkF6PSiRbgAWHkDqcB3yajCAGChAsdwAAAEBCAoJHdgoQDbLdVhyqdy/W5Mx0fWTltpv xWiLyD/2L20o/SfAbMYhmKwKw+k35fYKnphVrSdCanQ3dpfwkj6XdA4AcgAAAHIAAAAAB+kK FlwAArOdAeQIAEUQAGSU3EAAQAaoaUF6PShBej0iABaRbh3yajAeQOqggBgqwEvsAAABAQgK QDbLhQkd2CgpA4AZDpMZVCwXbegwUk4w7+QmU5veIuq+Df07+kPh9WG8MuF4550i3U5wQgoN msCX8JI+4XQOALIAAACyAAAAAAfpChZcAAKznQHkCABFEACklN1AAEAGqChBej0oQXo9IgAW kW4d8mpgHkDqoIAYKsCyuAAAAQEICkA2y4UJHdgov97abZzceWPHcpCkuANLnc/gTfq1E417 dfCtMMrZaP03Gf04ydHYuYvm9PZ6DDNUGWjmzAbvSXFHhPGNAwZjHO62e74sfv4yizrh2UMD Feqcifk0zSU/zHWHcHiB8Dn7UjnYKb/3dGJAFwrW+bmQHZfwkj6idg4AQgAAAEIAAAAAArOd AeQAB+kKFlwIAEUQADQK2kAAPgY0nEF6PSJBej0okW4AFh5A6qAd8mpggBAoQEGFAAABAQgK CR3YKEA2y4WX8JI+yHYOAHIAAAByAAAAAAfpChZcAAKznQHkCABFEABklN5AAEAGqGdBej0o QXo9IgAWkW4d8mrQHkDqoIAYKsBhyAAAAQEICkA2y4UJHdgoxwbPc+IVCVnAqsBpNZs1x9j8 hvQHPhvM+XbebyCnJdzgoG5skLO0QBh4EwXr2CF3l/CSPnx4DgBCAAAAQgAAAAACs50B5AAH 6QoWXAgARRAANArbQAA+BjSbQXo9IkF6PSiRbgAWHkDqoB3yawCAEChAQOUAAAEBCAoJHdgo QDbLhZnwkj4BRAIAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI6qEAAPwYDsEF6PSJBej0o lQ8bWBiMrHl0egQggBgW0J16AAABAQgKDUPedABCFOUyMjN8MTQ3MjQ4MXwxMDQ5ODE3MjQz fDEuMHwxfDI0NDB8aGVsbG8gd29ybGQKmfCSPj+xBABCAAAAQgAAAAACs50B5AAH6QoWXAgA RQAANJlTQAA/BqUyQXo9IkF6PSiTKBtYjYrZQS3RJHCAEBbQ/CAAAAEBCAoNQ96EAEIS9pnw kj7M6QQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVhUAAfQZrAEF6PShBej0iG1iTKC3R JHCNitlCgBAAABDjAAABAQgKAEIVAw1D3oSZ8JI+GBoFAEIAAABCAAAAAAfpChZcAAKznQHk CABFAAA0lYZAAH0Gav9Bej0oQXo9IhtYlQ90egQgGIysp4AQ74aaxAAAAQEICgBCFQQNQ950 mfCSPqEbBQBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjqpQAA/BgOvQXo9IkF6PSiVDxtY GIysp3R6BCCAGBbQmxwAAAEBCAoNQ96GAEIVBDIyNHwxNDcyNDgyfDEwNDk4MTcyNDN8MS4w fDF8MzQyMHxoZWxsbyB3b3JsZAqZ8JI+FHEIAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lYdAAH0Gav5Bej0oQXo9IhtYlQ90egQgGIys1YAQ71iasAAAAQEICgBCFQYNQ96GmfCSPnty CABvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTqqQAA/BgOvQXo9IkF6PSiVDxtYGIys1XR6 BCCAGBbQCJQAAAEBCAoNQ96cAEIVBjIyNXwxNDcyNDgzfDEwNDk4MTcyNDR8MS4wfDF8MzI3 fGhlbGxvIHdvcmxkCpnwkj5RxwsAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSViEAAfQZq /UF6PShBej0iG1iVD3R6BCAYjK0CgBDvK5qXAAABAQgKAEIVCQ1D3pya8JI+kF4IAG8AAABv AAAAAAKznQHkAAfpChZcCABFAABhOqtAAD8GA65Bej0iQXo9KJUPG1gYjK0CdHoEIIAYFtAF BwAAAQEICg1D3wAAQhUJMjI2fDE0NzI0ODR8MTA0OTgxNzI0NXwxLjB8MXwyMzB8aGVsbG8g d29ybGQKmvCSPmyKCwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJWJQAB9Bmr8QXo9KEF6 PSIbWJUPdHoEIBiMrS+AEO7+mioAAAEBCAoAQhUSDUPfAJrwkj49jAsAKAEAACgBAAAAArOd AeQAB+kKFlwIAEUAARo6rEAAPwYC9EF6PSJBej0olQ8bWBiMrS90egQggBgW0PXoAAABAQgK DUPfFABCFRIyMjd8MTQ3MjQ4NXwxMDQ5ODE3MjQ1fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQK MjI4fDE0NzI0ODZ8MTA0OTgxNzI0NnwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCjIyOXwxNDcy NDg3fDEwNDk4MTcyNDZ8MS4wfDF8MTUwOHxoZWxsbyB3b3JsZAoyMzB8MTQ3MjQ4OHwxMDQ5 ODE3MjQ2fDEuMHwxfDE1MDh8aGVsbG8gd29ybGQKMjMxfDE0NzI0ODl8MTA0OTgxNzI0Nnwx LjB8MXwxNTA4fGhlbGxvIHdvcmxkCprwkj4a4Q4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSVikAAfQZq+0F6PShBej0iG1iVD3R6BCAYjK4VgBDuGJoTAAABAQgKAEIVFQ1D3xSb8JI+ R6UEACoAAAAqAAAAAAfrnsVuAAKznQHkCAYAAQgABgQAAQACs50B5EF6PSgAAAAAAABBej0h m/CSPmSnBAA8AAAAPAAAAAACs50B5AAH657FbggGAAEIAAYEAAIAB+uexW5Bej0hAAKznQHk QXo9KAAAAAAAAAAAAAAAAAAAAAAAAJvwkj7yNwoAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUA AGI6rUAAPwYDq0F6PSJBej0olQ8bWBiMrhV0egQggBgW0JioAAABAQgKDUPfcABCFRUyMzJ8 MTQ3MjQ5MHwxMDQ5ODE3MjQ3fDEuMHwxfDM1NzN8aGVsbG8gd29ybGQKm/CSPrX4DABCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJWLQAB9Bmr6QXo9KEF6PSIbWJUPdHoEIBiMrkOAEO3q ma8AAAEBCAoAQhUdDUPfcJvwkj4y+gwA+QAAAPkAAAAAArOdAeQAB+kKFlwIAEUAAOs6rkAA PwYDIUF6PSJBej0olQ8bWBiMrkN0egQggBgW0LcSAAABAQgKDUPfggBCFR0yMzN8MTQ3MjQ5 MXwxMDQ5ODE3MjQ3fDEuMHwxfDIzMHxoZWxsbyB3b3JsZAoyMzR8MTQ3MjQ5MnwxMDQ5ODE3 MjQ3fDEuMHwxfDI0NDB8aGVsbG8gd29ybGQKMjM1fDE0NzI0OTN8MTA0OTgxNzI0N3wxLjB8 MXwxMjAzfGhlbGxvIHdvcmxkCjIzNnwxNDcyNDk0fDEwNDk4MTcyNDd8MS4wfDF8MzMwMXxo ZWxsbyB3b3JsZAqc8JI+zwwBAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lYxAAH0GavlB ej0oQXo9IhtYlQ90egQgGIyu+oAQ7TOZmgAAAQEICgBCFSANQ9+CnPCSPppsCwBvAAAAbwAA AAACs50B5AAH6QoWXAgARQAAYTqvQAA/BgOqQXo9IkF6PSiVDxtYGIyu+nR6BCCAGBbQABcA AAEBCAoNQ9/cAEIVIDIzN3wxNDcyNDk1fDEwNDk4MTcyNDh8MS4wfDF8MjMwfGhlbGxvIHdv cmxkCpzwkj7mZg4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVjUAAfQZq+EF6PShBej0i G1iVD3R6BCAYjK8ngBDtBpk4AAABAQgKAEIVKA1D39yd8JI+2GwLAG8AAABvAAAAAAKznQHk AAfpChZcCABFAABhOrBAAD8GA6lBej0iQXo9KJUPG1gYjK8ndHoEIIAYFtD/eQAAAQEICg1D 4EAAQhUoMjM4fDE0NzI0OTZ8MTA0OTgxNzI0OXwxLjB8MXwyMTN8aGVsbG8gd29ybGQKnfCS PuwpDgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJWOQAB9Bmr3QXo9KEF6PSIbWJUPdHoE IBiMr1SAEOzZmMoAAAEBCAoAQhUyDUPgQJ3wkj6YKw4AzAAAAMwAAAAAArOdAeQAB+kKFlwI AEUAAL46sUAAPwYDS0F6PSJBej0olQ8bWBiMr1R0egQggBgW0NHNAAABAQgKDUPgUgBCFTIy Mzl8MTQ3MjQ5N3wxMDQ5ODE3MjQ5fDEuMHwxfDMzMDF8aGVsbG8gd29ybGQKMjQwfDE0NzI0 OTh8MTA0OTgxNzI0OXwxLjB8MXwzNTczfGhlbGxvIHdvcmxkCjI0MXwxNDcyNDk5fDEwNDk4 MTcyNDl8MS4wfDF8MjQ0MHxoZWxsbyB3b3JsZAqe8JI+Aj4CAEIAAABCAAAAAAfpChZcAAKz nQHkCABFAAA0lY9AAH0GavZBej0oQXo9IhtYlQ90egQgGIyv3oAQ7E+YtgAAAQEICgBCFTQN Q+BSnvCSPm97DgBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjqyQAA/BgOmQXo9IkF6PSiV DxtYGIyv3nR6BCCAGBbQmo8AAAEBCAoNQ+C4AEIVNDI0MnwxNDcyNTAwfDEwNDk4MTcyNTB8 MS4wfDF8MjAwMXxoZWxsbyB3b3JsZAqf8JI+DgECAEIAAABCAAAAAAfpChZcAAKznQHkCABF AAA0lZBAAH0GavVBej0oQXo9IhtYlQ90egQgGIywDIAQ7CGYRgAAAQEICgBCFT4NQ+C4n/CS Pr8CAgD6AAAA+gAAAAACs50B5AAH6QoWXAgARQAA7DqzQAA/BgMbQXo9IkF6PSiVDxtYGIyw DHR6BCCAGBbQ+ZUAAAEBCAoNQ+DKAEIVPjI0M3wxNDcyNTAxfDEwNDk4MTcyNTB8MS4wfDF8 MTIwM3xoZWxsbyB3b3JsZAoyNDR8MTQ3MjUwMnwxMDQ5ODE3MjUwfDEuMHwxfDEyMDN8aGVs bG8gd29ybGQKMjQ1fDE0NzI1MDN8MTA0OTgxNzI1MHwxLjB8MXwzNTczfGhlbGxvIHdvcmxk CjI0NnwxNDcyNTA0fDEwNDk4MTcyNTB8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAqf8JI+clcF AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lZFAAH0GavRBej0oQXo9IhtYlQ90egQgGIyw xIAQ62mYMgAAAQEICgBCFUANQ+DKn/CSPtA+CAA8AAAAPAAAAAACs50B5AAH6QoWXAgGAAEI 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 VQAAAQEICg1D4e4AQhVTMjUxfDE0NzI1MDl8MTA0OTgxNzI1M3wxLjB8MXw2NTR8aGVsbG8g d29ybGQKovCSPlL1AgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJWVQAB9BmrwQXo9KEF6 PSIbWJUPdHoEIBiMsaeAEOqGlvEAAAEBCAoAQhVdDUPh7qLwkj769gIAcAAAAHAAAAAAArOd AeQAB+kKFlwIAEUAAGI6uEAAPwYDoEF6PSJBej0olQ8bWBiMsad0egQggBgW0I9SAAABAQgK DUPh/ABCFV0yNTJ8MTQ3MjUxMHwxMDQ5ODE3MjUzfDEuMHwxfDI2MjN8aGVsbG8gd29ybGQK ovCSPq1LBgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJWWQAB9BmrvQXo9KEF6PSIbWJUP dHoEIBiMsdWAEOpYluEAAAEBCAoAQhVfDUPh/KPwkj6vRwIAbwAAAG8AAAAAArOdAeQAB+kK FlwIAEUAAGE6uUAAPwYDoEF6PSJBej0olQ8bWBiMsdV0egQggBgW0AGAAAABAQgKDUPiXABC FV8yNTN8MTQ3MjUxMXwxMDQ5ODE3MjU0fDEuMHwxfDUyNHxoZWxsbyB3b3JsZAqj8JI+cmME AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lZdAAH0Gau5Bej0oQXo9IhtYlQ90egQgGIyy AoAQ6iuWeAAAAQEICgBCFWgNQ+Jco/CSPgBlBADMAAAAzAAAAAACs50B5AAH6QoWXAgARQAA vjq6QAA/BgNCQXo9IkF6PSiVDxtYGIyyAnR6BCCAGBbQz/wAAAEBCAoNQ+JpAEIVaDI1NHwx NDcyNTEyfDEwNDk4MTcyNTR8MS4wfDF8MjYyM3xoZWxsbyB3b3JsZAoyNTV8MTQ3MjUxM3wx MDQ5ODE3MjU0fDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKMjU2fDE0NzI1MTR8MTA0OTgxNzI1 NHwxLjB8MXwzMzAxfGhlbGxvIHdvcmxkCqPwkj4DugcAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSVmEAAfQZq7UF6PShBej0iG1iVD3R6BCAYjLKMgBDpoZZpAAABAQgKAEIVag1D4mmj 8JI+6sQLAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCTvFAAD8G74ZBej0iQXo9KLdtABXd +kHZucgIcFAYYQilBwAAREVMRSAzNjE5OTkxOC5vdXQuMDMwNDA4DQqj8JI+BQIMAHwAAAB8 AAAAAAfpChZcAAKznQHkCABFAABuuEhAAH0GSANBej0oQXo9IgAVt225yAhw3fpB81AY9iah ogAANTUwIDM2MTk5OTE4Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhl IGZpbGUgc3BlY2lmaWVkLiANCqPwkj5CDwwATwAAAE8AAAAAArOdAeQAB+kKFlwIAEUAAEFO 8kAAPwbvhkF6PSJBej0ot20AFd36QfO5yAi2UBhhCCYXAABQT1JUIDY1LDEyMiw2MSwzNCwx ODQsMA0Ko/CSPm1JDABUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrhJQAB9BkgqQXo9KEF6 PSIAFbdtucgItt36QgxQGPYMZXMAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCqPw kj56TAwAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJO80AAPwbvhEF6PSJBej0ot20AFd36 Qgy5yAjUUBhhCJJUAABTVE9SIDM2MTk5OTE4Lm91dC4wMzA0MDgNCqPwkj7ciAwAeAAAAHgA AAAAB+kKFlwAArOdAeQIAEUAAGq4SkAAfQZIBUF6PShBej0iABW3bbnICNTd+kImUBj18itl AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTE4 Lm91dC4wMzA0MDguDQqj8JI+1YkMAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuEtAAH0G SD5Bej0oQXo9IgAUuACxBOQvAAAAAHAC+vA99wAAAgQFZAEBBAKj8JI+Q4sMAD4AAAA+AAAA AAKznQHkAAfpChZcCABFAAAwTvRAAD8G75VBej0iQXo9KLgAABTkHmEfsQTkMHASYQiSQAAA AQEEAgIEBbSj8JI+jMMMADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouExAAH0GSEVBej0o QXo9IgAUuACxBOQw5B5hIFAQ/VwisAAAo/CSPljLDACaBQAAmgUAAAACs50B5AAH6QoWXAgA RQAFjE71QAA/Buo4QXo9IkF6PSi4AAAU5B5hILEE5DBQEGEIxfQAAFhZWlpZLi4uICBUQz0y IFRNPTEwNDk4MTcyNDIgTU49MzYxOTk5MTgub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgi IFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVyRG93Sm9uZXMiIAoKLi4uICAKCgouLi4gCSAKCgpI ZWFkTGluZS4uLiAgT0RKIFVTREEgSW93YS9NaW5uZXNvdGEgRGFpbHkgRGlyZWN0IEhvZ3Mt QU0gLSBBcHIgOAoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAg QXByIDA4LCAyMDAzIChPREogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5l Li4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0eSBOZXdzIChPREop LiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9uZXMKCkxNX0hHMjA1 CkRlcyBNb2luZXMsIElvd2EgICAgICAgICAgICAgICBUdWUsIEFwciAwOCwgMjAwMyAgICAg ICAgICAgICAgICBVU0RBIE1hcmtldApOZXdzCgpJT1dBL01JTk5FU09UQSBEQUlMWSBESVJF Q1QgSE9HUyBQTEFOVCBERUxJVkVSRUQgQkFTRUQgT04gU1RBVEUgT0YgT1JJR0lOCk1vcm5p bmcsIFR1ZXNkYXksIEFwcmlsIDgsIDIwMDMgKEFzIG9mIDk6MzAgQU0pCgpDVVJSRU5UIFZP TFVNRSBCWSBQVVJDSEFTRSBUWVBFCgpMSVZFIEFORCBDQVJDQVNTIEJBU0lTCgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRlZCAgICAgQWN0dWFsICAg ICBBY3R1YWwKQWN0dWFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFRvZGF5ICAgICAgVG9kYXkgICBXZWVrIEFnbyAgIFllYXIKQWdvClByb2R1Y2VyIFNv bGQ6CiAgTmVnb3RpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsODE2ICAg ICAgNCwwODUgICAgICA1LDMxNQogIE90aGVyIE1hcmtldCBGb3JtdWxhICAgICAgICAgICAg ICAgICAgICA0LDY0MyAgICAgICAgMjkwICAgICAgNyw0MTUKICBTd2luZSBvciBQb3JrIE1h cmtldCBGb3JtdWxhICAgICAgICAgICA2OCw4MjggICAgICAyLDUzMyAgICAgIDEsOTU0CiAg T3RoZXIgUHVyY2hhc2UgQXJyYW5nZW1lbnQgICAgICAgICAgICAgMTYsMjI1ICAgICAgMSw4 NjggICAgICAzLDEzMgpQYWNrZXIgU29sZCAoQWxsIFB1cmNoYXNlIFR5cGVzKTogICAgICAg ICAgICAgMCAgICAgICAgICAwICAgICAgICAgIDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQoKTkVHT1RJQVRFRCBQVVJDSEFTRQoKKEluY2x1ZGluZyBQYWNrZXItc29sZCkKCkJhcnJv d3MgJiBHaWx0cyAoQ2FyY2FzcyBCYXNpcyk6IDMsMzc1CgpCYXJyb3dzIGFuZCBHaWx0cyBj b21wYXJlZCB0byBwcmlvcqPwkj7QywwAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxO9kAA PwbqN0F6PSJBej0ouAAAFOQeZoSxBOQwUBhhCLgKAAAgZGF5J3MgY2xvc2UsIC41MCBsb3dl ci4KCkJhc2UgUHJpY2UgUmFuZ2UgJDQyLjAwIC0gJDQ4LjY1LCB3ZWlnaHRlZCBhdmVyYWdl ICQ0Ni4zOQoKQmFzZSBNYXJrZXQgSG9nIDE4NSBsYiBDYXJjYXNzIEJhc2lzLCBQbGFudCBE ZWxpdmVyZWQgKDAuOS0xLjEgaW5jaApiYWNrLWZhdCwgNiBzcXVhcmUgaW5jaCBsb2luLzIu MCBkZXB0aCkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklPV0EvTUlOTkVTT1RBIERB SUxZIERJUkVDVCBORUdPVElBVEVEIEhPRyBQVVJDSEFTRVMgTUFUUklYCgoxODUgbGIgQ2Fy Y2FzcyBCYXNpcwoKKERlZmluZWQgYnkgTXVzY2xlIGFuZCBGYXQpCgpMT0lOIEFSRUEvREVQ VEggKElOQ0hFUykKCkJBQ0stRkFUICAgICAgNC4wLzEuNCAgICAgICA1LjAvMS43ICAgICAg ICA2LjAvMi4wICAgICAgNy4wLzIuMyAgICAgICA4LjAvMi43CjAuNCAgICAgICAgIDQ0LjUw IDUzLjY1ICAgNDYuMDAgNTMuNjUgICA0Ny4yNSA1My42NSAgIDQ3LjI1IDUzLjY1ICAgNDcu MjUgNTMuNjUKMC41ICAgICAgICAgNDIuMDAgNTMuMTUgICA0NC41MCA1My4xNSAgIDQ3LjI1 IDUzLjY1ICAgNDcuMjUgNTMuNjUgICA0Ny4yNSA1My42NQowLjYgICAgICAgICA0Mi4wMCA1 Mi4xNSAgIDQ0LjUwIDUzLjE1ICAgNDYuMDAgNTMuMTUgICA0Ny41MCA1My42NSAgIDQ3Ljcz IDUzLjY1CjAuNyAgICAgICAgIDQyLjAwIDUwLjkwICAgNDIuMDAgNTIuMTUgICA0NC41MCA1 Mi4xNSAgIDQ3LjI5IDUzLjE1ICAgNDcuNzMgNTMuMTUKMC44ICAgICAgICAgNDAuMDAgNTAu OTAgICA0Mi4wMCA1MC45MCAgIDQ0LjUwIDUyLjE1ICAgNDYuMDAgNTIuMTUgICA0Ny43MyA1 My4xNQowLjkgICAgICAgICA0MC4wMCA0OC42NSAgIDQyLjAwIDQ4LjY1ICAgNDIuMDAgNTAu OTAgICA0NC41MCA1MC45MCAgIDQ2LjgwIDUyLjE1CjEuMCAgICAgICAgIDM5LjAwIDQ3LjQw ICAgNDAuMDAgNDguNjUgICA0Mi4wMCA0OC42NSAgIDQ0LjUwIDQ4LjY1ICAgNDYuMDAgNTAu OTAKMS4xICAgICAgICAgMzguMDAgNDUuNjUgICA0MC4wMCA0Ny40MCAgIDQyLjAwIDQ3LjQw ICAgNDIuMDAgNDguNjUgICA0My4yMCA0OC44OAoxLjIgICAgICAgICAzOC4wMCA0NS42NSAg IDM4LjU5IDQ1LjY1ICAgMzguNzAgNDYuMDYgICAzOC43MCA0Ny40MCAgIDM4LjcwIDQ4LjQx CjEuNCAgICAgICAgIDMyLjg1IDQyLjc3ICAgMzIuODUgNDMuNzEgICAzMi44NSA0NS4xMiAg IDMyLjg1IDQ2LjA2ICAgMzIuODUgNDcuMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK Q0FSQ0FTUyCj8JI+RcwMAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTvdAAD8G6jZBej0i QXo9KLgAABTkHmvosQTkMFAYYQj/5wAAV0VJR0hUIERJRkZFUkVOVElBTFMKCjE0NSMgICAt MjYuMTAgICAgLTYuNTAgICAgICAgIDE3NSMgICAgIDAuMDAgICAgIDAuMDAgICAgICAgMjA1 IyAgICAgMC4wMAowLjQ2CjE1NSMgICAtMTAuODAgICAgLTMuNTAgICAgICAgIDE4NSMgICAg IDAuMDAgICAgIDAuMDAgICAgICAgMjE1IyAgICAtMy4wMAowLjQ2CjE2NSMgICAgLTUuODUg ICAgIDAuMDAgICAgICAgIDE5NSMgICAgIDAuMDAgICAgIDAuMDAgICAgICAgMjI1IyAgICAt NS4wMAowLjAwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk1lYXN1cmVtZW50cyBCYXNl ZCBvbiBTbGF1Z2h0ZXIgRGF0YSBTdWJtaXR0ZWQ6Cgo1IERheSBSb2xsaW5nIEF2ZXJhZ2Ug TWFya2V0IEhvZzogMTk4LjY2IGxiIGNhcmNhc3MsIHBsYW50IGRlbGl2ZXJlZAooMC43NSBp bmNoIGJhY2stZmF0LCA2Ljg0IHNxdWFyZSBpbmNoIGxvaW4vMi4yOCBpbmNoIGxvaW4gZGVw dGgpIEZGTEk6CjUxLjIzJQoKUHJpY2UgUmFuZ2UgJDQ2LjAwIC0gJDUyLjE1Ci0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KClNPV1MgKFBsYW50IERlbGl2ZXJlZCkKClNvd3MgUHVyY2hh c2VkIChMaXZlIGFuZCBDYXJjYXNzIEJhc2lzKTogNjY3CgogICAgICAgICAgICAgIFdlaWdo dCBSYW5nZSAgIEhlYWQgQ291bnQgICAgQXZnIFdlaWdodCAgICBQcmljZSBSYW5nZSogICAg V3RkCkF2ZwooTGl2ZSBCYXNpcykgIDMwMC00NDkgbGJzLiAgICAgICAgMjA3ICAgICAgICAz OTkuMjEgICAgICAyMi4wMC0yOS4wMAoyNS45OAogICAgICAgICAgICAgIDQ1MC00OTkgbGJz LiAgICAgICAgMjQ4ICAgICAgICA0NzAuMjkgICAgICAyOC42Mi0yOS44NgoyOS40NQogICAg ICAgICAgICAgIDUwMC91cCAgbGJzLiAgICAgICAgMjEyICAgICAgICA1NjQuMTggICAgICAy OS44NS0zMy4zNQozMS4yNQoKKlByaWNlIG1heSBpbmNsdWRlIHRyYW5zcG9ydGF0aW9uIGNv c3RzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUFVSQ0hBU0UgQUxMIFRZUEVTOiBC WSBTVEFURSBPRiBPUklHSU4KCklvd2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3 LDg2MgpNaW5uZXNvdGEgICAgICAgICAgICAgICAgICAgICAgICAgNSw4MTAKLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQoKU291cmNlOiAgICAgICBVU0RBIE1hcmtldCBOZXdzLCBEZXMg o/CSPqpGDQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLhNQAB9BkhEQXo9KEF6PSIAFLgA sQTkMOQea+hQEP1cF+gAAKPwkj5ISA0AXAEAAFwBAAAAArOdAeQAB+kKFlwIAEUAAU5O+EAA Pwbuc0F6PSJBej0ouAAAFOQecUyxBOQwUBlhCFJ6AABNb2luZXMsIElBCiAgICAgICAgICAg ICAgNTE1LTI4NC00NDYwICAgIGVtYWlsOiAgZGVzbS5sZ21uQHVzZGEuZ292Cgp3d3cuYW1z LnVzZGEuZ292L21ucmVwb3J0cy9sbV9oZzIwNS50eHQgMTEwMEMKCi4KCi4uLiAgCSAKCktl eVdvcmRzLi4uICAKICAgIGVtYWlsCiAgICBnaWx0cwogICAgaW93YQogICAgbWFya2V0CiAg ICBtaW5uZXNvdGEKICAgIHBsYW50CiAgICBzd2luZQogICAgdHJhbnNwb3J0YXRpb24KICAg IHVzZGEKICAgIE1FQVRPcmlnaW4gQXNzaWduZWRCeT0iT3N0ZXJEb3dKb25lcyIgLz5VU0RB Cgqj8JI+GogNADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouE5AAH0GSENBej0oQXo9IgAU uACxBOQw5B5yc1AQ/VwRXQAAo/CSPoyTDQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLhP QAB9BkhCQXo9KEF6PSIAFLgAsQTkMOQecnNQEf1cEVwAAKPwkj7FlA0APAAAADwAAAAAArOd AeQAB+kKFlwIAEUAAChO+UAAPwbvmEF6PSJBej0ouAAAFOQecnOxBOQxUBBhCK2wAAAAAAAA AACj8JI+twUOADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTvpAAD8G75dBej0iQXo9KLdt ABXd+kImucgJFlAQYQi3CwAAAAAAAAAAo/CSPgA+DgBOAAAATgAAAAAH6QoWXAACs50B5AgA RQAAQLhQQAB9BkgpQXo9KEF6PSIAFbdtucgJFt36QiZQGPXyUwsAADIyNiBUcmFuc2ZlciBj b21wbGV0ZS4NCqTwkj42cQAAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChO+0AAPwbvlkF6 PSJBej0ot20AFd36Qia5yAkuUBBhCLbzAAAAAAAAAACk8JI+AkcCAG8AAABvAAAAAAKznQHk AAfpChZcCABFAABhOrtAAD8GA55Bej0iQXo9KJUPG1gYjLKMdHoEIIAYFtDxUQAAAQEICg1D 4sAAQhVqMjU3fDE0NzI1MTV8MTA0OTgxNzI1NXwxLjB8MXw3OTl8aGVsbG8gd29ybGQKpPCS PqDRBQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJWZQAB9BmrsQXo9KEF6PSIbWJUPdHoE IBiMsrmAEOl0lgkAAAEBCAoAQhVzDUPiwKTwkj7m0gUAywAAAMsAAAAAArOdAeQAB+kKFlwI AEUAAL06vEAAPwYDQUF6PSJBej0olQ8bWBiMsrl0egQggBgW0MPnAAABAQgKDUPi1wBCFXMy NTh8MTQ3MjUxNnwxMDQ5ODE3MjU1fDEuMHwxfDY1NHxoZWxsbyB3b3JsZAoyNTl8MTQ3MjUx N3wxMDQ5ODE3MjU1fDEuMHwxfDMxMTZ8aGVsbG8gd29ybGQKMjYwfDE0NzI1MTh8MTA0OTgx NzI1NXwxLjB8MXwzNTczfGhlbGxvIHdvcmxkCqTwkj5ZKAkAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSVmkAAfQZq60F6PShBej0iG1iVD3R6BCAYjLNCgBDo65XwAAABAQgKAEIVdQ1D 4tel8JI+Ps8DAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiOr1AAD8GA5tBej0iQXo9KJUP G1gYjLNCdHoEIIAYFtCAbAAAAQEICg1D4y4AQhV1MjYxfDE0NzI1MTl8MTA0OTgxNzI1Nnwx LjB8MXwxNTA4fGhlbGxvIHdvcmxkCqXwkj4TQAcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSVnEAAfQZq6UF6PShBej0iG1iVD3R6BCAYjLNwgBDovZWQAAABAQgKAEIVfg1D4y6l8JI+ 1EEHAK8BAACvAQAAAAKznQHkAAfpChZcCABFAAGhOr5AAD8GAltBej0iQXo9KJUPG1gYjLNw dHoEIIAYFtDBbQAAAQEICg1D40QAQhV+MjYyfDE0NzI1MjB8MTA0OTgxNzI1NnwxLjB8MXw0 ODJ8aGVsbG8gd29ybGQKMjYzfDE0NzI1MjF8MTA0OTgxNzI1NnwxLjB8MXw2NTF8aGVsbG8g d29ybGQKMjY0fDE0NzI1MjJ8MTA0OTgxNzI1NnwxLjB8MXwyMzB8aGVsbG8gd29ybGQKMjY1 fDE0NzI1MjN8MTA0OTgxNzI1NnwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCjI2NnwxNDcyNTI0 fDEwNDk4MTcyNTZ8MS4wfDF8MzExNnxoZWxsbyB3b3JsZAoyNjd8MTQ3MjUyNXwxMDQ5ODE3 MjU2fDEuMHwxfDM1NzN8aGVsbG8gd29ybGQKMjY4fDE0NzI1MjZ8MTA0OTgxNzI1NnwxLjB8 MXwzMTE2fGhlbGxvIHdvcmxkCjI2OXwxNDcyNTI3fDEwNDk4MTcyNTZ8MS4wfDF8MjAwMXxo ZWxsbyB3b3JsZAql8JI+gZYKAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lZ1AAH0GauhB ej0oQXo9IhtYlQ90egQgGIy03YAQ51CVeAAAAQEICgBCFYANQ+NEpvCSPmfcBgBwAAAAcAAA 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 IBiMtkqAEOXjlA8AAAEBCAoAQhWhDUPkjKjwkj78+A4AeAAAAHgAAAAAB+kKFlwAArOdAeQI AEUAAGq4U0AAfQZH/EF6PShBej0iABW3bbnICZLd+kJzUBj1pCqnAAAxNTAgT3BlbmluZyBC SU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTE5Lm91dC4wMzA0MDguDQqo 8JI+o/wOAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuFRAAH0GSDVBej0oQXo9IgAUuAKb +niSAAAAAHAC+vC+nAAAAgQFZAEBBAKo8JI+Y/4OAD4AAAA+AAAAAAKznQHkAAfpChZcCABF AAAwTv9AAD8G74pBej0iQXo9KLgCABTkNjrhm/p4k3ASYQg5DAAAAQEEAgIEBbSo8JI+gDYP ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouFVAAH0GSDxBej0oQXo9IgAUuAKb+niT5DY6 4lAQ/VzJewAAqPCSPnE+DwB9BAAAfQQAAAACs50B5AAH6QoWXAgARQAEb08AQAA/ButKQXo9 IkF6PSi4AgAU5DY64pv6eJNQGGEI/p4AAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTcyNDMg TU49MzYxOTk5MTkub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQ Rk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBDT1ZFUiwg QUNDRVNTCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIg MDgsIDIwMDMgKEZlZEJpek9wcHMgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRM aW5lLi4uICBDb3B5cmlnaHQgKGMpIDIwMDMgRmVkZXJhbCBJbmZvcm1hdGlvbiAmIE5ld3Mg RGlzcGF0Y2gsIEluYy4KCgouLi4KCgpGZWRCaXpPcHMKCk5PVElDRSBUWVBFOiBDT05UUkFD VCBBV0FSRAoKU09VUkNFOiBQdWJsaXNoZWQgaW4gRmVkQml6T3BwcwoKREFURSBQT1NURUQ6 IDA3LUFQUi0wMwoKT0ZGSUNFIEFERFJFU1M6IERFRkVOU0UgR0VORVJBTCBTVVBQTFkgQ0VO VEVSIDgwMDAgSkVGRiBEQVZJUyBIV1kKUklDSE1PTkQsIFZBIDIzMjk3LTUzIDEyCgpDTEFT U0lGSUNBVElPTiBDT0RFOiAxNSAtIEFpcmNyYWZ0ICYgYWlyZnJhbWUgc3RydWN0dXJhbCBj b21wb25lbnRzCgpTVUJKRUNUOiBDT1ZFUiwgQUNDRVNTCgpTT0xJQ0lUQVRJT04gTlVNQkVS OiBTUDA0NzAtMDMtUi0xNjM2CgpBV0FSRCBOVU1CRVI6IFNQMDQ3MC0wMy1DLTE5NzUKCkFX QVJEIEFNT1VOVDogJDE1NSw0NTUKCkxJTkUgTlVNQkVSOiAwMDAxCgpBV0FSRCBEQVRFOiAw NDA0MDMKCkFXQVJERUQgVE86IEhZQVRUIERJRSBDQVNUICYgRU5HSU5FRVJJTkcgQ09SUE9S QVRJT04gNDY1NiBMSU5DT0xOIEFWRU5VRQpDWVBSRVNTIENBIDkwNjMwLTI2NTAKCkFSQ0hJ VkUgREFURTogMDQxOTIwMDMKCkNPTlRBQ1Q6IE4vQQoKSU5URVJORVQgQUREUkVTUzoKaHR0 cDovL3d3dy5lcHMuZ292L3NwZy9ETEEvSjMvRFNDUi9Bd2FyZHMvU1AwNDcwLTAzLUMtMTk3 NUxuMDAwMS5odG1sCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhaXJjcmFmdAogICAg Y2FsaWZvcm5pYQogICAgY29udHJhY3QKICAgIGRlZmVuc2UKICAgIGVuZ2luZWVyaW5nCiAg ICBpbnRlcm5ldAogICAgc3RydWN0dXJhbAogICAgdmlyZ2luaWEKCqjwkj5zPg8APAAAADwA AAAAArOdAeQAB+kKFlwIAEUAAChPAUAAPwbvkEF6PSJBej0ouAIAFOQ2Pymb+niTUBFhCGGI AAAAAAAAAACp8JI+Y1IAADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouFZAAH0GSDtBej0o QXo9IgAUuAKb+niT5DY/KlAQ+RXJegAAqfCSPjlhAAA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLhXQAB9Bkg6QXo9KEF6PSIAFLgCm/p4k+Q2PypQEfkVyXkAAKnwkj6GYgAAPAAAADwA AAAAArOdAeQAB+kKFlwIAEUAAChPAkAAPwbvj0F6PSJBej0ouAIAFOQ2Pyqb+niUUBBhCGGH AAAAAAAAAACp8JI++jQBADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTwNAAD8G745Bej0i QXo9KLdtABXd+kJzucgJ1FAQYQi2AAAAAAAAAAAAqfCSPvJsAQBOAAAATgAAAAAH6QoWXAAC s50B5AgARQAAQLhYQAB9BkghQXo9KEF6PSIAFbdtucgJ1N36QnNQGPWkUk4AADIyNiBUcmFu c2ZlciBjb21wbGV0ZS4NCqnwkj4SdQEAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPBEAA Pwbvc0F6PSJBej0ot20AFd36QnO5yAnsUBhhCKbwAABERUxFIDM2MTk5OTI0Lm91dC4wMzA0 MDgNCqnwkj5zsgEAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG64WUAAfQZH8kF6PShBej0i ABW3bbnICezd+kKNUBj68JnGAAA1NTAgMzYxOTk5MjQub3V0LjAzMDQwODogVGhlIHN5c3Rl bSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KqfCSPpC+AQBPAAAATwAAAAAC s50B5AAH6QoWXAgARQAAQU8FQAA/Bu9zQXo9IkF6PSi3bQAV3fpCjbnICjJQGGEIIQEAAFBP UlQgNjUsMTIyLDYxLDM0LDE4NCwzDQqp8JI+qvgBAFQAAABUAAAAAAfpChZcAAKznQHkCABF AABGuFpAAH0GSBlBej0oQXo9IgAVt225yAoy3fpCplAY+tZekwAAMjAwIFBPUlQgY29tbWFu ZCBzdWNjZXNzZnVsLg0KqfCSPuL7AQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk8GQAA/ Bu9xQXo9IkF6PSi3bQAV3fpCprnIClBQGGEIlD0AAFNUT1IgMzYxOTk5MjQub3V0LjAzMDQw OA0KqfCSPls4AgB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarhbQAB9Bkf0QXo9KEF6PSIA FbdtucgKUN36QsBQGPq8I4kAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVj dGlvbiBmb3IgMzYxOTk5MjQub3V0LjAzMDQwOC4NCqnwkj7OcwIAPgAAAD4AAAAAB+kKFlwA ArOdAeQIAEUAADC4XEAAfQZILUF6PShBej0iABS4A2DbiK4AAAAAcAL68OmeAAACBAVkAQEE Aqnwkj5pdQIAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBPB0AAPwbvgkF6PSJBej0ouAMA FOQ5FvFg24ivcBJhCIf7AAABAQQCAgQFtKnwkj55rQIANgAAADYAAAAAB+kKFlwAArOdAeQI AEUAACi4XUAAfQZINEF6PShBej0iABS4A2DbiK/kORbyUBD9XBhrAACp8JI+FLUCAJoFAACa BQAAAAKznQHkAAfpChZcCABFAAWMTwhAAD8G6iVBej0iQXo9KLgDABTkORbyYNuIr1AQYQgD rwAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzI0NCBNTj0zNjE5OTkyNC5vdXQgU1JDPWNv bXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iT3N0ZXJEb3dKb25lcyIgCgou Li4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBPREogVVNEQSBFIENvcm5iZWx0IERhaWx5 IERpcmVjdCBIb2dzLUFNIC0gQXByIDgKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoK RGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoT0RKIHZpYSBDT01URVgpIC0tCgoKCi4uLgoK Q29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMgT3N0ZXJEb3dKb25lcyBDb21tb2Rp dHkgTmV3cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpPc3RlckRvd0pv bmVzCgpMTV9IRzIwOQpEZXMgTW9pbmVzLCBJb3dhICAgICAgICAgICAgICAgVHVlLCBBcHIg MDgsIDIwMDMgICAgICAgICAgICAgICAgVVNEQSBNYXJrZXQKTmV3cwoKRUFTVEVSTiBDT1JO QkVMVCBEQUlMWSBESVJFQ1QgSE9HUyBQTEFOVCBERUxJVkVSRUQgQkFTRUQgT04gU1RBVEUg T0YKT1JJR0lOIE1vcm5pbmcsIFR1ZXNkYXksIEFwcmlsIDgsIDIwMDMgKEFzIG9mIDk6MzAg QU0pCgpDVVJSRU5UIFZPTFVNRSBCWSBQVVJDSEFTRSBUWVBFCgpMSVZFIEFORCBDQVJDQVNT IEJBU0lTCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRl ZCAgICAgQWN0dWFsICAgICBBY3R1YWwKQWN0dWFsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFRvZGF5ICAgICAgVG9kYXkgICBXZWVrIEFnbyAgIFllYXIK QWdvClByb2R1Y2VyIFNvbGQ6CiAgTmVnb3RpYXRlZCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgMTcsMzAzICAgICAgOSw1MjAgICAgIDExLDkwMQogIE90aGVyIE1hcmtldCBGb3Jt dWxhICAgICAgICAgICAgICAgICAgICAyLDQyNSAgICAgICAgOTY2ICAgICAgICA4MDIKICBT d2luZSBvciBQb3JrIE1hcmtldCBGb3JtdWxhICAgICAgICAgICA0OCw3NTYgICAgICA5LDMx OSAgICAgIDgsOTAxCiAgT3RoZXIgUHVyY2hhc2UgQXJyYW5nZW1lbnQgICAgICAgICAgICAg MTQsMTc4ICAgICAgNiwwMTQgICAgICA1LDc3NgpQYWNrZXIgU29sZCAoQWxsIFB1cmNoYXNl IFR5cGVzKTogICAgICAgICAgIDc1MCAgICAgICAgNTUyICAgICAgICA5MjMKLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQoKTkVHT1RJQVRFRCBQVVJDSEFTRQoKKEluY2x1ZGluZyBQYWNr ZXItc29sZCkKCkJhcnJvd3MgJiBHaWx0cyAoQ2FyY2FzcyBCYXNpcyk6IDQsOTM5CgpCYXJy b3dzIGFuZCBHaWx0cyBjb21wYXJlZCB0byBwcmlvciBkqfCSPoy1AgCaBQAAmgUAAAACs50B 5AAH6QoWXAgARQAFjE8JQAA/BuokQXo9IkF6PSi4AwAU5DkcVmDbiK9QGGEIJUMAAGF5J3Mg Y2xvc2UsIG1vc3RseSAuNTAgaGlnaGVyLgoKQmFzZSBQcmljZSBSYW5nZSAkNDAuNzUgLSAk NTEuMDEsIHdlaWdodGVkIGF2ZXJhZ2UgJDQ3LjY2CgpCYXNlIE1hcmtldCBIb2cgMTg1IGxi IENhcmNhc3MgQmFzaXMsIFBsYW50IERlbGl2ZXJlZCAoMC45LTEuMSBpbmNoCmJhY2stZmF0 LCA2IHNxdWFyZSBpbmNoIGxvaW4vMi4wIGRlcHRoKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKRUFTVEVSTiBDT1JOQkVMVCBEQUlMWSBESVJFQ1QgTkVHT1RJQVRFRCBIT0cgUFVS Q0hBU0VTIE1BVFJJWAoKMTg1IGxiIENhcmNhc3MgQmFzaXMKCihEZWZpbmVkIGJ5IE11c2Ns ZSBhbmQgRmF0KQoKTE9JTiBBUkVBL0RFUFRIIChJTkNIRVMpCgpCQUNLLUZBVCAgICAgIDQu MC8xLjQgICAgICAgNS4wLzEuNyAgICAgICAgNi4wLzIuMCAgICAgIDcuMC8yLjMgICAgICAg OC4wLzIuNwowLjQgICAgICAgICA0My4yNSA1My44MiAgIDQ0Ljc1IDU0LjQzICAgNDYuMjUg NTUuNzAgICA0Ny4wMyA1Ni42NyAgIDQ3LjAzIDU3LjY0CjAuNSAgICAgICAgIDQwLjc1IDUz LjI1ICAgNDMuMjUgNTMuODcgICA0Ni4yNSA1NC44MiAgIDQ3LjAzIDU1Ljc5ICAgNDcuMDMg NTYuNzYKMC42ICAgICAgICAgNDAuNzUgNTIuNjQgICA0My4yNSA1My4yNSAgIDQ0Ljc1IDUz Ljk1ICAgNDYuMjUgNTQuOTIgICA0Ny4wMyA1NS44OQowLjcgICAgICAgICA0MC43NSA1Mi4w OCAgIDQwLjc1IDUyLjY5ICAgNDMuMjUgNTMuMzEgICA0Ni4yNSA1NC4wNCAgIDQ3LjAzIDU1 LjAyCjAuOCAgICAgICAgIDM4Ljc1IDUxLjQ3ICAgNDAuNzUgNTIuMDggICA0My4yNSA1Mi42 OSAgIDQ0Ljc1IDUzLjMxICAgNDcuMDMgNTQuMTQKMC45ICAgICAgICAgMzguNzUgNTAuOTEg ICA0MC43NSA1MS41MiAgIDQwLjc1IDUyLjEzICAgNDMuMjUgNTIuNzQgICA0Ni4yNSA1My41 NgoxLjAgICAgICAgICAzNy43NSA1MC4zMCAgIDM4Ljc1IDUwLjkxICAgNDAuNzUgNTEuNTIg ICA0My4yNSA1Mi4xMyAgIDQ0Ljc1IDUyLjk1CjEuMSAgICAgICAgIDM2Ljc1IDQ5LjczICAg MzguNzUgNTAuMzUgICA0MC43NSA1MC45NiAgIDQwLjc1IDUxLjU3ICAgNDQuNDAgNTIuMzkK MS4yICAgICAgICAgMzYuNzUgNDkuMTIgICAzNy43NSA0OS43MyAgIDM4Ljc1IDUwLjM1ICAg MzkuNzggNTAuOTYgICAzOS43OCA1MS43OAoxLjQgICAgICAgICAzMy4yNSA0Ny45NSAgIDMz Ljc2IDQ4LjU2ICAgMzMuNzYgNDkuMTcgICAzMy43NiA0OS43OSAgIDMzLjc2IDUwLjYwCi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCqnwkj4CtgIAmgUAAJoFAAAAArOdAeQAB+kKFlwI AEUABYxPCkAAPwbqI0F6PSJBej0ouAMAFOQ5Ibpg24ivUBhhCExxAABDQVJDQVNTIFdFSUdI VCBESUZGRVJFTlRJQUxTCgoxNDUjICAgLTE3LjU3ICAgLTQuODYgICAgICAgICAxNzUjICAg ICAwLjAwICAgICAwLjAwICAgICAgIDIwNSMgICAgLTMuODkKMC40NgoxNTUjICAgIC05LjQ2 ICAgIDAuMDAgICAgICAgICAxODUjICAgICAwLjAwICAgICAwLjAwICAgICAgIDIxNSMgICAg LTMuODkKMC40NgoxNjUjICAgIC0yLjAwICAgIDAuMDAgICAgICAgICAxOTUjICAgIC0wLjk3 ICAgICAwLjAwICAgICAgIDIyNSMgICAgLTMuODkKMC4wMAotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCgpNZWFzdXJlbWVudHMgQmFzZWQgb24gU2xhdWdodGVyIERhdGEgU3VibWl0dGVk OgoKNSBEYXkgUm9sbGluZyBBdmVyYWdlIE1hcmtldCBIb2c6IDE5NC42MCBsYiBjYXJjYXNz LCBwbGFudCBkZWxpdmVyZWQKKDAuNzcgaW5jaCBiYWNrLWZhdCwgNi42MCBzcXVhcmUgaW5j aCBsb2luLzIuMjAgaW5jaCBsb2luIGRlcHRoKSBGRkxJOgo1MC43NiUKClByaWNlIFJhbmdl ICQ0NC43NSAtICQ1My4zMQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTT1dTIChQbGFu dCBEZWxpdmVyZWQpCgpTb3dzIFB1cmNoYXNlZCAoTGl2ZSBhbmQgQ2FyY2FzcyBCYXNpcyk6 IDYwMAoKICAgICAgICAgICAgICBXZWlnaHQgUmFuZ2UgICBIZWFkIENvdW50ICAgIEF2ZyBX ZWlnaHQgICAgUHJpY2UgUmFuZ2UqICAgIFd0ZApBdmcKKExpdmUgQmFzaXMpICAzMDAtNDQ5 IGxicy4gICAgICAgIDM5OSAgICAgICAgMzk4LjY3ICAgICAgMjQuMDAtMzAuMzYKMjguMTEK CjQ1MC00OTkgbGJzLgoKICAgICAgICAgICAgICA1MDAvdXAgIGxicy4gICAgICAgIDE3NiAg ICAgICAgNTcwLjQ5ICAgICAgMjkuMDAtMzMuNDkKMzEuMjEKCipQcmljZSBtYXkgaW5jbHVk ZSB0cmFuc3BvcnRhdGlvbiBjb3N0cy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClBV UkNIQVNFIEFMTCBUWVBFUzogQlkgU1RBVEUgT0YgT1JJR0lOCgpBbGFiYW1hICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAxODgKR2VvcmdpYSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgNjA5CklsbGlub2lzICAgICAgICAgICAgICAgICAgICAgICAgICAzLDA3NgpJbmRp YW5hICAgICAgICAgICAgICAgICAgICAgICAgICAgMSw3NDkKS2VudHVja3kgICAgICAgICAg ICAgICAgICAgICAgICAgICAgMTgwCk1hcnlsYW5kICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDI1MApNaWNoaWdhbiCp8JI+zi8DADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouF5A AH0GSDNBej0oQXo9IgAUuANg24iv5DkhulAQ/VwNowAAqfCSPvIyAwAtBAAALQQAAAACs50B 5AAH6QoWXAgARQAEH08LQAA/BuuPQXo9IkF6PSi4AwAU5DknHmDbiK9QGWEIYawAACAgICAg ICAgICAgICAgICAgICAgICAgICAgIDU3MApNaXNzaXNzaXBwaSAgICAgICAgICAgICAgICAg ICAgICAgICAzMzMKTmV3IFlvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ3Ck5v cnRoIENhcm9saW5hICAgICAgICAgICAgICAgICAgICA0LDg3MQpPaGlvICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgNCwxOTgKUGVubnN5bHZhbmlhICAgICAgICAgICAgICAgICAg ICAgIDIsNjY5ClNvdXRoIENhcm9saW5hICAgICAgICAgICAgICAgICAgICAgIDM1MQpUZW5u ZXNzZWUgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzAKV2VzdCBWaXJnaW5pYSAgICAg ICAgICAgICAgICAgICAgICAgIDYwCldpc2NvbnNpbiAgICAgICAgICAgICAgICAgICAgICAg ICAxLDYzMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTb3VyY2U6ICAgICAgIFVTREEg TWFya2V0IE5ld3MsIERlcyBNb2luZXMsIElBCiAgICAgICAgICAgICAgNTE1LTI4NC00NDYw ICAgIGVtYWlsOiAgZGVzbS5sZ21uQHVzZGEuZ292Cgp3d3cuYW1zLnVzZGEuZ292L21ucmVw b3J0cy9sbV9oZzIwOS50eHQgMTEwMEMKCi4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAg IGFsYWJhbWEKICAgIGVtYWlsCiAgICBnZW9yZ2lhCiAgICBnaWx0cwogICAgaWxsaW5vaXMK ICAgIGluZGlhbmEKICAgIGlvd2EKICAgIGtlbnR1Y2t5CiAgICBtYXJrZXQKICAgIG1hcnls YW5kCiAgICBtaWNoaWdhbgogICAgbWlzc2lzc2lwcGkKICAgIG5ld195b3JrCiAgICBub3J0 aCtjYXJvbGluYQogICAgb2hpbwogICAgcGVubnN5bHZhbmlhCiAgICBwbGFudAogICAgc291 dGgrY2Fyb2xpbmEKICAgIHN3aW5lCiAgICB0ZW5uZXNzZWUKICAgIHRyYW5zcG9ydGF0aW9u CiAgICB1c2RhCiAgICB3ZXN0K3ZpcmdpbmlhCiAgICB3aXNjb25zaW4KICAgIE1FQVRPcmln aW4gQXNzaWduZWRCeT0iT3N0ZXJEb3dKb25lcyIgLz5VU0RBCgqp8JI+P4cDADYAAAA2AAAA AAfpChZcAAKznQHkCABFAAAouF9AAH0GSDJBej0oQXo9IgAUuANg24iv5DkrFlAQ/VwERwAA qfCSPp+TAwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLhgQAB9BkgxQXo9KEF6PSIAFLgD YNuIr+Q5KxZQEf1cBEYAAKnwkj63lAMAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChPDEAA PwbvhUF6PSJBej0ouAMAFOQ5KxZg24iwUBBhCKCaAAAAAAAAAACp8JI+AKYDADwAAAA8AAAA AAKznQHkAAfpChZcCABFAAAoTw1AAD8G74RBej0iQXo9KLdtABXd+kLAucgKklAQYQi09QAA AAAAAAAAqfCSPgXeAwBOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLhhQAB9BkgYQXo9KEF6 PSIAFbdtucgKkt36QsBQGPq8TCsAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCqnwkj6Z5QMA UAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPDkAAPwbvaUF6PSJBej0ot20AFd36QsC5yAqq UBhhCKTlAABERUxFIDM2MTk5OTI1Lm91dC4wMzA0MDgNCqnwkj7mIgQAfAAAAHwAAAAAB+kK FlwAArOdAeQIAEUAAG64YkAAfQZH6UF6PShBej0iABW3bbnICqrd+kLaUBj6opkIAAA1NTAg MzYxOTk5MjUub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBz cGVjaWZpZWQuIA0KqfCSPskuBABPAAAATwAAAAACs50B5AAH6QoWXAgARQAAQU8PQAA/Bu9p QXo9IkF6PSi3bQAV3fpC2rnICvBQGGEIHvYAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCw0DQqp 8JI+9WgEAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuGNAAH0GSBBBej0oQXo9IgAVt225 yArw3fpC81AY+ohd1gAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KqfCSPgtsBABQ AAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk8QQAA/Bu9nQXo9IkF6PSi3bQAV3fpC87nICw5Q GGEIkjIAAFNUT1IgMzYxOTk5MjUub3V0LjAzMDQwOA0KqfCSPrW9BAB4AAAAeAAAAAAH6QoW XAACs50B5AgARQAAarhkQAB9BkfrQXo9KEF6PSIAFbdtucgLDt36Qw1QGPpuIssAADE1MCBP cGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5MjUub3V0LjAz MDQwOC4NCqnwkj5CNQUAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC4ZUAAfQZIJEF6PShB ej0iABS4BNVphlAAAAAAcAL68HdtAAACBAVkAQEEAqnwkj7uNgUAPgAAAD4AAAAAArOdAeQA B+kKFlwIAEUAADBPEUAAPwbveEF6PSJBej0ouAQAFOQ7oD3VaYZRcBJhCIx7AAABAQQCAgQF tKnwkj5tbwUANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4ZkAAfQZIK0F6PShBej0iABS4 BNVphlHkO6A+UBD9XBzrAACp8JI+1XYFAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTxJA AD8G6htBej0iQXo9KLgEABTkO6A+1WmGUVAQYQhF5AAAWFlaWlkuLi4gIFRDPTIgVE09MTA0 OTgxNzI0NCBNTj0zNjE5OTkyNS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJD b210ZXgiIFBGTj0iTTIiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgVUsgR292 ZXJubWVudDogR0JQMTAwIG1pbGxpb24gZm9yIHdvcmxkIGxlYWRpbmcgbmV3IHNjaWVuY2Ug cHJvamVjdAoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXBy IDA4LCAyMDAzIChNMiBQUkVTU1dJUkUgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmln aHRMaW5lLi4uICAoQykxOTk0LTIwMDMgTTIgQ09NTVVOSUNBVElPTlMgTFRECgoKLi4uCgoK TTIKClRoZSBVSydzIHdvcmxkLWJlYXRpbmcgbmV1dHJvbiBjZW50cmUgYXQgdGhlIFJ1dGhl cmZvcmQgQXBwbGV0b24KTGFib3JhdG9yeSwgbmVhciBEaWRjb3QsIGlzIHRvIGdldCBvbmUg b2YgdGhlIGxhcmdlc3QgZXZlciBhd2FyZHMgb2YKR292ZXJubWVudCBmdW5kaW5nIGZvciBh IHNpbmdsZSBzY2llbmNlIHByb2plY3QsIFNjaWVuY2UgTWluaXN0ZXIgTG9yZApTYWluc2J1 cnkgYW5ub3VuY2VkIHRvZGF5LgoKVGhlIERUSSBpcyBnaXZpbmcgb3ZlciBHQlAxMDAgbWls bGlvbiB0byBmdW5kIGEgYnJhbmQgbmV3IHdpbmcgYXQgdGhlCklTSVMgbmV1dHJvbiBsYWJv cmF0b3J5LiBUaGlzIGV4cGFuc2lvbiB3aWxsIGhlbHAgc2NpZW50aXN0cyB3b3JraW5nIG9u CnRoZSBuZXh0IGdlbmVyYXRpb24gb2YgZW52aXJvbm1lbnRhbGx5IGZyaWVuZGx5IHRlY2hu b2xvZ2llcywgc3VwZXItZmFzdApjb21wdXRlcnMsIGRhdGEgc3RvcmFnZSwgYW5kIHNlbnNv cnMsIGFzIHdlbGwgYXMgcGhhcm1hY2V1dGljYWwgYW5kCm1lZGljYWwgYnJlYWt0aHJvdWdo cy4KCkxvcmQgU2FpbnNidXJ5LCBTY2llbmNlIGFuZCBJbm5vdmF0aW9uIE1pbmlzdGVyIHNh aWQ6ICJUaGlzIEdCUDEwMAptaWxsaW9uIGZvciB0aGUgSVNJUyBsYWJvcmF0b3J5IGlzIGEg a2V5IHBhcnQgb2Ygb3VyIGludmVzdG1lbnQgc3RyYXRlZ3kKaW4gbWFqb3IgZmFjaWxpdGll cyBmb3Igc2NpZW50aXN0cyBpbiB0aGlzIGNvdW50cnkuIEl0IHdpbGwga2VlcCB0aGUgVUsK YXQgdGhlIGZvcmVmcm9udCBvZiBuZXV0cm9uIHJlc2VhcmNoIGZvciBtYW55IHllYXJzLgoK IlRoZSBVSyBpcyBhIGxlYWRlciBpbiB0aGUgd29ybGQgaW4gc2NpZW5jZSBhbmQgdGhlIGRl dmVsb3BtZW50IG9mIG5ldwp0ZWNobm9sb2dpZXMsIGFuZCBpdCBpcyB2aXRhbCB0aGF0IHRo aXMgY29udGludWVzLCBib3RoIGZvciB0aGUgYmVuZWZpdHMKc2NpZW5jZSBhbmQgdGVjaG5v bG9neSBicmluZ3MgdG8gdGhlIHBvcHVsYXRpb24sIGFuZCB0aGUgZWNvbm9taWMKcHJvc3Bl cml0eSBvZiB0qfCSPkt3BQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE8TQAA/BuoaQXo9 IkF6PSi4BAAU5DulotVphlFQGGEIOCsAAGhpcyBjb3VudHJ5LiBGb3IgdGhpcyByZWFzb24g d2UgYXJlIGNvbW1pdHRlZCB0byBzdXN0YWluZWQKZnVuZGluZyBmb3Igc2NpZW50aWZpYyBy ZXNlYXJjaCBhbmQgZmFjaWxpdGllcy4gQnkgMjAwNS0wNiB0aGUgc2NpZW5jZQpidWRnZXQg d2lsbCByZWFjaCBqdXN0IHNob3J0IG9mIEdCUDMgYmlsbGlvbiAtIG1vcmUgdGhhbiBkb3Vi bGUgdGhlCmZpZ3VyZSBpbiAxOTk3LTE5OTguIiBUaGUgY3VycmVudCBuZXV0cm9uIGZhY2ls aXR5LCBvciAndGFyZ2V0IHN0YXRpb24nLAphdCBJU0lTIGlzIHRoZSBtb3N0IHBvd2VyZnVs IG5ldXRyb24gcHJvZHVjZXIgb2YgaXRzIGtpbmQgaW4gdGhlIHdvcmxkLApidXQgaXQgaXMg ZnVsbHkgZGV2ZWxvcGVkIGFuZCBjYW5ub3QgZXhwYW5kIHRvIG1lZXQgdGhlIGNhcGFjaXR5 IHJlcXVpcmVkCmJ5IHRoZSBzY2llbnRpZmljIGNvbW11bml0eS4gVGhlIHNlY29uZCB0YXJn ZXQgc3RhdGlvbiB3aWxsIG9mZmVyIHVuaXF1ZQplcXVpcG1lbnQsIGFuZCB3aWxsIG1haW50 YWluIElTSVMgYXMgYSB3b3JsZC0gY2xhc3MgZmFjaWxpdHkgZm9yIG1hbnkKeWVhcnMuCgpT Y2llbnRpc3RzIHVzZSB0aGUgSVNJUyBmYWNpbGl0eSB0byBzdHVkeSB0aGUgc3RydWN0dXJl IGFuZCBkeW5hbWljcyBvZgptYXR0ZXIsIGFuZCBpdCBpcyBuZWVkZWQgZm9yIGEgYnJvYWQg c3BlY3RydW0gb2YgZGlzY2lwbGluZXMgaW5jbHVkaW5nCnBoeXNpY3MsIGNoZW1pc3RyeSwg YmlvdGVjaG5vbG9neSwgYW5kIG1hdGVyaWFscyBzY2llbmNlLgoKVGhlIGRldmVsb3BtZW50 IG9mICd0YXJnZXRlZCBtZWRpY2luZSBkZWxpdmVyeScsIHdoaWNoIGFpbXMgdG8gcmVkdWNl IHRoZQpzaWRlLWVmZmVjdHMgb2YgbWVkaWNhbCB0cmVhdG1lbnRzLCBpcyBqdXN0IG9uZSBl eGFtcGxlIG9mIHRoZSBraW5kIG9mCnJlc2VhcmNoIHRoYXQgYmVuZWZpdHMgZnJvbSB3b3Jr IGRvbmUgYXQgSVNJUy4KClRoaXMgaW52ZXN0bWVudCBpcyBwYXJ0IG9mIGEgJ1VLIFN0cmF0 ZWd5IGZvciBuZXV0cm9ucycsIHdoaWNoIGlzIGJlaW5nCnJlbGVhc2VkIGZvciBjb25zdWx0 YXRpb24gdG9kYXkgYnkgdGhlIENvdW5jaWwgZm9yIHRoZSBDZW50cmFsIExhYm9yYXRvcnkK b2YgdGhlIFJlc2VhcmNoIENvdW5jaWxzIChDQ0xSQykuIFRoaXMgVUsgU3RyYXRlZ3kgaW4g dGhlIG5lYXIgdGVybQpjb25zaXN0cyBvZiBjb21wbGV0aW5nIHRoZSBJU0lTIHNlY29uZCB0 YXJnZXQgc3RhdGlvbiBhbmQgdXBncmFkaW5nIHRoZQpmYWNpbGl0aWVzIGluIHRoZSBJbnN0 aXR1dCBMYXVlIExhbmdldmluLCBhIFVLL0ZyZW5jaC9HZXJtYW4gbmV1dHJvbgpmYWNpbGl0 eSBpbiBHcmVub2JsZSwgRnJhbmNlLiBJbiB0aGUgbWVkaXVtIHRlcm0sIHRoZSBzdHJhdGVn eanwkj7AdwUAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxPFEAAPwbqGUF6PSJBej0ouAQA FOQ7qwbVaYZRUBhhCKzJAAAgc2VlcyB0aGUKbmVlZCBmb3IgYW4gZXZlbiBtb3JlIGhpZ2hs eSBwb3dlcmVkIG5ldXRyb24gc291cmNlIHdpdGhpbiBFdXJvcGUuCgpOb3RlcyB0byBlZGl0 b3JzCgoxLiBUaGUgRFRJIGlzIHByb3ZpZGluZyBHQlAxMDAuNCBtaWxsaW9uLCB0aHJvdWdo IHRoZSBPZmZpY2Ugb2YgU2NpZW5jZQphbmQgVGVjaG5vbG9neSBvdmVyIDYgeWVhcnMgLSAy MDAyLzMgdG8gMjAwNy84LiBUaGlzIHN1bSBpbmNsdWRlcwpHQlA3LjFtaWxsaW9uLCB3aGlj aCB3YXMgcHJvdmlkZWQgaW4gMjAwMi0wMyB0byBDQ0xSQyBmb3IgdGhlIGluaXRpYWwKc3Rh Z2VzIG9mIHRoaXMgcHJvamVjdC4gVGhlIHRvdGFsIHByb2plY3Qgc3VtIGluY2x1ZGVzIGEg Y29udGluZ2VuY3kgb2YKR0JQMTAgbWlsbGlvbi4gVGhlIGJyZWFrZG93biBlYWNoIHllYXIg aXMgYXMgZm9sbG93czsgMjAwMi0wMyBHQlA3LjFtLAoyMDAzLTA0IEdCUDcuNm0sIDIwMDQt MDUgR0JQMzdtLCAyMDA1LTA2IEdCUDE3LjNtLCAyMDA2LTA3IEdCUDI1LjJtCjIwMDctMDgg R0JQNi4ybQoKMi4gVGhlIElTSVMgMm5kIFRhcmdldCBTdGF0aW9uIFByb2plY3QsIGFzIHdp dGggYWxsIGxhcmdlIEdvdmVybm1lbnQKcHJvamVjdHMsIGhhcyBiZWVuIHVuZGVyZ29pbmcg dGhlIE9mZmljZSBvZiBHb3Zlcm5tZW50IENvbW1lcmNlJ3MKIkdhdGV3YXkgUHJvY2VzcyIu IFRoZXJlIGFyZSBzaXggc3RhZ2VzIGluIGFsbCAoMC01KSwgYW5kIHRoZSBwcm9qZWN0Cm5l ZWRlZCB0byBwYXNzIEdhdGVzIDAgKHNjaWVuY2UgY2FzZSkgYW5kIEdhdGUgMSAoYnVzaW5l c3MgY2FzZSkgYmVmb3JlCnRoZSBkZWNpc2lvbiB0byBjb25maXJtIHRoZSBwcm9qZWN0J3Mg ZnVuZGluZyBjb3VsZCBiZSBtYWRlLgoKVGhlIHByb2plY3QgcGFzc2VkIGl0cyBzY2llbmNl IGNhc2UgaW4gT2N0b2JlciAyMDAxIGFuZCBpdHMgYnVzaW5lc3MgY2FzZQppbiBOb3ZlbWJl ciAyMDAyLiBGdW5kaW5nIGZvciB0aGUgcHJvamVjdCB3YXMgcmVjb21tZW5kZWQgYnkgdGhl IFJlc2VhcmNoCkNvdW5jaWxzIFVLIFN0cmF0ZWd5IEdyb3VwIGluIEphbnVhcnkgMjAwMy4K CjMuIFRoZSBHQlAxMDAuNCBtaWxsaW9uIGZ1bmRpbmcgYW5ub3VuY2VkIHRvZGF5IHdpbGwg YmUgc3VmZmljaWVudCB0bwpjb21wbGV0ZSB0aGUgc2Vjb25kIHRhcmdldCBzdGF0aW9uIGl0 c2VsZi4gQWRkaXRpb25hbCBmdW5kaW5nIHdpbGwgYmUKbmVlZGVkIGZvciBpbnN0cnVtZW50 YXRpb24sIGFuZCBhIGZ1cnRoZXIgYW5ub3VuY2VtZW50IHdpbGwgYmUgbWFkZSBvbgp0aGlz IGluIGR1ZSBjb3Vyc2UuIFRoZSBVSyBhbnRpY2lwYXRlcyB0aGF0IHNvbWUgb2YgdGhlIGZ1 bmRpbmcgZm9yCmluc3RydW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIGJ5IHCp8JI+uvEF ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouGdAAH0GSCpBej0oQXo9IgAUuATVaYZR5Dur BlAQ/VwSIwAAqfCSPkb1BQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE8VQAA/BuoYQXo9 IkF6PSi4BAAU5DuwatVphlFQEGEIv7cAAGFydG5lcnMgZnJvbSBvdGhlciBjb3VudHJpZXMs IGluCmV4Y2hhbmdlIGZvciBhY2Nlc3MgdG8gdGhlIElTSVMgZmFjaWxpdGllcy4gVGhpcyBp cyBhIG5vcm1hbCBtZXRob2Qgb2YKcGFydGljaXBhdGlvbiBvZiBjb3VudHJpZXMgaW4gZWFj aCBvdGhlcidzIGxhcmdlc3QgZmFjaWxpdGllcywgYW5kIHRoZSBVSwpwYXJ0aWNpcGF0ZXMg aW4gZmFjaWxpdGllcyBpbiBvdGhlciBjb3VudHJpZXMgb24gdGhpcyBiYXNpcy4KCjQuIEND TFJDIGFyZSByZXNwb25zaWJsZSB0byBSZXNlYXJjaCBDb3VuY2lscyBVSyBmb3IgdGhlIHBy b3Zpc2lvbiBvZgpuZXV0cm9uIGZhY2lsaXRpZXMgZm9yIFVLIHNjaWVudGlzdHMsIG5vdyBh bmQgaW4gdGhlIGZ1dHVyZS4gVGhlIFVLClN0cmF0ZWd5IGZvciBOZXV0cm9ucyBhbm5vdW5j ZWQgdG9kYXkgc2V0cyBvdXQgdGhlIHJlcXVpcmVtZW50cyBmb3IKbmV1dHJvbiBmYWNpbGl0 aWVzIGluIHRoZSBuZWFyIGFuZCBtZWRpdW0gdGVybS4gSW4gdGhlIG5lYXIgdGVybSwgZWZm b3J0cwpuZWVkIHRvIGJlIGNvbmNlbnRyYXRlZCBvbiB0aGUgSVNJUyBTZWNvbmQgVGFyZ2V0 IFN0YXRpb24gYW5kIGNvbXBsZXRpbmcKdGhlIE1pbGxlbm5pdW0gUHJvZ3JhbW1lIG9mIHVw Z3JhZGVzIHRvIHRoZSBJbnN0aXR1dCBMYXVlIExhbmdldmluIGluCkdyZW5vYmxlLCBGcmFu Y2UuIEluIHRoZSBtZWRpdW0gdGVybSwgdGhlIFVLIHNlZXMgYSBuZWVkIGZvciBhIHNwYWxs YXRpb24Kc291cmNlIGluIEV1cm9wZSBhdCBtdWNoIGhpZ2hlciBwb3dlcnMgdGhhbiBkZWxp dmVyZWQgYnkgSVNJUy4gVGhlcmUgYXJlCmEgbnVtYmVyIG9mIG9wdGlvbnMgZm9yIG1lZXRp bmcgdGhpcyBuZWVkLCB3aGljaCBpbmNsdWRlIHRoZSBFdXJvcGVhbgpTcGFsbGF0aW9uIFNv dXJjZSBwcm9qZWN0IHdoaWNoIGhhcyB0aGUgc3VwcG9ydCBvZiBhIG51bWJlciBvZiBzY2ll bnRpc3RzCmFjcm9zcyBFdXJvcGUuIENDTFJDIHdpbGwgYmUgd29ya2luZyB3aXRoIHRoZSBV SyBjb21tdW5pdHkgdG8gZGV2ZWxvcCBvdXIKc3RyYXRlZ3kgdG8gZW5zdXJlIHRoYXQgVUsg c2NpZW50aXN0cyBjb250aW51ZSB0byBoYXZlIGFjY2VzcyB0bwp3b3JsZC1sZWFkaW5nIGZh Y2lsaXRpZXMuCgo1LiBUaGUgSVNJUyBGYWNpbGl0eSBwcm92aWRlcyBwb3dlcmZ1bCBiZWFt cyBvZiBuZXV0cm9ucyB0aGF0IGVuYWJsZSB0aGUKc3RydWN0dXJlIGFuZCBkeW5hbWljcyBv ZiBjb25kZW5zZWQgbWF0dGVyIHRvIGJlIHByb2JlZCBvbiBhIG1pY3Jvc2NvcGljCnNjYWxl IHRoYXQgcmFuZ2VzIGZyb20gdGhlIHN1YmF0b21pYyB0byB0aGUgbWFjcm9tb2xlY3VsYXIu CgpUaGUgSVNJUyB3ZWJzaXRlIGlzIGF0IHd3dy5pc2lzLnJsLmFjLnVrLwoKQ09OVEFDVDog UKnwkj6J9QUAqAIAAKgCAAAAArOdAeQAB+kKFlwIAEUAAppPFkAAPwbtCUF6PSJBej0ouAQA FOQ7tc7VaYZRUBFhCOBIAAB1YmxpYyBFbnF1aXJpZXMgVGVsOiArNDQgKDApMjAgNzIxNSA1 MDAwIFRleHRwaG9uZTogKzQ0ICgwKTIwCjcyMTUgNjc0MAoKTTIgQ29tbXVuaWNhdGlvbnMg THRkIGRpc2NsYWltcyBhbGwgbGlhYmlsaXR5IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZAp3 aXRoaW4gTTIgUHJlc3NXSVJFLiBEYXRhIHN1cHBsaWVkIGJ5IG5hbWVkIHBhcnR5L3BhcnRp ZXMuIEZ1cnRoZXIKaW5mb3JtYXRpb24gb24gTTIgUHJlc3NXSVJFIGNhbiBiZSBvYnRhaW5l ZCBhdCBodHRwOi8vd3d3LnByZXNzd2lyZS5uZXQKb24gdGhlIHdvcmxkIHdpZGUgd2ViLiBJ bnF1aXJpZXMgdG8gaW5mb0BtMi5jb20uCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBi aW90ZWNobm9sb2d5CiAgICBidWRnZXQKICAgIGJ1c2luZXNzCiAgICBjb21tZXJjZQogICAg Y29tbXVuaXR5CiAgICBkYXRhK3N0b3JhZ2UKICAgIGVkaXRvcnMKICAgIGV1cm9wZQogICAg ZXhwYW5zaW9uCiAgICBmcmFuY2UKICAgIGdvdmVybm1lbnQKICAgIGludmVzdG1lbnQKICAg IG1lZGljYWwKICAgIG1lZGljaW5lCiAgICBwaGFybWFjZXV0aWNhbHMKICAgIHBoeXNpY3MK ICAgIHJlc2VhcmNoCiAgICBzY2llbmNlCiAgICB0ZWNobm9sb2d5CiAgICB3ZWIKCqnwkj4X PgYAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChPF0AAPwbvekF6PSJBej0ot20AFd36Qw25 yAtQUBBhCLPqAAAAAAAAAACp8JI+aFMGADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouGhA AH0GSClBej0oQXo9IgAUuATVaYZR5Du1zlAQ/VwHWwAAqfCSPstdBgA2AAAANgAAAAAH6QoW XAACs50B5AgARQAAKLhpQAB9BkgoQXo9KEF6PSIAFLgE1WmGUeQ7uEFQEPrqB1oAAKnwkj7k agYANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4akAAfQZIJ0F6PShBej0iABS4BNVphlHk O7hBUBH66gdZAACp8JI+LWwGADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTxhAAD8G73lB ej0iQXo9KLgEABTkO7hB1WmGUlAQYQihOwAAAAAAAAAAqfCSPvl2BgBOAAAATgAAAAAH6QoW XAACs50B5AgARQAAQLhrQAB9BkgOQXo9KEF6PSIAFbdtucgLUN36Qw1QGPpuS24AADIyNiBU cmFuc2ZlciBjb21wbGV0ZS4NCqnwkj6xnQYAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJP GUAAPwbvXkF6PSJBej0ot20AFd36Qw25yAtoUBhhCKDaAABERUxFIDM2MTk5OTI4Lm91dC4w MzA0MDgNCqnwkj76XQcAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG64bEAAfQZH30F6PShB ej0iABW3bbnIC2jd+kMnUBj6VJhIAAA1NTAgMzYxOTk5Mjgub3V0LjAzMDQwODogVGhlIHN5 c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KqfCSPudqBwBPAAAATwAA AAACs50B5AAH6QoWXAgARQAAQU8aQAA/Bu9eQXo9IkF6PSi3bQAV3fpDJ7nIC65QGGEIHOsA AFBPUlQgNjUsMTIyLDYxLDM0LDE4NCw1DQqp8JI+dqUHAFQAAABUAAAAAAfpChZcAAKznQHk CABFAABGuG1AAH0GSAZBej0oQXo9IgAVt225yAuu3fpDQFAY+jpdGQAAMjAwIFBPUlQgY29t bWFuZCBzdWNjZXNzZnVsLg0KqfCSPp+oBwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk8b QAA/Bu9cQXo9IkF6PSi3bQAV3fpDQLnIC8xQGGEIjicAAFNUT1IgMzYxOTk5Mjgub3V0LjAz MDQwOA0KqfCSPsRRCAB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarhuQAB9BkfhQXo9KEF6 PSIAFbdtucgLzN36Q1pQGPogIgsAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29u bmVjdGlvbiBmb3IgMzYxOTk5Mjgub3V0LjAzMDQwOC4NCqnwkj5ryggAPgAAAD4AAAAAB+kK FlwAArOdAeQIAEUAADC4b0AAfQZIGkF6PShBej0iABS4BVld9fIAAAAAcAL68IPWAAACBAVk AQEEAqnwkj7aywgAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBPHEAAPwbvbUF6PSJBej0o uAUAFOQ+o9dZXfXzcBJhCJVHAAABAQQCAgQFtKnwkj4HBAkANgAAADYAAAAAB+kKFlwAArOd AeQIAEUAACi4cEAAfQZIIUF6PShBej0iABS4BVld9fPkPqPYUBD9XCW3AACp8JI+6AsJAJoF AACaBQAAAAKznQHkAAfpChZcCABFAAWMTx1AAD8G6hBBej0iQXo9KLgFABTkPqPYWV3181AQ YQg+FwAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzI0NSBNTj0zNjE5OTkyOC5vdXQgU1JD PWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iT3N0ZXJEb3dKb25lcyIg CgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBPREogVVNEQSBXIENvcm5iZWx0IERh aWx5IERpcmVjdCBIb2dzLUFNIC0gQXByIDgKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4g IAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoT0RKIHZpYSBDT01URVgpIC0tCgoKCi4u LgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMgT3N0ZXJEb3dKb25lcyBDb21t b2RpdHkgTmV3cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpPc3RlckRv d0pvbmVzCgpMTV9IRzIxMQpEZXMgTW9pbmVzLCBJb3dhICAgICAgICAgICAgICAgVHVlLCBB cHIgMDgsIDIwMDMgICAgICAgICAgICAgICAgVVNEQSBNYXJrZXQKTmV3cwoKV0VTVEVSTiBD T1JOQkVMVCBEQUlMWSBESVJFQ1QgSE9HUyBQTEFOVCBERUxJVkVSRUQgQkFTRUQgT04gU1RB VEUgT0YKT1JJR0lOIE1vcm5pbmcsIFR1ZXNkYXksIEFwcmlsIDgsIDIwMDMgKEFzIG9mIDk6 MzAgQU0pCgpDVVJSRU5UIFZPTFVNRSBCWSBQVVJDSEFTRSBUWVBFCgpMSVZFIEFORCBDQVJD QVNTIEJBU0lTCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGlt YXRlZCAgICAgQWN0dWFsICAgICBBY3R1YWwKQWN0dWFsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFRvZGF5ICAgICAgVG9kYXkgICBXZWVrIEFnbyAgIFll YXIKQWdvClByb2R1Y2VyIFNvbGQ6CiAgTmVnb3RpYXRlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgMjcsMTE4ICAgICAgNSw1MDYgICAgICA2LDYwOQogIE90aGVyIE1hcmtldCBG b3JtdWxhICAgICAgICAgICAgICAgICAgICA1LDA0MyAgICAgICAgMjkwICAgICAgNyw0MTUK ICBTd2luZSBvciBQb3JrIE1hcmtldCBGb3JtdWxhICAgICAgICAgICA5MiwxMjggICAgICA1 LDcxMyAgICAgIDMsMjI5CiAgT3RoZXIgUHVyY2hhc2UgQXJyYW5nZW1lbnQgICAgICAgICAg ICAgMTgsODQ4ICAgICAgNCwzMzEgICAgICA1LDIxMQpQYWNrZXIgU29sZCAoQWxsIFB1cmNo YXNlIFR5cGVzKTogICAgICAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgOTkKLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQoKTkVHT1RJQVRFRCBQVVJDSEFTRQoKKEluY2x1ZGluZyBQ YWNrZXItc29sZCkKCkJhcnJvd3MgJiBHaWx0cyAoQ2FyY2FzcyBCYXNpcyk6IDQsMzM2CgpC YXJyb3dzIGFuZCBHaWx0cyBjb21wYXJlZCB0byBwcmlvciBkqfCSPl8MCQCaBQAAmgUAAAAC s50B5AAH6QoWXAgARQAFjE8eQAA/BuoPQXo9IkF6PSi4BQAU5D6pPFld9fNQGGEIoRkAAGF5 J3MgY2xvc2UsIC41MCBsb3dlci4KCkJhc2UgUHJpY2UgUmFuZ2UgJDQyLjAwIC0gJDQ4LjY1 LCB3ZWlnaHRlZCBhdmVyYWdlICQ0Ni40MQoKQmFzZSBNYXJrZXQgSG9nIDE4NSBsYiBDYXJj YXNzIEJhc2lzLCBQbGFudCBEZWxpdmVyZWQgKDAuOS0xLjEgaW5jaApiYWNrLWZhdCwgNiBz cXVhcmUgaW5jaCBsb2luLzIuMCBkZXB0aCkKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K CldFU1RFUk4gQ09STkJFTFQgREFJTFkgRElSRUNUIE5FR09USUFURUQgSE9HIFBVUkNIQVNF UyBNQVRSSVgKCjE4NSBsYiBDYXJjYXNzIEJhc2lzCgooRGVmaW5lZCBieSBNdXNjbGUgYW5k IEZhdCkKCkxPSU4gQVJFQS9ERVBUSCAoSU5DSEVTKQoKQkFDSy1GQVQgICAgICA0LjAvMS40 ICAgICAgIDUuMC8xLjcgICAgICAgIDYuMC8yLjAgICAgICA3LjAvMi4zICAgICAgIDguMC8y LjcKMC40ICAgICAgICAgNDQuNTAgNTMuNjUgICA0Ni4wMCA1My42NSAgIDQ3LjI1IDUzLjY1 ICAgNDcuMjUgNTMuNjUgICA0Ny4yNSA1My42NQowLjUgICAgICAgICA0Mi4wMCA1My4xNSAg IDQ0LjUwIDUzLjE1ICAgNDcuMjUgNTMuNjUgICA0Ny4yNSA1My42NSAgIDQ3LjI1IDUzLjY1 CjAuNiAgICAgICAgIDQyLjAwIDUyLjE1ICAgNDQuNTAgNTMuMTUgICA0Ni4wMCA1My4xNSAg IDQ3LjUwIDUzLjY1ICAgNDcuNzMgNTMuNjUKMC43ICAgICAgICAgNDIuMDAgNTAuOTAgICA0 Mi4wMCA1Mi4xNSAgIDQ0LjUwIDUyLjE1ICAgNDcuMjkgNTMuMTUgICA0Ny43MyA1My4xNQow LjggICAgICAgICA0MC4wMCA1MC45MCAgIDQyLjAwIDUwLjkwICAgNDQuNTAgNTIuMTUgICA0 Ni4wMCA1Mi4xNSAgIDQ3LjczIDUzLjE1CjAuOSAgICAgICAgIDQwLjAwIDQ4LjY1ICAgNDIu MDAgNDguNjUgICA0Mi4wMCA1MC45MCAgIDQ0LjUwIDUwLjkwICAgNDYuODAgNTIuMTUKMS4w ICAgICAgICAgMzkuMDAgNDcuNTggICA0MC4wMCA0OC42NSAgIDQyLjAwIDQ4LjY1ICAgNDQu NTAgNDguNjUgICA0Ni4wMCA1MC45MAoxLjEgICAgICAgICAzOC4wMCA0NS42NSAgIDQwLjAw IDQ3LjQwICAgNDIuMDAgNDcuNDAgICA0Mi4wMCA0OC42NSAgIDQzLjIwIDQ4Ljg4CjEuMiAg ICAgICAgIDM4LjAwIDQ1LjY1ICAgMzguNTkgNDUuNjUgICAzOC43MCA0Ni4wNiAgIDM4Ljcw IDQ3LjQwICAgMzguNzAgNDguNDEKMS40ICAgICAgICAgMzIuODUgNDIuNzcgICAzMi44NSA0 My43MSAgIDMyLjg1IDQ1LjEyICAgMzIuODUgNDYuMDYgICAzMi44NSA0Ny4wMAotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCgpDQVJDQVNTIKnwkj7TDAkAmgUAAJoFAAAAArOdAeQAB+kK FlwIAEUABYxPH0AAPwbqDkF6PSJBej0ouAUAFOQ+rqBZXfXzUBhhCBguAABXRUlHSFQgRElG RkVSRU5USUFMUwoKMTQ1IyAgIC0yNi41NCAgIC02LjUwICAgICAgICAgMTc1IyAgICAgMC4w MCAgICAgMC4wMCAgICAgICAyMDUjICAgICAwLjAwCjAuNDYKMTU1IyAgIC0xMC45OCAgIC0z LjUwICAgICAgICAgMTg1IyAgICAgMC4wMCAgICAgMC4wMCAgICAgICAyMTUjICAgIC0zLjAw CjAuNDYKMTY1IyAgICAtNS45NSAgICAwLjAwICAgICAgICAgMTk1IyAgICAgMC4wMCAgICAg MC4wMCAgICAgICAyMjUjICAgIC01LjAwCjAuMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQoKTWVhc3VyZW1lbnRzIEJhc2VkIG9uIFNsYXVnaHRlciBEYXRhIFN1Ym1pdHRlZDoKCjUg RGF5IFJvbGxpbmcgQXZlcmFnZSBNYXJrZXQgSG9nOiAxOTcuOTQgbGIgY2FyY2FzcywgcGxh bnQgZGVsaXZlcmVkCigwLjc0IGluY2ggYmFjay1mYXQsIDYuODEgc3F1YXJlIGluY2ggbG9p bi8yLjI3IGluY2ggbG9pbiBkZXB0aCkgRkZMSToKNTEuMzclCgpQcmljZSBSYW5nZSAkNDcu MjkgLSAkNTMuMTUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU09XUyAoUGxhbnQgRGVs aXZlcmVkKQoKU293cyBQdXJjaGFzZWQgKExpdmUgYW5kIENhcmNhc3MgQmFzaXMpOiA5ODQK CiAgICAgICAgICAgICAgV2VpZ2h0IFJhbmdlICAgSGVhZCBDb3VudCAgICBBdmcgV2VpZ2h0 ICAgIFByaWNlIFJhbmdlKiAgICBXdGQKQXZnCihMaXZlIEJhc2lzKSAgMzAwLTQ0OSBsYnMu ICAgICAgICAyOTMgICAgICAgIDQwMS42MCAgICAgIDIyLjAwLTI5LjA0CjI2LjA1CiAgICAg ICAgICAgICAgNDUwLTQ5OSBsYnMuICAgICAgICAzMzUgICAgICAgIDQ3MS4xNSAgICAgIDE0 LjUwLTI5Ljg2CjI1LjU3CiAgICAgICAgICAgICAgNTAwL3VwICBsYnMuICAgICAgICAzNTYg ICAgICAgIDU2Ni45OCAgICAgIDI5Ljg1LTMzLjM1CjMxLjYyCgoqUHJpY2UgbWF5IGluY2x1 ZGUgdHJhbnNwb3J0YXRpb24gY29zdHMuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpQ VVJDSEFTRSBBTEwgVFlQRVM6IEJZIFNUQVRFIE9GIE9SSUdJTgoKSW93YSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgNyw4NjIKS2Fuc2FzICAgICAgICAgICAgICAgICAgICAgICAg ICAgMiwyMzUKTWlubmVzb3RhICAgICAgICAgICAgICAgICAgICAgICAgNSw4MTAKTWlzc291 cmkgICAgICAgICAgICAgICAgICAgICAgICAgMiw2NDcKTmVicmFza2EgICAgICAgICAgICAg ICAgICAgICAgICAgMSw0MTQKU2+p8JI+PIcJADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo uHFAAH0GSCBBej0oQXo9IgAUuAVZXfXz5D6uoFAQ/Vwa7wAAqfCSPimJCQAsAgAALAIAAAAC s50B5AAH6QoWXAgARQACHk8gQAA/Bu17QXo9IkF6PSi4BQAU5D60BFld9fNQGWEI6fIAAHV0 aCBEYWtvdGEgICAgICAgICAgICAgICAgICAgICAgIDExNgotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCgpTb3VyY2U6ICAgICAgIFVTREEgTWFya2V0IE5ld3MsIERlcyBNb2luZXMsIElB CiAgICAgICAgICAgICAgNTE1LTI4NC00NDYwICAgIGVtYWlsOiAgZGVzbS5sZ21uQHVzZGEu Z292Cgp3d3cuYW1zLnVzZGEuZ292L21ucmVwb3J0cy9sbV9oZzIxMS50eHQgMTEwMEMKCi4K Ci4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGVtYWlsCiAgICBnaWx0cwogICAgaW93YQog ICAga2Fuc2FzCiAgICBtYXJrZXQKICAgIG1pbm5lc290YQogICAgbWlzc291cmkKICAgIG5l YnJhc2thCiAgICBwbGFudAogICAgc291dGgrZGFrb3RhCiAgICBzd2luZQogICAgdHJhbnNw b3J0YXRpb24KICAgIHVzZGEKICAgIE1FQVRPcmlnaW4gQXNzaWduZWRCeT0iT3N0ZXJEb3dK b25lcyIgLz5VU0RBCgqp8JI+nsAJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTyFAAD8G 73BBej0iQXo9KLdtABXd+kNaucgMDlAQYQiy3wAAAAAAAAAAqfCSPm/PCQA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLhyQAB9BkgfQXo9KEF6PSIAFLgFWV318+Q+tftQEP1cE5QAAKnw kj5e2wkANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4c0AAfQZIHkF6PShBej0iABS4BVld 9fPkPrX7UBH9XBOTAACp8JI+mdwJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoTyJAAD8G 729Bej0iQXo9KLgFABTkPrX7WV319FAQYQiv5wAAAAAAAAAAqfCSPhDrCQBwAAAAcAAAAAAC s50B5AAH6QoWXAgARQAAYjrFQAA/BgOTQXo9IkF6PSiVDxtYGIy2SnR6BCCAGBbQfoIAAAEB CAoNQ+TmAEIVoTI3OHwxNDcyNTM2fDEwNDk4MTcyNjF8MS4wfDF8MTIwM3xoZWxsbyB3b3Js ZAqp8JI+tfgJAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuHRAAH0GSAVBej0oQXo9IgAV t225yAwO3fpDWlAY+iBKsQAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KqfCSPqH/CQBQAAAA UAAAAAACs50B5AAH6QoWXAgARQAAQk8jQAA/Bu9UQXo9IkF6PSi3bQAV3fpDWrnIDCZQGGEI ps4AAERFTEUgMzYxOTk5MzEub3V0LjAzMDQwOA0KqfCSPjg9CgB8AAAAfAAAAAAH6QoWXAAC s50B5AgARQAAbrh1QAB9BkfWQXo9KEF6PSIAFbdtucgMJt36Q3RQGPoGlpIAADU1MCAzNjE5 OTkzMS5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNp ZmllZC4gDQqp8JI+ukgKAE8AAABPAAAAAAKznQHkAAfpChZcCABFAABBTyRAAD8G71RBej0i QXo9KLdtABXd+kN0ucgMbFAYYQga4AAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDYNCqnwkj4N gwoAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa4dkAAfQZH/UF6PShBej0iABW3bbnIDGzd +kONUBj57FxcAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQqp8JI+2IoKAFAAAABQ AAAAAAKznQHkAAfpChZcCABFAABCTyVAAD8G71JBej0iQXo9KLdtABXd+kONucgMilAYYQiU GwAAU1RPUiAzNjE5OTkzMS5vdXQuMDMwNDA4DQqp8JI+E8gKAHgAAAB4AAAAAAfpChZcAAKz nQHkCABFAABquHdAAH0GR9hBej0oQXo9IgAVt225yAyK3fpDp1AY+dIgVQAAMTUwIE9wZW5p bmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTkzMS5vdXQuMDMwNDA4 Lg0KqfCSPgbJCgA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLh4QAB9BkgRQXo9KEF6PSIA FLgGkIk+zwAAAABwAvrwA80AAAIEBWQBAQQCqfCSPqfKCgA+AAAAPgAAAAACs50B5AAH6QoW XAgARQAAME8mQAA/Bu9jQXo9IkF6PSi4BgAU5D/dOZCJPtBwEmEI29oAAAEBBAICBAW0qfCS PikDCwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLh5QAB9BkgYQXo9KEF6PSIAFLgGkIk+ 0OQ/3TpQEP1cbEoAAKnwkj6xCgsAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxPJ0AAPwbq BkF6PSJBej0ouAYAFOQ/3TqQiT7QUBBhCBTmAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3 MjQ1IE1OPTM2MTk5OTMxLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRl eCIgUEZOPSJCeSBHYXZpbiBNYWd1aXJlJiN4QTsiIFBGTj0iT3N0ZXJEb3dKb25lcyIgCgou Li4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBPREogTlkgUHJlY2lvdXMgTWV0YWxzIE1p ZGRheTogU2lsdmVyIFJhbGxpZXMsIEJhbGFuY2UgUXVpZXQKCi4uLiAgCSAKCkJ5TGluZS4u LiAgQnkgR2F2aW4gTWFndWlyZQoKCi4uLiAgCgpEYXRlTGluZS4uLiAgTmV3IFlvcmssIEFw ciAwOCwgMjAwMyAoT0RKIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4u LiAgQ29weXJpZ2h0IDIwMDMgT3N0ZXJEb3dKb25lcyBDb21tb2RpdHkgTmV3cyAoT0RKKS4g QWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpPc3RlckRvd0pvbmVzCgotLSBNYXkgU2ls dmVyIEhpdHMgMTYtRGF5IEhpZ2hzIE9mICQ0LjUzIE9uIFNob3J0IENvdmVyaW5nLCBCdXlp bmcgLS0KR29sZCBTdGF5cyBTdWJkdWVkOyBFeWVpbmcgRG9sbGFyLCBIZWFkbGluZXMgLS0g UGxhdGludW0gQ3JlZXBzIEhpZ2hlciBBcwpSZWNlbnQgU2VsbGluZyBXYW5lcwoKKE9zdGVy RG93Sm9uZXMpIC0gQ29tZXggTWF5IHNpbHZlciBmdXR1cmVzIHNjcmFtYmxlZCB0byAxNi1k YXkgaGlnaHMgb2YKJDQuNTMgcGVyIG91bmNlIFR1ZXNkYXkgbW9ybmluZyBvbiBzcGVjdWxh dGl2ZSBzaG9ydCBjb3ZlcmluZyBhbmQgdHJhZGUKYnV5aW5nIGFtaWQgYSBzY2FyY2Ugc2Vs bGVyIGVudmlyb25tZW50LgoKU291cmNlcyBzYWlkIHRoZSBmYWN0IHRoYXQgdGhlIHJlY2Vu dCBDb21taXRtZW50cyBvZiBUcmFkZXJzIFJlcG9ydApkZXRhaWxlZCB0aGUgbGFyZ2VzdCBu ZXQgc2hvcnQgc2lsdmVyIHBvc2l0aW9uIC0gMyw2ODAgY29udHJhY3RzIC0gc2luY2UKTm92 ZW1iZXIgMjAwMCB3YXMgY2l0ZWQgYXMgYSBtYWpvciBpc3N1ZSBkcml2aW5nIHRoZSBidXlp bmcgYW5kIHNob3J0CmNvdmVyaW5nLgoKVHJhZGl0aW9uYWxseSwgdGhlIGxhcmdlIHNwZWN1 bGF0aXZlIGNvbW11bml0eSBoYXMgYmVlbiByZWx1Y3RhbnQgdG8gaG9zdApoZWZ0eSBzaG9y dCBwb3NpdGlvbnMgZm9yIGxvbmcuIENvbnNpZGVyaW5nIHRoYXQgcHJpY2VzIGhhdmUgcmVj ZW50bHkKcGx1bWJlZCBkZXB0aHMgbmVhciBmaXZlLW1vbnRoIGxvd3MsIGRlYWxlcnMgc2Fp ZCB0aGF0IGEgcG9zaXRpdmUgYmlhcwp3YXMgbGlrZWx5IHRvIHRha2UgaG9sZCBvZiBwcmlj ZXMgb3ZlciB0aGUgbmVhciB0byBtZWRpdW0gdGVybS4KCkhvd2V2ZXIsIG1hbnkgd2VyZSB1 bnN1cmUgb2YgdGhlIHRpbWluZyBvZiBhbnkgdHVybiBoaWdoZXIgZ2l2ZW4gdGhlCmNvbnRp bnVpbmep8JI+KAsLAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTyhAAD8G6gVBej0iQXo9 KLgGABTkP+KekIk+0FAYYQhX3gAAIHVuY2VydGFpbnR5IG9uIHRoZSBnZW9wb2xpdGljYWwg YW5kIGVjb25vbWljIGxhbmRzY2FwZXMuIFNvbWUKc291cmNlcyBzYWlkIHRoZXkgZXhwZWN0 ZWQgYSBib3V0IG9mIGNvbnNvbGlkYXRpb24gaW4gYSAkNC4zMC0kNC41MCByYW5nZQpiZWZv cmUgYW55IHN0cmVuZ3RoIHdhcyBzZWVuLgoKQnV0LCB3aXRoIHRoZSBVUyBkb2xsYXIgZWFz aW5nIHNsaWdodGx5IG92ZXJuaWdodCBhbmQgZ2xvYmFsIGVxdWl0eQptYXJrZXRzIHRyaW1t aW5nIHJlY2VudCBnYWlucywgdGhlIGRyaXZlIGJ5IHNvbWUgcGxheWVycyB0byB0YWtlIHBy b2ZpdHMKaW4gc2lsdmVyIGJ5IGNvdmVyaW5nIHNob3J0IHBvc2l0aW9ucyB3YXMgInVuZGVy c3RhbmRhYmxlLCIgYWNjb3JkaW5nIHRvCmEgZmxvb3IgZGVhbGVyLgoKIkl0IHdhcyBnb2lu ZyB0byBoYXBwZW4gc29vbmVyIG9yIGxhdGVyLCBhbmQgdGhlIHdlYWtlciBkb2xsYXIgYW5k IHN0b2NrCm1hcmtldHMgcHJvdmVkIHRvIGJlIHRoZSBjb25kaXRpb25zICh0aGUgbmV0LXNo b3J0IGZ1bmRzKSB3ZXJlIGxvb2tpbmcKZm9yIHRvIGNvdmVyIHRob3NlIHNob3J0cyBhbmQg dGFrZSBwcm9maXRzLiBJdCdzIHVuZGVyc3RhbmRhYmxlLCBzZW5zaWJsZQpiZWhhdmlvciwg cmVhbGx5LCIgaGUgc2FpZC4KClJlZ2FyZGxlc3Mgb2YgdGhlIGdhaW5zIG1hZGUgVHVlc2Rh eSwgc291cmNlcyBhZ3JlZWQgdGhhdCBmdXJ0aGVyIGdhaW5zCndlcmUgbGlrZWx5IHRvIGJl IGRpZmZpY3VsdCB0byBjb21lIGJ5IHdoaWxlIGdvbGQgcmVtYWluZWQgc3ViZHVlZC4KCkFz IGEgcmVzdWx0LCByZXNpc3RhbmNlIGFyb3VuZCAkNC41My0kNC41NSBpcyBzZWVuIGFzIGFj dGluZyBhcyBhIGxpZCBvbgpzaWx2ZXIgcHJpY2VzIG92ZXIgdGhlIHNob3J0IHRlcm0uCgpT dXBwb3J0IGlzIHNlZW4gYXQgJDQuNDAgaW5pdGlhbGx5IGFuZCB0aGVuIGFyb3VuZCAkNC4z NS4KCkp1biBnb2xkIGZ1dHVyZXMgd2VyZSB1bmFibGUgdG8gZ2xlYW4gbXVjaCBzdHJlbmd0 aCBmcm9tIHNpbHZlcidzIHN1cmdlCmFuZCBrZXB0IGJlbG93IHRoZSAkMzI1IGxldmVsIHRo cm91Z2hvdXQuCgpIb3dldmVyLCBwcmljZXMgZGlkIG1hbmFnZSB0byBob2xkIGFib3ZlIE1v bmRheSdzIGxvd3Mgb2YgJDMyMC4xMCB0aHJvdWdoCnN0ZWFkeSBwaHlzaWNhbCBpbnRlcmVz dCBhcm91bmQgJDMyMSB0aHJvdWdob3V0LgoKSnVuIGlzIGV4cGVjdGVkIHRvIGNyYXdsIG1h aW5seSBzaWRld2F5cyBpbiBhICQzMjEtJDMyNSByYW5nZSBmb3IgdGhlCm5lYXIgdGVybSB3 aGlsZSBhbGwgZXllcyByZW1haW4gb24gdGhlIG5ld3MgaGVhZGxpbmVzIGFuZCBvbiB0aGUg VVMKZG9sbGFyIGFuZCBzdG9jayBtYXJrZXRzLgoKTnltZXggSmx5IHBsYXRpbnVtIGhlqfCS PocLCwB7BAAAewQAAAACs50B5AAH6QoWXAgARQAEbU8pQAA/BusjQXo9IkF6PSi4BgAU5D/o ApCJPtBQGGEI1QkAAGxkIHVwIGluIGEgJDYwMC0kNjA4IHJhbmdlIG5lYXIgcmVjZW50IGxv d3MgaW4gdmVyeQpxdWlldCBjb25kaXRpb25zLgoKUHJpY2VzIG1heSBoYXZlIHNlZW4gdGhl aXIgbG93cyBmb3IgdGhlIGN1cnJlbnQgY3ljbGUgYW5kIHdlcmUgbm93CnBvdGVudGlhbGx5 IHNldCB0byBncmluZCBoaWdoZXIgaW4gdGhlIGNvbWluZyBkYXlzIGFuZCB3ZWVrcyBiZWNh dXNlIG9mCnBsYXRpbnVtJ3MgZmFpcmx5IGRlY2VudCBkZW1hbmQgcHJvc3BlY3RzLCBkZWFs ZXJzIHNhaWQuCgpIb3dldmVyLCBtdWNoIGRlcGVuZHMgb24gdGhlIHRpbWluZyBhbmQgYXBw ZXRpdGUgb2YgQ2hpbmVzZSBjb25zdW1lcnMuClNvbWUgZnVydGhlciB0ZWNobmljYWwgZnVu ZCBzZWxsaW5nIHdhcyBhbGxvd2VkIGZvciBieSBzb21lIGRlYWxlcnMgb3Zlcgp0aGUgbmV4 dCBmZXcgZGF5cy4KCkdvb2Qgc3VwcG9ydCwgaG93ZXZlciwgd2FzIGV4cGVjdGVkIGF0ICQ1 OTAuCgpKdW4gcGFsbGFkaXVtIGhvdmVyZWQgbmVhciByZWNlbnQgbG93cyBpbiBhICQxNjku NTAtJDE3Ny4wMCByYW5nZS4gQXMKcGFsbGFkaXVtJ3MgZGVtYW5kIG91dGxvb2sgaXMgbGVz cyByZWFzc3VyaW5nIHRoYXQgcGxhdGludW0ncywgZnVydGhlcgpwcmljZSB3ZWFrbmVzcyBp cyBleHBlY3RlZCBvdmVyIHRoZSBuZWFyIHRvIG1lZGl1bSB0ZXJtLgoKRG93bnNpZGUgdGFy Z2V0cyBpbmNsdWRlICQxNjAgYW5kICQxNTAsIGRlYWxlcnMgc2FpZC4KCi0tLSBHYXZpbiBN YWd1aXJlLCBPc3RlckRvd0pvbmVzLCAoNjQ2KSAzNjQtMDk1OSBtZXRhbHNAb3N0ZXJkb3dq b25lcy5jb20KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGNvbWV4CiAgICBjb21tdW5p dHkKICAgIGRlYWxlcgogICAgZG9sbGFyCiAgICBlbnZpcm9ubWVudAogICAgZXF1aXR5CiAg ICBmdXR1cmVzCiAgICBnb2xkCiAgICBtZXRhbHMKICAgIG5ld195b3JrCiAgICBueW1leAog ICAgcGFsbGFkaXVtCiAgICBwbGF0aW51bQogICAgcHJlY2lvdXMrbWV0YWxzCiAgICBwcmlj ZXMKICAgIHNpbHZlcgogICAgdHJhZGUKICAgIENPTU1FTlRTT3JpZ2luIEFzc2lnbmVkQnk9 Ik9zdGVyRG93Sm9uZXMiIC8+TUVUQUxTCgqp8JI+iAsLADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoTypAAD8G72dBej0iQXo9KLgGABTkP+xHkIk+0FARYQj5kAAAAAAAAAAAqfCSPoOF CwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLh6QAB9BkgXQXo9KEF6PSIAFLgGkIk+0OQ/ 6AJQEP1cYYIAAKnwkj5HnAsANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4e0AAfQZIFkF6 PShBej0iABS4BpCJPtDkP+xIUBD5F2GBAACp8JI+jjEMADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoTytAAD8G72ZBej0iQXo9KLdtABXd+kOnucgMzFAQYQix1AAAAAAAAAAAqfCSPuta DAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLh8QAB9BkgVQXo9KEF6PSIAFLgGkIk+0OQ/ 7EhQEfkXYYAAAKnwkj7+WwwAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChPLEAAPwbvZUF6 PSJBej0ouAYAFOQ/7EiQiT7RUBBhCPmPAAAAAAAAAACp8JI+2GkMAE4AAABOAAAAAAfpChZc AAKznQHkCABFAABAuH1AAH0GR/xBej0oQXo9IgAVt225yAzM3fpDp1AY+dJJ9AAAMjI2IFRy YW5zZmVyIGNvbXBsZXRlLg0KqfCSPhJxDABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk8t QAA/Bu9KQXo9IkF6PSi3bQAV3fpDp7nIDORQGGEIpMMAAERFTEUgMzYxOTk5MzIub3V0LjAz MDQwOA0KqfCSPrOuDAB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrh+QAB9BkfNQXo9KEF6 PSIAFbdtucgM5N36Q8FQGPm4ldQAADU1MCAzNjE5OTkzMi5vdXQuMDMwNDA4OiBUaGUgc3lz dGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQqp8JI+NLoMAE8AAABPAAAA AAKznQHkAAfpChZcCABFAABBTy5AAD8G70pBej0iQXo9KLdtABXd+kPBucgNKlAYYQgY1QAA UE9SVCA2NSwxMjIsNjEsMzQsMTg0LDcNCqnwkj7f9AwAVAAAAFQAAAAAB+kKFlwAArOdAeQI AEUAAEa4f0AAfQZH9EF6PShBej0iABW3bbnIDSrd+kPaUBj5nlufAAAyMDAgUE9SVCBjb21t YW5kIHN1Y2Nlc3NmdWwuDQqp8JI+BPgMAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCTy9A AD8G70hBej0iQXo9KLdtABXd+kPaucgNSFAYYQiSEAAAU1RPUiAzNjE5OTkzMi5vdXQuMDMw NDA4DQqp8JI+2PgMAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0laZAAH0Gat9Bej0oQXo9 IhtYlQ90egQgGIy2eIAQ5bWTrQAAAQEICgBCFakNQ+TmqfCSPjv6DABwAAAAcAAAAAACs50B 5AAH6QoWXAgARQAAYjrGQAA/BgOSQXo9IkF6PSiVDxtYGIy2eHR6BCCAGBbQfTMAAAEBCAoN Q+T6AEIVqTI3OXwxNDcyNTM3fDEwNDk4MTcyNjF8MS4wfDF8MjQ0MHxoZWxsbyB3b3JsZAqp 8JI+gVINAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquIBAAH0GR89Bej0oQXo9IgAVt225 yA1I3fpD9FAY+YQflwAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9u IGZvciAzNjE5OTkzMi5vdXQuMDMwNDA4Lg0KqfCSPiXKDQA+AAAAPgAAAAAH6QoWXAACs50B 5AgARQAAMLiBQAB9BkgIQXo9KEF6PSIAFLgHVskpjgAAAABwAvrwUs0AAAIEBWQBAQQCqfCS PsTLDQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME8wQAA/Bu9ZQXo9IkF6PSi4BwAU5EKd LlbJKY9wEmEIauMAAAEBBAICBAW0qfCSPqcDDgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLiCQAB9BkgPQXo9KEF6PSIAFLgHVskpj+RCnS9QEP1c+1IAAKnwkj5cCw4AmgUAAJoFAAAA ArOdAeQAB+kKFlwIAEUABYxPMUAAPwbp/EF6PSJBej0ouAcAFORCnS9WySmPUBBhCOlmAABY WVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MjQ2IE1OPTM2MTk5OTMyLm91dCBTUkM9Y29tdGV4 IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJNMiIgCgouLi4gIAoKCi4uLiAJIAoK CkhlYWRMaW5lLi4uICBVSyBHb3Zlcm5tZW50OiBOZXcgcmVndWxhdGlvbnMgb2ZmZXIgZGly ZWN0IHBheW1lbnRzIHRvIGFsbCBpbiBuZWVkCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4u ICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKE0yIFBSRVNTV0lSRSB2aWEgQ09NVEVY KSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIChDKTE5OTQtMjAwMyBNMiBDT01NVU5J Q0FUSU9OUyBMVEQKCgouLi4KCgpNMgoKVm9sdW50YXJ5IGFuZCBjb21tdW5pdHkgZ3JvdXBz IHRvIGpvaW4gd2l0aCBjb3VuY2lscyBpbiBpbXByb3ZpbmcgYWNjZXNzCmFuZCBzdXBwb3J0 IEhlYWx0aCBNaW5pc3RlciwgSmFjcXVpIFNtaXRoLCB0b2RheSBhbm5vdW5jZWQgaW1wb3J0 YW50IG5ldwpyZWd1bGF0aW9ucyByZXF1aXJpbmcgYWxsIGNvdW5jaWxzIHRvIG9mZmVyIGRp cmVjdCBwYXltZW50cyAoY2FzaCBpbiBsaWV1Cm9mIHNvY2lhbCBzZXJ2aWNlcykgYXMgYW4g YWx0ZXJuYXRpdmUgdG8gZXhpc3Rpbmcgc2VydmljZXMgYXJyYW5nZWQgYnkKbG9jYWwgY291 bmNpbHMuCgpKYWNxdWkgU21pdGggc2FpZDogIkRpcmVjdCBwYXltZW50cyBhcmUgYW4gaW1w b3J0YW50IHZlaGljbGUgZm9yIHRoZQpwcm9tb3Rpb24gb2YgaW5kZXBlbmRlbmNlIGFuZCBj aG9pY2UgZm9yIGFkdWx0cyB1c2luZyBzb2NpYWwgc2VydmljZXMuClJlcXVpcmluZyBjb3Vu Y2lscyB0byBvZmZlciBkaXJlY3QgcGF5bWVudHMgaXMgYSBrZXkgc3RlcCBpbiBvdXIKY29u dGludWluZyBjb21taXRtZW50IHRvIHByb21vdGluZyBpbmRlcGVuZGVuY2UgYW5kIGZyZWVk b20gb2YgY2hvaWNlLiBJdAppcyBwYXJ0IG9mIGEgZGV0ZXJtaW5lZCBzaGlmdCBpbiBmb2N1 cyBhbmQgcG93ZXIgdG8gaW5kaXZpZHVhbHMuCgoiRGlyZWN0IHBheW1lbnRzIGdpdmUgcGVv cGxlIHRoZSBtZWFucyB0byBtYWtlIHRoZSBkYXkgdG8gZGF5IGRlY2lzaW9ucwp0byBiZXN0 IGZ1bGZpbCB0aGVpciBpbmRpdmlkdWFsIG5lZWRzLiBIYXZpbmcgdGhlIGNob2ljZSB3aWxs IGVuYWJsZQpwZW9wbGUgdG8gcHVyY2hhc2UgdGhlIGxldmVsIGFuZCB0eXBlIG9mIGNhcmUg dGhleSByZXF1aXJlLCBhcyB3ZWxsIGFzCnRoZSBmcmVlZG9tIHRvIGJ1eSBlcXVpcG1lbnQg YW5kIHNlcnZpY2VzLCB3aGljaCBtZWV0IHRoZWlyIGluZGl2aWR1YWwKY2lyY3Vtc3RhbmNl cyBhbmQgcHJvbW90ZSBhIGJldHRlciBxdWFsaXR5IG9mIGxpZmUuCgoiRXZlcnlvbmUgZGVz ZXJ2ZXMgdGhlIHJpZ2h0IHRvIGxlYWQgYSBkaWep8JI+1gsOAJoFAACaBQAAAAKznQHkAAfp ChZcCABFAAWMTzJAAD8G6ftBej0iQXo9KLgHABTkQqKTVskpj1AYYQh9GgAAbmlmaWVkIGFu ZCBpbmRlcGVuZGVudCBsaWZlLAphbmQgdG8gYmUgYWJsZSB0byByZW1haW4gaW4gdGhlaXIg b3duIGhvbWUgZm9yIGFzIGxvbmcgYXMgdGhleSB3aXNoLgpUaGVzZSBuZXcgcmVndWxhdGlv bnMgYW5kIGltcHJvdmVkIHN1cHBvcnQgbmV0d29ya3Mgd2lsbCBlbmFibGUgdGhpcy4iCkFj Y2VzcyB0byBkaXJlY3QgcGF5bWVudHMgZ2l2ZSBpbmRpdmlkdWFscyBncmVhdGVyIGNob2lj ZSBhbmQgY29udHJvbApvdmVyIGhvdyB0aGVpciBzdXBwb3J0IG5lZWRzIGFyZSBtZXQuIFBv cHVsYXIgd2l0aCBwZW9wbGUgbmVlZGluZyBzb2NpYWwKc2VydmljZXMsIGFuIGV4cGFuZGlu ZyBib2R5IG9mIHJlc2VhcmNoIHNob3dzIHRoZXkgaW1wcm92ZSB0aGUgcXVhbGl0eSBvZgps aWZlIGZvciB0aG9zZSB3aG8gaGF2ZSBhY2Nlc3MgdG8gdGhlbS4gSW5kaXZpZHVhbHMgY2Fu IG1ha2UgbW9yZQpzdWl0YWJsZSBhcnJhbmdlbWVudHMgdG8gbWVldCB0aGVpciBuZWVkcyBh bmQgdGhpcyBlbmFibGVzIHRoZW0gdG8gcmVtYWluCmluIGdvb2QgaGVhbHRoIGZvciBsb25n ZXIuCgpEaXJlY3QgcGF5bWVudHMgY2FuIGJlbmVmaXQgYSB3aG9sZSByYW5nZSBvZiBwZW9w bGUgYW5kIG1ha2luZyB0aGVtIG1vcmUKYWNjZXNzaWJsZSBpcyB2aXRhbC4gRm9yIGV4YW1w bGUsIGRlc3BpdGUgb2xkZXIgcGVvcGxlIGJlaW5nIHRoZSBsYXJnZXN0CnNpbmdsZSBncm91 cCBvZiBwZW9wbGUgbmVlZGluZyBjb21tdW5pdHkgY2FyZSB3ZSBrbm93IHRoZXkgYXJlIGxl c3MKbGlrZWx5IHRvIGhhdmUgZGlyZWN0IHBheW1lbnRzIHRoYW4gYW55IG90aGVyIGdyb3Vw LiBUaGVzZSBuZXcKcmVndWxhdGlvbnMgd2lsbCBoZWxwIGltcHJvdmUgdGhlIHRha2UtdXAg b2YgZGlyZWN0IHBheW1lbnRzLCBub3QganVzdCBieQp0aGVzZSBvbGRlciBwZW9wbGUsIGJ1 dCBmb3IgZXZlcnkgZ3JvdXAgaW4gbmVlZC4KCkV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQg YSBzdHJvbmcgc3VwcG9ydCBuZXR3b3JrIGlzIGZ1bmRhbWVudGFsIHRvIGEKc3VjY2Vzc2Z1 bCBzY2hlbWUsIGFuZCB0aGVzZSBoYXZlIGJlZW4gbW9zdCBjb21tb25seSBwcm92aWRlZCBi eSB0aGUKdm9sdW50YXJ5IHNlY3RvciwgaW4gcGFydGljdWxhciB0aG9zZSBsZWQgYnkgZGlz YWJsZWQgcGVvcGxlLgoKV2l0aCB0aGlzIHZpdGFsIGNvbnRyaWJ1dGlvbiBwbGF5ZWQgYnkg dGhlIHZvbHVudGFyeSBzZWN0b3IgaW4gbWluZCwKSGVhbHRoIFNlY3JldGFyeSwgQWxhbiBN aWxidXJuIGxhc3QgeWVhciBhbm5vdW5jZWQgdGhlIGVzdGFibGlzaG1lbnQgb2YKdGhlIERp cmVjdCBQYXltZW50cyBEZXZlbG9wbWVudCBGdW5kLCB3aGljaCB3aWxsIGJlIG1hZGUgYXZh aWxhYmxlIGZvcgppbnZlc3RtZW50qfCSPkkMDgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAF jE8zQAA/Bun6QXo9IkF6PSi4BwAU5EKn91bJKY9QGGEIMG8AACBpbiBkaXJlY3QgcGF5bWVu dHMgc3VwcG9ydCBzZXJ2aWNlcy4gVGhpcyBtb25leSAoR0JQMyBtaWxsaW9uCnBlciBhbm51 bSBvdmVyIHRoZSBuZXh0IDMgZmluYW5jaWFsIHllYXJzKSB3aWxsIGJlIHRhcmdldGVkIGF0 IG5hdGlvbmFsLApyZWdpb25hbCBhbmQgbG9jYWwgdm9sdW50YXJ5IG9yZ2FuaXNhdGlvbnMs IGluIHBhcnRuZXJzaGlwIHdpdGggbG9jYWwKY291bmNpbHMsIHRvIGVuYWJsZSB0aGVtIHRv IHBsYXkgYSBzaWduaWZpY2FudCByb2xlIGluIHRoZSBkZXZlbG9wbWVudAphbmQgcHJvbW90 aW9uIG9mIGRpcmVjdCBwYXltZW50cy4KCk5vdGVzIHRvIGVkaXRvcnMKCjEuIERpcmVjdCBw YXltZW50cyAoY2FzaCBpbiBsaWV1IG9mIHNvY2lhbCBzZXJ2aWNlcykgZm9yIGFkdWx0cyBv Zgp3b3JraW5nIGFnZSB3ZXJlIGludHJvZHVjZWQgaW4gQXByaWwgMTk5NywgdGhyb3VnaCB0 aGUgQ29tbXVuaXR5IENhcmUKKERpcmVjdCBQYXltZW50cykgQWN0IDE5OTYuIFRoZXkgd2Vy ZSBleHRlbmRlZCB0byBvbGRlciBkaXNhYmxlZCBwZW9wbGUKaW4gMjAwMC4gU2luY2UgQXBy aWwgMjAwMSAoQ2FyZXJzICYgRGlzYWJsZWQgQ2hpbGRyZW4ncyBBY3QgMjAwMCkgRGlyZWN0 ClBheW1lbnRzIGhhdmUgYmVlbiBhdmFpbGFibGUgdG8gY2FyZXJzLgoKMi4gVGhlIG5ldyBy ZWd1bGF0aW9ucyB3aWxsIGNvbWUgaW50byBmb3JjZSBvbiA4IEFwcmlsIDIwMDMgd2hpY2gg d2lsbApyZXF1aXJlIGNvdW5jaWxzIHRvIG1ha2UgZGlyZWN0IHBheW1lbnRzIHRvIHBlb3Bs ZSB3aG8gaGF2ZSBhbiBhc3Nlc3NlZApuZWVkIGFuZCBhcmUgYWJsZSB0byBtYW5hZ2UgdGhl bSAoYWxvbmUgb3Igd2l0aCBhc3Npc3RhbmNlKS4KCjMuIE1vc3QgcGVvcGxlIGluIHJlY2Vp cHQgb2Ygc29jaWFsIHNlcnZpY2VzIGZyb20gdGhlIGNvdW5jaWwgYXJlCmVsaWdpYmxlIGZv ciBhIGRpcmVjdCBwYXltZW50LiBNb3JlIHNwZWNpZmljYWxseSB0aGUgZm9sbG93aW5nIGdy b3VwcyBvZgpwZW9wbGUgY2FuIHJlY2VpdmUgZGlyZWN0IHBheW1lbnRzOiAtIG9sZGVyIHBl b3BsZSB3aG8gaGF2ZSBiZWVuIGFzc2Vzc2VkCmFzIG5lZWRpbmcgY29tbXVuaXR5IGNhcmUg c2VydmljZXMgLSBkaXNhYmxlZCBwZW9wbGUgYWdlZCAxNiBhbmQgb3ZlcgppbmNsdWRpbmcg cGVvcGxlIHdpdGggc2hvcnQgYXMgd2VsbCBhcyBsb25nIHRlcm0gbmVlZHMgLSBjYXJlcnMg aW4gcGxhY2UKb2YgY2FyZXJzJyBzZXJ2aWNlcyAtIGZhbWlsaWVzIHdpdGggZGlzYWJsZWQg Y2hpbGRyZW4gZm9yIGNoaWxkcmVuJ3MKc2VydmljZXMgZGlzYWJsZWQgcGFyZW50cyBmb3Ig Y2hpbGRyZW4ncyBzZXJ2aWNlcwoKNC4gVGhlIERIIHdpbGwgc29vbiBiZSBzZWVraW5nIGJp ZHMgZnJvbSBWb2x1bqnwkj7ihQ4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4g0AAfQZI DkF6PShBej0iABS4B1bJKY/kQqf3UBD9XPCKAACp8JI+kIgOAEoDAABKAwAAAAKznQHkAAfp ChZcCABFAAM8TzRAAD8G7ElBej0iQXo9KLgHABTkQq1bVskpj1AZYQh5fwAAdGFyeSBPcmdh bmlzYXRpb25zIGluCnBhcnRuZXJzaGlwIHdpdGggTG9jYWwgQXV0aG9yaXRpZXMsIGZvciBw cm9qZWN0cyB0byBzdXBwb3J0IHRoZSBleHBhbnNpb24Kb2YgYWNjZXNzIHRvIERpcmVjdCBQ YXltZW50cy4gQSBjb21wcmVoZW5zaXZlIFBvbGljeSBhbmQgUHJhY3RpY2UKZ3VpZGFuY2Ug YW5kIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gY3JpdGVyaWEgZm9yIGJpZHMgd2lsbCBiZSBh dmFpbGFibGUKYXQ6IHd3dy5kb2guZ292LnVrL2RpcmVjdHBheW1lbnRzIC0gYnkgZW5kIG9m IEFwcmlsLgoKQ09OVEFDVDogUHVibGljIGVucXVpcmllcyBUZWw6ICs0NCAoMCkyMCA3MjEw IDQ4NTAKCk0yIENvbW11bmljYXRpb25zIEx0ZCBkaXNjbGFpbXMgYWxsIGxpYWJpbGl0eSBm b3IgaW5mb3JtYXRpb24gcHJvdmlkZWQKd2l0aGluIE0yIFByZXNzV0lSRS4gRGF0YSBzdXBw bGllZCBieSBuYW1lZCBwYXJ0eS9wYXJ0aWVzLiBGdXJ0aGVyCmluZm9ybWF0aW9uIG9uIE0y IFByZXNzV0lSRSBjYW4gYmUgb2J0YWluZWQgYXQgaHR0cDovL3d3dy5wcmVzc3dpcmUubmV0 Cm9uIHRoZSB3b3JsZCB3aWRlIHdlYi4gSW5xdWlyaWVzIHRvIGluZm9AbTIuY29tLgoKLi4u ICAJIAoKS2V5V29yZHMuLi4gIAogICAgY2hpbGRyZW4KICAgIGNvbW11bml0eQogICAgZWRp dG9ycwogICAgZ292ZXJubWVudAogICAgaGVhbHRoCiAgICBpbnZlc3RtZW50CiAgICBsb2Nh bAogICAgbW9uZXkKICAgIHBhcnRuZXJzaGlwCiAgICBwb2xpY3kKICAgIHJlZ3VsYXRpb25z CiAgICByZXNlYXJjaAogICAgd2ViCgqp8JI+oskOADwAAAA8AAAAAAKznQHkAAfpChZcCABF AAAoTzVAAD8G71xBej0iQXo9KLdtABXd+kP0ucgNilAQYQiwyQAAAAAAAAAAqfCSPrDWDgA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLiEQAB9BkgNQXo9KEF6PSIAFLgHVskpj+RCsHBQ EP1c6BEAAKnwkj7L4w4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4hUAAfQZIDEF6PShB ej0iABS4B1bJKY/kQrBwUBH9XOgQAACp8JI+8+QOADwAAAA8AAAAAAKznQHkAAfpChZcCABF AAAoTzZAAD8G71tBej0iQXo9KLgHABTkQrBwVskpkFAQYQiEZQAAAAAAAAAAqfCSPs0BDwBO AAAATgAAAAAH6QoWXAACs50B5AgARQAAQLiGQAB9BkfzQXo9KEF6PSIAFbdtucgNit36Q/RQ GPmESTcAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCqnwkj6KCQ8AUAAAAFAAAAAAArOdAeQA B+kKFlwIAEUAAEJPN0AAPwbvQEF6PSJBej0ot20AFd36Q/S5yA2iUBhhCKC6AABERUxFIDM2 MTk5OTE1Lm91dC4wMzA0MDgNCqrwkj77AwAAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG64 h0AAfQZHxEF6PShBej0iABW3bbnIDaLd+kQOUBj5apcUAAA1NTAgMzYxOTk5MTUub3V0LjAz MDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KqvCS PqkPAABPAAAATwAAAAACs50B5AAH6QoWXAgARQAAQU84QAA/Bu9AQXo9IkF6PSi3bQAV3fpE DrnIDehQGGEIFsoAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCw4DQqq8JI+mEkAAFQAAABUAAAA AAfpChZcAAKznQHkCABFAABGuIhAAH0GR+tBej0oQXo9IgAVt225yA3o3fpEJ1AY+VBa4gAA MjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KqvCSPjtNAABQAAAAUAAAAAACs50B5AAH 6QoWXAgARQAAQk85QAA/Bu8+QXo9IkF6PSi3bQAV3fpEJ7nIDgZQGGEIjgcAAFNUT1IgMzYx OTk5MTUub3V0LjAzMDQwOA0KqvCSPomKAAB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAariJ QAB9BkfGQXo9KEF6PSIAFbdtucgOBt36REFQGPk2INcAADE1MCBPcGVuaW5nIEJJTkFSWSBt b2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5MTUub3V0LjAzMDQwOC4NCqrwkj6eiwAA PgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC4ikAAfQZH/0F6PShBej0iABS4CHFtgjUAAAAA cAL68N+AAAACBAVkAQEEAqrwkj46jQAAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBPOkAA PwbvT0F6PSJBej0ouAgAFORGcKhxbYI2cBJhCCQZAAABAQQCAgQFtKrwkj5TxQAANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi4i0AAfQZIBkF6PShBej0iABS4CHFtgjbkRnCpUBD9XLSI AACq8JI+ycwAAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMTztAAD8G6fJBej0iQXo9KLgI ABTkRnCpcW2CNlAQYQh5wQAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzIxMSBNTj0zNjE5 OTkxNS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iT3N0 ZXJEb3dKb25lcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBPREogVVNEQSBJ b3dhL01pbm4gRGFpbHkgV3RnIEF2ZyBEaXJlY3QgQ2F0dGxlIE5lZyBTYWxlcyAtIEFwciA4 CgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIw MDMgKE9ESiB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHly aWdodCAyMDAzIE9zdGVyRG93Sm9uZXMgQ29tbW9kaXR5IE5ld3MgKE9ESikuIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCgoKLi4uCgoKT3N0ZXJEb3dKb25lcwoKTE1fQ1QxMjkKU3QgSm9zZXBo LCBNTyAgICBUdWUgQXByIDgsIDIwMDMgICAgIFVTREEgTWFya2V0IE5ld3MKCklPV0EvTUlO TkVTT1RBIERBSUxZIFdFSUdIVEVEIEFWRVJBR0UgQ0FUVExFIFJFUE9SVCAtIE5FR09USUFU RUQKUFVSQ0hBU0VTIFJlY2FwIGZvcjogTW9uZGF5IDQvNy8wMwoKQ29uZmlybWVkOiAgICAg ICAgMzc5ICAgICAgICAgV2VlayBBZ286ICAgICAgIDY4NCAgICAgICAgTGFzdCBZZWFyOiAg ICAgMSwyMTEKV2VlayB0byBEYXRlOiAgICAgMzc5ICAgICAgICAgV2VlayBBZ286ICAgICAg IDY4NCAgICAgICAgTGFzdCBZZWFyOiAgICAgMSwyMTEKCkxJVkUgRk9CIEJBU0lTIC0gQmVl ZiBCcmVlZHMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWQgICAgICBXZWlnaHQg ICAgIFd0ZCBBdmcgICAgIFByaWNlICAgICAgIFd0ZCBBdmcKICAgICAgICAgICAgICAgICAg ICAgICAgICAgQ291bnQgICAgIFJhbmdlICAgICAgV2VpZ2h0ICAgICAgUmFuZ2UgICAgICAg UHJpY2UKU1RFRVJTCiBPdmVyIDgwJSBDaG9pY2UgICAgICAgICAgICAgICAgICAgICAgIC0g ICAgICAgICAgICAgICAgICAgICAgLQogNjUgLSA4MCUgQ2hvaWNlICAgICAgICAgICAgICAg ICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgIC0KIDM1IC0gNjUlIENob2ljZSAgICAg ICAgICAgICAgICAgICAgICAgLSAgICAgICAgICBYWDJBMDAKS0VZV09SRFM6IEZTTjA2ODUz IEFPVEMgTUVBVCBVU0RBCgpPREogVVNEQSBOYXRsIERhaWx5IERpcmVjdCBIb2dzLUFNIC0g QXByIDgKCkxNX0hHMjAyCkRlcyBNb2luZXMsIElvd2EgICAgICAgICAgICAgICAgVHVlLCBB cHIgMDgsIDIwMDMgICAgICAgICAgICAgICBVU0RBIE1hcmtldApOZXdzCgpOQVRJT05BTCBE QUlMWSBESVJFQ1QgSE9HUyBQTEFOVCBERUxJVkVSRUQgTW9ybmluZywgVHVlc2RheSwgQXBy aWwgOCwKMjAwMyAoQXMgb2YgOTozMCBBTSkKCkNVUlJFTlQgVk9MVU1FIEJZIFBVqvCSPj/N AACaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE88QAA/BunxQXo9IkF6PSi4CAAU5EZ2DXFt gjZQGGEIoXwAAFJDSEFTRSBUWVBFCgpMSVZFIEFORCBDQVJDQVNTIEJBU0lTCgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRlZCAgICAgQWN0dWFsICAg ICBBY3R1YWwKQWN0dWFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFRvZGF5ICAgICAgVG9kYXkgICBXZWVrIEFnbyAgIFllYXIKQWdvClByb2R1Y2VyIFNv bGQ6CiAgTmVnb3RpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsNTkxICAg ICAxNSwxMTYgICAgIDE4LDU4NQogIE90aGVyIE1hcmtldCBGb3JtdWxhICAgICAgICAgICAg ICAgICAgICA3LDQ2OCAgICAgIDEsMjU2ICAgICAgOCwyMTcKICBTd2luZSBvciBQb3JrIE1h cmtldCBGb3JtdWxhICAgICAgICAgIDE0NSwzMzMgICAgIDE1LDAzMiAgICAgMTIsMTMwCiAg T3RoZXIgUHVyY2hhc2UgQXJyYW5nZW1lbnQgICAgICAgICAgICAgMzMsNDA5ICAgICAxMCwz NDUgICAgIDEwLDk4NwpQYWNrZXIgU29sZCAoQWxsIFB1cmNoYXNlIFR5cGVzKTogICAgICAg ICA2LDczOSAgICAgICAgNjI3ICAgICAgMSwwOTkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQoKTkVHT1RJQVRFRCBQVVJDSEFTRQoKKEluY2x1ZGluZyBQYWNrZXItc29sZCkKCkJhcnJv d3MgJiBHaWx0cyAoQ2FyY2FzcyBCYXNpcyk6IDksMjk3CgpCYXJyb3dzIGFuZCBHaWx0cyBj b21wYXJlZCB0byBwcmlvciBkYXkncyBjbG9zZSwgZ2VuZXJhbGx5IHN0ZWFkeS4KCkJhc2Ug UHJpY2UgUmFuZ2UgJDQwLjc1IC0gJDUxLjAxLCB3ZWlnaHRlZCBhdmVyYWdlICQ0Ny4wOAoK QmFzZSBNYXJrZXQgSG9nIDE4NSBsYiBDYXJjYXNzIEJhc2lzLCBQbGFudCBEZWxpdmVyZWQg KDAuOS0xLjEgaW5jaApiYWNrLWZhdCwgNiBzcXVhcmUgaW5jaCBsb2luLzIuMCBkZXB0aCkK Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5BVElPTkFMIERBSUxZIERJUkVDVCBORUdP VElBVEVEIEhPRyBQVVJDSEFTRVMgTUFUUklYCgoxODUgbGIgQ2FyY2FzcyBCYXNpcwoKKERl ZmluZWQgYnkgTXVzY2xlIGFuZCBGYXQpCgpMT0lOIEFSRUEvREVQVEggKElOQ0hFUykKCkJB Q0stRkFUICAgICAgNC4wLzEuNCAgICAgICA1LjAvMS43ICAgICAgIDYuMC8yLjAgICAgICAg Ny4wLzIuMyAgICAgICA4LjAvMi43CjAuNCAgICAgICAgIDQzLjI1IDUzLjgyICAgNDQuNzUg NTQuNDMgICA0Ni4yNSA1NS43MCAgIDQ3LjAzIDU2LjY3ICAgNDcuMDMgNTcuNjQKMC41ICAg ICAgICAgNDAuNzUgNTMuMjUgICA0My4yNSA1My44NyAgIDQ2LjI1IKrwkj60zQAAmgUAAJoF AAAAArOdAeQAB+kKFlwIAEUABYxPPUAAPwbp8EF6PSJBej0ouAgAFORGe3FxbYI2UBhhCHy7 AAA1NC44MiAgIDQ3LjAzIDU1Ljc5ICAgNDcuMDMgNTYuNzYKMC42ICAgICAgICAgNDAuNzUg NTIuNjQgICA0My4yNSA1My4yNSAgIDQ0Ljc1IDUzLjk1ICAgNDYuMjUgNTQuOTIgICA0Ny4w MyA1NS44OQowLjcgICAgICAgICA0MC43NSA1Mi4wOCAgIDQwLjc1IDUyLjY5ICAgNDMuMjUg NTMuMzEgICA0Ni4yNSA1NC4wNCAgIDQ3LjAzIDU1LjAyCjAuOCAgICAgICAgIDM4Ljc1IDUx LjQ3ICAgNDAuNzUgNTIuMDggICA0My4yNSA1Mi42OSAgIDQ0Ljc1IDUzLjMxICAgNDcuMDMg NTQuMTQKMC45ICAgICAgICAgMzguNzUgNTAuOTEgICA0MC43NSA1MS41MiAgIDQwLjc1IDUy LjEzICAgNDMuMjUgNTIuNzQgICA0Ni4yNSA1My41NgoxLjAgICAgICAgICAzNy43NSA1MC4z MCAgIDM4Ljc1IDUwLjkxICAgNDAuNzUgNTEuNTIgICA0My4yNSA1Mi4xMyAgIDQ0Ljc1IDUy Ljk1CjEuMSAgICAgICAgIDM2Ljc1IDQ5LjczICAgMzguNzUgNTAuMzUgICA0MC43NSA1MC45 NiAgIDQwLjc1IDUxLjU3ICAgNDMuMjAgNTIuMzkKMS4yICAgICAgICAgMzYuNzUgNDkuMTIg ICAzNy43NSA0OS43MyAgIDM4LjcwIDUwLjM1ICAgMzguNzAgNTAuOTYgICAzOC43MCA1MS43 OAoxLjQgICAgICAgICAzMi44NSA0Ny45NSAgIDMyLjg1IDQ4LjU2ICAgMzIuODUgNDkuMTcg ICAzMi44NSA0OS43OSAgIDMyLjg1IDUwLjYwCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K CkNBUkNBU1MgV0VJR0hUIERJRkZFUkVOVElBTFMKCjE0NSMgICAtMjYuNTQgICAgLTQuODYg ICAgICAgIDE3NSMgICAgIDAuMDAgICAgIDAuMDAgICAgICAgMjA1IyAgICAtMy44OQowLjQ2 CjE1NSMgICAtMTAuOTggICAgIDAuMDAgICAgICAgIDE4NSMgICAgIDAuMDAgICAgIDAuMDAg ICAgICAgMjE1IyAgICAtMy44OQowLjQ2CjE2NSMgICAgLTUuOTUgICAgIDAuMDAgICAgICAg IDE5NSMgICAgLTAuOTcgICAgIDAuMDAgICAgICAgMjI1IyAgICAtNS4wMAowLjAwCi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KCk1lYXN1cmVtZW50cyBCYXNlZCBvbiBTbGF1Z2h0ZXIg RGF0YSBTdWJtaXR0ZWQ6Cgo1LURheSBSb2xsaW5nIEF2ZXJhZ2UgTWFya2V0IEhvZzogMTk2 LjQ0IGxiIGNhcmNhc3MsIHBsYW50IGRlbGl2ZXJlZAooMC43NSBpbmNoIGJhY2stZmF0LCA2 LjcyIHNxdWFyZSBpbmNoIGxvaW4vMi4yNCBpbmNoIGxvaW4gZGVwdGgpIEZGTEk6CjUxLjE2 JQoKUHJpY2UgUmFuZ2UgJDQ0Ljc1IC0gJDUzLjMxCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS2q8JI++AwBAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0ladAAH0Gat5Bej0oQXo9IhtYlQ90egQgGIy2poAQ5YeTlgAAAQEICgBC FawNQ+T6qvCSPoFHAQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLiMQAB9BkgFQXo9KEF6 PSIAFLgIcW2CNuRGe3FQEP1cqcAAAKrwkj4ISwEAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUA BYxPPkAAPwbp70F6PSJBej0ouAgAFORGgNVxbYI2UBBhCIl9AAAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KClNPV1MgKFBsYW50IERlbGl2ZXJlZCkKClNvd3MgUHVyY2hhc2VkIChMaXZl IGFuZCBDYXJjYXNzIEJhc2lzKTogMSw4MTAKCiAgICAgICAgICAgICAgV2VpZ2h0IFJhbmdl ICAgSGVhZCBDb3VudCAgICBBdmcgV2VpZ2h0ICAgIFByaWNlIFJhbmdlKiAgICBXdGQKQXZn CihMaXZlIEJhc2lzKSAgMzAwLTQ0OSBsYnMuICAgICAgICA4MzMgICAgICAgIDM5OS4wOCAg ICAgIDIyLjAwLTMwLjM2CjI3LjMwCiAgICAgICAgICAgICAgNDUwLTQ5OSBsYnMuICAgICAg ICAzNjUgICAgICAgIDQ3MC4xMyAgICAgIDE0LjUwLTMwLjQ5CjI1Ljg3CiAgICAgICAgICAg ICAgNTAwL3VwICBsYnMuICAgICAgICA2MTIgICAgICAgIDU2OC45MyAgICAgIDI5LjAwLTMz LjQ5CjMxLjU2CgoqUHJpY2UgbWF5IGluY2x1ZGUgdHJhbnNwb3J0YXRpb24gY29zdHMuCgot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpQVVJDSEFTRSBBTEwgVFlQRVM6IEJZIFNUQVRF IE9GIE9SSUdJTgoKQWxhYmFtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg4CkFy a2Fuc2FzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MgpDYW5hZGEgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAyNjEKR2VvcmdpYSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgNjA5CklsbGlub2lzICAgICAgICAgICAgICAgICAgICAgICAgICAzLDA3NgpJbmRp YW5hICAgICAgICAgICAgICAgICAgICAgICAgICAgMSw3NDkKSW93YSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDcsODYyCkthbnNhcyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAyLDIzNQpLZW50dWNreSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODAKTWFyeWxh bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCk1pY2hpZ2FuICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDU3MApNaW5uZXNvdGEgICAgICAgICAgICAgICAgICAgICAgICAg NSw4MTAKTWlzc2lzc2lwcGkgICAgICAgICAgICAgICAgICAgICAgICAgMzMzCk1pc3NvdXJp ICAgICAgICAgICAgICAgICAgICAgICAgICAyLDY0NwpOZWJyYXNrYSAgICAgICAgICAgICAg ICAgICAgICAgICAgMSw0MTQKTmV3IFlvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAg NTQ3Ck5vcnRoIENhcm9saW5hICAgICAgICAgICAgICAgICAgICA0LDg3MQpOb3J0aCBEYWtv dGEgICAgICAgICAgICAgICAgICAgICAgICAgMjIKT2hpbyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDQsMTk4ClBlbm5zeWx2YW5pYSAgICAgICAgICAgICAgICAgICAgICAyLDY2 OQpTb3V0aCBDYXJvbGmq8JI+YksBABQEAAAUBAAAAAKznQHkAAfpChZcCABFAAQGTz9AAD8G 63RBej0iQXo9KLgIABTkRoY5cW2CNlARYQixCQAAbmEgICAgICAgICAgICAgICAgICAgICAg MzUxClNvdXRoIERha290YSAgICAgICAgICAgICAgICAgICAgICAgIDExNgpUZW5uZXNzZWUg ICAgICAgICAgICAgICAgICAgICAgICAgICA1MzAKVGV4YXMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgODcyCldlc3QgVmlyZ2luaWEgICAgICAgICAgICAgICAgICAgICAgICA2 MApXaXNjb25zaW4gICAgICAgICAgICAgICAgICAgICAgICAgMSw2MzAKLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQoKU291cmNlOiAgICAgICBVU0RBIE1hcmtldCBOZXdzLCBEZXMgTW9p bmVzLCBJQQogICAgICAgICAgICAgIDUxNS0yODQtNDQ2MCAgICBlbWFpbDogIGRlc20ubGdt bkB1c2RhLmdvdgoKd3d3LmFtcy51c2RhLmdvdi9tbnJlcG9ydHMvbG1faGcyMDIudHh0IDEx MDBDCgouCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhbGFiYW1hCiAgICBhcmthbnNh cwogICAgYmVlZgogICAgY2FuYWRhCiAgICBlbWFpbAogICAgZ2VvcmdpYQogICAgZ2lsdHMK ICAgIGlsbGlub2lzCiAgICBpbmRpYW5hCiAgICBpb3dhCiAgICBrYW5zYXMKICAgIGtlbnR1 Y2t5CiAgICBtYXJrZXQKICAgIG1hcnlsYW5kCiAgICBtaWNoaWdhbgogICAgbWlubmVzb3Rh CiAgICBtaXNzaXNzaXBwaQogICAgbWlzc291cmkKICAgIG5lYnJhc2thCiAgICBuZXdfeW9y awogICAgbm9ydGgrY2Fyb2xpbmEKICAgIG5vcnRoK2Rha290YQogICAgb2hpbwogICAgcGVu bnN5bHZhbmlhCiAgICBwbGFudAogICAgc2FsZXMKICAgIHNvdXRoK2Nhcm9saW5hCiAgICBz b3V0aCtkYWtvdGEKICAgIHN3aW5lCiAgICB0ZW5uZXNzZWUKICAgIHRleGFzCiAgICB0cmFu c3BvcnRhdGlvbgogICAgdXNkYQogICAgd2VzdCt2aXJnaW5pYQogICAgd2lzY29uc2luCiAg ICBNRUFUT3JpZ2luIEFzc2lnbmVkQnk9Ik9zdGVyRG93Sm9uZXMiIC8+VVNEQQoKqvCSPmep AQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLiNQAB9BkgEQXo9KEF6PSIAFLgIcW2CNuRG hjlQEP1cnvgAAKrwkj5kvAEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4jkAAfQZIA0F6 PShBej0iABS4CHFtgjbkRooYUBD5fp73AACq8JI+R8kBADYAAAA2AAAAAAfpChZcAAKznQHk CABFAAAouI9AAH0GSAJBej0oQXo9IgAUuAhxbYI25EaKGFAR+X6e9gAAqvCSPnrKAQA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKE9AQAA/Bu9RQXo9IkF6PSi4CAAU5EaKGHFtgjdQEGEI N20AAAAAAAAAAKrwkj5d+AEAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChPQUAAPwbvUEF6 PSJBej0ot20AFd36REG5yA5IUBBhCK++AAAAAAAAAACq8JI+tjACAE4AAABOAAAAAAfpChZc AAKznQHkCABFAABAuJBAAH0GR+lBej0oQXo9IgAVt225yA5I3fpEQVAY+TZIegAAMjI2IFRy YW5zZmVyIGNvbXBsZXRlLg0KqvCSPjY6AgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk9C QAA/Bu81QXo9IkF6PSi3bQAV3fpEQbnIDmBQGGEInq8AAERFTEUgMzYxOTk5MTYub3V0LjAz MDQwOA0KqvCSPut2AgB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbriRQAB9Bke6QXo9KEF6 PSIAFbdtucgOYN36RFtQGPkcllYAADU1MCAzNjE5OTkxNi5vdXQuMDMwNDA4OiBUaGUgc3lz dGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQqq8JI+44ICAE8AAABPAAAA AAKznQHkAAfpChZcCABFAABBT0NAAD8G7zVBej0iQXo9KLdtABXd+kRbucgOplAYYQgUvwAA UE9SVCA2NSwxMjIsNjEsMzQsMTg0LDkNCqrwkj6BvQIAVAAAAFQAAAAAB+kKFlwAArOdAeQI AEUAAEa4kkAAfQZH4UF6PShBej0iABW3bbnIDqbd+kR0UBj5AlolAAAyMDAgUE9SVCBjb21t YW5kIHN1Y2Nlc3NmdWwuDQqq8JI+ecACAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCT0RA AD8G7zNBej0iQXo9KLdtABXd+kR0ucgOxFAYYQiL/AAAU1RPUiAzNjE5OTkxNi5vdXQuMDMw NDA4DQqq8JI+KCEDAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquJNAAH0GR7xBej0oQXo9 IgAVt225yA7E3fpEjlAY+OggGQAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25u ZWN0aW9uIGZvciAzNjE5OTkxNi5vdXQuMDMwNDA4Lg0KqvCSPsgjAwA+AAAAPgAAAAAH6QoW XAACs50B5AgARQAAMLiUQAB9Bkf1QXo9KEF6PSIAFLgJfDV/rAAAAABwAvrw10AAAAIEBWQB AQQCqvCSPnIlAwA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME9FQAA/Bu9EQXo9IkF6PSi4 CQAU5EedsHw1f61wEmEI7s8AAAEBBAICBAW0qvCSPk1dAwA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLiVQAB9Bkf8QXo9KEF6PSIAFLgJfDV/reRHnbFQEP1cfz8AAKrwkj7SZAMAmgUA AJoFAAAAArOdAeQAB+kKFlwIAEUABYxPRkAAPwbp50F6PSJBej0ouAkAFORHnbF8NX+tUBBh CNpaAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MjEyIE1OPTM2MTk5OTE2Lm91dCBTUkM9 Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJNMiIgCgouLi4gIAoKCi4u LiAJIAoKCkhlYWRMaW5lLi4uICBVSyBHb3Zlcm5tZW50OiBEcml2aW5nIHRlc3QgYm9va2lu Z3MgaGFsdCBmb3IgdXBncmFkZQoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRl TGluZS4uLiAgQXByIDA4LCAyMDAzIChNMiBQUkVTU1dJUkUgdmlhIENPTVRFWCkgLS0KCgoK Li4uCgpDb3B5cmlnaHRMaW5lLi4uICAoQykxOTk0LTIwMDMgTTIgQ09NTVVOSUNBVElPTlMg TFRECgoKLi4uCgoKTTIKClRoZSBEcml2aW5nIFN0YW5kYXJkcyBBZ2VuY3kgKERTQSkgaGFz IGFkdmlzZWQgbGVhcm5lciBkcml2ZXJzIGFuZCB0aGVpcgppbnN0cnVjdG9ycyB0aGF0IHRo ZXkgd2lsbCBub3QgYmUgYWJsZSB0byBib29rIHByYWN0aWNhbCBkcml2aW5nIG9yCnJpZGlu ZyB0ZXN0cyBvciBlbnF1aXJlIGFib3V0IHRoZW0gZm9yIHR3byBkYXlzIHRoaXMgd2Vlaywg YnV0IHRoZW9yeQp0ZXN0IGJvb2tpbmdzIHdpbGwgc3RpbGwgZ28gYWhlYWQuCgpJbiBhIG1h am9yIGFkZGl0aW9uIHRvIHRoZWlyIHNlcnZpY2UsIHRoZSBEU0EgaXMgcGxhbm5pbmcgdG8g cHJvdmlkZQpJbnRlcm5ldCBib29raW5nIHRoaXMgc3VtbWVyIGZvciBwcmFjdGljYWwgdGVz dCBjYW5kaWRhdGVzLgoKSW4gb3JkZXIgZm9yIHRoZSBwcm9qZWN0IHRvIGdvIGFoZWFkLCBz b2Z0d2FyZSBhbmQgSVQgaGFyZHdhcmUgaGF2ZSB0byBiZQp1cGdyYWRlZCBhbmQgdGhlIGRy aXZpbmcgdGVzdCBib29raW5nIHN5c3RlbSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBjdXJyZW50 CnNlcnZlcnMgdG8gbmV3ZXIsIGZhc3RlciBvbmVzLgoKVGhlIHdvcmsgd2lsbCB0YWtlIHBs YWNlIG92ZXIgdGhyZWUgZGF5cyBhbmQgc28gdGhlcmUgd2lsbCBub3QgYmUgYW55CnByYWN0 aWNhbCBkcml2aW5nIG9yIHJpZGluZyB0ZXN0IGJvb2tpbmdzIG9yIGVucXVpcmllcyBvbiBG cmlkYXkgYW5kClNhdHVyZGF5LCAxMSBhbmQgMTIgQXByaWwuIFRoZW9yeSB0ZXN0IGJvb2tp bmdzIGFuZCBlbnF1aXJpZXMgd2lsbCBub3QgYmUKYWZmZWN0ZWQgYnkgdGhlIHdvcmsuCgpC cmlhbiBHaWxob29sZXksIERTQSdzIE9wZXJhdGlvbmFsIERpcmVjdG9yLCBzYWlkOiAiV2Ug YXBvbG9naXNlIGZvciB0aGUKaW5jb252ZW5pZW5jZSB0aGlzIHdpbGwgY2F1c2UgcHJhY3Rp Y2FsIHRlc3QgY2FuZGlkYXRlcy4gRnVsbCBzZXJ2aWNlCndpbGwgcmVzdW1lIG9uIE1vbmRh eSwgMTQgQXByaWwgd2hlbiB3ZSB3aWxsIGhhdmUgdGhlIG1heGltdW0gbnVtYmVyIG9mCnN0 YWZmIGF2YWlsYWJsZSB0byBjbGVhciBhbnkgYmFja2xvZyCq8JI+SGUDAJoFAACaBQAAAAKz nQHkAAfpChZcCABFAAWMT0dAAD8G6eZBej0iQXo9KLgJABTkR6MVfDV/rVAYYQibrwAAb2Yg Y2FsbHMuCgoiV2UgaG9wZSB0aGF0IGJ5IHdhcm5pbmcgb2YgdGhlIGRpc3J1cHRpb24sIHBl b3BsZSB3aWxsIGJlIGFibGUgdG8gd29yawpyb3VuZCBpdC4gQW5kIHdlIGhvcGUgdGhhdCBv dXIgY3VzdG9tZXJzIG5vdGljZSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUKdGltZSBpdCB3aWxs IHRha2UgdG8gYm9vayBhIHRlc3Qgd2hlbiB0aGUgc2VydmljZSByZXN1bWVzIG9uIDE0IEFw cmlsLiIKRFNBIGJlY2FtZSBvbmUgb2YgdGhlIGZpcnN0IEdvdmVybm1lbnQgZGVwYXJ0bWVu dHMgdG8gaW50cm9kdWNlIGFuCidvbi1saW5lJyB0cmFuc2FjdGlvbmFsIHNlcnZpY2UgaW4g RGVjZW1iZXIgMjAwMSB3aGVuIGEgYm9va2luZyBzZXJ2aWNlCmZvciB0aGVvcnkgdGVzdHMg d2VudCBsaXZlIGFzIHBhcnQgb2YgdGhlICdtb2Rlcm5pc2luZyBHb3Zlcm5tZW50Jwppbml0 aWF0aXZlLiBUbyBkYXRlLCAyMDQsNjIwIHRoZW9yeSB0ZXN0cyBoYXZlIGJlZW4gYm9va2Vk IHRocm91Z2ggdGhlCkRTQSB3ZWJzaXRlIGF0IHd3dy5kc2EuZ292LnVrCgpOb3RlcyB0byBF ZGl0b3JzCgoxLiBUaGUgRHJpdmluZyBTdGFuZGFyZHMgQWdlbmN5IChEU0EpIGlzIGFuIGV4 ZWN1dGl2ZSBhZ2VuY3kgb2YgdGhlCkRlcGFydG1lbnQgZm9yIFRyYW5zcG9ydCwgYW5kIGlz IHBhcnQgb2YgdGhlIERyaXZlciwgVmVoaWNsZSBhbmQgT3BlcmF0b3IKKERWTykgZ3JvdXAg b2Ygb3JnYW5pc2F0aW9ucyB3aXRoaW4gdGhlIERlcGFydG1lbnQuCgoyLiBUaGUgQWdlbmN5 J3MgYWltIGlzIHRvIHByb21vdGUgcm9hZCBzYWZldHkgdGhyb3VnaCBpbXByb3ZpbmcgZHJp dmluZwpzdGFuZGFyZHMsIHRlc3RpbmcgZHJpdmVycyBhbmQgcmlkZXJzIGZhaXJseSBhbmQg ZWZmaWNpZW50bHksIG1haW50YWluaW5nCnRoZSByZWdpc3RlcnMgb2YgQXBwcm92ZWQgRHJp dmluZyBJbnN0cnVjdG9ycyBhbmQgTGFyZ2UgR29vZHMgVmVoaWNsZQpJbnN0cnVjdG9ycyBh bmQgc3VwZXJ2aXNpbmcgYmFzaWMgdHJhaW5pbmcgZm9yIGxlYXJuZXIgbW90b3JjeWNsaXN0 cy4KCjMuIFRoZSBEU0EgaXMgYSB0cmFkaW5nIGZ1bmQgd2l0aCB0dXJub3ZlciBvZiBhcm91 bmQgR0JQODggbWlsbGlvbiBmb3IKdGhlIHllYXIgMjAwMS8yLiBJbmNvbWUgZm9yIHRoZSB5 ZWFyIDIwMDIvMyBpcyBleHBlY3RlZCB0byBiZSBpbiB0aGUKcmVnaW9uIG9mIEdCUDk0bSwg ZnVsbHkgZnVuZGVkIGJ5IGZlZSBpbmNvbWUgYW5kIHJldmVudWUgZnJvbQpub24tc3RhdHV0 b3J5IGFjdGl2aXRpZXMuCgo0LiBUaGUgRFNBIEhRIGlzIGF0IFN0YW5sZXkgSG91c2UsIDU2 IFRhbGJvdCBTdHJlZXQsIE5vdHRpbmdoYW0sIE5HMSA1R1UsCmFuZCB0aGVyZSBhcmUgZml2 ZSBhcmVhIG9mZmljZXMsIHdoaWNoIG1hbmFnqvCSPrVlAwBEBQAARAUAAAACs50B5AAH6QoW XAgARQAFNk9IQAA/Buo7QXo9IkF6PSi4CQAU5EeoeXw1f61QGGEIIs8AAGUgNDMxIHByYWN0 aWNhbCB0ZXN0IGNlbnRyZXMKYWNyb3NzIEJyaXRhaW4uCgo1LiBUaGUgRFNBIGVtcGxveXMg MiwwMDAgc3RhZmYsIG9mIHdoaWNoIHNvbWUgMSwyOTUgYXJlIGRyaXZpbmcKZXhhbWluZXJz LiBJbiAyMDAxLzAyIHRoZSBBZ2VuY3kgY29uZHVjdGVkIDEuMyBtaWxsaW9uIHRlc3RzIGZv ciBjYXIKZHJpdmVycywgNzIsMDAwIHZvY2F0aW9uYWwgdGVzdHMgYW5kIDkxLDAwMCBtb3Rv cmN5Y2xlIHJpZGVyIHRlc3RzLgoKMS4zIG1pbGxpb24gdGhlb3J5IHRlc3RzIHdlcmUgY2Fy cmllZCBvdXQgYXQgMTU4IGNlbnRyZXMuIEF0IHRoZSBlbmQgb2YKdGhlIHllYXIgdGhlcmUg d2VyZSAyOSw5NjIgcGVvcGxlIG9uIHRoZSBSZWdpc3RlciBvZiBBcHByb3ZlZCBEcml2aW5n Ckluc3RydWN0b3JzLgoKNi4gSW4gSnVseSAyMDAxLCBEU0Egc3VjY2Vzc2Z1bGx5IHJldGFp bmVkIHRoZSBDaGFydGVyIE1hcmssIGF3YXJkZWQgZm9yCmV4Y2VsbGVuY2UgaW4gcHVibGlj IHNlcnZpY2UuIERTQSB3YXMgb25lIG9mIHRoZSBmaXJzdCByZWNpcGllbnRzIG9mIHRoaXMK YXdhcmQgZm9yIDE5OTItNSBhbmQgcmVnYWluZWQgaXQgaW4gMTk5Ny4KCjcuIFRoZSBEU0Eg YWNoaWV2ZWQgZm9ybWFsIGFjY3JlZGl0YXRpb24gYXMgYW4gSW52ZXN0b3IgaW4gUGVvcGxl IGluIEp1bHkKMjAwMC4KCjguIERTQSBpcyBvbmUgb2YgdGhlIGZpcnN0IEdvdmVybm1lbnQg QWdlbmNpZXMgdG8gaW50cm9kdWNlIGFuICdvbi1saW5lJwpib29raW5nIHNlcnZpY2UuIENh bmRpZGF0ZXMgY2FuIGJvb2sgdGhlaXIgdGhlb3J5IHRlc3QgZGlyZWN0bHkgb24gRFNBJ3MK d2Vic2l0ZSA6IHd3dy5kc2EuZ292LnVrCgpNMiBDb21tdW5pY2F0aW9ucyBMdGQgZGlzY2xh aW1zIGFsbCBsaWFiaWxpdHkgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkCndpdGhpbiBNMiBQ cmVzc1dJUkUuIERhdGEgc3VwcGxpZWQgYnkgbmFtZWQgcGFydHkvcGFydGllcy4gRnVydGhl cgppbmZvcm1hdGlvbiBvbiBNMiBQcmVzc1dJUkUgY2FuIGJlIG9idGFpbmVkIGF0IGh0dHA6 Ly93d3cucHJlc3N3aXJlLm5ldApvbiB0aGUgd29ybGQgd2lkZSB3ZWIuIElucXVpcmllcyB0 byBpbmZvQG0yLmNvbS4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGJvb2sKICAgIGJy aXRhaW4KICAgIGVkaXRvcnMKICAgIGV4ZWN1dGl2ZQogICAgZ292ZXJubWVudAogICAgaGFy ZHdhcmUKICAgIGludGVybmV0CiAgICByZXZlbnVlCiAgICBzb2Z0d2FyZQogICAgc3RhbmRh cmRzCiAgICB0cmFpbmluZwogICAgdm9jYXRpb25hbAogICAgd2ViCgqq8JI+tmUDADwAAAA8 AAAAAAKznQHkAAfpChZcCABFAAAoT0lAAD8G70hBej0iQXo9KLgJABTkR62HfDV/rVARYQgL vQAAAAAAAAAAqvCSPnnfAwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLiWQAB9Bkf7QXo9 KEF6PSIAFLgJfDV/reRHqHlQEP1cdHcAAKrwkj4B+wMANgAAADYAAAAAB+kKFlwAArOdAeQI AEUAACi4l0AAfQZH+kF6PShBej0iABS4CXw1f63kR62IUBD4TnR2AACq8JI+7wQEADYAAAA2 AAAAAAfpChZcAAKznQHkCABFAAAouJhAAH0GR/lBej0oQXo9IgAUuAl8NX+t5EetiFAR+E50 dQAAqvCSPvgFBAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE9KQAA/Bu9HQXo9IkF6PSi4 CQAU5EetiHw1f65QEGEIC7wAAAAAAAAAAKrwkj6DkAQAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChPS0AAPwbvRkF6PSJBej0ot20AFd36RI65yA8GUBBhCK6zAAAAAAAAAACq8JI+pcgE AE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuJlAAH0GR+BBej0oQXo9IgAVt225yA8G3fpE jlAY+OhHvQAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KqvCSPlY+BgA8AAAAPAAAAAACs50B 5AAH6QoWXAgARQAAKE9MQAA/Bu9FQXo9IkF6PSi3bQAV3fpEjrnIDx5QEGEIrpsAAAAAAAAA AKrwkj5q6wkAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE6x0AAPwYDkkF6PSJBej0olQ8b WBiMtqZ0egQggBgW0PFvAAABAQgKDUPlSgBCFawyODB8MTQ3MjUzOHwxMDQ5ODE3MjYyfDEu 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 NzZ8MS4wfDF8MzIyNXxoZWxsbyB3b3JsZAozMTJ8MTQ3MjU3MHwxMDQ5ODE3Mjc3fDEuMHwx fDEyMDN8aGVsbG8gd29ybGQKMzEzfDE0NzI1NzF8MTA0OTgxNzI3N3wxLjB8MXwyMDAxfGhl bGxvIHdvcmxkCjMxNHwxNDcyNTcyfDEwNDk4MTcyNzd8MS4wfDF8MzU3M3xoZWxsbyB3b3Js ZAozMTV8MTQ3MjU3M3wxMDQ5ODE3Mjc3fDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKuvCSPi3t DQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJXBQAB9BmrEQXo9KEF6PSIbWJUPdHoEIBiM vRGAEN8cjFoAAAEBCAoAQhZUDUPrjrvwkj7PFwEAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUA AGI64EAAPwYDeEF6PSJBej0olQ8bWBiMvRF0egQggBgW0GkzAAABAQgKDUPrtABCFlQzMTZ8 MTQ3MjU3NHwxMDQ5ODE3Mjc4fDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKu/CSPpqsAwBCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJXCQAB9BmrDQXo9KEF6PSIbWJUPdHoEIBiMvT+AEN7u jDEAAAEBCAoAQhZXDUPrtLvwkj4YrgMAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI64UAA PwYDd0F6PSJBej0olQ8bWBiMvT90egQggBgW0G/zAAABAQgKDUPrxQBCFlczMTd8MTQ3MjU3 NXwxMDQ5ODE3Mjc4fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKu/CSPhUDBwBCAAAAQgAAAAAH 6QoWXAACs50B5AgARQAANJXDQAB9BmrCQXo9KEF6PSIbWJUPdHoEIBiMvW2AEN7AjB4AAAEB CAoAQhZZDUPrxbvwkj5YmQ0AbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE64kAAPwYDd0F6 PSJBej0olQ8bWBiMvW10egQggBgW0N1DAAABAQgKDUPsBgBCFlkzMTh8MTQ3MjU3NnwxMDQ5 ODE3Mjc5fDEuMHwxfDIzMHxoZWxsbyB3b3JsZAq88JI+a8QBAEIAAABCAAAAAAfpChZcAAKz nQHkCABFAAA0lcRAAH0GasFBej0oQXo9IhtYlQ90egQgGIy9moAQ3pOL1gAAAQEICgBCFmAN Q+wGvPCSPvrFAQCCAQAAggEAAAACs50B5AAH6QoWXAgARQABdDrjQAA/BgJjQXo9IkF6PSiV DxtYGIy9mnR6BCCAGBbQHegAAAEBCAoNQ+wcAEIWYDMxOXwxNDcyNTc3fDEwNDk4MTcyNzl8 MS4wfDF8NjU0fGhlbGxvIHdvcmxkCjMyMHwxNDcyNTc4fDEwNDk4MTcyNzl8MS4wfDF8NTI0 fGhlbGxvIHdvcmxkCjMyMXwxNDcyNTc5fDEwNDk4MTcyNzl8MS4wfDF8MzQyMHxoZWxsbyB3 b3JsZAozMjJ8MTQ3MjU4MHwxMDQ5ODE3Mjc5fDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKMzIz fDE0NzI1ODF8MTA0OTgxNzI3OXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjMyNHwxNDcyNTgy fDEwNDk4MTcyNzl8MS4wfDF8MzMwMXxoZWxsbyB3b3JsZAozMjV8MTQ3MjU4M3wxMDQ5ODE3 Mjc5fDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKvPCSPr0aBQBCAAAAQgAAAAAH6QoWXAACs50B 5AgARQAANJXFQAB9BmrAQXo9KEF6PSIbWJUPdHoEIBiMvtqAEN1Ti74AAAEBCAoAQhZiDUPs HLzwkj7b0g4AcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI65EAAPwYDdEF6PSJBej0olQ8b WBiMvtp0egQggBgW0GWeAAABAQgKDUPscgBCFmIzMjZ8MTQ3MjU4NHwxMDQ5ODE3MjgwfDEu MHwxfDE3ODd8aGVsbG8gd29ybGQKvfCSPl2HAQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA NJXGQAB9Bmq/QXo9KEF6PSIbWJUPdHoEIBiMvwiAEN0li2AAAAEBCAoAQhZqDUPscr/wkj4w EgcAPAAAADwAAAAAArOdAeQAB+kKFlwIBgABCAAGBAABAAfpChZcQXo9IgAAAAAAAEF6PSgA AAAAAAAAAAAAAAAAAAAAAAC/8JI+QxIHACoAAAAqAAAAAAfpChZcAAKznQHkCAYAAQgABgQA AgACs50B5EF6PSgAB+kKFlxBej0iwPCSPsJAAQBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAA YjrlQAA/BgNzQXo9IkF6PSiVDxtYGIy/CHR6BCCAGBbQajIAAAEBCAoNQ+2pAEIWajMyN3wx NDcyNTg1fDEwNDk4MTcyODJ8MS4wfDF8MTM1M3xoZWxsbyB3b3JsZArA8JI+yCYEAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0lcdAAH0Gar5Bej0oQXo9IhtYlQ90egQgGIy/NoAQ3PeK CQAAAQEICgBCFooNQ+2pwPCSPjsoBAD4AAAA+AAAAAACs50B5AAH6QoWXAgARQAA6jrmQAA/ BgLqQXo9IkF6PSiVDxtYGIy/NnR6BCCAGBbQjJEAAAEBCAoNQ+28AEIWijMyOHwxNDcyNTg2 fDEwNDk4MTcyODJ8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCjMyOXwxNDcyNTg3fDEwNDk4MTcy ODN8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAozMzB8MTQ3MjU4OHwxMDQ5ODE3MjgzfDEuMHwx fDE2MHxoZWxsbyB3b3JsZAozMzF8MTQ3MjU4OXwxMDQ5ODE3MjgzfDEuMHwxfDMyMjV8aGVs bG8gd29ybGQKwPCSPlZ9BwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJXIQAB9Bmq9QXo9 KEF6PSIbWJUPdHoEIBiMv+yAENxBifQAAAEBCAoAQhaMDUPtvMHwkj7rxgIAbwAAAG8AAAAA ArOdAeQAB+kKFlwIAEUAAGE650AAPwYDckF6PSJBej0olQ8bWBiMv+x0egQggBgW0OF5AAAB AQgKDUPuFwBCFowzMzJ8MTQ3MjU5MHwxMDQ5ODE3Mjg0fDEuMHwxfDY1NHxoZWxsbyB3b3Js ZArB8JI+/ZQFAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lclAAH0GarxBej0oQXo9IhtY lQ90egQgGIzAGYAQ3BSJkAAAAQEICgBCFpUNQ+4XwfCSPnuWBQBwAAAAcAAAAAACs50B5AAH 6QoWXAgARQAAYjroQAA/BgNwQXo9IkF6PSiVDxtYGIzAGXR6BCCAGBbQa3AAAAEBCAoNQ+4p AEIWlTMzM3wxNDcyNTkxfDEwNDk4MTcyODR8MS4wfDF8MjU2NnxoZWxsbyB3b3JsZArB8JI+ j+sIAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lcpAAH0GartBej0oQXo9IhtYlQ90egQg GIzAR4AQ2+aJfAAAAQEICgBCFpcNQ+4pxPCSPgLwAgBvAAAAbwAAAAACs50B5AAH6QoWXAgA RQAAYTrpQAA/BgNwQXo9IkF6PSiVDxtYGIzAR3R6BCCAGBbQ3e0AAAEBCAoNQ+9EAEIWlzMz NHwxNDcyNTkyfDEwNDk4MTcyODV8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCsTwkj713QQAQgAA AEIAAAAAB+kKFlwAArOdAeQIAEUAADSVy0AAfQZqukF6PShBej0iG1iVD3R6BCAYjMB0gBDb uYhGAAABAQgKAEIWsg1D70TE8JI+md8EAPkAAAD5AAAAAAKznQHkAAfpChZcCABFAADrOupA AD8GAuVBej0iQXo9KJUPG1gYjMB0dHoEIIAYFtAYsAAAAQEICg1D71AAQhayMzM1fDE0NzI1 OTN8MTA0OTgxNzI4NXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjMzNnwxNDcyNTk0fDEwNDk4 MTcyODV8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZAozMzd8MTQ3MjU5NXwxMDQ5ODE3Mjg2fDEu MHwxfDk2NjJ8aGVsbG8gd29ybGQKMzM4fDE0NzI1OTZ8MTA0OTgxNzI4N3wxLjB8MXw0ODJ8 aGVsbG8gd29ybGQKxPCSPpU0CABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJXMQAB9Bmq5 QXo9KEF6PSIbWJUPdHoEIBiMwSuAENsCiDgAAAEBCAoAQha0DUPvUMXwkj6wGQQAKgAAACoA AAAAB+kKFlwAArOdAeQIBgABCAAGBAABAAKznQHkQXo9KAAAAAAAAEF6PSLF8JI+ohoEADwA AAA8AAAAAAKznQHkAAfpChZcCAYAAQgABgQAAgAH6QoWXEF6PSIAArOdAeRBej0oAAAAAAAA AAAAAAAAAAAAAAAAxvCSPo/9AwBCAAAAQgAAAAACs50B5AAH6QoWXAgARQAANHnSQAA/BsSz QXo9IkF6PSiSmxtYAtHcKTg0e3eAEBbQEmcAAAEBCAoNQ/ATAEISFcbwkj7LNgQAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSVzUAAfQZquEF6PShBej0iG1iSmzg0e3cC0dwqgBAAACSG AAABAQgKAEIWxQ1D8BPG8JI+uOcIAEEBAABBAQAAAQAMzMzMAAfrnsVuATOqqgMAAAwgAAK0 gaYAAQAOU2thcnZlbl9ndwACABEAAAABAQHMAARBej0hAAMAEUZhc3RFdGhlcm5ldDAABAAI AAAAAQAFANNDaXNjbyBJbnRlcm5ldHdvcmsgT3BlcmF0aW5nIFN5c3RlbSBTb2Z0d2FyZSAK SU9TICh0bSkgQzE3MDAgU29mdHdhcmUgKEMxNzAwLVktTSksIFZlcnNpb24gMTIuMSgzKSwg UkVMRUFTRSBTT0ZUV0FSRSAoZmMxKQpDb3B5cmlnaHQgKGMpIDE5ODYtMjAwMCBieSBjaXNj byBTeXN0ZW1zLCBJbmMuCkNvbXBpbGVkIFdlZCAwNS1KdWwtMDAgMTc6MDcgYnkgY21vbmcA BgAOY2lzY28gMTcyMAAHAAlBfTWcHgALAAUBx/CSPt4XAwBvAAAAbwAAAAACs50B5AAH6QoW XAgARQAAYTrrQAA/BgNuQXo9IkF6PSiVDxtYGIzBK3R6BCCAGBbQz7QAAAEBCAoNQ/BxAEIW tDMzOXwxNDcyNTk3fDEwNDk4MTcyODh8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCsfwkj4U0gUA QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSVzkAAfQZqt0F6PShBej0iG1iVD3R6BCAYjMFY gBDa1Yb6AAABAQgKAEIW0Q1D8HHH8JI+dNMFAMwAAADMAAAAAAKznQHkAAfpChZcCABFAAC+ OuxAAD8GAxBBej0iQXo9KJUPG1gYjMFYdHoEIIAYFtCcBAAAAQEICg1D8IMAQhbRMzQwfDE0 NzI1OTh8MTA0OTgxNzI4OHwxLjB8MXwyNjIzfGhlbGxvIHdvcmxkCjM0MXwxNDcyNTk5fDEw NDk4MTcyODl8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZAozNDJ8MTQ3MjYwMHwxMDQ5ODE3Mjg5 fDEuMHwxfDI0NDB8aGVsbG8gd29ybGQKx/CSPssoCQBCAAAAQgAAAAAH6QoWXAACs50B5AgA RQAANJXPQAB9Bmq2QXo9KEF6PSIbWJUPdHoEIBiMweKAENpLhuYAAAEBCAoAQhbTDUPwg8jw kj6TwwQAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPTUAAPwbvKkF6PSJBej0ot20AFd36 RI65yA8eUBhhCKCiAABERUxFIDM2MTk5OTMzLm91dC4wMzA0MDgNCsjwkj54AQUAfAAAAHwA AAAAB+kKFlwAArOdAeQIAEUAAG64mkAAfQZHsUF6PShBej0iABW3bbnIDx7d+kSoUBj4zpOc AAA1NTAgMzYxOTk5MzMub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUg ZmlsZSBzcGVjaWZpZWQuIA0KyPCSPuoOBQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk9O QAA/Bu8pQXo9IkF6PSi3bQAV3fpEqLnID2RQGGEIGH4AAFBPUlQgNjUsMTIyLDYxLDM0LDE4 NCwxOA0KyPCSPjZJBQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARribQAB9BkfYQXo9KEF6 PSIAFbdtucgPZN36RMJQGPizWWgAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCsjw kj54TAUAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPT0AAPwbvKEF6PSJBej0ot20AFd36 RMK5yA+CUBhhCI3uAABTVE9SIDM2MTk5OTMzLm91dC4wMzA0MDgNCsjwkj7wiAUAeAAAAHgA AAAAB+kKFlwAArOdAeQIAEUAAGq4nEAAfQZHs0F6PShBej0iABW3bbnID4Ld+kTcUBj4mR1f AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTMz Lm91dC4wMzA0MDguDQrI8JI+6IkFAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuJ1AAH0G R+xBej0oQXo9IgAUuBLWFXq6AAAAAHAC+vCCSQAAAgQFZAEBBALI8JI+VosFAD4AAAA+AAAA AAKznQHkAAfpChZcCABFAAAwT1BAAD8G7zlBej0iQXo9KLgSABTkypyQ1hV6u3ASYQiadQAA AQEEAgIEBbTI8JI+UMMFADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouJ5AAH0GR/NBej0o QXo9IgAUuBLWFXq75MqckVAQ/Vwq5QAAyPCSPqnKBQCmBAAApgQAAAACs50B5AAH6QoWXAgA RQAEmE9RQAA/BurQQXo9IkF6PSi4EgAU5MqckdYVertQGGEIxHcAAFhZWlpZLi4uICBUQz0y IFRNPTEwNDk4MTcyNzcgTU49MzYxOTk5MzMub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgi IFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRM aW5lLi4uICBGSVRUSU5HIEhJTkdFIENPV0wgRE9PUiBBU1NZCgouLi4gIAkgCgpCeUxpbmUu Li4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKEZlZEJpek9wcHMgdmlh IENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKGMpIDIw MDMgRmVkZXJhbCBJbmZvcm1hdGlvbiAmIE5ld3MgRGlzcGF0Y2gsIEluYy4KCgouLi4KCgpG ZWRCaXpPcHMKCk5PVElDRSBUWVBFOiBDT05UUkFDVCBBV0FSRAoKU09VUkNFOiBQdWJsaXNo ZWQgaW4gRmVkQml6T3BwcwoKREFURSBQT1NURUQ6IDA3LUFQUi0wMwoKT0ZGSUNFIEFERFJF U1M6IERFRkVOU0UgR0VORVJBTCBTVVBQTFkgQ0VOVEVSIDgwMDAgSkVGRiBEQVZJUyBIV1kK UklDSE1PTkQsIFZBIDIzMjk3LTUzIDEyCgpDTEFTU0lGSUNBVElPTiBDT0RFOiAxNSAtIEFp cmNyYWZ0ICYgYWlyZnJhbWUgc3RydWN0dXJhbCBjb21wb25lbnRzCgpTVUJKRUNUOiBGSVRU SU5HIEhJTkdFIENPV0wgRE9PUiBBU1NZCgpTT0xJQ0lUQVRJT04gTlVNQkVSOiBTUDA0NzAt MDMtWC1XMTk3CgpBV0FSRCBOVU1CRVI6IFNQMDQ3MC0wMy1NLUJKNjMKCkFXQVJEIEFNT1VO VDogJDMyLDE1MAoKTElORSBOVU1CRVI6IDAwMDEKCkFXQVJEIERBVEU6IDA0MDQwMwoKQVdB UkRFRCBUTzogUFJFQ0lTSU9OIE1BTlVGQUNUVVJJTkcgQ09NUEFOWSBPRiBTQU4gQU5UT05J TyBURVhBUyA0NTQ2ClNJTkNMQUlSIFJPQUQgU0FOIEFOVE9OSU8gVFggNzgyMjItMjAzNwoK QVJDSElWRSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFDVDogTi9BCgpJTlRFUk5FVCBBRERSRVNT OgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJkcy9TUDA0NzAtMDMt TS1CSjYzTG4wMDAxLmh0bWwKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGFpcmNyYWZ0 CiAgICBjb250cmFjdAogICAgZGVmZW5zZQogICAgaW50ZXJuZXQKICAgIG1hbnVmYWN0dXJp bmcKICAgIHN0cnVjdHVyYWwKICAgIHRleGFzCiAgICB2aXJnaW5pYQoKyPCSPqrKBQA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKE9SQAA/Bu8/QXo9IkF6PSi4EgAU5MqhAdYVertQEWEI wsgAAAAAAAAAAMjwkj5nIgYANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4n0AAfQZH8kF6 PShBej0iABS4EtYVervkyqECUBD47CrkAADI8JI+DS4GADYAAAA2AAAAAAfpChZcAAKznQHk CABFAAAouKBAAH0GR/FBej0oQXo9IgAUuBLWFXq75MqhAlAR+Owq4wAAyPCSPmIvBgA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKE9TQAA/Bu8+QXo9IkF6PSi4EgAU5MqhAtYVerxQEGEI wscAAAAAAAAAAMjwkj5zBAcAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChPVEAAPwbvPUF6 PSJBej0ot20AFd36RNy5yA/EUBBhCK2nAAAAAAAAAADI8JI+5zwHAE4AAABOAAAAAAfpChZc AAKznQHkCABFAABAuKFAAH0GR9hBej0oQXo9IgAVt225yA/E3fpE3FAY+JlHAAAAMjI2IFRy YW5zZmVyIGNvbXBsZXRlLg0KyPCSPiuyCAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE9V QAA/Bu88QXo9IkF6PSi3bQAV3fpE3LnID9xQEGEIrY8AAAAAAAAAAMrwkj4VyAQAbwAAAG8A AAAAArOdAeQAB+kKFlwIAEUAAGE67UAAPwYDbEF6PSJBej0olQ8bWBiMweJ0egQggBgW0Nq3 AAABAQgKDUPxqABCFtMzNDN8MTQ3MjYwMXwxMDQ5ODE3MjkxfDEuMHwxfDUyNHxoZWxsbyB3 b3JsZArK8JI+W8YGAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0ldBAAH0GarVBej0oQXo9 IhtYlQ90egQgGIzCD4AQ2h6FpQAAAQEICgBCFu8NQ/GoyvCSPh7IBgCBAQAAgQEAAAACs50B 5AAH6QoWXAgARQABczruQAA/BgJZQXo9IkF6PSiVDxtYGIzCD3R6BCCAGBbQOnAAAAEBCAoN Q/G1AEIW7zM0NHwxNDcyNjAyfDEwNDk4MTcyOTF8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAoz NDV8MTQ3MjYwM3wxMDQ5ODE3MjkxfDEuMHwxfDI5NjR8aGVsbG8gd29ybGQKMzQ2fDE0NzI2 MDR8MTA0OTgxNzI5MnwxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCjM0N3wxNDcyNjA1fDEwNDk4 MTcyOTJ8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCjM0OHwxNDcyNjA2fDEwNDk4MTcyOTJ8MS4w fDF8Nzk5fGhlbGxvIHdvcmxkCjM0OXwxNDcyNjA3fDEwNDk4MTcyOTJ8MS4wfDF8MTYwfGhl bGxvIHdvcmxkCjM1MHwxNDcyNjA4fDEwNDk4MTcyOTJ8MS4wfDF8MjYyM3xoZWxsbyB3b3Js ZArK8JI+3RwKAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0ldFAAH0GarRBej0oQXo9IhtY lQ90egQgGIzDToAQ2N+FlQAAAQEICgBCFvINQ/G1yvCSPkMeCgBvAAAAbwAAAAACs50B5AAH 6QoWXAgARQAAYTrvQAA/BgNqQXo9IkF6PSiVDxtYGIzDTnR6BCCAGBbQzQgAAAEBCAoNQ/HL AEIW8jM1MXwxNDcyNjA5fDEwNDk4MTcyOTR8MS4wfDF8NDgyfGhlbGxvIHdvcmxkCsrwkj4l cw0AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSV0kAAfQZqs0F6PShBej0iG1iVD3R6BCAY jMN7gBDYsoV9AAABAQgKAEIW9A1D8cvK8JI+tHQNAJ4AAACeAAAAAAKznQHkAAfpChZcCABF AACQOvBAAD8GAzpBej0iQXo9KJUPG1gYjMN7dHoEIIAYFtB9vQAAAQEICg1D8eAAQhb0MzUy fDE0NzI2MTB8MTA0OTgxNzI5NHwxLjB8MXwyMjM1fGhlbGxvIHdvcmxkCjM1M3wxNDcyNjEx fDEwNDk4MTcyOTR8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZArL8JI+j4cBAEIAAABCAAAAAAfp ChZcAAKznQHkCABFAAA0ldNAAH0GarJBej0oQXo9IhtYlQ90egQgGIzD14AQ2FaFZgAAAQEI CgBCFvYNQ/Hgy/CSPm8zCwBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTrxQAA/BgNoQXo9 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 OTM0Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJQUiBO ZXdzd2lyZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBUTUJSL1NoYXJwIERy aWxsaW5nLCBJbmMgIEFubm91bmNlcyBDb21wbGV0aW9uIG9mIEF0b2thIERpc2NvdmVyeQoK Li4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgTUlETEFORCwgIFRl eGFzLCBBcHIgOCwgMjAwMyAvUFJOZXdzd2lyZS1GaXJzdENhbGwgdmlhIENPTVRFWC8gLS0K CgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKEMpIDIwMDMgUFIgTmV3c3dp cmUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKClBSIE5ld3N3aXJlCgpUTUJSL1No YXJwIERyaWxsaW5nLCBJbmMgKE5hc2RhcTogVEJESSkgdG9kYXkgYW5ub3VuY2VkIHRoYXQg aXRzIExlaW1hbgpOby4gMVIgd2VsbCAoMjUlIFdvcmtpbmcgSW50ZXJlc3QgYW5kIG9wZXJh dG9yKSwgbG9jYXRlZCBpbiBMb3ZpbmcKQ291bnR5LCBUZXhhcywgaGFzIGJlZW4gY29tcGxl dGVkIGluIHRoZSBBdG9rYSBmb3JtYXRpb24gYW5kIGhhcyBmbG93ZWQKYXQgdmFyaW91cyBy YXRlcyBvdmVyIGEgcGVyaW9kIG9mIDE3IGRheXMsIG1vc3QgcmVjZW50bHkgYXQgcmF0ZXMg b2YKYXBwcm94aW1hdGVseSA0LjkgdG8gNS4xIG1pbGxpb24gY3ViaWMgZmVldCBwZXIgZGF5 IG9uIGEgNy82NC1pbmNoIGNob2tlLAp3aXRoIGEgZmxvd2luZyB0dWJpbmcgcHJlc3N1cmUg b2YgYXBwcm94aW1hdGVseSA3LDk1MCBwc2kgZnJvbSBhIGdyb3NzCnBlcmZvcmF0ZWQgaW50 ZXJ2YWwgb2YgMTYsNjEwIHRvIDE2LDYzOCBmZWV0LiBUaGUgd2VsbCBoYXMgYmVlbiBzaHV0 IGluCmZvciBhIGJvdHRvbSBob2xlIHByZXNzdXJlIGJ1aWxkIHVwLCBhbmQgb3BlcmF0aW9u cyBhcmUgY3VycmVudGx5CnVuZGVyd2F5IHRvIHJlcGFpciBhIHR1YmluZyBsZWFrLiBUaGUg Q29tcGFueSBleHBlY3RzIHRvIHJlc3VtZSB0ZXN0aW5nCm9mIHRoZSB3ZWxsIGluIHRoZSBu ZXh0IGZldyBkYXlzLiBUaGUgQ29tcGFueSBjdXJyZW50bHkgaGFzIGEgMjUlIHdvcmtpbmcK aW50ZXJlc3QgaW4gYW4gOCBzZWN0aW9uIHByb3NwZWN0IGFyZWEgYXJvdW5kIHRoZSB3ZWxs LgoKVE1CUi9TaGFycCBEcmlsbGluZywgSW5jIGlzIGFuIGluZGVwZW5kZW50IG9uc2hvcmUg Y29udHJhY3QgZHJpbGxpbmcKY29tcGFueSB3aXRoIG9pbCBhbmQgZ2FzIG9wZXJhdGlvbnMg aW4gdGhlIFBlcm1pYW4gQmFzaW4uCgpTT1VSQ0UgVE1CUi9TaGFycCBEcmlsbGluZywgSW5j CgpQYXRyaWNpYSBSICBFbGxlZGdlLCBDaGllZiBGaW5hbmNpYWwgT2ZmaWNlciDN8JI+/k0I AEUBAABFAQAAAAKznQHkAAfpChZcCABFAAE3T1tAAD8G7idBej0iQXo9KLgVABTk4f5hf1Rb y1AYYQjfygAAVE1CUi1TaGFycApEcmlsbGluZywgSW5jICwgKzEtOTE1LTY5OS01MDUwLCBv ciBQUkVsbGVkZ2VAYW9sLmNvbSA7IG9yIExhcnJ5IEhvd2VsbCBvZiBUaGUKSG93ZWxsIEdy b3VwLCArMS0yMTQtMzY4LTE1OTIsIG9yIGhvd2dyb3VwQGVhcnRobGluay5uZXQgLCBmb3Ig VE1CUi1TaGFycApEcmlsbGluZywgSW5jIAooVEJESSkKCi4uLiAgCSAKCktleVdvcmRzLi4u ICAKICAgIGNvbnRyYWN0CiAgICBuYXNkYXEKICAgIG9pbCthbmQrZ2FzCiAgICByYXRlcwog ICAgdGV4YXMKCs3wkj7/TQgAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChPXEAAPwbvNUF6 PSJBej0ouBUAFOTh/3B/VFvLUBFhCNnwAAAAAAAAAADN8JI+D64IADYAAAA2AAAAAAfpChZc AAKznQHkCABFAAAouKdAAH0GR+pBej0oQXo9IgAUuBV/VFvL5OH/cFAQ/Vw9nQAAzfCSPgGv CAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLioQAB9BkfpQXo9KEF6PSIAFLgVf1Rby+Th /3FQEP1cPZwAAM3wkj6gvAgANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4qUAAfQZH6EF6 PShBej0iABS4FX9UW8vk4f9xUBH9XD2bAADN8JI+pb0IADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoT11AAD8G7zRBej0iQXo9KLgVABTk4f9xf1RbzFAQYQjZ7wAAAAAAAAAAzfCSPuh1 CQA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE9eQAA/Bu8zQXo9IkF6PSi3bQAV3fpFKrnI EIJQEGEIrJsAAAAAAAAAAM3wkj5OrgkATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC4qkAA fQZHz0F6PShBej0iABW3bbnIEILd+kUqUBj4SkZDAAAyMjYgVHJhbnNmZXIgY29tcGxldGUu DQrN8JI+77UJAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCT19AAD8G7xhBej0iQXo9KLdt ABXd+kUqucgQmlAYYQicigAAREVMRSAzNjE5OTkzNS5vdXQuMDMwNDA4DQrN8JI+PPMJAHwA AAB8AAAAAAfpChZcAAKznQHkCABFAABuuKtAAH0GR6BBej0oQXo9IgAVt225yBCa3fpFRFAY +DCSIAAANTUwIDM2MTk5OTM1Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQg dGhlIGZpbGUgc3BlY2lmaWVkLiANCs3wkj4D/wkAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUA AEJPYEAAPwbvF0F6PSJBej0ot20AFd36RUS5yBDgUBhhCBVsAABQT1JUIDY1LDEyMiw2MSwz NCwxODQsMjINCs3wkj6iOAoAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa4rEAAfQZHx0F6 PShBej0iABW3bbnIEODd+kVeUBj4FVfuAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwu DQrN8JI+szsKAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCT2FAAD8G7xZBej0iQXo9KLdt ABXd+kVeucgQ/lAYYQiJ1gAAU1RPUiAzNjE5OTkzNS5vdXQuMDMwNDA4DQrN8JI+vHgKAHgA AAB4AAAAAAfpChZcAAKznQHkCABFAABquK1AAH0GR6JBej0oQXo9IgAVt225yBD+3fpFeFAY 9/sb4wAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5 OTkzNS5vdXQuMDMwNDA4Lg0KzfCSPrl5CgA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLiu QAB9BkfbQXo9KEF6PSIAFLgWrX7eeQAAAABwAvrwRx0AAAIEBWQBAQQCzfCSPoN7CgA+AAAA PgAAAAACs50B5AAH6QoWXAgARQAAME9iQAA/Bu8nQXo9IkF6PSi4FgAU5OYulq1+3npwEmEI zScAAAEBBAICBAW0zfCSPpGzCgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLivQAB9Bkfi QXo9KEF6PSIAFLgWrX7eeuTmLpdQEP1cXZcAAM3wkj4UuwoAmgUAAJoFAAAAArOdAeQAB+kK FlwIAEUABYxPY0AAPwbpykF6PSJBej0ouBYAFOTmLpetft56UBBhCMxHAABYWVpaWS4uLiAg VEM9MiBUTT0xMDQ5ODE3Mjc4IE1OPTM2MTk5OTM1Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29t dGV4IiBQRk49IkNvbXRleCIgUEZOPSJQUiBOZXdzd2lyZSIgCgouLi4gIAoKCi4uLiAJIAoK CkhlYWRMaW5lLi4uICBJQ0JBIGFuZCBBQ0IgSm9pbiBpbiBTdXBwb3J0aW5nIFByaW5jaXBs ZXMgT2YKRWxlY3Ryb25pYyBDaGVjayBDbGVhcmluZyBMZWdpc2xhdGlvbgoKLi4uICAJIAoK QnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgV0FTSElOR1RPTiwgQXByIDgsIDIw MDMgL1BSTmV3c3dpcmUgdmlhIENPTVRFWC8gLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4u ICBDb3B5cmlnaHQgKEMpIDIwMDMgUFIgTmV3c3dpcmUuICBBbGwgcmlnaHRzIHJlc2VydmVk LgoKCi4uLgoKClBSIE5ld3N3aXJlCgpUaGUgSW5kZXBlbmRlbnQgQ29tbXVuaXR5IEJhbmtl cnMgb2YgQW1lcmljYSAoSUNCQSkgYW5kIEFtZXJpY2EncwpDb21tdW5pdHkgQmFua3MgKEFD Qikgam9pbmVkIHRvZGF5IGluIHN1cHBvcnQgb2YgbGVnaXNsYXRpb24gdG8gcHJvbW90ZQpp bmNyZWFzZWQgZWZmaWNpZW5jeSBhbmQgcG90ZW50aWFsIGNvc3Qgc2F2aW5ncyB0aHJvdWdo IGdyZWF0ZXIgdXNlIG9mCmNoZWNrIHRydW5jYXRpb24uCgooUGhvdG86IGh0dHA6Ly93d3cu bmV3c2NvbS5jb20vY2dpLWJpbi9wcm5oLzIwMDAwMTAzL0RDTTAwMSApCgoiV2Ugc3Ryb25n bHkgc3VwcG9ydCB0aGUgZWZmb3J0cyB0byBpbmNyZWFzZSB0aGUgZWZmaWNpZW5jeSBvZiB0 aGUKbmF0aW9uJ3MgcGF5bWVudHMgc3lzdGVtLCBhbmQgd2UgYmVsaWV2ZSB0aGF0IHRocm91 Z2ggdGhpcyBwcm9wb3NlZApsZWdpc2xhdGlvbiwgQ29uZ3Jlc3MgY2FuIGNyZWF0ZSBzaWdu aWZpY2FudCBjb3N0IHNhdmluZ3MgYW5kCmVmZmljaWVuY2llcyB0aGF0IHdpbGwgYmVuZWZp dCBib3RoIGNvbnN1bWVycyBhbmQgZmluYW5jaWFsCmluc3RpdHV0aW9ucywiIHNhaWQgQ1Ig KFJ1c3R5KSBDbG91dGllciwgcHJlc2lkZW50IG9mIE1pZFNvdXRoIE5hdGlvbmFsCkJhbmss IExhZmF5ZXR0ZSwgTGEuCgpDbG91dGllciB0ZXN0aWZpZWQgYXQgYSBoZWFyaW5nIG9mIHRo ZSBTdWJjb21taXR0ZWUgb24gRmluYW5jaWFsCkluc3RpdHV0aW9ucyBhbmQgQ29uc3VtZXIg Q3JlZGl0IG9mIHRoZSBIb3VzZSBGaW5hbmNpYWwgU2VydmljZXMKQ29tbWl0dGVlIG9uIHRo ZSBDaGVjayBDbGVhcmluZyBmb3IgdGhlIDIxc3QgQ2VudHVyeSBBY3QuCgpJQ0JBIGFuZCBB Q0IsIGFsb25nIHdpdGggdGhlIG90aGVyIGZpbmFuY2lhbCBzZXJ2aWNlcyB0cmFkZSBhc3Nv Y2lhdGlvbnMsCmFyZSB1bml0ZWQgaW4gc3VwcG9ydCBvZiB0aGUgZ2VuZXJhbCBwcmluY2lw bGVzIG91dGxpbmVkIGluIHRoZSDN8JI+jLsKAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWM T2RAAD8G6clBej0iQXo9KLgWABTk5jP7rX7eelAYYQg8iQAAcHJvcG9zZWQKbGVnaXNsYXRp b24sIHdoaWNoIHdvdWxkIGFsbG93IGEgY29sbGVjdGluZyBiYW5rIHRvIHJlbW92ZSAtLSBv ciB0cnVuY2F0ZQotLSB0aGUgb3JpZ2luYWwgcGFwZXIgY2hlY2sgZnJvbSB0aGUgY2hlY2sg Y29sbGVjdGlvbiBwcm9jZXNzIGFuZCBlbmFibGUKdGhlIGVudGlyZSBiYW5raW5nIGluZHVz dHJ5IHRvIHVzZSBlbGVjdHJvbmljIGltYWdlcyB0byBwcm9jZXNzIGFuZCBjbGVhcgpjaGVj a3MuCgoiUHJvY2Vzc2luZyBjaGVja3MgaGFzIGJlY29tZSBleHRyZW1lbHkgY29zdGx5IGFu ZCBidXJkZW5zb21lIGZvciB0aGUKbmF0aW9uJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywi IHNhaWQgQ2xvdXRpZXIuICJbSXRdIGlzIGEgbGFib3IKaW50ZW5zaXZlIHByb2Nlc3Mgb2Yg aGFuZGxpbmcsIHNvcnRpbmcgYW5kIHBoeXNpY2FsbHkgdHJhbnNwb3J0aW5nCmNoZWNrcy4g Q2hlY2sgdHJ1bmNhdGlvbiBhbmQgZWxlY3Ryb25pYyBwcm9jZXNzaW5nIHdvdWxkIHNpZ25p ZmljYW50bHkKcmVkdWNlIHRoaXMgY29zdCBhbmQgYnVyZGVuLiIKClRoZSBwcm9wb3NlZCBs ZWdpc2xhdGlvbiB3b3VsZCBzdHJlYW1saW5lIHRoZSBjb2xsZWN0aW9uIGFuZCByZXR1cm4g b2YKY2hlY2tzLCByZWR1Y2UgcHJvY2Vzc2luZyBjb3N0cyBhbmQgbWluaW1pemUgdGhlIGVm ZmVjdCBvZiB1bmV4cGVjdGVkCmRpc3J1cHRpb25zIHRvIGFpciBhbmQgZ3JvdW5kIHRyYW5z cG9ydGF0aW9uIHN5c3RlbXMuIE1vcmVvdmVyLCB0aGUKbGVnaXNsYXRpb24gZG9lcyBub3Qg bWFuZGF0ZSBlbGVjdHJvbmljIGNoZWNrIGNsZWFyaW5nLCBidXQgcHJvdmlkZXMKZmxleGli aWxpdHksIG9uIGEgYmFuay1ieS1iYW5rIGJhc2lzLCB0byBhZGFwdCB0byBlbGVjdHJvbmlj IGNoZWNrCmNsZWFyaW5nIG92ZXIgdGltZSB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhl IGV4aXN0aW5nIHBhcGVyIGNoZWNrCnByb2Nlc3MuCgpDbG91dGllciBhbHNvIHJlY29tbWVu ZGVkIHJldGFpbmluZyB0aGUgY2hlY2sgY29sbGVjdGlvbiBzeXN0ZW0ncwpleGlzdGluZyBi b2R5IG9mIGxhdyBhbmQgcmVndWxhdGlvbi4gIlRoZXJlIGhhdmUgYmVlbiBubyBzaWduaWZp Y2FudApjb25zdW1lciBpc3N1ZXMgcmVsYXRpbmcgdG8gdGhlIHJlY2VpcHQgb2YgaW1hZ2Vz IG9yIGVsZWN0cm9uaWMKcmVwcmVzZW50YXRpb25zIG9mIHJldHVybiBjaGVjayBpdGVtcywg YW5kIHRoZXJlIGlzIG5vIGV2aWRlbmNlIHRvCmp1c3RpZnkgY2hhbmdpbmcgdGhlIGV4aXN0 aW5nIGxhdyAuLi4uIiBXaXRoIHJlc3BlY3QgdG8gdGhlIHByb3Bvc2VkCmV4cGVkaXRlZCBy ZS1jcmVkaXQgcHJvdmlzaW9ucyBpbiB0aGUgbGVnaXNsYXRpb24sIENsb3V0aWVyIHN0YXRl ZCwgIldlCmJlbGllzfCSPgC8CgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE9lQAA/BunI QXo9IkF6PSi4FgAU5OY5X61+3npQGGEIH64AAHZlIHRoYXQgdGhlIG5ldyByZS1jcmVkaXQg cHJvY2VkdXJlcyBhcmUgY29tcGxpY2F0ZWQgYW5kIHdvdWxkIG9ubHkKc2VydmUgdG8gY29u ZnVzZSBjdXN0b21lcnMsIGNyZWF0ZSBhbiB1bm5lY2Vzc2FyeSBidXJkZW4gZm9yIGJhbmtz IGFuZApleHBvc2UgYmFua3MgdG8gc29waGlzdGljYXRlZCBmcmF1ZCBzY2hlbWVzLiBNb3Jl IGltcG9ydGFudGx5LCBhY2NvcmRpbmcKdG8gdGVzdGltb255IGdpdmVuIGJ5IEZlZGVyYWwg UmVzZXJ2ZSBCb2FyZCBWaWNlIENoYWlybWFuIFJvZ2VyIEZlcmd1c29uCmxhc3Qgd2VlayBi ZWZvcmUgdGhlIFNlbmF0ZSBCYW5raW5nIENvbW1pdHRlZSwgdGhlIEJvYXJkIGhhcyBub3cK Y29uY2x1ZGVkIHRoYXQgdGhlIGV4cGVkaXRlZCByZS1jcmVkaXQgcHJvdmlzaW9ucyBpdCBv cmlnaW5hbGx5IHN1Z2dlc3RlZAphcmUgbm90IG5lY2Vzc2FyeS4iCgpDbG91dGllciB1cmdl ZCBtZW1iZXJzIG9mIHRoZSBjb21taXR0ZWUgdG8gaW1wcm92ZSB0aGUgZWZmaWNpZW5jeSBv ZiB0aGUKbmF0aW9uJ3MgcGF5bWVudHMgc3lzdGVtIGJ5IHF1aWNrIHBhc3NhZ2Ugb2YgdGhl IHByb3Bvc2VkIGxlZ2lzbGF0aW9uLAp3aGljaCBoYXMgdGhlIGJyb2FkIHN1cHBvcnQgb2Yg dGhlIGJhbmtpbmcgaW5kdXN0cnkgYW5kIHRoZSBGZWRlcmFsClJlc2VydmUgQm9hcmQuCgog ICAgQWJvdXQgdGhlIFJlcHJlc2VudGVkIE9yZ2FuaXphdGlvbnMKCkFtZXJpY2EncyBDb21t dW5pdHkgQmFua2VycwoKQW1lcmljYSdzIENvbW11bml0eSBCYW5rZXJzIHJlcHJlc2VudHMg dGhlIG5hdGlvbidzIGNvbW11bml0eSBiYW5rcy4gQUNCCm1lbWJlcnMsIHdob3NlIGFnZ3Jl Z2F0ZSBhc3NldHMgdG90YWwgbW9yZSB0aGFuICQxIHRyaWxsaW9uLCBwdXJzdWUKcHJvZ3Jl c3NpdmUsIGVudHJlcHJlbmV1cmlhbCBhbmQgc2VydmljZS1vcmllbnRlZCBzdHJhdGVnaWVz IGluIHByb3ZpZGluZwpmaW5hbmNpYWwgc2VydmljZXMgdG8gYmVuZWZpdCB0aGVpciBjdXN0 b21lcnMgYW5kIGNvbW11bml0aWVzLgoKSW5kZXBlbmRlbnQgQ29tbXVuaXR5IEJhbmtlcnMg b2YgQW1lcmljYQoKVGhlIEluZGVwZW5kZW50IENvbW11bml0eSBCYW5rZXJzIG9mIEFtZXJp Y2EgaXMgdGhlIG5hdGlvbidzIGxlYWRpbmcKdm9pY2UgZm9yIGNvbW11bml0eSBiYW5rcyBh bmQgdGhlIG9ubHkgbmF0aW9uYWwgdHJhZGUgYXNzb2NpYXRpb24KZGVkaWNhdGVkIGV4Y2x1 c2l2ZWx5IHRvIHByb3RlY3RpbmcgdGhlIGludGVyZXN0cyBvZiB0aGUgY29tbXVuaXR5CmJh bmtpbmcgaW5kdXN0cnkuIFdlIGFnZ3JlZ2F0ZSB0aGUgcG93ZXIgb2Ygb3VyIG1lbWJlcnMg dG8gcHJvdmlkZSBhCnZvaWNlIGZvciBjb21tdW5pdHkgYmFua2luZyBpbnRlcmVzdHMgaW4g V2FzaM3wkj7yNQsANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4sEAAfQZH4UF6PShBej0i ABS4Fq1+3nrk5jlfUBD9XFLPAADN8JI+rzgLACQEAAAkBAAAAAKznQHkAAfpChZcCABFAAQW T2ZAAD8G6z1Bej0iQXo9KLgWABTk5j7DrX7eelAZYQhxpwAAaW5ndG9uLCByZXNvdXJjZXMg dG8gZW5oYW5jZQpjb21tdW5pdHkgYmFuayBlZHVjYXRpb24gYW5kIG1hcmtldGFiaWxpdHks IGFuZCBwcm9maXRhYmlsaXR5IG9wdGlvbnMgdG8KaGVscCBjb21tdW5pdHkgYmFua3MgY29t cGV0ZSBpbiBhbiBldmVyLWNoYW5naW5nIG1hcmtldHBsYWNlLiBJQ0JBIGhhcwpuZWFybHkg NSwwMDAgbWVtYmVycyB3aXRoIDE3LDAwMCBsb2NhdGlvbnMgbmF0aW9ud2lkZS4gT3VyIG1l bWJlcnMgaG9sZAptb3JlIHRoYW4gJDUyNiBiaWxsaW9uIGluIGluc3VyZWQgZGVwb3NpdHMs ICQ2NDMgYmlsbGlvbiBpbiBhc3NldHMgYW5kCm1vcmUgdGhhbiAkNDA1IGJpbGxpb24gaW4g bG9hbnMgdG8gY29uc3VtZXJzLCBzbWFsbCBidXNpbmVzc2VzIGFuZCBmYXJtcy4KClNPVVJD RSBJbmRlcGVuZGVudCBDb21tdW5pdHkgQmFua2VycyBvZiBBbWVyaWNhOyBBbWVyaWNhJ3Mg Q29tbXVuaXR5CkJhbmtzCgpSb2JlcnQgU2NobWVybXVuZCBvZiBBbWVyaWNhJ3MgQ29tbXVu aXR5IEJhbmtzLAorMS0yMDItODU3LTMxMDQ7IG9yIFZpdmVjYSBXYXJlIG9mIEluZGVwZW5k ZW50IENvbW11bml0eSBCYW5rZXJzIG9mIEFtZXJpY2EsCisxLTIwMi02NTktODExMQovUGhv dG86ICBOZXdzQ29tOiAgaHR0cDovL3d3dy5uZXdzY29tLmNvbS9jZ2ktYmluL3BybmgvMjAw MDAxMDMvRENNMDAxClBSTiBQaG90byBEZXNrLCArMS04ODgtNzc2LTY1NTUgb3IgKzEtMjEy LTc4Mi0yODQwCgpodHRwOi8vd3d3LmljYmEub3JnCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAg CiAgICBiYW5rCiAgICBiYW5raW5nCiAgICBjb21tdW5pdHkKICAgIGNvbmdyZXNzCiAgICBj b25zdW1lcgogICAgY29uc3VtZXIrY3JlZGl0CiAgICBlZHVjYXRpb24KICAgIGZlZGVyYWwr cmVzZXJ2ZQogICAgZmluYW5jaWFsK3NlcnZpY2VzCiAgICBsYWJvcgogICAgbGF3CiAgICBs ZWdpc2xhdGlvbgogICAgcHJlc2lkZW50CiAgICB0cmFkZQogICAgdHJhbnNwb3J0YXRpb24K ICAgIHdhc2hpbmd0b24KCs3wkj4qjAsANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4sUAA fQZH4EF6PShBej0iABS4Fq1+3nrk5kKyUBD9XEl8AADN8JI+hJgLADYAAAA2AAAAAAfpChZc AAKznQHkCABFAAAouLJAAH0GR99Bej0oQXo9IgAUuBatft565OZCslAR/VxJewAAzfCSPomZ CwA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE9nQAA/Bu8qQXo9IkF6PSi4FgAU5OZCsq1+ 3ntQEGEI5c8AAAAAAAAAAM3wkj7u5gsAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChPaEAA PwbvKUF6PSJBej0ot20AFd36RXi5yBFAUBBhCKuPAAAAAAAAAADN8JI+Cx8MAE4AAABOAAAA AAfpChZcAAKznQHkCABFAABAuLNAAH0GR8ZBej0oQXo9IgAVt225yBFA3fpFeFAY9/tFhgAA MjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KzfCSPi4mDABQAAAAUAAAAAACs50B5AAH6QoWXAgA RQAAQk9pQAA/Bu8OQXo9IkF6PSi3bQAV3fpFeLnIEVhQGGEImn4AAERFTEUgMzYxOTk5MzYu b3V0LjAzMDQwOA0KzfCSPpBjDAB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbri0QAB9BkeX QXo9KEF6PSIAFbdtucgRWN36RZJQGPfhkWIAADU1MCAzNjE5OTkzNi5vdXQuMDMwNDA4OiBU aGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQrN8JI+xGgMAG8A AABvAAAAAAKznQHkAAfpChZcCABFAABhOvVAAD8GA2RBej0iQXo9KJUPG1gYjMS7dHoEIIAY FtDJRwAAAQEICg1D8wYAQhcLMzU5fDE0NzI2MTd8MTA0OTgxNzI5N3wxLjB8MXwyMzB8aGVs bG8gd29ybGQKzfCSPg5vDABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk9qQAA/Bu8NQXo9 IkF6PSi3bQAV3fpFkrnIEZ5QGGEIFF8AAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwyMw0KzfCS PuuoDABUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARri1QAB9Bke+QXo9KEF6PSIAFbdtucgR nt36RaxQGPfGVzEAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCs3wkj5drAwAUAAA AFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPa0AAPwbvDEF6PSJBej0ot20AFd36Ray5yBG8UBhh CIfKAABTVE9SIDM2MTk5OTM2Lm91dC4wMzA0MDgNCs3wkj677wwAeAAAAHgAAAAAB+kKFlwA ArOdAeQIAEUAAGq4tkAAfQZHmUF6PShBej0iABW3bbnIEbzd+kXGUBj3rBslAAAxNTAgT3Bl bmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTM2Lm91dC4wMzA0 MDguDQrN8JI+ovAMAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuLdAAH0GR9JBej0oQXo9 IgAUuBey+mS/AAAAAHAC+vC7WgAAAgQFZAEBBALN8JI+8vEMAD4AAAA+AAAAAAKznQHkAAfp ChZcCABFAAAwT2xAAD8G7x1Bej0iQXo9KLgXABTk57RAsvpkwHASYQi7uQAAAQEEAgIEBbTN 8JI+eCkNADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouLhAAH0GR9lBej0oQXo9IgAUuBey +mTA5Oe0QVAQ/VxMKQAAzfCSPhMxDQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE9tQAA/ BunAQXo9IkF6PSi4FwAU5Oe0QbL6ZMBQEGEILgIAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4 MTcyNzkgTU49MzYxOTk5MzYub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29t dGV4IiBQRk49IkJ5IERhdmlkIFJvYmluc29uJiN4QTsiIFBGTj0iS25pZ2h0LVJpZGRlciBP cGVuIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIEJ1ZmZhbG8sIE5ZICAtQXJl YSBDb21wYW5pZXMnIFN0b2NrcyBGYWxsIGluIEZpcnN0IFF1YXJ0ZXIKCi4uLiAgCSAKCkJ5 TGluZS4uLiAgQnkgRGF2aWQgUm9iaW5zb24KCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciAw NywgMjAwMyAoVGhlIEJ1ZmZhbG8gTmV3cyAtIEtuaWdodCBSaWRkZXIvVHJpYnVuZSBCdXNp bmVzcyBOZXdzIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgKGMp IDIwMDMsIFRoZSBCdWZmYWxvIE5ld3MsIE4uWS4gRGlzdHJpYnV0ZWQgYnkgS25pZ2h0IFJp ZGRlci9UcmlidW5lIEJ1c2luZXNzCgoKLi4uCgoKS25pZ2h0LVJpZGRlciBPcGVuCgpUaGUg YmVhciBtYXJrZXQgaXMgcHV0dGluZyB0aGUgYml0ZSBvbiBCdWZmYWxvLWFyZWEgc3RvY2tz LgoKQWZ0ZXIgd2VhdGhlcmluZyB0aGUgZmlyc3QgdGhyZWUgeWVhcnMgb2YgdGhlIHN0b2Nr IG1hcmtldCdzIHNsdW1wIHdpdGgKbGl0dGxlIHBhaW4sIHRoZSBzdG9ja3Mgb2YgY29tcGFu aWVzIGJhc2VkIGluIHRoZSBCdWZmYWxvIGFyZWEgYXJlCnN0YXJ0aW5nIHRvIGZlZWwgc29t ZSByZWFsIHBhaW4gZnJvbSB0aGUgbWFya2V0J3MgZGVjbGluZS4KClRoZSBsb2NhbCBzdG9j a3MgbG9zdCBtb25leSBmb3IgdGhlIHRoaXJkIHN0cmFpZ2h0IHF1YXJ0ZXIgZHVyaW5nIHRo ZQpmaXJzdCB0aHJlZSBtb250aHMgb2YgdGhpcyB5ZWFyIC0tIHRoZSBCdWZmYWxvIFBvcnRm b2xpbydzIGxvbmdlc3QgbG9zaW5nCnN0cmVhayBzaW5jZSAxOTkwIC0tIGFuZCBhbHNvIGxh Z2dlZCBiZWhpbmQgdGhlIG1ham9yIG1hcmtldCBpbmRleGVzLAphbHRob3VnaCBub3QgYnkg bXVjaC4KCkEgcG9ydGZvbGlvIHRoYXQgb3duZWQgYSBzaW5nbGUgc2hhcmUgb2YgZWFjaCBv ZiB0aGUgbG9jYWwgc3RvY2tzIHdvdWxkCmhhdmUgbG9zdCA1LjQgcGVyY2VudCBvZiBpdHMg dmFsdWUgZHVyaW5nIHRoZSBmaXJzdCBxdWFydGVyLiBUaGF0J3Mgd29yc2UKdGhhbiB0aGUg NC4yIHBlcmNlbnQgZHJvcCBieSB0aGUgRG93IEpvbmVzIEluZHVzdHJpYWwgQXZlcmFnZSBh bmQgdGhlIDMuNgpwZXJjZW50IGRlY2xpbmUgYnkgdGhlIFN0YW5kYXJkICYgUG9vcidzIDUw MCBpbmRleC4gVGhlIGdhcCB3YXMgZXZlbgp3aWRlciBiZXR3ZWVuIHRoZSBsb2NhbCBzdG9j a3MgYW5kIHRoZSBvbmNlIGhpZ2gtZmx5aW5nIE5hc2RhcSBjb21wb3NpdGUKaW5kZXgsIHdo aWNoIGJvdc3wkj6KMQ0AmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxPbkAAPwbpv0F6PSJB ej0ouBcAFOTnuaWy+mTAUBhhCLuUAABuY2VkIGJhY2sgdG8gZ2FpbiAwLjQgcGVyY2VudCBk dXJpbmcgdGhlIHF1YXJ0ZXIuCgpUaGUgd2VhayBlY29ub215IGRpZG4ndCBoZWxwIHRoZSBs b2NhbCBzdG9ja3MsIGFuZCB0aGUgb3ZlcmhhbmcgZnJvbSB0aGUKb3V0YnJlYWsgb2Ygd2Fy IGluIElyYXEgb25seSBmdXJ0aGVyIGRlcHJlc3NlZCBzaGFyZSBwcmljZXMuCgoiSXQncyB0 b3VnaCB0byBkaXNjZXJuIGFueSB0cmVuZHMgZnJvbSB0aGUgZmlyc3QgcXVhcnRlciBiZWNh dXNlIHdoYXQgd2FzCmRyaXZpbmcgdGhlIG1hcmtldCBmb3IgdGhlIG1vc3QgcGFydCB3YXMg dGhlIHdhciwiIHNhaWQgQ2hyaXN0b3BoZXIKQ2Fyb3NhLCB3aG8gbWFuYWdlcyB0aGUgQnVs bGZpbmNoIGZhbWlseSBvZiBtdXR1YWwgZnVuZHMgaW4gSG9uZW95ZQpGYWxscy4KClRoZSBp bXBhY3QgdGhhdCB0aGUgd2FyIGhhZCBvbiBzdG9jayBwcmljZXMgd2FzIHF1aXRlIGFwcGFy ZW50IGluIHRoZQpwZXJmb3JtYW5jZSBvZiB0aGUgbG9jYWwgc3RvY2tzIGR1cmluZyBNYXJj aC4KCkJ5IHRoZSBzZWNvbmQgd2VlayBpbiBNYXJjaCwgYXMgdGhlIG91dGJyZWFrIG9mIHdh ciBhcHByb2FjaGVkLCB0aGUgbG9jYWwKc2hhcmVzIHdlcmUgZG93biBieSBhYm91dCA3IHBl cmNlbnQsIG9ubHkgdG8gdHJpbSB0aGF0IGxvc3MgdG8gMiBwZXJjZW50CmJ5IHRoZSBlbmQg b2YgdGhlIHdhcidzIGZpcnN0IHdlZWssIHdoZW4gaXQgc2VlbWVkIHZpY3RvcnkgbWlnaHQg YmUKcXVpY2suIEJ1dCB3aGVuIHRoZSB3YXIgaW50ZW5zaWZpZWQgYW5kIGhvcGVzIGZvciBh IHF1aWNrIGVuZCB2YW5pc2hlZCwKdGhlIGxvY2FsIHN0b2NrcyBsb3N0IGdyb3VuZCB3aXRo IHRoZSByZXN0IG9mIHRoZSBtYXJrZXQgZHVyaW5nIHRoZSBmaW5hbApkYXlzIG9mIE1hcmNo LgoKIlRoZSBtYXJrZXQgd2FzIGRyaXZlbiBieSB0aGVzZSBub24tZWNvbm9taWMgZmFjdG9y cywiIENhcm9zYSBzYWlkLgoKT3ZlcmFsbCwgaXQgd2FzIHRoZSBsb2NhbCBzdG9ja3MnIHdv cnN0IHF1YXJ0ZXIgc2luY2UgdGhleSBsb3N0IDExLjkKcGVyY2VudCBkdXJpbmcgdGhlIHRo aXJkIHF1YXJ0ZXIgb2YgbGFzdCB5ZWFyIGFuZCB0aGUgc2Vjb25kLXdvcnN0CnF1YXJ0ZXJs eSBkcm9wIHNpbmNlIHRoZSB0aGlyZCBxdWFydGVyIG9mIDIwMDEuCgpCdXQgb3ZlcmFsbCwg dGhlcmUgd2FzIG1vcmUgcGFpbiB0aGFuIGdhaW4gZm9yIHRoZSBsb2NhbCBzdG9ja3MuIEp1 c3Qgb25lCmxvY2FsIGNvbXBhbnkgLS0gRmlyc3QgTmlhZ2FyYSBGaW5hbmNpYWwgR3JvdXAg LS0gbWFuYWdlZCB0byBnYWluIG1vcmUKdGhhbiAxMCBwZXJjZW50IGR1cmluZyB0aGUgcXVh cnRlciBhbmQgb25seSBvbmUgb3RoZXIgLS0gTmF0aW9uYWwgRnVlbApHYXMgLS0gd2FzIGHN 8JI+/zENAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMT29AAD8G6b5Bej0iQXo9KLgXABTk 578JsvpkwFAYYQgYGwAAYmxlIHRvIGVrZSBvdXQgYXMgbXVjaCBhcyBhIDUgcGVyY2VudCBn YWluLgoKSnVzdCBlaWdodCBvZiB0aGUgMjEgbG9jYWwgc3RvY2tzIGluIHRoZSBCdWZmYWxv IFBvcnRmb2xpbyB3ZW50IHVwIGR1cmluZwp0aGUgcXVhcnRlciwgYW5kIHRocmVlIG9mIHRo b3NlIGdhaW5zIHdlcmUgbGVzcyB0aGFuIDEgcGVyY2VudC4gT24gdGhlCmRvd25zaWRlLCBh IGRvemVuIGxvc3QgdmFsdWUsIHdpdGggYSB0aGlyZCBvZiB0aGUgbG9jYWwgc3RvY2tzIGxv c2luZwptb3JlIHRoYW4gMTMgcGVyY2VudC4gT25lIHdhcyB1bmNoYW5nZWQuCgpMZWFkaW5n IHRoZSBnYWluZXJzIHdhcyBGaXJzdCBOaWFnYXJhLCB3aGljaCByb2RlIGl0cyBtb21lbnR1 bSBmcm9tIGl0cwo1NSBwZXJjZW50IHN1cmdlIGxhc3QgeWVhciB0byBhbm90aGVyIDE3IHBl cmNlbnQganVtcCBkdXJpbmcgdGhlIGZpcnN0CnF1YXJ0ZXIuCgpEcml2aW5nIHRoYXQgaW5j cmVhc2Ugd2FzIHRoZSBQZW5kbGV0b24tYmFzZWQgYmFua2luZyBjb21wYW55J3MgbW92ZSB0 bwpjaGFuZ2UgaXRzIGNvcnBvcmF0ZSBzdHJ1Y3R1cmUgYW5kIHNlbGwgbW9yZSBzaGFyZXMu CgpMYXVyaWUgSHVuc2lja2VyLCBhbiBhbmFseXN0IGF0IEZyaWVkbWFuLCBCaWxsaW5ncyBS YW1zZXksIGEgVmlyZ2luaWEKaW52ZXN0bWVudCBiYW5raW5nIGZpcm0sIHNhaWQgc2hlIHRo aW5rcyB0aGVyZSdzIGEgZ29vZCBjaGFuY2UgRmlyc3QKTmlhZ2FyYSB3aWxsIG1ha2UgbW9y ZSBhY3F1aXNpdGlvbnMgdG8gcHVzaCBpbnRvIG5ldyBtYXJrZXRzLgoKIldlIGJlbGlldmUg dGhhdCB0aGV5IHdpbGwgY29udGludWUgdG8gZmlsbCBpbiBOZXcgWW9yayBzdGF0ZSBhbmQg dGhhdAp0aGV5IG1heSBsb29rIHRvIGV4cGFuZCBpbnRvIFBlbm5zeWx2YW5pYSwiIHNoZSBz YWlkLgoKTmF0aW9uYWwgRnVlbCB3YXMgdGhlIG9ubHkgb3RoZXIgbG9jYWwgc3RvY2sgdG8g ZWtlIG91dCBhbiBhcHByZWNpYWJsZQpnYWluLCByaXNpbmcgNSBwZXJjZW50IGFmdGVyIHNv YXJpbmcgZW5lcmd5IHByaWNlcyBoZWxwZWQgaXQgYm9vc3QgaXRzCnByb2ZpdHMgYnkgMzkg cGVyY2VudCwgd2hpbGUgYWdyZWVpbmcgdG8gc2VsbCBwYXJ0IG9mIGl0cyB0aW1iZXIgYnVz aW5lc3MKdG8gcGF5IGZvciBpdHMgYWNxdWlzaXRpb24gb2YgdGhlIEVtcGlyZSBTdGF0ZSBQ aXBlbGluZS4KCk5vIGxvY2FsIHN0b2NrIGhhZCBhIHdvcnNlIHF1YXJ0ZXIgdGhhbiBCdXNo IEluZHVzdHJpZXMsIHRoZQpKYW1lc3Rvd24tYmFzZWQgcmVhZHktdG8tYXNzZW1ibGUgZnVy bml0dXJlIG1ha2VyLCB3aG9zZSBzdG9jayBwbHVuZ2VkIGJ5CjY2IHBlcmNlbnQgYXMgaXQg c3RydWdnbGVkIHdpdGggd2VhayBmdXJuaXR1cmUgc2FsZXMgYW5kIGRpc2FwzfCSPq6rDQA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLi5QAB9BkfYQXo9KEF6PSIAFLgXsvpkwOTnvwlQ EP1cQWEAAM3wkj48rw0AmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxPcEAAPwbpvUF6PSJB ej0ouBcAFOTnxG2y+mTAUBBhCHlGAABwb2ludGluZwpyZXZlbnVlcyBmcm9tIGl0cyBuZXcg dGVsZWNvbW11bmljYXRpb25zIHByb2R1Y3RzLgoKQnVzaCBsb3N0ICQxLjIgbWlsbGlvbiBp biB0aGUgZm91cnRoIHF1YXJ0ZXIgYW5kIHdhcm5lZCB0aGF0IGl0cyBzYWxlcwp3b3VsZCBz bGlkZSBieSBhbm90aGVyIDEwIHBlcmNlbnQgdG8gMTUgcGVyY2VudCBkdXJpbmcgdGhlIGZp cnN0IHF1YXJ0ZXIuCkluIHJlc3BvbnNlLCBCdXNoIHNhaWQgaXQgd291bGQgY3V0IGNvc3Rz IGJ5ICQ4IG1pbGxpb24gYSB5ZWFyIGJ5IGNsb3NpbmcKYSBtYW51ZmFjdHVyaW5nIHBsYW50 IGluIFN0IFBhdWwsIFZhLiwgYW5kIHBoYXNpbmcgb3V0IHVucHJvZml0YWJsZQpwcm9kdWN0 IGxpbmVzIGluIGl0cyBCdXNoIFRlY2hub2xvZ2llcyBhbmQgQnVzaCBGdXJuaXR1cmUgRXVy b3BlIHVuaXRzLgoKQWxtb3N0IGFzIGJhdHRlcmVkIHdhcyBDb2x1bWJ1cyBNY0tpbm5vbiwg dGhlIEFtaGVyc3QgbWF0ZXJpYWxzIGhhbmRsaW5nCmVxdWlwbWVudCBtYW51ZmFjdHVyZXIs IHdoaWNoIHBsdW1tZXRlZCBieSA1OCBwZXJjZW50IGFzIHRoZSBjb21wYW55CnNjdXJyaWVk IHRvIGN1dCBjb3N0cyBhcyBpdHMgbG9zc2VzIG1vdW50LgoKVG8gY3V0IGNvc3RzLCBDb2x1 bWJ1cyBNY0tpbm5vbiBhbm5vdW5jZWQgcGxhbnMgZHVyaW5nIHRoZSBmaXJzdCBxdWFydGVy CnRvIGNsb3NlIHR3byBwbGFudHMsIHRoZSBlaWdodGggZmFjaWxpdGllcyBpdCBoYXMgY2xv c2VkIG92ZXIgdGhlIGxhc3QKeWVhci4KCkNvbHVtYnVzIE1jS2lubm9uLCB3ZWlnaHRlZCBk b3duIGJ5ICQ0MjAgbWlsbGlvbiBpbiBkZWJ0IGFuZCBhIGNhc2ggZmxvdwp0aGF0IHR1cm5l ZCBuZWdhdGl2ZSBkdXJpbmcgdGhlIGxhc3QgdGhyZWUgbW9udGhzIG9mIDIwMDIsIGxvc3Qg JDIuNQptaWxsaW9uIGR1cmluZyB0aGUgbGF0ZXN0IHF1YXJ0ZXIgYW5kIGlzIHNjdXJyeWlu ZyB0byBjdXQgaXRzIGNvc3RzIGFuZAppbXByb3ZlIGl0cyBjYXNoIGZsb3cgc28gaXQgY2Fu IHBheSBvZmYgc29tZSBvZiBpdHMgZGVidCBmYXN0ZXIuCgpUbyBzZWUgbW9yZSBvZiBUaGUg QnVmZmFsbyBOZXdzLCBOWSAgLCBvciB0byBzdWJzY3JpYmUgdG8gdGhlIG5ld3NwYXBlciwg Z28gdG8KIGh0dHA6Ly93d3cuYnVmZmFsb25ld3MuY29tLgoKLi4uICAJIAoKS2V5V29yZHMu Li4gIAogICAgYWNxdWlzaXRpb24KICAgIGJhbmtpbmcKICAgIGJ1c2gKICAgIGJ1c2luZXNz CiAgICBjb3Jwb3JhdGUKICAgIGRlYnQKICAgIGVjb25vbXkKICAgIGVuZXJneQogICAgZXVy b3BlCiAgICBmYW1pbHkKICAgIGdhc29saW5lCiAgICBpbmRleAogICAgaW5kdXN0cmlhbAog ICAgaW52ZXN0bWVudCtiYW5raW5nCiAgICBpcmFxCiAgICBsb2NhbAogICAgbWFudWZhY3TN 8JI+Pq8NAPgAAAD4AAAAAAKznQHkAAfpChZcCABFAADqT3FAAD8G7l5Bej0iQXo9KLgXABTk 58nRsvpkwFARYQjeaAAAdXJlcgogICAgbWFudWZhY3R1cmluZwogICAgbWFya2V0CiAgICBt b25leQogICAgbXV0dWFsK2Z1bmRzCiAgICBuYXNkYXEKICAgIG5ld195b3JrCiAgICBwZW5u c3lsdmFuaWEKICAgIHBsYW50CiAgICBwcmljZXMKICAgIHByb2R1Y3RzCiAgICBzYWxlcwog ICAgdGVjaG5vbG9neQogICAgdGltYmVyCiAgICB2aXJnaW5pYQogICAgd2FyCgrN8JI+QQ4O ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouLpAAH0GR9dBej0oQXo9IgAUuBey+mTA5OfJ 0VAQ/Vw2mQAAzfCSPjUPDgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLi7QAB9BkfWQXo9 KEF6PSIAFLgXsvpkwOTnypRQEPyaNpgAAM3wkj4tGg4ANgAAADYAAAAAB+kKFlwAArOdAeQI AEUAACi4vEAAfQZH1UF6PShBej0iABS4F7L6ZMDk58qUUBH8mjaXAADN8JI+NBsOADwAAAA8 AAAAAAKznQHkAAfpChZcCABFAAAoT3JAAD8G7x9Bej0iQXo9KLgXABTk58qUsvpkwVAQYQjS KQAAAAAAAAAAzfCSPvJXDgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE9zQAA/Bu8eQXo9 IkF6PSi3bQAV3fpFxrnIEf5QEGEIqoMAAAAAAAAAAM3wkj5OZw4AQgAAAEIAAAAAB+kKFlwA ArOdAeQIAEUAADSV2EAAfQZqrUF6PShBej0iG1iVD3R6BCAYjMTogBDXRYQkAAABAQgKAEIX Eg1D8wbN8JI+vmgOAMkAAADJAAAAAAKznQHkAAfpChZcCABFAAC7OvZAAD8GAwlBej0iQXo9 KJUPG1gYjMTodHoEIIAYFtAD4AAAAQEICg1D8xMAQhcSMzYwfDE0NzI2MTh8MTA0OTgxNzI5 N3wxLjB8MXw2NTF8aGVsbG8gd29ybGQKMzYxfDE0NzI2MTl8MTA0OTgxNzI5N3wxLjB8MXwz Mjd8aGVsbG8gd29ybGQKMzYyfDE0NzI2MjB8MTA0OTgxNzI5N3wxLjB8MXwxNjB8aGVsbG8g d29ybGQKzfCSPgSQDgBOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLi9QAB9Bke8QXo9KEF6 PSIAFbdtucgR/t36RcZQGPesRMkAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCs3wkj59lw4A UAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPdEAAPwbvA0F6PSJBej0ot20AFd36Rca5yBIW UBhhCJdyAABERUxFIDM2MTk5OTM4Lm91dC4wMzA0MDgNCs3wkj6/1A4AfAAAAHwAAAAAB+kK FlwAArOdAeQIAEUAAG64vkAAfQZHjUF6PShBej0iABW3bbnIEhbd+kXgUBj3kpCjAAA1NTAg MzYxOTk5Mzgub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBz cGVjaWZpZWQuIA0KzfCSPoXgDgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk91QAA/Bu8C QXo9IkF6PSi3bQAV3fpF4LnIElxQGGEIE1IAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwyNA0K zfCSPtgaDwBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARri/QAB9Bke0QXo9KEF6PSIAFbdt ucgSXN36RfpQGPd3VnQAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCs3wkj7fHQ8A UAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPdkAAPwbvAUF6PSJBej0ot20AFd36Rfq5yBJ6 UBhhCIS+AABTVE9SIDM2MTk5OTM4Lm91dC4wMzA0MDgNCs7wkj4MGAAAeAAAAHgAAAAAB+kK FlwAArOdAeQIAEUAAGq4wEAAfQZHj0F6PShBej0iABW3bbnIEnrd+kYUUBj3XRpmAAAxNTAg T3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTM4Lm91dC4w MzA0MDguDQrO8JI+8hgAAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuMFAAH0GR8hBej0o QXo9IgAUuBi6F0KHAAAAAHAC+vDWdAAAAgQFZAEBBALO8JI+dhoAAD4AAAA+AAAAAAKznQHk AAfpChZcCABFAAAwT3dAAD8G7xJBej0iQXo9KLgYABTk6d8fuhdCiHASYQir8gAAAQEEAgIE BbTO8JI+qlIAADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouMJAAH0GR89Bej0oQXo9IgAU uBi6F0KI5OnfIFAQ/Vw8YgAAzvCSPgJaAACaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE94 QAA/Bum1QXo9IkF6PSi4GAAU5OnfILoXQohQEGEIGGwAAFhZWlpZLi4uICBUQz0yIFRNPTEw NDk4MTcyODAgTU49MzYxOTk5Mzgub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0i Q29tdGV4IiBQRk49Ik0yIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIFdvcmxk IFZpZXcgUmVzZWFyY2g6IFRlbGtvbmV0IEluYyAgZmllbGQgdHJpYWwsIFN1biBjb250ZW50 IG1hbmFnZW1lbnQgc3lzdGVtLCBJQk0gY29ubmVjdGVkIGNvbW11bml0eSwgUmVkIEhhdCBl bnRlcnByaXNlIGFwcGxpY2F0aW9ucywgQnJvYWRjb20gc2hhcmVob2xkZXJzLCBhbmQgVW5p c3lzIHRvIGNvbXBldGUgd2l0aCBEZWxsCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAK CkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKE0yIFBSRVNTV0lSRSB2aWEgQ09NVEVYKSAt LQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIChDKTE5OTQtMjAwMyBNMiBDT01NVU5JQ0FU SU9OUyBMVEQKCgouLi4KCgpNMgoKQ2l0eSBvZiBJbmR1c3RyeSwgQ0EgLS0gVGVsa29uZXQs IEluYyAoT1RDQkI6IFRMS08pLCBUaGUgTGVhZGVyIGluCkNvbW1lcmNpYWwgUG93ZXJsaW5l IENvbW11bmljYXRpb25zIChQTEMpLCBhbm5vdW5jZWQgdGhlIGtpY2sgb2ZmIG9mIGEKTXVs dGktRHdlbGxpbmcgVW5pdCAoTURVKSBGaWVsZCBUcmlhbCB3aXRoIE5vbWVudCBOZXR3b3Jr cy4gVGVsa29uZXQgYW5kCk5vbWVudCBOZXR3b3JrcyBpbml0aWF0ZWQgYSB0aGlydHktZGF5 IGZpZWxkIHRyaWFsIGltcGxlbWVudGF0aW9uIHRoYXQKaW5jbHVkZXMgcHJvdmlkaW5nIElu dGVybmV0IGNvbm5lY3Rpdml0eSB2aWEgUG93ZXJsaW5lIHRvIHRoZSBsZWFzaW5nCm9mZmlj ZSwgY2x1YmhvdXNlLCBtb2RlbCBhcGFydG1lbnQsIGFuZCBtb3JlIHRoYW4gdGhpcnR5IG9j Y3VwaWVkCmFwYXJ0bWVudHMuIFRoZSBmaWVsZCB0cmlhbCBpcyB0YWtpbmcgcGxhY2UgaW4g YSBnYXJkZW4gc3R5bGUgTURVIGNvbXBsZXgKdXNpbmcgdGhlIFRlbGtvbmV0IFBsdWdQbHVz SW50ZXJuZXQgc29sdXRpb24uIFRlbGtvbmV0IGlzIGFuIGlubm92YXRpdmUKY3JlYXRvciBv ZiB1bmlxdWUgUG93ZXJsaW5lIENvbW11bmljYXRpb25zIChQTEMpIHNvbHV0aW9ucyBmb3Ig dGhlCmNvbW1lcmNpYWwgYW5kIGluZHVzdHJpYWwgbWFya2V0cywgd2hpY2ggdXRpbGl6ZXMg dGhlaXIgcGF0ZW50LXBlbmRpbmcKdGVjaG5vbG9neS4gVGVsa29uZXQgaW52ZW50cyBuZXcg bWV0aG9kcyBmb3IgZGVsaXZlcmluZyBoaWdoLXNwZWVkCkludGVybmV0IGFjY2VzcyBvdmVy IHRoZSBzdGFuZGFyZCBlbGVjdHJpY2FsIHdpcmluZyBhbHJlYWR5IGluc3RhbGxlZCBpbgpi dWlsZGluZ3MuCgpTdW4gTWljcm9zeXN0ZW1zLCBJbmMgKE5hc2RhcTogU1VOVykgdG9kYXkg bGF1bmNoZWQgdM7wkj52WgAAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxPeUAAPwbptEF6 PSJBej0ouBgAFOTp5IS6F0KIUBhhCB11AABoZSBpbmR1c3RyeSdzIGZpcnN0CmVuZC0gdG8t ZW5kIERpZ2l0YWwgQXNzZXQgTWFuYWdlbWVudCBSZWZlcmVuY2UgQXJjaGl0ZWN0dXJlIC0t IGEKY29tcHJlaGVuc2l2ZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZGVzaWduIGFuZCBkZXBs b3ltZW50IG9mIGEgY29tcGxldGUKY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSAtLSBmb3Ig dGVsZXZpc2lvbiBhbmQgcmljaCBtZWRpYSBlbnRlcnByaXNlcy4KVXNpbmcgdGhpcyBSZWZl cmVuY2UgQXJjaGl0ZWN0dXJlLCBtZWRpYSBidXNpbmVzc2VzIGNhbiBsZXZlcmFnZSBhbmQK ZXh0ZW5kIHRoZWlyIGxlZ2FjeSBwbGF0Zm9ybXMgaW50byBuZXh0LWdlbmVyYXRpb24gZGln aXRhbCBhc3NldAptYW5hZ2VtZW50IHN5c3RlbXMuIFdHQkggQm9zdG9uLCB0aGUgZmlyc3Qg Y3VzdG9tZXIgdG8gaW1wbGVtZW50IGEKc29sdXRpb24gYmFzZWQgb24gdGhpcyByZWZlcmVu Y2UgYXJjaGl0ZWN0dXJlLCBpcyB0aGUgcHJvZHVjZXIgb2YgbmVhcmx5Cm9uZS10aGlyZCBv ZiBQQlMncyBwcmltZS10aW1lIHRlbGV2aXNpb24gbGluZXVwIGFuZCBjb21wYW5pb24gb25s aW5lCmNvbnRlbnQuIEluIGFkZGl0aW9uLCBUaGlydGVlbi9XTkVUIE5ldyBZb3JrLCBwbGFu cyB0byBhZG9wdCBhbmQKaW1wbGVtZW50IHRoZSBEaWdpdGFsIEFzc2V0IE1hbmFnZW1lbnQg UmVmZXJlbmNlIEFyY2hpdGVjdHVyZSBpbiBpdHMKZXhhY3Qgc3RhdGUgYW5kIGZvcm0uCgpJ Qk0gKE5ZU0U6IElCTSkgaXMgdGFraW5nIHRoZSBob21lIG9mIHRoZSBmdXR1cmUgdG8gdGhl IG5leHQgbGV2ZWw6IHRoZQpjb25uZWN0ZWQgY29tbXVuaXR5LiBUb2dldGhlciB3aXRoIGEg ZGV2ZWxvcGVyIGFuZCBvdGhlciBidXNpbmVzcwpwYXJ0bmVycywgdGhlIHRlY2ggZ2lhbnQg aXMgdXNpbmcgYm90aCB3aXJlbGVzcyBhbmQgd2lyZWQgdGVjaG5vbG9naWVzIHRvCmNyZWF0 ZSBhIGJyb2FkIGFycmF5IG9mIGF1dG9tYXRlZCBzZXJ2aWNlcyBmb3IgaG9tZW93bmVycy4K ClJlZCBIYXQgKE5hc2RhcTogUkhBVCkgaGFzIHVudmVpbGVkIHBsYW5zIHRvIGV4cGFuZCBp dHMgc29mdHdhcmUgbGluZXVwLAphZGRpbmcgYXBwbGljYXRpb25zIGRlc2lnbmVkIHRvIHJ1 biBvbiB0b3Agb2YgaXRzIGNvcmUgb3BlcmF0aW5nIHN5c3RlbS4KQ2FsbGVkIHRoZSBSZWQg SGF0IEVudGVycHJpc2UgQXBwbGljYXRpb25zIHN1aXRlLCB0aGUgZmlyc3Qgb2ZmZXJpbmdz IGluCnRoaXMgbmV3IHByb2R1Y3QgbGluZSBhcmUgV2ViIHNlcnZlciBwb3J0YWwgYW5kIGNv bnRlbnQgbWFuYWdlbWVudAphcHBsaWNhdGlvbnMuCgpCcm9hZGNvbSAoTmFzZGFxOiBCUkNN KSBjb250aW51ZXMgdG8gcHV0IHNoYXJlaG9sZGVycyBmaXJzdC4gVGhlIElydmluZSwKQ2Fs aWbO8JI+6loAAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMT3pAAD8G6bNBej0iQXo9KLgY ABTk6enouhdCiFAYYQhRcQAAb3JuaWEgY29tbXVuaWNhdGlvbnMtY2hpcCBtYWtlciBzZXQg cGxhbnMgTW9uZGF5IHRvIGxldCBlbXBsb3llZXMKc3dhcCBtaWxsaW9ucyBvZiBvdXQtb2Yt dGhlLW1vbmV5IG9wdGlvbnMgZm9yIGEgc21hbGxlciBudW1iZXIgb2YKbWFya2V0LXByaWNl ZCBvbmVzLiBXaXRoIHRoZSBkZWNpc2lvbiwgd2hpY2ggd2lsbCBzYWRkbGUgdGhlIGNvbXBh bnkgd2l0aAphICQyMzggbWlsbGlvbiBjaGFyZ2UsIEJyb2FkY29tIGpvaW5zIGEgZ3Jvd2lu ZyBudW1iZXIgb2Ygb25jZS1ob3QgdGVjaApmaXJtcyB1c2luZyB2YXJpb3VzIHN0cmF0ZWdp ZXMgdG8ga2VlcCBzdG9jayBjb21wZW5zYXRpb24gYWxpdmUgaW4gYW4gZXJhCm9mIHBsdW5n aW5nIHNoYXJlIHByaWNlcy4KClVuaXN5cyBDb3JwIChOWVNFOiBVSVMpLCBhIGhhcmR3YXJl IGFuZCBzZXJ2aWNlcyBjb21wYW55IHRoYXQgb25jZSBzb2xkCm9ubHkgZ2lhbnQgbWFpbmZy YW1lIGNvbXB1dGVycywgb24gTW9uZGF5IGFubm91bmNlZCBwbGFucyBmb3IgYSBzbWFsbApp bmR1c3RyeS1zdGFuZGFyZCBjb21wdXRlciB0aGF0IHdvdWxkIGNvbXBldGUgd2l0aCBwcm9k dWN0cyBmcm9tCmZhc3QtZ3Jvd2luZyBEZWxsIENvbXB1dGVyIENvcnAgKE5hc2RhcU5NOiBE RUxMKS4gVW5pc3lzIHNhaWQgdGhhdCBpdAp3aWxsIHN0YXJ0IHNlbGxpbmcgY29tcHV0ZXJz IHRoYXQgaW5jbHVkZSBvbmx5IGZvdXIgbWljcm9wcm9jZXNzb3JzIG1hZGUKYnkgSW50ZWwg Q29ycCAoTmFzZGFxTk06IElOVEMpLCBhcyBvcHBvc2VkIHRvIHRoZSAxNi1wcm9jZXNzb3Ig b3IKMzItcHJvY2Vzc29yIEludGVsLWJhc2VkIGNvbXB1dGVycyB0aGF0IGl0IHByZXZpb3Vz bHkgb2ZmZXJlZC4gVW5pc3lzCnNhaWQgaXQgaXMgdGFyZ2V0aW5nIGJ1eWVycyBvZiBtYWNo aW5lcyBiYXNlZCBvbiB0aGUgcG9wdWxhciBVbml4Cm9wZXJhdGluZyBzeXN0ZW0sIHdoaWNo IGFyZSBtYWRlIGJ5IGNvbXBhbmllcyBpbmNsdWRpbmcgSW50ZXJuYXRpb25hbApCdXNpbmVz cyBNYWNoaW5lcyBDb3JwIChOWVNFOiBJQk0pLCBTdW4gTWljcm9zeXN0ZW1zIEluYyAoTmFz ZGFxTk06IFNVTlcpCmFuZCBIZXdsZXR0LVBhY2thcmQgQ28gKE5ZU0U6IEhQUSkuCgpDT05U QUNUOiBXb3JsZCBWaWV3IFJlc2VhcmNoIGUtbWFpbDogaW5mb0B3b3JsZHZpZXdyZXNlYXJj aC5jb20KCk0yIENvbW11bmljYXRpb25zIEx0ZCBkaXNjbGFpbXMgYWxsIGxpYWJpbGl0eSBm b3IgaW5mb3JtYXRpb24gcHJvdmlkZWQKd2l0aGluIE0yIFByZXNzV0lSRS4gRGF0YSBzdXBw bGllZCBieSBuYW1lZCBwYXJ0eS9wYXJ0aWVzLiBGdXJ0aGVyCmluZm9ybWF0aW9uIG9uIE0y IFByZXNzV0lSRSBjYW4gYmUgb2J0YWluZWQgYXQgaHR0cDovL3d3dy5wcmVzc3dpzvCSPuLU AAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLjDQAB9BkfOQXo9KEF6PSIAFLgYuhdCiOTp 6ehQEP1cMZoAAM7wkj7f1gAAKQIAACkCAAAAArOdAeQAB+kKFlwIAEUAAhtPe0AAPwbtI0F6 PSJBej0ouBgAFOTp70y6F0KIUBlhCDWiAAByZS5uZXQKb24gdGhlIHdvcmxkIHdpZGUgd2Vi LiBJbnF1aXJpZXMgdG8gaW5mb0BtMi5jb20uCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAg ICBhcmNoaXRlY3R1cmUKICAgIGJ1c2luZXNzCiAgICBjYWxpZm9ybmlhCiAgICBjb21tZXJj aWFsCiAgICBjb21tdW5pY2F0aW9ucwogICAgY29tbXVuaXR5CiAgICBjb21wdXRlcgogICAg Y29udGVudAogICAgZWxlY3RyaWNhbAogICAgZS1tYWlsCiAgICBoYXJkd2FyZQogICAgaW5k dXN0cmlhbAogICAgaW50ZXJuZXQKICAgIG1hcmtldAogICAgbWVkaWEKICAgIG5hc2RhcQog ICAgbmV3X3lvcmsKICAgIG5ldytwcm9kdWN0CiAgICBueXNlCiAgICBvbmxpbmUKICAgIG9w ZXJhdGluZytzeXN0ZW0KICAgIHBhdGVudAogICAgcHJpY2VzCiAgICBwcm9kdWN0cwogICAg cmVzZWFyY2gKICAgIHNvZnR3YXJlCiAgICB0ZWNobm9sb2d5CiAgICB0ZWxldmlzaW9uCiAg ICB0cmlhbAogICAgdW5peAogICAgd2ViCiAgICB3aXJlbGVzcwoKzvCSPvMbAQA2AAAANgAA AAAH6QoWXAACs50B5AgARQAAKLjEQAB9BkfNQXo9KEF6PSIAFLgYuhdCiOTp8UBQEP1cKkIA AM7wkj6nKAEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi4xUAAfQZHzEF6PShBej0iABS4 GLoXQojk6fFAUBH9XCpBAADO8JI+2CkBADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT3xA 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 CABFAACPOv1AAD8GAy5Bej0iQXo9KJUPG1gYjMc4dHoEIIAYFtDETgAAAQEICg1D9TYAQhdJ MzczfDE0NzI2MzF8MTA0OTgxNzMwMnwxLjB8MXw2NTR8aGVsbG8gd29ybGQKMzc0fDE0NzI2 MzJ8MTA0OTgxNzMwMnwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCtPwkj7hogkAQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSV4EAAfQZqpUF6PShBej0iG1iVD3R6BCAYjMeTgBDUmoG7AAAB AQgKAEIXSw1D9TbW8JI+HxkFAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiOv5AAD8GA1pB ej0iQXo9KJUPG1gYjMeTdHoEIIAYFtBZEQAAAQEICg1D9loAQhdLMzc1fDE0NzI2MzN8MTA0 OTgxNzMwNHwxLjB8MXwyODU4fGhlbGxvIHdvcmxkCtbwkj6NQAcAQgAAAEIAAAAAB+kKFlwA ArOdAeQIAEUAADSV4UAAfQZqpEF6PShBej0iG1iVD3R6BCAYjMfBgBDUbIB6AAABAQgKAEIX aA1D9lrW8JI+HUIHAMwAAADMAAAAAAKznQHkAAfpChZcCABFAAC+Ov9AAD8GAv1Bej0iQXo9 KJUPG1gYjMfBdHoEIIAYFtCHJAAAAQEICg1D9mgAQhdoMzc2fDE0NzI2MzR8MTA0OTgxNzMw NHwxLjB8MXwyODU4fGhlbGxvIHdvcmxkCjM3N3wxNDcyNjM1fDEwNDk4MTczMDR8MS4wfDF8 MjU2NnxoZWxsbyB3b3JsZAozNzh8MTQ3MjYzNnwxMDQ5ODE3MzA1fDEuMHwxfDI4NTh8aGVs bG8gd29ybGQK1vCSPhuXCgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJXiQAB9BmqjQXo9 KEF6PSIbWJUPdHoEIBiMyEuAENPigGoAAAEBCAoAQhdqDUP2aNbwkj7mMQsAcAAAAHAAAAAA ArOdAeQAB+kKFlwIAEUAAGI7AEAAPwYDWEF6PSJBej0olQ8bWBiMyEt0egQggBgW0FgIAAAB AQgKDUP2ggBCF2ozNzl8MTQ3MjYzN3wxMDQ5ODE3MzA2fDEuMHwxfDk2NjJ8aGVsbG8gd29y bGQK1vCSPn/tDQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJXjQAB9BmqiQXo9KEF6PSIb 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 NnwxMDQ5ODE3MzE2fDEuMHwxfDQ4MnxoZWxsbyB3b3JsZArj8JI+OycEAEIAAABCAAAAAAfp ChZcAAKznQHkCABFAAA0lfNAAH0GapJBej0oQXo9IhtYlQ90egQgGIzL24AQ0FJ7AgAAAQEI CgBCF+gNQ/tS4/CSPhkpBAAlAQAAJQEAAAACs50B5AAH6QoWXAgARQABFzsRQAA/BgKSQXo9 IkF6PSiVDxtYGIzL23R6BCCAGBbQwaEAAAEBCAoNQ/tnAEIX6DM5OXwxNDcyNjU3fDEwNDk4 MTczMTZ8MS4wfDF8NjUxfGhlbGxvIHdvcmxkCjQwMHwxNDcyNjU4fDEwNDk4MTczMTZ8MS4w fDF8MjkxNXxoZWxsbyB3b3JsZAo0MDF8MTQ3MjY1OXwxMDQ5ODE3MzE3fDEuMHwxfDk2NjJ8 aGVsbG8gd29ybGQKNDAyfDE0NzI2NjB8MTA0OTgxNzMxN3wxLjB8MXw2NTR8aGVsbG8gd29y bGQKNDAzfDE0NzI2NjF8MTA0OTgxNzMxN3wxLjB8MXw0ODJ8aGVsbG8gd29ybGQK4/CSPqV9 BwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJX0QAB9BmqRQXo9KEF6PSIbWJUPdHoEIBiM zL6AEM9veusAAAEBCAoAQhfqDUP7Z+Pwkj7efgcAywAAAMsAAAAAArOdAeQAB+kKFlwIAEUA AL07EkAAPwYC60F6PSJBej0olQ8bWBiMzL50egQggBgW0JbLAAABAQgKDUP7fQBCF+o0MDR8 MTQ3MjY2MnwxMDQ5ODE3MzE4fDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAo0MDV8MTQ3MjY2M3wx MDQ5ODE3MzE4fDEuMHwxfDEzMTB8aGVsbG8gd29ybGQKNDA2fDE0NzI2NjR8MTA0OTgxNzMx OHwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCuPwkj5C1AoAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSV9UAAfQZqkEF6PShBej0iG1iVD3R6BCAYjM1HgBDO5nrTAAABAQgKAEIX7A1D+33j 8JI+xtUKAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiOxNAAD8GA0VBej0iQXo9KJUPG1gY jM1HdHoEIIAYFtBTgwAAAQEICg1D+5MAQhfsNDA3fDE0NzI2NjV8MTA0OTgxNzMxOXwxLjB8 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 Qk+BQAA/Bu72QXo9IkF6PSi3bQAV3fpGSLnIEzhQGGEIi7EAAFNUT1IgMzYxOTk5NDAub3V0 LjAzMDQwOA0K7PCSPjmAAgB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarjKQAB9BkeFQXo9 KEF6PSIAFbdtucgTON36RmJQGPcOGLEAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEg Y29ubmVjdGlvbiBmb3IgMzYxOTk5NDAub3V0LjAzMDQwOC4NCuzwkj41gQIAPgAAAD4AAAAA B+kKFlwAArOdAeQIAEUAADC4y0AAfQZHvkF6PShBej0iABS4JK0MxnkAAAAAcAL68F+BAAAC BAVkAQEEAuzwkj7xggIAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBPgkAAPwbvB0F6PSJB ej0ouCQAFOV2pbStDMZ6cBJhCG3dAAABAQQCAgQFtOzwkj5uugIANgAAADYAAAAAB+kKFlwA ArOdAeQIAEUAACi4zEAAfQZHxUF6PShBej0iABS4JK0MxnrldqW1UBD9XP5MAADs8JI+msEC AFcEAABXBAAAAAKznQHkAAfpChZcCABFAARJT4NAAD8G6u1Bej0iQXo9KLgkABTldqW1rQzG elAYYQj1QQAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzMxMCBNTj0zNjE5OTk0MC5vdXQg U1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRp b24gKEVVUikiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgTGEgVHJpYnVuZTog RnJlbmNoIGJyb2FkY2FzdGluZyBmYXJlcyBiZXR0ZXIgdGhhbiBwcmVzcwoKLi4uICAJIAoK QnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDgsIDIwMDMsIChMYSBUcmli dW5lIC9GVCBJbmZvcm1hdGlvbiB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExp bmUuLi4gIENvcHlyaWdodCAyMDAzOiBGaW5hbmNpYWwgVGltZXMgSW5mb3JtYXRpb24uIEFs bCByaWdodHMgcmVzZXJ2ZWQKCgouLi4KCgpGVCBJbmZvcm1hdGlvbiAoRVVSKQoKQWNjb3Jk aW5nIHRvIGZpZ3VyZXMgcmVsZWFzZWQgYnkgdGhlIEZyZW5jaCBtZWRpYSBtb25pdG9yIFpl bml0aApPcHRpbWVkaWEsIHJldmVudWVzIGZyb20gYWR2ZXJ0aXNpbmcgb24gRnJlbmNoIHRl bGV2aXNpb24gYW5kIHJhZGlvCnNob3VsZCByaXNlIHJlc3BlY3RpdmVseSBieSAyLjMgYW5k IDUuNSBwZXIgY2VudCBpbiAyMDAzLiBJbiAyMDA0LAptb3Jlb3ZlciwgdGhvc2UgcmF0ZXMg c2hvdWxkIGluY3JlYXNlIHRvIDMuNSBhbmQgNC44IHBlciBjZW50LCB0aGFua3MgdG8KdGhl IE9seW1waWMgR2FtZXMuCgpBZHZlcnRpc2luZyBpbiB0aGUgRnJlbmNoIHByZXNzIGFuZCBv biBiaWxsYm9hcmRzIHdpbGwgZXhwYW5kIGF0IGEgbG93ZXIKcmF0ZSB0aGlzIHllYXIgdGhh biB0aGVpciBlbGVjdHJvbmljIGVxdWl2YWxlbnRzLCBzYXlzIFplbml0aCBPcHRpbWVkaWEu CkZyYW5jZSdzIGFkdmVydGlzaW5nIG1hcmtldCBhcyBhIHdob2xlIHNob3VsZCBzaG93IGdy b3d0aCBvZiBvbmx5IDEuMyBwZXIKY2VudC4KCkFic3RyYWN0ZWQgZnJvbSBMYSBUcmlidW5l CgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhZHZlcnRpc2luZwogICAgZnJhbmNlCiAg ICBtYXJrZXQKICAgIG1lZGlhCiAgICByYWRpbwogICAgcmF0ZXMKCuzwkj6bwQIAPAAAADwA AAAAArOdAeQAB+kKFlwIAEUAAChPhEAAPwbvDUF6PSJBej0ouCQAFOV2qdatDMZ6UBFhCJZ/ AAAAAAAAAADs8JI+zRYDADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouM1AAH0GR8RBej0o QXo9IgAUuCStDMZ65Xap11AQ+Tv+SwAA7PCSPiEmAwA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLjOQAB9BkfDQXo9KEF6PSIAFLgkrQzGeuV2qddQEfk7/koAAOzwkj5uJwMAPAAAADwA AAAAArOdAeQAB+kKFlwIAEUAAChPhUAAPwbvDEF6PSJBej0ouCQAFOV2qdetDMZ7UBBhCJZ+ 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 NjUsMTIyLDYxLDM0LDE4NCwzNw0K8fCSPjarBABUAAAAVAAAAAAH6QoWXAACs50B5AgARQAA RrjRQAB9BkeiQXo9KEF6PSIAFbdtucgT2N36RpZQGPbZVPoAADIwMCBQT1JUIGNvbW1hbmQg c3VjY2Vzc2Z1bC4NCvHwkj4urgQAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPikAAPwbu 7UF6PSJBej0ot20AFd36Rpa5yBP2UBhhCImlAABTVE9SIDM2MTk5OTQxLm91dC4wMzA0MDgN CvHwkj5RsAUAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq40kAAfQZHfUF6PShBej0iABW3 bbnIE/bd+kawUBj2vxfzAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rp b24gZm9yIDM2MTk5OTQxLm91dC4wMzA0MDguDQrx8JI+bsIFAD4AAAA+AAAAAAfpChZcAAKz nQHkCABFAAAwuNNAAH0GR7ZBej0oQXo9IgAUuCVtTU1MAAAAAHAC+vAYbQAAAgQFZAEBBALx 8JI+Z8QFAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwT4tAAD8G7v5Bej0iQXo9KLglABTl jAIkbU1NTXASYQjKQwAAAQEEAgIEBbTx8JI+wfwFADYAAAA2AAAAAAfpChZcAAKznQHkCABF AAAouNRAAH0GR71Bej0oQXo9IgAUuCVtTU1N5YwCJVAQ/VxaswAA8fCSPjsEBgCsBAAArAQA AAACs50B5AAH6QoWXAgARQAEnk+MQAA/BuqPQXo9IkF6PSi4JQAU5YwCJW1NTU1QGGEIth0A AFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTczMTEgTU49MzYxOTk5NDEub3V0IFNSQz1jb210 ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoK Ci4uLiAJIAoKCkhlYWRMaW5lLi4uICBEVUNULEFJUiBFWElULEZVRUwgSEVBVEVSCgouLi4g IAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKEZl ZEJpek9wcHMgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5 cmlnaHQgKGMpIDIwMDMgRmVkZXJhbCBJbmZvcm1hdGlvbiAmIE5ld3MgRGlzcGF0Y2gsIElu Yy4KCgouLi4KCgpGZWRCaXpPcHMKCk5PVElDRSBUWVBFOiBDT05UUkFDVCBBV0FSRAoKU09V UkNFOiBQdWJsaXNoZWQgaW4gRmVkQml6T3BwcwoKREFURSBQT1NURUQ6IDA3LUFQUi0wMwoK T0ZGSUNFIEFERFJFU1M6IERFRkVOU0UgR0VORVJBTCBTVVBQTFkgQ0VOVEVSIDgwMDAgSkVG RiBEQVZJUyBIV1kKUklDSE1PTkQsIFZBIDIzMjk3LTUzIDEyCgpDTEFTU0lGSUNBVElPTiBD T0RFOiAxNSAtIEFpcmNyYWZ0ICYgYWlyZnJhbWUgc3RydWN0dXJhbCBjb21wb25lbnRzCgpT VUJKRUNUOiBEVUNULEFJUiBFWElULEZVRUwgSEVBVEVSCgpTT0xJQ0lUQVRJT04gTlVNQkVS OiBTUDA0NzAtMDMtWC1XMzMzCgpBV0FSRCBOVU1CRVI6IFNQMDQ3MC0wMy1NLUJKNzEKCkFX QVJEIEFNT1VOVDogJDU0LDMyMAoKTElORSBOVU1CRVI6IDAwMDEgVEhST1VHSCAwMDAyCgpB V0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQgVE86IFNFTklPUiBPUEVSQVRJT05TIElOQyBT RU5JT1IgQUVST1NQQUNFIFNTUCBESVYgMjk4MCBOIFNBTgpGRVJOQU5ETyBCTFZEIEJVUkJB TksgQ0EgOTE1MDQtMjUyMgoKQVJDSElWRSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFDVDogTi9B CgpJTlRFUk5FVCBBRERSRVNTOgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NS L0F3YXJkcy9TUDA0NzAtMDMtTS1CSjcxTG4wMDAxX19fVEhST1VHSF9fMDAwMi5odG1sCgou Li4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhaXJjcmFmdAogICAgY2FsaWZvcm5pYQogICAg Y29udHJhY3QKICAgIGRlZmVuc2UKICAgIGludGVybmV0CiAgICBzdHJ1Y3R1cmFsCiAgICB2 aXJnaW5pYQoK8fCSPjwEBgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE+NQAA/Bu8EQXo9 IkF6PSi4JQAU5YwGm21NTU1QEWEI8pAAAAAAAAAAAPHwkj7EWwYANgAAADYAAAAAB+kKFlwA ArOdAeQIAEUAACi41UAAfQZHvEF6PShBej0iABS4JW1NTU3ljAacUBD45lqyAADx8JI+lZQG ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouNZAAH0GR7tBej0oQXo9IgAUuCVtTU1N5YwG nFAR+OZasQAA8fCSPq+VBgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE+OQAA/Bu8DQXo9 IkF6PSi4JQAU5YwGnG1NTU5QEGEI8o8AAAAAAAAAAPHwkj6OLwcAPAAAADwAAAAAArOdAeQA B+kKFlwIAEUAAChPj0AAPwbvAkF6PSJBej0ot20AFd36RrC5yBQ4UBBhCKdfAAAAAAAAAADx 8JI+K2gHAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuNdAAH0GR6JBej0oQXo9IgAVt225 yBQ43fpGsFAY9r9CkgAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0K8fCSPvpvBwBQAAAAUAAA AAACs50B5AAH6QoWXAgARQAAQk+QQAA/Bu7nQXo9IkF6PSi3bQAV3fpGsLnIFFBQGGEImU0A AERFTEUgMzYxOTk5NDMub3V0LjAzMDQwOA0K8fCSPpqsBwB8AAAAfAAAAAAH6QoWXAACs50B 5AgARQAAbrjYQAB9BkdzQXo9KEF6PSIAFbdtucgUUN36RspQGPaljXEAADU1MCAzNjE5OTk0 My5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmll ZC4gDQrx8JI+VrgHAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCT5FAAD8G7uZBej0iQXo9 KLdtABXd+kbKucgUllAYYQgPKgAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDM4DQrx8JI+L/MH AFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuNlAAH0GR5pBej0oQXo9IgAVt225yBSW3fpG 5FAY9opUPQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K8fCSPnb2BwBQAAAAUAAA AAACs50B5AAH6QoWXAgARQAAQk+SQAA/Bu7lQXo9IkF6PSi3bQAV3fpG5LnIFLRQGGEIhpkA AFNUT1IgMzYxOTk5NDMub3V0LjAzMDQwOA0K8fCSPuozCAB4AAAAeAAAAAAH6QoWXAACs50B 5AgARQAAarjaQAB9Bkd1QXo9KEF6PSIAFbdtucgUtN36Rv5QGPZwFzQAADE1MCBPcGVuaW5n IEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5NDMub3V0LjAzMDQwOC4N CvHwkj7fNAgAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC420AAfQZHrkF6PShBej0iABS4 Jn2vhlEAAAAAcAL68M8EAAACBAVkAQEEAvHwkj5KNggAPgAAAD4AAAAAArOdAeQAB+kKFlwI AEUAADBPk0AAPwbu9kF6PSJBej0ouCYAFOWOPoZ9r4ZScBJhCER3AAABAQQCAgQFtPHwkj6/ bggANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi43EAAfQZHtUF6PShBej0iABS4Jn2vhlLl jj6HUBD9XNTmAADx8JI+z3YIAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMT5RAAD8G6ZlB ej0iQXo9KLgmABTljj6Hfa+GUlAQYQgo+wAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzMx MiBNTj0zNjE5OTk0My5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgi IFBGTj0iQ0NOTWF0dGhld3MiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgRmlu bmluZyBDbG9zZXMgQWNxdWlzaXRpb24gb2YgdGhlIENhdGVycGlsbGFyIERlYWxlcnNoaXAg aW4gQm9saXZpYQoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAg VkFOQ09VVkVSLCBCUklUSVNIIENPTFVNQklBLCBBcHIgOCwgMjAwMyAoQ0NOTWF0dGhld3Mg dmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKEMp IDIwMDMsIENDTk1hdHRoZXdzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCkNDTk1h dHRoZXdzCgpGaW5uaW5nIEludGVybmF0aW9uYWwgSW5jIGFubm91bmNlZCB0b2RheSB0aGF0 IGl0IGhhcyBjbG9zZWQgdGhlCnByZXZpb3VzbHkgYW5ub3VuY2VkIGFjcXVpc2l0aW9uIG9m IE1hdHJlcSBGZXJyZXlyb3MgUyBBICwgdGhlCkNhdGVycGlsbGFyIGRlYWxlcnNoaXBzIGlu IEJvbGl2aWEuIFRoZSBhY3F1aXNpdGlvbiBpcyBlZmZlY3RpdmUgQXByaWwgMSwKMjAwMy4K CkZpbm5pbmcgSW50ZXJuYXRpb25hbCBJbmMgc2VsbHMsIHJlbnRzLCBmaW5hbmNlcyBhbmQg cHJvdmlkZXMgY3VzdG9tZXIKc3VwcG9ydCBzZXJ2aWNlcyBmb3IgQ2F0ZXJwaWxsYXIgZXF1 aXBtZW50IGFuZCBlbmdpbmVzLCBhbmQgY29tcGxlbWVudGFyeQplcXVpcG1lbnQsIGluIFdl c3Rlcm4gQ2FuYWRhLCB0aGUgVUsgLCBhbmQgU291dGggQW1lcmljYSAoQXJnZW50aW5hLApC b2xpdmlhLCBDaGlsZSBhbmQgVXJ1Z3VheSkuIFRoZSBjb3Jwb3JhdGlvbidzIEhlYWQgT2Zm aWNlIGlzIGxvY2F0ZWQgaW4KVmFuY291dmVyLCBCQyAsIENhbmFkYS4gRmlubmluZyBJbnRl cm5hdGlvbmFsIEluYyAod3d3LmZpbm5pbmcuY29tKSBpcyBhCndpZGVseSBoZWxkLCBwdWJs aWNseSB0cmFkZWQgY29ycG9yYXRpb24sIGxpc3RlZCBvbiB0aGUgVG9yb250byBTdG9jawpF eGNoYW5nZSAoc3ltYm9sIEZUVCkuCgpUaGlzIHJlbGVhc2UgY29udGFpbnMgZm9yd2FyZC1s b29raW5nIHN0YXRlbWVudHMgYW5kIGluZm9ybWF0aW9uLCB3aGljaApyZWZsZWN0IHRoZSBj dXJyZW50IHZpZXcgb2YgRmlubmluZyBJbnRlcm5hdGlvbmFsIEluYyB3aXRoIHJlc3BlY3Qg dG8KZnV0dXJlIGV2ZW50cyBhbmQgZmluYW5jaWFsIHBlcmZvcm1hbmNlLiBBbnkgc3VjaCBm b3J3YXJkLWxvb2tpbmcKc3RhdGVtZW50cyBhcmUgc3ViamVjdCB0byByaXNrcyBhbmQgdW5j ZXJ0YWludGllcyBhbmQgRmlubmluZydzIGFjdHVhbApyZXN1bHRzIG9mIG9wZXJhdGlvbnMg Y2918fCSPit3CAA2BAAANgQAAAACs50B5AAH6QoWXAgARQAEKE+VQAA/Bur8QXo9IkF6PSi4 JgAU5Y5D632vhlJQGGEIyS8AAGxkIGRpZmZlciBtYXRlcmlhbGx5IGZyb20gaGlzdG9yaWNh bCByZXN1bHRzIG9yCmN1cnJlbnQgZXhwZWN0YXRpb25zLiBGaW5uaW5nIGFzc3VtZXMgbm8g b2JsaWdhdGlvbiB0byBwdWJsaWNseSB1cGRhdGUgb3IKcmV2aXNlIGl0cyBmb3J3YXJkLWxv b2tpbmcgc3RhdGVtZW50cyBldmVuIGlmIGV4cGVyaWVuY2Ugb3IgZnV0dXJlCmNoYW5nZXMg bWFrZSBpdCBjbGVhciB0aGF0IGFueSBwcm9qZWN0ZWQgcmVzdWx0cyBleHByZXNzZWQgb3Ig aW1wbGllZAp0aGVyZWluIGRvIG5vdCBtYXRlcmlhbGl6ZS4KClJlZmVyIHRvIEZpbm5pbmcn cyBhbm51YWwgcmVwb3J0LCBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIGNpcmN1bGFyLCBhbm51 YWwKaW5mb3JtYXRpb24gZm9ybSBhbmQgb3RoZXIgZmlsaW5ncyB3aXRoIHRoZSBPbnRhcmlv IFNlY3VyaXRpZXMgQ29tbWlzc2lvbgphbmQgVG9yb250byBTdG9jayBFeGNoYW5nZSBmb3Ig ZnVydGhlciBpbmZvcm1hdGlvbiBvbiByaXNrcyBhbmQKdW5jZXJ0YWludGllcyB0aGF0IGNv dWxkIGNhdXNlIGFjdHVhbCByZXN1bHRzIHRvIGRpZmZlciBtYXRlcmlhbGx5IGZyb20KZm9y d2FyZC1sb29raW5nIHN0YXRlbWVudHMgY29udGFpbmVkIGluIHRoaXMgcmVwb3J0LgoKRmlu bmluZyBJbnRlcm5hdGlvbmFsIEluYyAKQW50aG9ueSBSICBHdWdsaWVsbWluClZpY2UgUHJl c2lkZW50IGFuZCBDb3Jwb3JhdGUgVHJlYXN1cmVyCig2MDQpIDMzMS00OTM3Cig2MDQpIDMz MS00ODk5ICAoRkFYKQpFbWFpbDogYWd1Z2xpZWxtaW5AZmlubmluZy5jYQpXZWJzaXRlOiB3 d3cuZmlubmluZy5jb20KCk5FV1MgUkVMRUFTRSBUUkFOU01JVFRFRCBCWSBDQ05NYXR0aGV3 cwoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYWNxdWlzaXRpb24KICAgIGFubnVhbCty ZXBvcnQKICAgIGFyZ2VudGluYQogICAgYm9saXZpYQogICAgY2FuYWRhCiAgICBjaGlsZQog ICAgc2VjdXJpdGllcwogICAgc291dGgrYW1lcmljYQogICAgdG9yb250bwogICAgdXJ1Z3Vh eQogICAgdmFuY291dmVyCgrx8JI+LHcIADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT5ZA AD8G7vtBej0iQXo9KLgmABTljkfrfa+GUlARYQhn1gAAAAAAAAAA8fCSPoujCABwAAAAcAAA AAACs50B5AAH6QoWXAgARQAAYjsoQAA/BgMwQXo9IkF6PSiVDxtYGIzRvnR6BCCAGBbQTyAA AAEBCAoNRAD9AEIYdDQzMnwxNDcyNjkxfDEwNDk4MTczMzJ8MS4wfDF8MTIwM3xoZWxsbyB3 b3JsZArx8JI+eukIADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouN1AAH0GR7RBej0oQXo9 IgAUuCZ9r4ZS5Y5H7FAQ/VzLgQAA8fCSPkj2CAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLjeQAB9BkezQXo9KEF6PSIAFLgmfa+GUuWOR+xQEf1cy4AAAPHwkj6d9wgAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChPl0AAPwbu+kF6PSJBej0ouCYAFOWOR+x9r4ZTUBBhCGfVAAAA AAAAAADx8JI+EqEJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT5hAAD8G7vlBej0iQXo9 KLdtABXd+kb+ucgU9lAQYQimUwAAAAAAAAAA8fCSPkjaCQBOAAAATgAAAAAH6QoWXAACs50B 5AgARQAAQLjfQAB9BkeaQXo9KEF6PSIAFbdtucgU9t36Rv5QGPZwQdUAADIyNiBUcmFuc2Zl ciBjb21wbGV0ZS4NCvHwkj5y4QkAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPmUAAPwbu 3kF6PSJBej0ot20AFd36Rv65yBUOUBhhCJRBAABERUxFIDM2MTk5OTQ3Lm91dC4wMzA0MDgN CvHwkj5lQgoAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG644EAAfQZHa0F6PShBej0iABW3 bbnIFQ7d+kcYUBj2VoywAAA1NTAgMzYxOTk5NDcub3V0LjAzMDQwODogVGhlIHN5c3RlbSBj YW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K8fCSPi1OCgBQAAAAUAAAAAACs50B 5AAH6QoWXAgARQAAQk+aQAA/Bu7dQXo9IkF6PSi3bQAV3fpHGLnIFVRQGGEIDh0AAFBPUlQg NjUsMTIyLDYxLDM0LDE4NCwzOQ0K8fCSPkKICgBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAA RrjhQAB9BkeSQXo9KEF6PSIAFbdtucgVVN36RzJQGPY7U4AAADIwMCBQT1JUIGNvbW1hbmQg c3VjY2Vzc2Z1bC4NCvHwkj7+kAoAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPm0AAPwbu 3EF6PSJBej0ot20AFd36RzK5yBVyUBhhCIGNAABTVE9SIDM2MTk5OTQ3Lm91dC4wMzA0MDgN CvHwkj5F1AoAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWC0AAfQZqekF6PShBej0iG1iV D3R6BCAYjNHsgBDKQXTHAAABAQgKAEIYeA1EAP3x8JI+Iu4KAHgAAAB4AAAAAAfpChZcAAKz nQHkCABFAABquOJAAH0GR21Bej0oQXo9IgAVt225yBVy3fpHTFAY9iEWcwAAMTUwIE9wZW5p bmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTk0Ny5vdXQuMDMwNDA4 Lg0K8fCSPg/vCgA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLjjQAB9BkemQXo9KEF6PSIA FLgnrapjvQAAAABwAvrwwZwAAAIEBWQBAQQC8fCSPozwCgA+AAAAPgAAAAACs50B5AAH6QoW XAgARQAAME+cQAA/Bu7tQXo9IkF6PSi4JwAU5ZD+mq2qY75wEmEIdvgAAAEBBAICBAW08fCS PvkoCwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLjkQAB9BketQXo9KEF6PSIAFLgnrapj vuWQ/ptQEP1cB2gAAPHwkj5QMAsADAUAAAwFAAAAArOdAeQAB+kKFlwIAEUABP5PnUAAPwbq HkF6PSJBej0ouCcAFOWQ/putqmO+UBhhCM6YAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3 MzEyIE1OPTM2MTk5OTQ3Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRl eCIgUEZOPSJGVCBJbmZvcm1hdGlvbiAoRVVSKSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRM aW5lLi4uICBFbCBQYWlzOiBMYSBTZWRhIHNoYXJlaG9sZGVyIHNldHMgY29uZGl0aW9ucyBm b3IgcHVyY2hhc2Ugb2YgU2VsZW5pcwoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpE YXRlTGluZS4uLiAgQXByIDgsIDIwMDMsIChFbCBQYWlzIC9GVCBJbmZvcm1hdGlvbiB2aWEg Q09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAyMDAzOiBG aW5hbmNpYWwgVGltZXMgSW5mb3JtYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQKCgouLi4K CgpGVCBJbmZvcm1hdGlvbiAoRVVSKQoKQWJhIEh1c2FpLCB0aGUgU2F1ZGkgZ3JvdXAgd2hp Y2ggaXMgdGhlIGxhcmdlc3Qgc2hhcmVob2xkZXIgb2YgU3BhbmlzaApjaGVtaWNhbCBhbmQg dGV4dGlsZXMgZ3JvdXAgTGEgU2VkYSBkZSBCYXJjZWxvbmEgd2l0aCAxMy42OCBwZXIgY2Vu dCB2aWEKUEMgWFhJLCB5ZXN0ZXJkYXkgc2V0IGNvbmRpdGlvbnMgZm9yIHRoZSBwdXJjaGFz ZSBvZiBQb3J0dWd1ZXNlIGdyb3VwClNlbGVuaXMsIGZvcm1lcmx5IGNhbGxlZCBUcmV2aXJh LiBBYmEgSHVzYWkgYmVsaWV2ZXMgdGhhdCBpdCBzdGlsbCBkb2VzCm5vdCBoYXZlIGVub3Vn aCBpbmZvcm1hdGlvbiB0byBldmFsdWF0ZSB0aGUgcHVyY2hhc2UuCgpHdXN0YXZvIFBlcmV6 IENhcmJhbGxvLCByZXByZXNlbnRpbmcgUEMuWFhJLCBleHBsYWluZWQgdGhlIHBvc2l0aW9u IG9mCmhpcyBncm91cCB0byB0aGUgZ2VuZXJhbCBtZWV0aW5nIG9mIHNoYXJlaG9sZGVycyBv ZiBMYSBTZWRhLiBIZSByZXF1ZXN0ZWQKdmlhYmlsaXR5IHN0dWRpZXMgdG8ganVzdGlmeSB0 aGUgcHVyY2hhc2UgaW4gcmVsYXRpb24gdG8gb3RoZXIgcG9zc2libGUKb3B0aW9ucy4gTGEg U2VkYSBkaXJlY3RvcnMgc2F5cyB0aGF0IHRoZSBTYXVkaSBncm91cCBpcyBub3QgcXVlc3Rp b25pbmcKdGhlIGNhcGl0YWwgaW5jcmVhc2UgaW4gaXRzZWxmLCBidXQgd2FudHMgbW9yZSBp bmZvcm1hdGlvbiBhYm91dCBob3cgdGhlCmZ1bmRzIGFyZSBnb2luZyB0byBiZSB1c2VkLgoK QWJzdHJhY3RlZCBmcm9tIEVsIFBhaXMKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIHNh dWRpK2FyYWJpYQogICAgdGV4dGlsZXMKCvHwkj5RMAsAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChPnkAAPwbu80F6PSJBej0ouCcAFOWRA3GtqmO+UBFhCJ7lAAAAAAAAAADx8JI+84oL ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouOVAAH0GR6xBej0oQXo9IgAUuCetqmO+5ZED clAQ+IYHZwAA8fCSPjiXCwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLjmQAB9BkerQXo9 KEF6PSIAFLgnrapjvuWRA3JQEfiGB2YAAPHwkj6ImAsAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChPn0AAPwbu8kF6PSJBej0ouCcAFOWRA3KtqmO/UBBhCJ7kAAAAAAAAAADx8JI+sl8M ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT6BAAD8G7vFBej0iQXo9KLdtABXd+kdMucgV tFAQYQilRwAAAAAAAAAA8fCSPimYDABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLjnQAB9 BkeSQXo9KEF6PSIAFbdtucgVtN36R0xQGPYhQRgAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4N CvHwkj6qngwAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPoUAAPwbu1kF6PSJBej0ot20A Fd36R0y5yBXMUBhhCJE1AABERUxFIDM2MTk5OTQ5Lm91dC4wMzA0MDgNCvHwkj5+2wwAfAAA AHwAAAAAB+kKFlwAArOdAeQIAEUAAG646EAAfQZHY0F6PShBej0iABW3bbnIFczd+kdmUBj2 B4vxAAA1NTAgMzYxOTk5NDkub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0 aGUgZmlsZSBzcGVjaWZpZWQuIA0K8fCSPtTmDABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAA Qk+iQAA/Bu7VQXo9IkF6PSi3bQAV3fpHZrnIFhJQGGEIDBoAAFBPUlQgNjUsMTIyLDYxLDM0 LDE4NCw0MA0K8fCSPrEhDQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrjpQAB9BkeKQXo9 KEF6PSIAFbdtucgWEt36R4BQGPXsUsMAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4N CvHwkj7pJA0AUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPo0AAPwbu1EF6PSJBej0ot20A Fd36R4C5yBYwUBhhCH6BAABTVE9SIDM2MTk5OTQ5Lm91dC4wMzA0MDgNCvHwkj4izA0AeAAA AHgAAAAAB+kKFlwAArOdAeQIAEUAAGq46kAAfQZHZUF6PShBej0iABW3bbnIFjDd+keaUBj1 0hW0AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5 OTQ5Lm91dC4wMzA0MDguDQrx8JI+Uz8OAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuOtA AH0GR55Bej0oQXo9IgAUuChrREAwAAAAAHAC+vAnjwAAAgQFZAEBBALx8JI+KUEOAD4AAAA+ AAAAAAKznQHkAAfpChZcCABFAAAwT6RAAD8G7uVBej0iQXo9KLgoABTllSyOa0RAMXASYQiu 8gAAAQEEAgIEBbTx8JI+a3kOADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouOxAAH0GR6VB ej0oQXo9IgAUuChrREAx5ZUsj1AQ/Vw/YgAA8fCSPgCBDgCaBQAAmgUAAAACs50B5AAH6QoW XAgARQAFjE+lQAA/BumIQXo9IkF6PSi4KAAU5ZUsj2tEQDFQEGEILUoAAFhZWlpZLi4uICBU Qz0yIFRNPTEwNDk4MTczMTMgTU49MzYxOTk5NDkub3V0IFNSQz1jb210ZXggUEZOPSJDb210 ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkJ5IFRvbSBTZWxsZW4mI3hBOyIgUEZOPSJPc3RlckRv d0pvbmVzIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIE9ESiBDQk9UIENvcm4g TWlkZGF5OiBGdW5kIEJ1eWluZyBQdXNoZXMgUHJpY2VzIEhpZ2hlcgoKLi4uICAJIAoKQnlM aW5lLi4uICBCeSBUb20gU2VsbGVuCgoKLi4uICAKCkRhdGVMaW5lLi4uICBDaGljYWdvLCBB cHIgMDgsIDIwMDMgKE9ESiB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUu Li4gIENvcHlyaWdodCAyMDAzIE9zdGVyRG93Sm9uZXMgQ29tbW9kaXR5IE5ld3MgKE9ESiku IEFsbCByaWdodHMgcmVzZXJ2ZWQuCgoKLi4uCgoKT3N0ZXJEb3dKb25lcwoKLS0gSHVnZSBG dW5kIEJ1eWluZywgU2hvcnQgQ292ZXJpbmcgU3VwcG9ydHMgUHJpY2VzIEVhcmx5CgooT3N0 ZXJEb3dKb25lcykgLSBDb3JuIGZ1dHVyZXMgY29udGludWVkIHRoZWlyIHJhbGx5IFR1ZXNk YXkgYXQgdGhlCkNoaWNhZ28gQm9hcmQgb2YgVHJhZGUsIHN1cHBvcnRlZCBieSBsYXJnZSBh bW91bnRzIG9mIGZ1bmQgYnV5aW5nIGluIGEKdGVjaG5pY2FsLXR5cGUgdHJhZGUsIHNvdXJj ZXMgc2FpZC4KClRyYWRlcnMgc2VlbWVkIHRvIGJlIHRhcmdldGluZyB0aGUgRmVicnVhcnkg aGlnaHMgaW4gdGhlIGVhcmx5IGdvaW5nLCBidXQKcmVjZW50IHNlbGxpbmcgaGFzIGVudGVy ZWQgdGhlIG1hcmtldCBhbmQgcHJpY2VzIGhhdmUgYmFja2VkIG9mZiB0byBuZWFyCnVuY2hh bmdlZCBsZXZlbHMuCgpBdCBtaWRkYXksIE1heSBjb3JuIHdhcyAzLzQgY2VudCBoaWdoZXIg YXQgJDIuNDQgYW5kIEpseSB3YXMgMS8yYyBoaWdoZXIKYXQgJDIuNDUgYSBidXNoZWwuCgpU aGUgYmlnIHN0b3J5IFR1ZXNkYXkgaXMgaG93IHRoZSBmdW5kcyB3ZXJlIHB1c2hpbmcgdGhl IG1hcmtldCBoaWdoZXIgaW4KYSBjb250aW51YXRpb24gZnJvbSBNb25kYXkncyByYWxseS4g SW4gdG90YWwsIGZ1bmRzIGJvdWdodCAxNCwwMDAKY29udHJhY3RzIGluIHRoZSBmaXJzdCBo b3VyIG9mIHRyYWRpbmcuCgoiV2hhdCBjb21wdXRlciB0aWNrZWQgb2ZmIGFuZCB0b2xkIHRo ZXNlIGd1eXMgdG8gYnV5PyIgb25lIENCT1QgZmxvb3IKdHJhZGVyIHNhaWQsIHJlZmVycmlu ZyB0byB0aGUgbGFjayBvZiBzdXBwb3J0aXZlIG5ld3Mgb3IgZnVuZGFtZW50YWxzIGluCnRo ZSBtYXJrZXQuCgpNYW55IHRyYWRlcnMgYW5kIGFuYWx5c3RzIGFncmVlIHRoYXQgdGhlIHJh bGx5IGlzIGlsbG9naWNhbCwgYW5kIHNvbWUKYXJlbid0IGJ1eWluZyBhbGwgdGhlIHdlYXRo ZXIgdGFsayB0aGF0IGhhcyBjafHwkj58gQ4AmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxP pkAAPwbph0F6PSJBej0ouCgAFOWVMfNrREAxUBhhCJ/pAAByY3VsYXRlZCB0aGUgbWFya2V0 IGxhdGVseS4KCiJUaGUgbG9naWMgaXMgYmV5b25kIG1lLCIgc2FpZCBpbmRlcGVuZGVudCBh Z3JpY3VsdHVyYWwgY29uc3VsdGFudCBKb2huCktsZWlzdC4gIkkgZG9uJ3QgZXZlbiBhZ3Jl ZSB3aXRoIHRoZSB3ZWF0aGVyIGluIHRoZSB3ZXN0ZXJuIGNvcm4gYmVsdCAtIEkKcmVhbGx5 IGRvbid0LiIKClRhbGsgTW9uZGF5IGNlbnRlcmVkIG9uIHRoZSBmYWN0IHRoYXQgYXJlYXMg b2YgdGhlIHdlc3Rlcm4gY29ybiBiZWx0CmRpZG4ndCByZWNlaXZlIGFzIG11Y2ggbW9pc3R1 cmUgYXMgaGFkIGJlZW4gZXhwZWN0ZWQsIHRodXMgc3VwcG9ydGluZyB0aGUKcHJpY2UgcmFs bHkuIEtsZWlzdCBiZWxpZXZlcyBpdCdzIHRvbyBlYXJseSB5ZXQgdG8gZ2V0IG92ZXJseSBl eGNpdGVkCmFib3V0IHdlYXRoZXIgY29uZGl0aW9ucyBpbiB0aGUgTWlkd2VzdC4gQmVzaWRl cywgbWFueSBhcmVhcyBvZiB0aGUgY29ybgpiZWx0IGRpZCByZWNlaXZlIGJlbmVmaWNpYWwg bW9pc3R1cmUgZnJvbSB0aGUgcmVjZW50IHN0b3JtIHN5c3RlbS4KClRoZSBoaWdoZXIgcHJp Y2VzIFR1ZXNkYXkgd2VyZSBsaWtlbHkgZHVlIHRvIHJlc2lkdWFsIGJ1eWluZyBhbmQgbGVm dG92ZXIKc2hvcnQgY292ZXJpbmcgZnJvbSBNb25kYXksIGhlIG5vdGVkLgoKIlRoaXMgaXMg dGhlIGJlc3QgcmFsbHkgd2UndmUgaGFkIGluIGNvcm4gaW4gdGhlIGxhc3QgZm91ciBtb250 aHMsIgpLbGVpc3Qgc2FpZC4KClRyYWRlcnMgYXJlIHN0aWxsIGxpa2VseSBnZXR0aW5nIG91 dCBvZiBzaG9ydCBwb3NpdGlvbnMgImJlY2F1c2Ugb2YgdGhhdApuZXcgc3dpbmctaGlnaCBj bG9zZSB3ZSBoYWQgeWVzdGVyZGF5IChNb25kYXkpLCIgaGUgYWRkZWQuCgpUZWNobmljYWxs eSwgY29ybiBmdXR1cmVzIGFyZSBuZWFyaW5nIHRoZSBGZWJydWFyeSBoaWdoIGF0ICQyLjQ1 IDMvNApiYXNpcyBNYXksIHRoZW4gdGhlIEphbnVhcnkgaGlnaCBvZiAkMi40OCAzLzQuCgpL bGVpc3Qgc2FpZCBoZSBpcyBzdXNwZWN0IG9mIHRoZSByYWxseSwgaG93ZXZlciwgYmVjYXVz ZSBpdCBldmFkZXMgbG9naWMKYW5kIHRoZSBmdW5kYW1lbnRhbHMgYXJlbid0IHN1cHBvcnRp bmcgcHJpY2VzLgoKIldlJ3JlIG5vdCBkb2luZyB0aGUgZXhwb3J0IGJ1c2luZXNzLiBBbmQg aWYgeW91IGRvbid0IGJlbGlldmUgaW4gdGhlCndlYXRoZXIgdGhlbiB0aGVyZSdzIGxpdHRs ZSBlbHNlIGV4Y2VwdCB0aGUgc3Ryb25nIHRlY2huaWNhbHMsIiBoZSBzYWlkLgoKSW4gb3Ro ZXIgbmV3cywgU291dGggS29yZWEncyBNYWpvciBGZWVkbWlsbCBHcm91cCBib3VnaHQgMTYs MDAwIG1ldHJpYwp0b25zIG9mIENoaW5lc2UgY29ybiBvdmVybmlnaHQuIFNvdXRoIEtvcmVh IGFsc28gcHVyY2jx8JI+4oEOAPoEAAD6BAAAAAKznQHkAAfpChZcCABFAATsT6dAAD8G6iZB ej0iQXo9KLgoABTllTdXa0RAMVAYYQiRgQAAYXNlZCA1MCwwMDAgdG9ucyBvZgpvcHRpb25h bCBvcmlnaW4gZmVlZCB3aGVhdCwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gY29tZSBmcm9tIENo aW5hLgoKUnVzc2lhbiBncmFpbiBwcm9kdWN0aW9uIGluIDIwMDMgaXMgZXN0aW1hdGVkIGF0 IDc1LjcgbWlsbGlvbiB0b25zLCAxMC41Cm1pbGxpb24gdG9ucyBsb3dlciB0aGFuIDIwMDIs IHRoZSBVUyBEZXBhcnRtZW50IG9mIEFncmljdWx0dXJlIFJ1c3NpYW4KYXR0YWNoZSBzYWlk IGluIGEgcmVwb3J0IE1vbmRheS4KClRoZSBkZWNyZWFzZSBpcyBkdWUgdG8gYSBzbWFsbGVy IGFyZWEgc293biB0byB3aW50ZXIgZ3JhaW5zIGFuZCBpbmNyZWFzZWQKd2ludGVya2lsbC4g SW4gYWRkaXRpb24sIGxvdyBncmFpbiBwcmljZXMgYW5kIGFtcGxlIHN0b2NrcyBtYXkgZGFt cGVuCmVudGh1c2lhc20gZm9yIHNwcmluZyBwbGFudGluZywgdGhlIGF0dGFjaGUgc2FpZC4K CkluIGNvcm4sIEFETSB3YXMgYSBtYWpvciBidXllciBwdXJjaGFzaW5nIDIsNTAwIE1heSBh bmQgMiwwMDAgSmx5IGNvcm4sCkNJUyBib3VnaHQgMSwwMDAgRGVjIGFuZCA1MDAgTWF5LCBS SiBPJ0JyaWVuIGJvdWdodCAxLDAwMCBKbHksIEZpbWF0CmJvdWdodCAxLDUwMCBKbHkgYW5k IE1lcnJpbGwgTHluY2ggYm91Z2h0IDIsMDAwIEpseSwgQ2FyciBGdXR1cmVzIGJvdWdodAox LDAwMCBNYXksIE1hbiBGaW5hbmNpYWwgYm91Z2h0IDEsMDAwIE1heSBhbmQgMSw1MDAgSmx5 LCBSZWZjbyBib3VnaHQgNDAwCkpseSBhbmQgVGVuY28gYm91Z2h0IDUwMCBNYXkKClNlbGxl cnMgd2VyZSBsaWdodCwgd2l0aCBDYXJnaWxsIHNoZWRkaW5nIDUwMCBlYWNoIE1heSBhbmQg RGVjLCBSZWZjbwpzZWxsaW5nIDMwMCBEZWMgYW5kIFRlbmNvIHNlbGxpbmcgNzAwIEpseS4K Ci0tLSBUb20gU2VsbGVuLCBPc3RlckRvd0pvbmVzLCAoMzE5KSAyNjgtNzMzMCB0c2VsbGVu QG9zdGVyZG93am9uZXMuY29tCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhZ3JpY3Vs dHVyYWwKICAgIGJ1c2luZXNzCiAgICBjaGluYQogICAgY2lzCiAgICBjb21wdXRlcgogICAg Y29uc3VsdGFudAogICAgY29ybgogICAgZnV0dXJlcwogICAgZ3JhaW4KICAgIHByaWNlcwog ICAgcnVzc2lhCiAgICBzb3V0aCtrb3JlYQogICAgdHJhZGUKICAgIHdlYXRoZXIKICAgIHdo ZWF0CiAgICBDT01NRU5UU09yaWdpbiBBc3NpZ25lZEJ5PSJPc3RlckRvd0pvbmVzIiAvPkdS QUlOCgrx8JI+5IEOADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT6hAAD8G7ulBej0iQXo9 KLgoABTllTwba0RAMVARYQjMKQAAAAAAAAAA8fCSPoz8DgA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLjtQAB9BkekQXo9KEF6PSIAFLgoa0RAMeWVN1dQEP1cNJoAAPHwkj4QFQ8ANgAA ADYAAAAAB+kKFlwAArOdAeQIAEUAACi47kAAfQZHo0F6PShBej0iABS4KGtEQDHllTwcUBD4 mDSZAADx8JI+mSMPADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouO9AAH0GR6JBej0oQXo9 IgAUuChrREAx5ZU8HFAR+Jg0mAAA8fCSPqQkDwA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAA KE+pQAA/Bu7oQXo9IkF6PSi4KAAU5ZU8HGtEQDJQEGEIzCgAAAAAAAAAAPLwkj6pAwAAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChPqkAAPwbu50F6PSJBej0ot20AFd36R5q5yBZyUBBh CKQ7AAAAAAAAAADy8JI+vDsAAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuPBAAH0GR4lB ej0oQXo9IgAVt225yBZy3fpHmlAY9dJAWwAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0K8vCS PmFDAABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk+rQAA/Bu7MQXo9IkF6PSi3bQAV3fpH mrnIFopQGGEImSgAAERFTEUgMzYxOTk5NTAub3V0LjAzMDQwOA0K8vCSPquAAAB8AAAAfAAA AAAH6QoWXAACs50B5AgARQAAbrjxQAB9BkdaQXo9KEF6PSIAFbdtucgWit36R7RQGPW4ij0A ADU1MCAzNjE5OTk1MC5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBm aWxlIHNwZWNpZmllZC4gDQry8JI+WYwAAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCT6xA AD8G7stBej0iQXo9KLdtABXd+ke0ucgW0FAYYQgLDQAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0 LDQxDQry8JI+ycYAAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuPJAAH0GR4FBej0oQXo9 IgAVt225yBbQ3fpHzlAY9Z1SBgAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K8vCS PiHKAABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk+tQAA/Bu7KQXo9IkF6PSi3bQAV3fpH zrnIFu5QGGEIhnQAAFNUT1IgMzYxOTk5NTAub3V0LjAzMDQwOA0K8vCSPn8HAQB4AAAAeAAA AAAH6QoWXAACs50B5AgARQAAarjzQAB9BkdcQXo9KEF6PSIAFbdtucgW7t36R+hQGPrwDpMA ADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5NTAu b3V0LjAzMDQwOC4NCvLwkj5mCAEAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC49EAAfQZH lUF6PShBej0iABS4KdW6xP8AAAAAcAL68DhIAAACBAVkAQEEAvLwkj7zCQEAPgAAAD4AAAAA ArOdAeQAB+kKFlwIAEUAADBPrkAAPwbu20F6PSJBej0ouCkAFOWWZkPVusUAcBJhCIX1AAAB AQQCAgQFtPLwkj5pQgEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi49UAAfQZHnEF6PShB ej0iABS4KdW6xQDllmZEUBD9XBZlAADy8JI+JUkBANcDAADXAwAAAAKznQHkAAfpChZcCABF AAPJT69AAD8G60FBej0iQXo9KLgpABTllmZE1brFAFAYYQhVbwAAWFlaWlkuLi4gIFRDPTIg VE09MTA0OTgxNzMxMyBNTj0zNjE5OTk1MC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIg UEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRpb24gKEVVUikiIAoKLi4uICAKCgouLi4g CSAKCgpIZWFkTGluZS4uLiAgTGUgTW9uZGU6IFZ1aXR0b24gbW9zdCB2YWx1YWJsZSBGcmVu Y2ggYnJhbmQKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFw ciA2LCAyMDAzLCAoTGUgTW9uZGUgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgpIC0tCgoK Ci4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lhbCBUaW1l cyBJbmZvcm1hdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIEluZm9ybWF0 aW9uIChFVVIpCgpBY2NvcmRpbmcgdG8gYSByYW5raW5nIG9mIHRoZSAyNSBtb3N0IHZhbHVh YmxlIEZyZW5jaCBicmFuZHMsIHB1Ymxpc2hlZApieSBVUyBmaXJtIEludGVyYnJhbmQgb24g QXByaWwgMywgdGhlIExvdWlzIFZ1aXR0b24gYnJhbmQsIG93bmVkIGJ5Cmx1eHVyeSBnb29k cyBncm91cCBMVk1ILCB3YXMgd29ydGggbW9zdCwgYXQgbmVhcmx5IDhibiBldXJvcywgZm9s bG93ZWQgYnkKY29zbWV0aWNzIGJyYW5kIEwnT3JlYWwsIHZhbHVlZCBhdCA1LjdibiwgYW5k IGJhbmtpbmcgZ3JvdXAgQk5QIFBhcmliYXMsCnZhbHVlZCBhdCA1LjRibi4KClRoZSBjbGFz c2lmaWNhdGlvbiBjcml0ZXJpYSB1c2VkIGJ5IEludGVyYnJhbmQgaW5jbHVkZWQgdGhlIGZp bmFuY2lhbApyZXN1bHRzIGFjaGlldmVkIGJ5IGJyYW5kcywgdGhlaXIgaW5mbHVlbmNlIG9u IHRoZSBhY3Qgb2YgcHVyY2hhc2UgYW5kCnRoZWlyIHNvbGlkaXR5LgoKQWJzdHJhY3RlZCBm cm9tIExlIE1vbmRlCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBiYW5raW5nCgry8JI+ JUkBADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT7BAAD8G7uFBej0iQXo9KLgpABTllmnl 1brFAFARYQivFwAAAAAAAAAA8vCSPviaAQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLj2 QAB9BkebQXo9KEF6PSIAFLgp1brFAOWWaeZQEPm7FmQAAPLwkj5xpgEANgAAADYAAAAAB+kK FlwAArOdAeQIAEUAACi490AAfQZHmkF6PShBej0iABS4KdW6xQDllmnmUBH5uxZjAADy8JI+ u6cBADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT7FAAD8G7uBBej0iQXo9KLgpABTllmnm 1brFAVAQYQivFgAAAAAAAAAA8vCSPr90AgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKE+y QAA/Bu7fQXo9IkF6PSi3bQAV3fpH6LnIFzBQEGEIoy8AAAAAAAAAAPLwkj7mrAIATgAAAE4A AAAAB+kKFlwAArOdAeQIAEUAAEC4+EAAfQZHgUF6PShBej0iABW3bbnIFzDd+kfoUBj68Dox AAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQry8JI+27QCAFAAAABQAAAAAAKznQHkAAfpChZc CABFAABCT7NAAD8G7sRBej0iQXo9KLdtABXd+kfoucgXSFAYYQiXHAAAREVMRSAzNjE5OTk1 MS5vdXQuMDMwNDA4DQry8JI+t/ECAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABuuPlAAH0G R1JBej0oQXo9IgAVt225yBdI3fpIAlAY+taEEgAANTUwIDM2MTk5OTUxLm91dC4wMzA0MDg6 IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCvLwkj52/QIA UAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJPtEAAPwbuw0F6PSJBej0ot20AFd36SAK5yBeO UBhhCAoAAABQT1JUIDY1LDEyMiw2MSwzNCwxODQsNDINCvLwkj6SNwMAVAAAAFQAAAAAB+kK FlwAArOdAeQIAEUAAEa4+kAAfQZHeUF6PShBej0iABW3bbnIF47d+kgcUBj6u0vcAAAyMDAg UE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQry8JI+vjoDAFAAAABQAAAAAAKznQHkAAfpChZc CABFAABCT7VAAD8G7sJBej0iQXo9KLdtABXd+kgcucgXrFAYYQiEaAAAU1RPUiAzNjE5OTk1 MS5vdXQuMDMwNDA4DQry8JI+AZIDAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquPtAAH0G R1RBej0oQXo9IgAVt225yBes3fpINlAY+qEN1QAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUg ZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTk1MS5vdXQuMDMwNDA4Lg0K8vCSPjeTAwA+AAAA PgAAAAAH6QoWXAACs50B5AgARQAAMLj8QAB9BkeNQXo9KEF6PSIAFLgqeJhjpAAAAABwAvrw 9sQAAAIEBWQBAQQC8vCSPu+UAwA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAME+2QAA/Bu7T QXo9IkF6PSi4KgAU5ZkJd3iYY6VwEmEIoTsAAAEBBAICBAW08vCSPh7NAwA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLj9QAB9BkeUQXo9KEF6PSIAFLgqeJhjpeWZCXhQEP1cMasAAPLw kj7Y0wMAeAQAAHgEAAAAArOdAeQAB+kKFlwIAEUABGpPt0AAPwbqmEF6PSJBej0ouCoAFOWZ CXh4mGOlUBhhCNnNAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MzE0IE1OPTM2MTk5OTUx Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJGZWRCaXpP cHMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgRFVDVCBBU1NFTUJMWSxBSVIg Q09ORElUSU9OSU5HCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4u ICBBcHIgMDgsIDIwMDMgKEZlZEJpek9wcHMgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5 cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKGMpIDIwMDMgRmVkZXJhbCBJbmZvcm1hdGlvbiAm IE5ld3MgRGlzcGF0Y2gsIEluYy4KCgouLi4KCgpGZWRCaXpPcHMKCk5PVElDRSBUWVBFOiBD T05UUkFDVCBBV0FSRAoKU09VUkNFOiBQdWJsaXNoZWQgaW4gRmVkQml6T3BwcwoKREFURSBQ T1NURUQ6IDA3LUFQUi0wMwoKT0ZGSUNFIEFERFJFU1M6IERFRkVOU0UgR0VORVJBTCBTVVBQ TFkgQ0VOVEVSIDgwMDAgSkVGRiBEQVZJUyBIV1kKUklDSE1PTkQsIFZBIDIzMjk3LTUzIDEy CgpDTEFTU0lGSUNBVElPTiBDT0RFOiAxNSAtIEFpcmNyYWZ0ICYgYWlyZnJhbWUgc3RydWN0 dXJhbCBjb21wb25lbnRzCgpTVUJKRUNUOiBEVUNUIEFTU0VNQkxZLEFJUiBDT05ESVRJT05J TkcKClNPTElDSVRBVElPTiBOVU1CRVI6IFNQMDQ3NS0wMy1RLUFBNjUKCkFXQVJEIE5VTUJF UjogU1AwNDc1LTAzLU0tSko4MwoKQVdBUkQgQU1PVU5UOiAkNDQsOTUwCgpMSU5FIE5VTUJF UjogMDAwMQoKQVdBUkQgREFURTogMDQwNDAzCgpBV0FSREVEIFRPOiBCUk9XTiBIRUxJQ09Q VEVSUyBJTkMgMTAxMDAgQUlMRVJPTiBBVkUgUEVOU0FDT0xBIEZMCjMyNTA2LTgyMjMKCkFS Q0hJVkUgREFURTogMDQxOTIwMDMKCkNPTlRBQ1Q6IE4vQQoKSU5URVJORVQgQUREUkVTUzoK aHR0cDovL3d3dy5lcHMuZ292L3NwZy9ETEEvSjMvRFNDUi9Bd2FyZHMvU1AwNDc1LTAzLU0t Sko4M0xuMDAwMS5odG1sCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhaXJjcmFmdAog ICAgY29udHJhY3QKICAgIGRlZmVuc2UKICAgIGZsb3JpZGEKICAgIGludGVybmV0CiAgICBz dHJ1Y3R1cmFsCiAgICB2aXJnaW5pYQoK8vCSPtnTAwA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKE+4QAA/Bu7ZQXo9IkF6PSi4KgAU5ZkNuniYY6VQEWEIybwAAAAAAAAAAPLwkj70DwQA bwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE7KUAAPwYDMEF6PSJBej0olQ8bWBiM0ex0egQg gBgW0LdaAAABAQgKDUQBQwBCGHg0MzN8MTQ3MjY5MnwxMDQ5ODE3MzMzfDEuMHwxfDk4OHxo ZWxsbyB3b3JsZAry8JI+jCoEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouP5AAH0GR5NB ej0oQXo9IgAUuCp4mGOl5ZkNu1AQ+RoxqgAA8vCSPjtABAA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLj/QAB9BkeSQXo9KEF6PSIAFLgqeJhjpeWZDbtQEfkaMakAAPLwkj5PQQQAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChPuUAAPwbu2EF6PSJBej0ouCoAFOWZDbt4mGOmUBBh CMm7AAAAAAAAAADy8JI+uQwFADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT7pAAD8G7tdB ej0iQXo9KLdtABXd+kg2ucgX7lAQYQiiIwAAAAAAAAAA8vCSPuVEBQBOAAAATgAAAAAH6QoW XAACs50B5AgARQAAQLkAQAB9Bkd5QXo9KEF6PSIAFbdtucgX7t36SDZQGPqhOXQAADIyNiBU cmFuc2ZlciBjb21wbGV0ZS4NCvLwkj4vTAUAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJP u0AAPwbuvEF6PSJBej0ot20AFd36SDa5yBgGUBhhCJUQAABERUxFIDM2MTk5OTUyLm91dC4w MzA0MDgNCvLwkj7fiQUAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG65AUAAfQZHSkF6PShB ej0iABW3bbnIGAbd+khQUBj6h4NUAAA1NTAgMzYxOTk5NTIub3V0LjAzMDQwODogVGhlIHN5 c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K8vCSPpKVBQBQAAAAUAAA AAACs50B5AAH6QoWXAgARQAAQk+8QAA/Bu67QXo9IkF6PSi3bQAV3fpIULnIGExQGGEICPMA AFBPUlQgNjUsMTIyLDYxLDM0LDE4NCw0Mw0K8vCSPgTQBQBUAAAAVAAAAAAH6QoWXAACs50B 5AgARQAARrkCQAB9BkdxQXo9KEF6PSIAFbdtucgYTN36SGpQGPpsSx8AADIwMCBQT1JUIGNv bW1hbmQgc3VjY2Vzc2Z1bC4NCvLwkj5v1AUAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJP vUAAPwbuukF6PSJBej0ot20AFd36SGq5yBhqUBhhCIJcAABTVE9SIDM2MTk5OTUyLm91dC4w MzA0MDgNCvLwkj7DEQYAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq5A0AAfQZHTEF6PShB ej0iABW3bbnIGGrd+kiEUBj6Ug0XAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNv bm5lY3Rpb24gZm9yIDM2MTk5OTUyLm91dC4wMzA0MDguDQry8JI+qxIGAD4AAAA+AAAAAAfp ChZcAAKznQHkCABFAAAwuQRAAH0GR4VBej0oQXo9IgAUuCuwsrr+AAAAAHAC+vBnTwAAAgQF ZAEBBALy8JI+PxQGAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwT75AAD8G7stBej0iQXo9 KLgrABTlm8ZxsLK6/3ASYQhUyQAAAQEEAgIEBbTy8JI+h0wGADYAAAA2AAAAAAfpChZcAAKz nQHkCABFAAAouQVAAH0GR4xBej0oQXo9IgAUuCuwsrr/5ZvGclAQ/VzlOAAA8vCSPoBUBgCa BQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE+/QAA/BuluQXo9IkF6PSi4KwAU5ZvGcrCyuv9Q EGEIudoAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTczMTUgTU49MzYxOTk5NTIub3V0IFNS Qz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkFGWCBOZXdzIC0gVUsi IAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgTW9uZXkgbWFya2V0IHJhdGVzCgou Li4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICAgQXByIDA4LCAyMDAz IChBRlgtVUsgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5 cmlnaHQgMjAwMy4gQUZYIE5ld3MgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoK CkFGWCBOZXdzIC0gVUsKClRSRUFTVVJZIEJJTExTIDEgTU9OVEggMS4xNiAyIE1PTlRIUyAx LjE1IDMgTU9OVEhTIDEuMTQgSU5URVJCQU5LIFJBVEVTCk9WRVJOSUdIVCAzLTMvMTYgLSAz LTEvMTYgMSBXRUVLIDMtMTYvMTYgLSAzLTkvMTYgMSBNT05USCAzLjYyIC0gMy41NyAyCk1P TlRIUyAzLjYwIC0gMy41NSAzIE1PTlRIUyAzLjU4IC0gMy41MyA0IE1PTlRIUyAzLjU2IC0g My41MSA1IE1PTlRIUwozLjUzIC0gMy40OCA2IE1PTlRIUyAzLjUyIC0gMy40NyA5IE1PTlRI UyAzLjUyIC0gMy40NyAxMiBNT05USFMgMy41NiAtCjMuNTEgREVQTyBDRHMgMSBNT05USCAz LjYwIC0gMy41NyAyIE1PTlRIUyAzLjU5IC0gMy41NSAzIE1PTlRIUyAzLjU3IC0KMy41MyA0 IE1PTlRIUyAzLjU1IC0gMy41MSA1IE1PTlRIUyAzLjUyIC0gMy40OCA2IE1PTlRIUyAzLjUx IC0gMy40NyA5Ck1PTlRIUyAzLjUxIC0gMy40NyAxMiBNT05USFMgMy41NSAtIDMuNTEgQ0xF QVJFUiBDRHMgMSBNT05USCAzLjYwIC0gMy41NgoyIE1PTlRIUyAzLjU4IC0gMy41NCAzIE1P TlRIUyAzLjU2IC0gMy41MiA0IE1PTlRIUyAzLjU0IC0gMy41MCA1IE1PTlRIUwozLjUxIC0g My40NyA2IE1PTlRIUyAzLjUwIC0gMy40NiA5IE1PTlRIUyAzLjUwIC0gMy40NiAxMiBNT05U SFMgMy41NCAtCjMuNTAgTE9DQUwgQVVUSE9SSVRZIERFUE9TSVRTIDIgREFZUyAzLTEvMiA3 IERBWVMgMy0xLzIgMSBNT05USCAzLjU4IDMKTU9OVEhTIDMuNTUgNiBNT05USFMgMy40OCAx MiBNT05USFMgMy41MCBFVVJPRE9MTEFSIERFUE9TSVQgT1ZFUk5JR0hUCjItMjEvMzIgLSAy LTkvMTYgNyBEQVlTIDEtOS8xNiAtIDEtNy8xNiAxIE1PTlRIIDEtMjEvMzIgLSAxLTkvMTYg MyBNT05USFMKMS0xOS8zMiAtIDEtMS8yIDYgTU9OVEhTIDEtNS84IC0gMS0xLzIgMTIgTU9O VEhTIDEtNy84IC0gMS0zLzQgRVVST0RPTExBUgpDRHMgMSBNT05USCAxLjI0IDMgTU9OVEhT IDEuMjIgNiBNT05USFMgMS4xOCAxMiBNT05USFMgMS4yNiBhcC8KCi4uLiAgCSAKCktleVdv cmRzLi4uICAKICAgIGxvY2FsCiAgICBtYXJrZXQKICAgIG1vbvLwkj6BVAYAUQAAAFEAAAAA ArOdAeQAB+kKFlwIAEUAAENPwEAAPwbutkF6PSJBej0ouCsAFOWby9awsrr/UBhhCO3oAABl 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 AAAAB+kKFlwAArOdAeQIAEUAADSWEkAAfQZqc0F6PShBej0iG1iVD3R6BCAYjNMrgBDJAnIR AAABAQgKAEIYtw1EA3T48JI+t9IAAPgAAAD4AAAAAAKznQHkAAfpChZcCABFAADqOzBAAD8G AqBBej0iQXo9KJUPG1gYjNMrdHoEIIAYFtCkfwAAAQEICg1EA4UAQhi3NDQwfDE0NzI2OTl8 MTA0OTgxNzMzOHwxLjB8MXwzMzAxfGhlbGxvIHdvcmxkCjQ0MXwxNDcyNzAwfDEwNDk4MTcz Mzh8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCjQ0MnwxNDcyNzAxfDEwNDk4MTczMzh8MS4wfDF8 MzI3fGhlbGxvIHdvcmxkCjQ0M3wxNDcyNzAyfDEwNDk4MTczMzl8MS4wfDF8MzU3M3xoZWxs byB3b3JsZAr48JI+TicEAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lhNAAH0GanJBej0o QXo9IhtYlQ90egQgGIzT4YAQyExx/QAAAQEICgBCGLoNRAOF+PCSPpHNCABwAAAAcAAAAAAC s50B5AAH6QoWXAgARQAAYjsxQAA/BgMnQXo9IkF6PSiVDxtYGIzT4XR6BCCAGBbQPPsAAAEB CAoNRAO6AEIYujQ0NHwxNDcyNzAzfDEwNDk4MTczMzl8MS4wfDF8MTUwOHxoZWxsbyB3b3Js ZAr48JI+eNQKAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lhRAAH0GanFBej0oQXo9IhtY lQ90egQgGIzUD4AQyB5xxAAAAQEICgBCGL4NRAO6+fCSPq+UCwA8AAAAPAAAAAACs50B5AAH 6QoWXAgGAAEIAAYEAAEAB+kKFlxBej0iAAAAAAAAQXo9KAAAAAAAAAAAAAAAAAAAAAAAAPnw kj7BlAsAKgAAACoAAAAAB+kKFlwAArOdAeQIBgABCAAGBAACAAKznQHkQXo9KAAH6QoWXEF6 PSL78JI+H3wKAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhOzJAAD8GAydBej0iQXo9KJUP G1gYjNQPdHoEIIAYFtCyVwAAAQEICg1EBPEAQhi+NDQ1fDE0NzI3MDR8MTA0OTgxNzM0M3wx LjB8MXwyMTN8aGVsbG8gd29ybGQK+/CSPvhzDQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA 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 AAAAAQAFANNDaXNjbyBJbnRlcm5ldHdvcmsgT3BlcmF0aW5nIFN5c3RlbSBTb2Z0d2FyZSAK SU9TICh0bSkgQzE3MDAgU29mdHdhcmUgKEMxNzAwLVktTSksIFZlcnNpb24gMTIuMSgzKSwg UkVMRUFTRSBTT0ZUV0FSRSAoZmMxKQpDb3B5cmlnaHQgKGMpIDE5ODYtMjAwMCBieSBjaXNj byBTeXN0ZW1zLCBJbmMuCkNvbXBpbGVkIFdlZCAwNS1KdWwtMDAgMTc6MDcgYnkgY21vbmcA BgAOY2lzY28gMTcyMAAHAAlBfTWcHgALAAUBA/GSPgmHBgBvAAAAbwAAAAACs50B5AAH6QoW XAgARQAAYTs5QAA/BgMgQXo9IkF6PSiVDxtYGIzV13R6BCCAGBbQqS0AAAEBCAoNRAf3AEIZ DTQ1NXwxNDcyNzE0fDEwNDk4MTczNDl8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCgPxkj6G4AkA QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWHUAAfQZqaEF6PShBej0iG1iVD3R6BCAYjNYE gBDGKW0aAAABAQgKAEIZKw1EB/cD8ZI+8uEJAPgAAAD4AAAAAAKznQHkAAfpChZcCABFAADq OzpAAD8GApZBej0iQXo9KJUPG1gYjNYEdHoEIIAYFtBwmgAAAQEICg1ECA0AQhkrNDU2fDE0 NzI3MTV8MTA0OTgxNzM0OXwxLjB8MXw0ODJ8aGVsbG8gd29ybGQKNDU3fDE0NzI3MTZ8MTA0 OTgxNzM0OXwxLjB8MXw0ODJ8aGVsbG8gd29ybGQKNDU4fDE0NzI3MTd8MTA0OTgxNzM0OXwx LjB8MXwyNTY2fGhlbGxvIHdvcmxkCjQ1OXwxNDcyNzE4fDEwNDk4MTczNTB8MS4wfDF8MzU3 M3xoZWxsbyB3b3JsZAoD8ZI+9DYNAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lh5AAH0G amdBej0oQXo9IhtYlQ90egQgGIzWuoAQxXNtAQAAAQEICgBCGS4NRAgNBvGSPqg1CABwAAAA cAAAAAACs50B5AAH6QoWXAgARQAAYjs7QAA/BgMdQXo9IkF6PSiVDxtYGIzWunR6BCCAGBbQ MD4AAAEBCAoNRAkuAEIZLjQ2MHwxNDcyNzE5fDEwNDk4MTczNTJ8MS4wfDF8MTUwOHxoZWxs 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 wUF6PSJBej0ouDgAFOYlK3pqw/oecBJhCPX5AAABAQQCAgQFtBDxkj6HsAgANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi5DUAAfQZHhEF6PShBej0iABS4OGrD+h7mJSt7UBD9XIZpAAAQ 8ZI+SrgIAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMT8lAAD8G6WRBej0iQXo9KLg4ABTm JSt7asP6HlAQYQjT7AAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzM0NSBNTj0zNjE5OTk1 NS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iQnkgSm9u IFRheWxvciYjeEE7IiBQRk49Ik9zdGVyRG93Sm9uZXMiIAoKLi4uICAKCgouLi4gCSAKCgpI ZWFkTGluZS4uLiAgT0RKIEdXUyBVUyBNaWRkYXkgVXBkYXRlOiBTdG9ybXMgUnVtYmxpbmcg QWNyb3NzIFNvdXRoZXJuIFN0YXRlcwoKLi4uICAJIAoKQnlMaW5lLi4uICBCeSBKb24gVGF5 bG9yCgoKLi4uICAKCkRhdGVMaW5lLi4uICBLYW5zYXMgQ2l0eSwgQXByIDA4LCAyMDAzIChP REogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQg MjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0eSBOZXdzIChPREopLiBBbGwgcmlnaHRzIHJl c2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9uZXMKCi0tIEhlYXZ5IFJhaW5mYWxsLCBIYWls LCBJc29sYXRlZCBUb3JuYWRvZXMgUG9zc2libGUgLS0gQ29sZCBMaW5nZXJzIEluClBsYWlu cyBXaW50ZXIgV2hlYXQgQXJlYXMgQmVmb3JlIExhdGUgV2VlayBXYXJtdGgKCihHV1MpIC0g U3Ryb25nIHRodW5kZXJzdG9ybXMsIHNvbWUgY29udGFpbmluZyBoZWF2eSByYWluZmFsbCwg d2lsbApjb250aW51ZSB0byBhZmZlY3QgbXVjaCBvZiB0aGUgc291dGhlcm4gVVMgaW50byBU aHVyc2RheS4KCkFyZWFzIGZyb20gc291dGhlcm4gTG91aXNpYW5hIGFuZCBNaXNzaXNzaXBw aSBpbnRvIG5vcnRoZXJuIEZsb3JpZGEsCkdlb3JnaWEgYW5kIHRoZSBDYXJvbGluYXMgY291 bGQgcmVjZWl2ZSBhZGRpdGlvbmFsIHJhaW5mYWxsIGFtb3VudHMgb2YKMS4wMCB0byBhcyBt dWNoIGFzIDQuMDAgaW5jaGVzLgoKTGFyZ2UgaGFpbCwgZGFtYWdpbmcgd2luZHMgYW5kIGlz b2xhdGVkIHRvcm5hZG9lcyBhcmUgcG9zc2libGUgVHVlc2RheQphZnRlcm5vb24gaW50byBU aHVyc2RheS4gTnVtZXJvdXMgZmxvb2Qgd2F0Y2hlcyBhcmUgaW4gZWZmZWN0IGFjcm9zcyB0 aGUKc291dGhlcm4gVVMKClJhaW5mYWxsIHdpbGwgYmUgbW9yZSB3aWRlbHkgc2NhdHRlcmVk IGFuZCBsaWdodGVyIGFjcm9zcyBUZW5uZXNzZWUsCktlbnR1Y2t5LCBWaXJnaW5pYSBhbmQg c29tZSBhcmVhcyBqdXN0IHRvIHRoZSBub3J0aCBvZiB0aGUgT2hpbyBSaXZlci4KUmFpbiBh bW91bnRzIGluIHNvbWUgb2YgdGhlIGFib3ZlIGFyZWFzIGNvdWxkIGZhbGwgaW50byBhIDAu NTAgdG8gMS41MAppbmNoZXMgcmFuZ2UuIFJhaW4gYW5kIHNub3cgd2lsbCBtb3ZlIGludG8g dGhlIG5vcnRoZWFzdGVybiBVUyBXZWRuZXNkYXkKYW5kIFRodXJzZGF5LgoKQ29sZCB0ZW1w ZXJhdHVyZXMgYXJlIGxpbmdlcmluZyBhY3Jvc3MgbWFueSBQbGFpbnMgd2luEPGSPqu4CACf BAAAnwQAAAACs50B5AAH6QoWXAgARQAEkU/KQAA/BupeQXo9IkF6PSi4OAAU5iUw32rD+h5Q GGEIcgoAAHRlciB3aGVhdCBhcmVhcwpUdWVzZGF5IG1vcm5pbmcuIEFsbGlhbmNlLCBOZWIu LCBzZXQgYSByZWNvcmQgbG93IGZvciBBcHJpbCA4IHdpdGggYQpyZWFkaW5nIG9mIDMgZGVn cmVlcy4gVmFsZW50aW5lLCBOZWIuLCByZXBvcnRlZCA5IGRlZ3JlZXMsIGFuZCByZWFkaW5n cwphY3Jvc3MgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlIHJhbmdlZCBmcm9tIHRoZSB0ZWVucyB0 byBsb3dlciAyMHMuIExvd3MgaW4KdGhlIG1pZGRsZSBhbmQgdXBwZXIgMjBzIHdlcmUgY29t bW9uIGZyb20gdGhlIHdlc3Rlcm4gaGFsZiBvZiBLYW5zYXMgaW50bwp0aGUgVGV4YXMgcGFu aGFuZGxlLgoKV2VkbmVzZGF5IG1vcm5pbmcgd2lsbCBiZSBhbm90aGVyIGNvbGQgb25lIGFz IHJlYWRpbmdzIGZhbGwgaW50byB0aGUKdXBwZXIgdGVlbnMgYW5kIDIwcyBhY3Jvc3MgTmVi cmFza2EgYW5kIEthbnNhcy4gVGVtcGVyYXR1cmVzIHNob3VsZApxdWlja2x5IHdhcm0gV2Vk bmVzZGF5IGFmdGVybm9vbiBpbnRvIHRoZSA1MHMgYW5kIDYwcy4gRXZlbiB3YXJtZXIKcmVh ZGluZ3MgaW4gdGhlIDcwcyBhbmQgcG9zc2libHkgbG93ZXIgODBzIGFyZSBwb3NzaWJsZSBU aHVyc2RheSB0aHJvdWdoCnRoaXMgd2Vla2VuZCBhY3Jvc3MgbXVjaCBvZiB0aGUgY2VudHJh bCBhbmQgc291dGhlcm4gUGxhaW5zLgoKQ2hhbmNlcyBmb3IgYW55IG1lYW5pbmdmdWwgcmFp bmZhbGwgYWNyb3NzIHRoZSBQbGFpbnMgd2lsbCBwcm9iYWJseSBob2xkCm9mZiB1bnRpbCBU dWVzZGF5IG9yIFdlZG5lc2RheSBvZiBuZXh0IHdlZWsuIC0tLSBGb3IgbW9yZSB3ZWF0aGVy CmluZm9ybWF0aW9uIHNlZSB0aGUgR1dTIHdlYiBzaXRlIGF0OiBodHRwOi8vd3d3Lmdsb2Jh bHdlYXRoZXJzZXJ2aWNlcy5jb20KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGZsb29k CiAgICBmbG9yaWRhCiAgICBnZW9yZ2lhCiAgICBrYW5zYXMKICAgIGtlbnR1Y2t5CiAgICBs b3Vpc2lhbmEKICAgIG1pc3Npc3NpcHBpCiAgICBuZWJyYXNrYQogICAgdGVubmVzc2VlCiAg ICB2aXJnaW5pYQogICAgd2VhdGhlcgogICAgd2ViCiAgICB3aGVhdAogICAgRU5FUkdZT3Jp Z2luIEFzc2lnbmVkQnk9Ik9zdGVyRG93Sm9uZXMiIC8+RklCRVJHUkFJTk1FQVRXRUFUSEVS CgoQ8ZI+rLgIADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT8tAAD8G7sZBej0iQXo9KLg4 ABTmJTVIasP6HlARYQgY8AAAAAAAAAAAEPGSPhotCQA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLkOQAB9BkeDQXo9KEF6PSIAFLg4asP6HuYlNUlQEP1cfJsAABDxkj4PNQkANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi5D0AAfQZHgkF6PShBej0iABS4OGrD+h7mJTVJUBH9XHya AAAQ8ZI+DjYJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT8xAAD8G7sVBej0iQXo9KLg4 ABTmJTVJasP6H1AQYQgY7wAAAAAAAAAAEPGSPrnxCQA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKE/NQAA/Bu7EQXo9IkF6PSi3bQAV3fpI0rnIGWpQEGEIoAsAAAAAAAAAABDxkj42KgoA TgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC5EEAAfQZHaUF6PShBej0iABW3bbnIGWrd+kjS UBj6Azf6AAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQoQ8ZI+qJ8LADwAAAA8AAAAAAKznQHk AAfpChZcCABFAAAoT85AAD8G7sNBej0iQXo9KLdtABXd+kjSucgZglAQYQif8wAAAAAAAAAA EPGSPo2kDgBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjtIQAA/BgMQQXo9IkF6PSiVDxtY GIzZZ3R6BCCAGBbQJw0AAAEBCAoNRA1AAEIZlTQ3NXwxNDcyNzM0fDEwNDk4MTczNjJ8MS4w fDF8MTc4N3xoZWxsbyB3b3JsZAoR8ZI+ZIgBAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lixAAH0GallBej0oQXo9IhtYlQ90egQgGIzZlYAQwphnSgAAAQEICgBCGbINRA1AEfGSPuGJ AQBTAQAAUwEAAAACs50B5AAH6QoWXAgARQABRTtJQAA/BgIsQXo9IkF6PSiVDxtYGIzZlXR6 BCCAGBbQjAwAAAEBCAoNRA1OAEIZsjQ3NnwxNDcyNzM1fDEwNDk4MTczNjJ8MS4wfDF8NDgy fGhlbGxvIHdvcmxkCjQ3N3wxNDcyNzM2fDEwNDk4MTczNjJ8MS4wfDF8MTUwOHxoZWxsbyB3 b3JsZAo0Nzh8MTQ3MjczN3wxMDQ5ODE3MzYzfDEuMHwxfDIyMzV8aGVsbG8gd29ybGQKNDc5 fDE0NzI3Mzh8MTA0OTgxNzM2M3wxLjB8MXwyMTN8aGVsbG8gd29ybGQKNDgwfDE0NzI3Mzl8 MTA0OTgxNzM2M3wxLjB8MXw2NTR8aGVsbG8gd29ybGQKNDgxfDE0NzI3NDB8MTA0OTgxNzM2 M3wxLjB8MXwxMjAzfGhlbGxvIHdvcmxkChHxkj6y3gQAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSWLUAAfQZqWEF6PShBej0iG1iVD3R6BCAYjNqmgBDBh2c6AAABAQgKAEIZtA1EDU4R 8ZI+cHAFACoAAAAqAAAAAAfrnsVuAAKznQHkCAYAAQgABgQAAQACs50B5EF6PSgAAAAAAABB ej0hEfGSPr1yBQA8AAAAPAAAAAACs50B5AAH657FbggGAAEIAAYEAAIAB+uexW5Bej0hAAKz nQHkQXo9KAAAAAAAAAAAAAAAAAAAAAAAABTxkj5NDwEAcAAAAHAAAAAAArOdAeQAB+kKFlwI AEUAAGI7SkAAPwYDDkF6PSJBej0olQ8bWBiM2qZ0egQggBgW0Ct7AAABAQgKDUQOdwBCGbQ0 ODJ8MTQ3Mjc0MXwxMDQ5ODE3MzY1fDEuMHwxfDE1MDh8aGVsbG8gd29ybGQKFPGSPrcnBABC AAAAQgAAAAAH6QoWXAACs50B5AgARQAANJYuQAB9BmpXQXo9KEF6PSIbWJUPdHoEIBiM2tSA EMFZZfMAAAEBCAoAQhnSDUQOdxTxkj4tKQQAngAAAJ4AAAAAArOdAeQAB+kKFlwIAEUAAJA7 S0AAPwYC30F6PSJBej0olQ8bWBiM2tR0egQggBgW0EbMAAABAQgKDUQOiwBCGdI0ODN8MTQ3 Mjc0MnwxMDQ5ODE3MzY1fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKNDg0fDE0NzI3NDN8MTA0 OTgxNzM2NnwxLjB8MXwxNzg3fGhlbGxvIHdvcmxkChTxkj4ifgcAQgAAAEIAAAAAB+kKFlwA ArOdAeQIAEUAADSWL0AAfQZqVkF6PShBej0iG1iVD3R6BCAYjNswgBDA/WXdAAABAQgKAEIZ 1A1EDosU8ZI+fX8HAJ0AAACdAAAAAAKznQHkAAfpChZcCABFAACPO0xAAD8GAt9Bej0iQXo9 KJUPG1gYjNswdHoEIIAYFtCCVAAAAQEICg1EDqEAQhnUNDg1fDE0NzI3NDR8MTA0OTgxNzM2 N3wxLjB8MXwyMzB8aGVsbG8gd29ybGQKNDg2fDE0NzI3NDV8MTA0OTgxNzM2N3wxLjB8MXwx MjAzfGhlbGxvIHdvcmxkChTxkj7P1AoAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWMEAA fQZqVUF6PShBej0iG1iVD3R6BCAYjNuLgBDAomXFAAABAQgKAEIZ1g1EDqEV8ZI+YSkHAG8A AABvAAAAAAKznQHkAAfpChZcCABFAABhO01AAD8GAwxBej0iQXo9KJUPG1gYjNuLdHoEIIAY FtCSowAAAQEICg1EDwMAQhnWNDg3fDE0NzI3NDZ8MTA0OTgxNzM2OHwxLjB8MXw0ODJ8aGVs bG8gd29ybGQKFfGSPkEfCgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk/PQAA/Bu6oQXo9 IkF6PSi3bQAV3fpI0rnIGYJQGGEIjvgAAERFTEUgMzYxOTk5NTYub3V0LjAzMDQwOA0KFfGS PkhdCgB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrkRQAB9Bkc6QXo9KEF6PSIAFbdtucgZ gt36SOxQGPnpgdYAADU1MCAzNjE5OTk1Ni5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5v dCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQoV8ZI+wGoKAFAAAABQAAAAAAKznQHkAAfp ChZcCABFAABCT9BAAD8G7qdBej0iQXo9KLdtABXd+kjsucgZyFAYYQgF1wAAUE9SVCA2NSwx MjIsNjEsMzQsMTg0LDU3DQoV8ZI+q5cKAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0ljFA AH0GalRBej0oQXo9IhtYlQ90egQgGIzbuIAQwHVlWQAAAQEICgBCGeANRA8DFfGSPgmZCgCd AAAAnQAAAAACs50B5AAH6QoWXAgARQAAjztOQAA/BgLdQXo9IkF6PSiVDxtYGIzbuHR6BCCA GBbQeEIAAAEBCAoNRA8ZAEIZ4DQ4OHwxNDcyNzQ3fDEwNDk4MTczNjh8MS4wfDF8MjMwfGhl bGxvIHdvcmxkCjQ4OXwxNDcyNzQ4fDEwNDk4MTczNjh8MS4wfDF8MzMwMXxoZWxsbyB3b3Js ZAoV8ZI+0aQKAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuRJAAH0GR2FBej0oQXo9IgAV t225yBnI3fpJBlAY+c5JpQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KFfGSPu6n CgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk/RQAA/Bu6mQXo9IkF6PSi3bQAV3fpJBrnI GeZQGGEIfEQAAFNUT1IgMzYxOTk5NTYub3V0LjAzMDQwOA0KFfGSPtHtCgB4AAAAeAAAAAAH 6QoWXAACs50B5AgARQAAarkTQAB9Bkc8QXo9KEF6PSIAFbdtucgZ5t36SSBQGPm0C5kAADE1 MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5NTYub3V0 LjAzMDQwOC4NChXxkj7U7goAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC5FEAAfQZHdUF6 PShBej0iABS4OZCjCdsAAAAAcAL68Dh0AAACBAVkAQEEAhXxkj598AoAPgAAAD4AAAAAArOd AeQAB+kKFlwIAEUAADBP0kAAPwbut0F6PSJBej0ouDkAFOY6LoqQownccBJhCL02AAABAQQC AgQFtBXxkj5YKAsANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5FUAAfQZHfEF6PShBej0i ABS4OZCjCdzmOi6LUBD9XE2mAAAV8ZI+MjALAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWM T9NAAD8G6VpBej0iQXo9KLg5ABTmOi6LkKMJ3FAQYQjXcgAAWFlaWlkuLi4gIFRDPTIgVE09 MTA0OTgxNzM0NiBNTj0zNjE5OTk1Ni5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZO PSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRpb24gKEVVUikiIAoKLi4uICAKCgouLi4gCSAK CgpIZWFkTGluZS4uLiAgTGUgTW9uZGU6IERlbmlzIE9saXZlbm5lcyB0byBoZWFkIEZOQUMK Ci4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciA2LCAyMDAz LCAoTGUgTW9uZGUgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29w eXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lhbCBUaW1lcyBJbmZvcm1h dGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIEluZm9ybWF0aW9uIChFVVIp CgpGcmVuY2ggZGl2ZXJzaWZpZWQgcmV0YWlsIGdyb3VwIFBpbmF1bHQtUHJpbnRlbXBzLVJl ZG91dGUgaXMgcmVwb3J0ZWRseQpwcmVwYXJpbmcgdG8gYXBwb2ludCBEZW5pcyBPbGl2ZW5u ZXMsIHRoZSBmb3JtZXIgbWFuYWdpbmcgZGlyZWN0b3Igb2YKRnJlbmNoIHBheS1UViBncm91 cCBDYW5hbCsgYW5kIGN1cnJlbnRseSBtYW5hZ2luZyBkaXJlY3RvciBhdCBQUFIsCmNoYWly bWFuIG9mIEZOQUMsIHRoZSByZXRhaWxlcidzIGNoYWluIG9mIGJvb2sgYW5kIHJlY29yZCBz dG9yZXMuIE1yCk9saXZlbm5lcyB3aWxsIHJlcG9ydGVkbHkgYWxzbyB0YWtlIGNoYXJnZSBv ZiBhIG5ldyAiaG9tZSBlcXVpcG1lbnQiCmRpdmlzaW9uIGNvbXByaXNpbmcgRm5hYyBhbmQg Q29uZm9yYW1hLCBQUFIncyBob21lIGZ1cm5pc2hpbmdzIHVuaXQuCgpBY2NvcmRpbmcgdG8g dGhlIHJlcG9ydHMsIGEgbW9yZSBnZW5lcmFsIG1hbmFnZW1lbnQgcmVzaHVmZmxlIHdpbGwg c2VlClRoaWVycnkgRmFscXVlIGFwcG9pbnRlZCBoZWFkIG9mIGFub3RoZXIgbmV3LCAicGVy c29uYWwgZXF1aXBtZW50IgpkaXZpc2lvbiwgY29tcHJpc2luZyBob21lIHNob3BwaW5nIHVu aXQgUmVkY2F0cyAod2hpY2ggY29udHJvbHMgdGhlIExhClJlZG91dGUgYW5kIEJyeWxhbmUg Y2F0YWxvZ3VlcywgYW1vbmdzdCBtYW55IG90aGVycykuIElmIHRoZSBydW1vdXJzIGFyZQp0 cnVlLCBKZWFuLVBhdWwgR2lyYXVkIGhhcyBsb3N0IGhpcyBwb3NpdGlvbiBhcyBoZWFkIG9m IEZOQUM7IGhlIGhhcyBhCmdvb2QgdHJhY2sgcmVjb3JkIGFzIGNoYWlybWFuIChGTkFDJ3Mg dHVybm92ZXIgaW5jcmVhc2VkIGJ5IDYgcGVyIGNlbnQgaW4KMjAwMikgYnV0IG1heSBoYXZl IHN1ZmZlcmVkIGZyb20gYW4gaW1hZ2UgcHJvYmxlbS4KCk9yaWdpbmFsIGFydGljbGUgYnkg U3RlcGhhbmUgTGF1ZXIKCkFic3RyYWN0ZWQgZnJvbSBMZSBNb25kZQoKLi4uICAJIAoKS2V5 V29yZHMuLi4gIAogFfGSPjMwCwBUAAAAVAAAAAACs50B5AAH6QoWXAgARQAARk/UQAA/Bu6f QXo9IkF6PSi4OQAU5joz75CjCdxQGGEIDnYAACAgIGJvb2sKICAgIHJldGFpbAogICAgdHJh Y2sKChXxkj40MAsAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChP1UAAPwbuvEF6PSJBej0o uDkAFOY6NA2QowncUBFhCOR3AAAAAAAAAAAV8ZI+VY4LADYAAAA2AAAAAAfpChZcAAKznQHk CABFAAAouRZAAH0GR3tBej0oQXo9IgAUuDmQownc5jo0DlAQ/VxIIwAAFfGSPrmaCwA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLkXQAB9Bkd6QXo9KEF6PSIAFLg5kKMJ3OY6NA5QEf1c SCIAABXxkj7wmwsAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChP1kAAPwbuu0F6PSJBej0o uDkAFOY6NA6QowndUBBhCOR2AAAAAAAAAAAV8ZI+R2MMADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoT9dAAD8G7rpBej0iQXo9KLdtABXd+kkgucgaKFAQYQie/wAAAAAAAAAAFfGSPlmb DABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLkYQAB9BkdhQXo9KEF6PSIAFbdtucgaKN36 SSBQGPm0Nz0AADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NChXxkj4F7g0AQgAAAEIAAAAAB+kK FlwAArOdAeQIAEUAADSWMkAAfQZqU0F6PShBej0iG1iVD3R6BCAYjNwTgBDAGmVBAAABAQgK AEIZ4g1EDxkV8ZI++xAOADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT9hAAD8G7rlBej0i QXo9KLdtABXd+kkgucgaQFAQYQie5wAAAAAAAAAAFvGSPgGwCABvAAAAbwAAAAACs50B5AAH 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 MzgzfDEuMHwxfDE2MHxoZWxsbyB3b3JsZAo1MTB8MTQ3Mjc2OXwxMDQ5ODE3MzgzfDEuMHwx fDM1NzN8aGVsbG8gd29ybGQKNTExfDE0NzI3NzB8MTA0OTgxNzM4M3wxLjB8MXwzNTczfGhl bGxvIHdvcmxkCjUxMnwxNDcyNzcxfDEwNDk4MTczODN8MS4wfDF8MzI3fGhlbGxvIHdvcmxk CjUxM3wxNDcyNzcyfDEwNDk4MTczODN8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCjUxNHwxNDcy NzczfDEwNDk4MTczODR8MS4wfDF8MjYyM3xoZWxsbyB3b3JsZAo1MTV8MTQ3Mjc3NHwxMDQ5 ODE3Mzg0fDEuMHwxfDk2NjJ8aGVsbG8gd29ybGQKJfGSPnQfDwBCAAAAQgAAAAAH6QoWXAAC s50B5AgARQAANJZCQAB9BmpDQXo9KEF6PSIbWJUPdHoEIBiM4LWAELt4XlgAAAEBCAoAQhqD DUQVYSXxkj4YIQ8AcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI7X0AAPwYC+UF6PSJBej0o lQ8bWBiM4LV0egQggBgW0BaeAAABAQgKDUQVdwBCGoM1MTZ8MTQ3Mjc3NXwxMDQ5ODE3Mzg1 fDEuMHwxfDI2MjN8aGVsbG8gd29ybGQKJvGSPtIzAwBCAAAAQgAAAAAH6QoWXAACs50B5AgA RQAANJZDQAB9BmpCQXo9KEF6PSIbWJUPdHoEIBiM4OOAELtKXkAAAAEBCAoAQhqFDUQVdybx kj5Kvw0AcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI7YEAAPwYC+EF6PSJBej0olQ8bWBiM 4ON0egQggBgW0BkRAAABAQgKDUQV0gBCGoU1MTd8MTQ3Mjc3NnwxMDQ5ODE3Mzg2fDEuMHwx fDM0MjB8aGVsbG8gd29ybGQKJ/GSPp5LAQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZE QAB9BmpBQXo9KEF6PSIbWJUPdHoEIBiM4RGAELscXdwAAAEBCAoAQhqODUQV0ifxkj7YTAEA ngAAAJ4AAAAAArOdAeQAB+kKFlwIAEUAAJA7YUAAPwYCyUF6PSJBej0olQ8bWBiM4RF0egQg gBgW0CaBAAABAQgKDUQV5ABCGo41MTh8MTQ3Mjc3N3wxMDQ5ODE3Mzg2fDEuMHwxfDI0NDB8 aGVsbG8gd29ybGQKNTE5fDE0NzI3Nzh8MTA0OTgxNzM4NnwxLjB8MXwzMTE2fGhlbGxvIHdv cmxkCifxkj7toQQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWRUAAfQZqQEF6PShBej0i G1iVD3R6BCAYjOFtgBC6wF3IAAABAQgKAEIakA1EFeQn8ZI+FqMEAHAAAABwAAAAAAKznQHk AAfpChZcCABFAABiO2JAAD8GAvZBej0iQXo9KJUPG1gYjOFtdHoEIIAYFtAZVAAAAQEICg1E FfoAQhqQNTIwfDE0NzI3Nzl8MTA0OTgxNzM4NnwxLjB8MXwzMTE2fGhlbGxvIHdvcmxkCifx kj5n+AcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWRkAAfQZqP0F6PShBej0iG1iVD3R6 BCAYjOGbgBC6kl2wAAABAQgKAEIakg1EFfon8ZI+AYwIAEIAAABCAAAAAAKznQHkAAfpChZc CABFAAA0UmpAAD8G7BtBej0iQXo9KJSEG1horlP0bv9LXIAQFtACWAAAAQEICg1EFhQAQhXi J/GSPm7ECABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZHQAB9Bmo+QXo9KEF6PSIbWJSE bv9LXGiuU/WAEAAAFHcAAAEBCAoAQhqSDUQWFCfxkj6uOAwAbwAAAG8AAAAAArOdAeQAB+kK FlwIAEUAAGE7Y0AAPwYC9kF6PSJBej0olQ8bWBiM4Zt0egQggBgW0JCtAAABAQgKDUQWLABC GpI1MjF8MTQ3Mjc4MHwxMDQ5ODE3Mzg3fDEuMHwxfDY1NHxoZWxsbyB3b3JsZAon8ZI+j6UO AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lkhAAH0Gaj1Bej0oQXo9IhtYlQ90egQgGIzh yIAQumVdegAAAQEICgBCGpYNRBYsJ/GSPg2nDgCeAAAAngAAAAACs50B5AAH6QoWXAgARQAA kDtkQAA/BgLGQXo9IkF6PSiVDxtYGIzhyHR6BCCAGBbQM2YAAAEBCAoNRBY8AEIaljUyMnwx NDcyNzgxfDEwNDk4MTczODd8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZAo1MjN8MTQ3Mjc4Mnwx MDQ5ODE3Mzg3fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKKPGSPs65AgBCAAAAQgAAAAAH6QoW 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 +ZqAGgAANTUwIDM2MTk5OTY1Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQg dGhlIGZpbGUgc3BlY2lmaWVkLiANCjPxkj5d4QwAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUA AEJP2kAAPwbunUF6PSJBej0ot20AFd36STq5yBqGUBhhCALMAABQT1JUIDY1LDEyMiw2MSwz NCwxODQsNzYNCjPxkj7ZGw0AVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa5GkAAfQZHWUF6 PShBej0iABW3bbnIGobd+klUUBj5f0joAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwu DQoz8ZI+4B4NAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCT9tAAD8G7pxBej0iQXo9KLdt ABXd+klUucgapFAYYQh8NwAAU1RPUiAzNjE5OTk2NS5vdXQuMDMwNDA4DQoz8ZI+elsNAHgA AAB4AAAAAAfpChZcAAKznQHkCABFAABquRtAAH0GRzRBej0oQXo9IgAVt225yBqk3fpJblAY +WUJ3QAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5 OTk2NS5vdXQuMDMwNDA4Lg0KM/GSPm9cDQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLkc QAB9BkdtQXo9KEF6PSIAFLhMwIPfCQAAAABwAvrwM1IAAAIEBWQBAQQCM/GSPjFeDQA+AAAA PgAAAAACs50B5AAH6QoWXAgARQAAME/cQAA/Bu6tQXo9IkF6PSi4TAAU5tpCMMCD3wpwEmEI o84AAAEBBAICBAW0M/GSPrSVDQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLkdQAB9Bkd0 QXo9KEF6PSIAFLhMwIPfCubaQjFQEP1cND4AADPxkj5anQ0AmgUAAJoFAAAAArOdAeQAB+kK FlwIAEUABYxP3UAAPwbpUEF6PSJBej0ouEwAFObaQjHAg98KUBBhCIojAABYWVpaWS4uLiAg VEM9MiBUTT0xMDQ5ODE3Mzc2IE1OPTM2MTk5OTY1Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29t dGV4IiBQRk49IkNvbXRleCIgUEZOPSJPc3RlckRvd0pvbmVzIiAKCi4uLiAgCgoKLi4uIAkg CgoKSGVhZExpbmUuLi4gIEdXUyBXZWF0aGVyIFN0YXRpc3RpY3MgOiBEYWlseSBOb3J0aGVy biBCcmF6aWwgLSBBcHIgMDgKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxp bmUuLi4gIEFwciAwOCwgMjAwMyAoT0RKIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJp Z2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMgT3N0ZXJEb3dKb25lcyBDb21tb2RpdHkgTmV3 cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpPc3RlckRvd0pvbmVzCgpS ZXBvcnQgcGVyaW9kIEFwciAwOCAyMDAzIHRocm91Z2ggQXByIDA4IDIwMDMgUHJlY2lwaXRh dGlvbiBpbgptaWxsaW1ldGVycywgdGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cy4gKDAuMDQgaW5j aD0xIG1pbGxpbWV0ZXI7CkZhaHJlbmhlaXQ9Q2Vsc2l1cyB0aW1lcyAxLjgsIHBsdXMgMzIp CgpNT05USAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTyAgREFZUwogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFIFNJTkNFICBFWFRSTSAgRVhUUk0KICBM T0NBVElPTiAgICAgICAgICAgICBQQ1BOICAgUkFJTiAgUkFJTiAgIEhJR0ggICAgTE9XIFNO T1cKCkFDUkUKICBDcnV6ZWlybyBEbyBTdWwgICAgICAgICAyICAgICAyNiAgICAgMCAgICAg MjcgICAgIDIyICAgIDAKICBUYXJhdWFjYSAgICAgICAgICAgICAgIDIwICAgIDExMCAgICAg MCAgICAgMjkgICAgIDIyICAgIDAKCkFMQUdPQVMKICBNYWNlaW8gQ2FtcG8gUGEgICAgICAg IC0tICAgICAtLSAgICAtLSAgICAgLS0gICAgIC0tICAgLS0KCkFNQVBBCiAgTWFjYXBhICAg ICAgICAgICAgICAgICAgMCAgICAgNTYgICAgIDIgICAgIC0tICAgICAyMiAgICAwCgpBTUFa T05BUwogIEJlbmphbWluIENvbnN0YW50ICAgICAgMTggICAgIDg5ICAgICAwICAgICAzMyAg ICAgMjMgICAgMAogIExhYnJlYSAgICAgICAgICAgICAgICAgIDAgICAgMTA4ICAgICAxICAg ICAzMiAgICAgMjQgICAgMAogIE1hbmljb3JlICAgICAgICAgICAgICAgIDYgICAgIDY3ICAg ICAwICAgICAzMiAgICAgMjMgICAgMAogIFBhcmludGlucyAgICAgICAgICAgICAgIDAgICAg MTk3ICAgICAxICAgICAzMiAgICAgMjMgICAgMAogIFMgIEdhYnJpZWwgRG8gQ2FjaG8gICAg IDAgICAgIDExICAgICAxICAgICAzNiAgICAgMjQgICAgMAogIFRlZmUgICAgICAgICAgICAg ICAgICAgIDEgICAgIDI1ICAgICAwICAgICAzMyAgICAgMjQgICAgMAoKQkFISUEKICBCYXJy YSAgICAgICAgICAgICAgICAgICAz8ZI+2p0NAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWM T95AAD8G6U9Bej0iQXo9KLhMABTm2keVwIPfClAYYQgEZwAANSAgICAgIDUgICAgIDAgICAg IDMyICAgICAyNCAgICAwCiAgQmFycmVpcmFzICAgICAgICAgICAgICAgNCAgICAgNDUgICAg IDAgICAgIDM2ICAgICAyMiAgICAwCiAgQm9tIEplc3VzIERhIExhcGEgICAgICAyMSAgICAg NDQgICAgIDAgICAgIDMzICAgICAyMSAgICAwCiAgQ2FldGl0ZSAgICAgICAgICAgICAgICAg MCAgICAgIDAgICAgMTQgICAgIDMyICAgICAtLSAgICAwCiAgQ2FyYXZlbGFzIEFpcnBvICAg ICAgICAtLSAgICAgLS0gICAgLS0gICAgIC0tICAgICAtLSAgIC0tCiAgQ2lwbyAgICAgICAg ICAgICAgICAgICAgMCAgICAgIDAgICAgMTAgICAgIDM3ICAgICAyNCAgICAwCiAgSWxoZXVz IEFpcnBvcnQgICAgICAgICAtLSAgICAgLS0gICAgLS0gICAgIC0tICAgICAtLSAgIC0tCiAg SXJlY2UgICAgICAgICAgICAgICAgICAgMCAgICAgIDcgICAgIDEgICAgIDI5ICAgICAyMSAg ICAwCiAgSmFjb2JpbmEgICAgICAgICAgICAgICAgMCAgICAgIDAgICAgMTAgICAgIDM0ICAg ICAyMyAgICAwCiAgSmFndWFxdWFyYSAgICAgICAgICAgICAtLSAgICAgLS0gICAgLS0gICAg IC0tICAgICAtLSAgIC0tCiAgTGVuY29pcyAgICAgICAgICAgICAgICAgMCAgICAgIDAgICAg MTIgICAgIDM2ICAgICAyNCAgICAwCiAgUGV0cm9saW5hICAgICAgICAgICAgICAyOCAgICAg MzMgICAgIDAgICAgIDMzICAgICAyMSAgICAwCiAgUmVtYW5zbyAgICAgICAgICAgICAgICAg MCAgICAgIDAgICAgIDIgICAgIDMyICAgICAyMiAgICAwCiAgU2FsdmFkb3IgQWlycG9ydCAg ICAgICAtLSAgICAgLS0gICAgLS0gICAgIC0tICAgICAtLSAgIC0tCiAgVml0b3JpYSBEYSBD b25xdWlzdGEgICA0MiAgICAgNDIgICAgIDAgICAgIDMzICAgICAxOSAgICAwCgpDRUFSQQog IFRhdWEgICAgICAgICAgICAgICAgICAgIDAgICAgIDE3ICAgICAyICAgICAzMiAgICAgMjMg ICAgMAoKR09JQVMKICBBcmFnYXJjYXMgICAgICAgICAgICAgICAwICAgICAxNiAgICAgMiAg ICAgMzQgICAgIDIzICAgIDAKICBCcmFzaWxpYSBBaXJwb3J0ICAgICAgIC0tICAgICAtLSAg ICAtLSAgICAgLS0gICAgIC0tICAgLS0KICBDYXRhbGFvICAgICAgICAgICAgICAgICAwICAg ICA0NiAgICAgMSAgICAgMzAgICAgIDE5ICAgIDAKICBHb2lhbmlhICAgICAgICAgICAgICAg ICAwICAgICA3MyAgICAgMSAgICAgMzAgICAgIDIwICAgIDAKICBHb2lhcyAgICAgICAgICAg ICAgICAgICAwICAgICA3OCAgICAgMyAgICAgMzMgICAgIDIzICAgIDAKICBSaW8gVmVyZGUg ICAgICAgICAgICAgICAzICAgICA1NyAgICAgMCAgICAgMjkgICAgIDIxICAgIDAKCk1BUkFO SEFPCiAgQmFjYWJhbCAgICAgICAgICAgICAgICAgNSAgICAxODYgICAgIDAgICAgIDMyICAg ICAyNSAgICAwCiAgM/GSPk+eDQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjE/fQAA/BulO QXo9IkF6PSi4TAAU5tpM+cCD3wpQGGEIu8sAAEJhcnJhIERvIENvcmRhICAgICAgICAgIDAg ICAgIDE1ICAgICAwICAgICAzMiAgICAgMjQgICAgMAogIENhcm9saW5hICAgICAgICAgICAg ICAgIDAgICAgIDYzICAgICAxICAgICAzMiAgICAgMjMgICAgMAogIENheGlhcyAgICAgICAg ICAgICAgICAgIDAgICAgIDUzICAgICAxICAgICAtLSAgICAgMjMgICAgMAoKTUFUTyBHUk9T U08KICBDYWNlcmVzICAgICAgICAgICAgICAgICAwICAgICAyNCAgICAgMiAgICAgMjkgICAg IDE5ICAgIDAKICBDYW5hcmFuYSAgICAgICAgICAgICAgICAwICAgICAzOCAgICAgMSAgICAg MzMgICAgIDIyICAgIDAKICBDdWlhYmEgTWFyZWNoYWwgICAgICAgIC0tICAgICAtLSAgICAt LSAgICAgLS0gICAgIC0tICAgLS0KICBEaWFtYW50aW5vICAgICAgICAgICAgICAwICAgICA2 MyAgICAgMSAgICAgMzEgICAgIDIzICAgIDAKICBNYXR1cGEgICAgICAgICAgICAgICAgIDM1 ICAgIDEwMiAgICAgMCAgICAgMjggICAgIDIyICAgIDAKICBQb3hvcmVvIFBveG9yZXUgICAg ICAgICAwICAgICAzMiAgICAgMiAgICAgLS0gICAgIDIyICAgIDAKICBWZXJhIEdsZWJhIENl bGVzICAgICAgICAxICAgICAzNCAgICAgMCAgICAgMzIgICAgIDIzICAgIDAKICBYYXZhbnRp bmEgICAgICAgICAgICAgICAwICAgICA2NiAgICAgMiAgICAgMzMgICAgIDIxICAgIDAKClBB UkEKICBBbHRhbWlyYSAgICAgICAgICAgICAgICAwICAgICA4NCAgICAgMSAgICAgMzEgICAg IDIzICAgIDAKICBCZWxlbS9WYWwgRGUgQ2EgICAgICAgIC0tICAgICAtLSAgICAtLSAgICAg LS0gICAgIC0tICAgLS0KICBCZWx0ZXJyYSAgICAgICAgICAgICAgICAwICAgICAxNiAgICAg MSAgICAgLS0gICAgIDIxICAgIDAKICBDb25jZWljYW8gRG8gQXJhZ3VhICAgICAzICAgICA2 NyAgICAgMCAgICAgMzIgICAgIDIzICAgIDAKICBNYXJhYmEgICAgICAgICAgICAgICAgICA0 ICAgIDExMiAgICAgMCAgICAgMzEgICAgIDI0ICAgIDAKICBQb3J0byBEZSBNb3ogICAgICAg ICAgICAwICAgICA0MiAgICAgMSAgICAgLS0gICAgIDI0ICAgIDAKClBBUkFJQkEKICBDYW1w aW5hIEdyYW5kZSAgICAgICAgICAwICAgICAgMiAgICAgMSAgICAgMzAgICAgIDIyICAgIDAK ClBFUk5BTUJVQ08KICBHYXJhbmh1bnMgICAgICAgICAgICAgICAwICAgICAgMyAgICAgNCAg ICAgMzIgICAgIDIzICAgIDAKICBQZXRyb2xpbmEgICAgICAgICAgICAgIDI4ICAgICAzMyAg ICAgMCAgICAgMzMgICAgIDIxICAgIDAKICBSZWNpZmUgR3VhcmFyYXBlICAgICAgIC0tICAg ICAtLSAgICAtLSAgICAgLS0gICAgIC0tICAgLS0KClBJQVVJCiAgRmxvcmlhbm8gICAgICAg ICAgICAgICAgMSAgICAgMTggICAgIDAgICAgIDMzICAgICAyNCAgICAwCiAgRm9ydGFsZXph IEFpcjPxkj4ZGA4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5HkAAfQZHc0F6PShBej0i ABS4TMCD3wrm2kz5UBD9XCl2AAAz8ZI+IhsOAN0EAADdBAAAAAKznQHkAAfpChZcCABFAATP T+BAAD8G6gpBej0iQXo9KLhMABTm2lJdwIPfClAZYQj82AAAcG9ydCAgICAgICAxICAgICA5 OSAgICAgMCAgICAgLS0gICAgIDI0ICAgIDAKICBTICBKb2FvIERvIFBpYXVpICAgICAgICAw ICAgICAgMCAgICAgOCAgICAgMzEgICAgIDIyICAgIDAKICBUZXJlc2luYSBBaXJwb3IgICAg ICAgIC0tICAgICAtLSAgICAtLSAgICAgLS0gICAgIC0tICAgLS0KClJJTyBHUkFOREUgRE8g Tk9SVEUKICBNYWNhdSAgICAgICAgICAgICAgICAgICAwICAgICAzNCAgICAgMSAgICAgMzAg ICAgIDI2ICAgIDAKICBOYXRhbCBBdWd1c3RvIFMgICAgICAgICAyICAgICAxNyAgICAgMCAg ICAgLS0gICAgIDI0ICAgIDAKClJPTkRPTklBCiAgUG9ydG8gVmVsaG8gQXJwdCAgICAgICAt LSAgICAgLS0gICAgLS0gICAgIC0tICAgICAtLSAgIC0tCiAgVmlsaGVuYSAgICAgICAgICAg ICAgICAtLSAgICAgLS0gICAgLS0gICAgIC0tICAgICAtLSAgIC0tCgpST1JBSU1BCiAgQm9h IFZpc3RhIEFwcnQgICAgICAgICAtLSAgICAgLS0gICAgLS0gICAgIC0tICAgICAtLSAgIC0t CgpTRVJHSVBFCiAgQXJhY2FqdSAgICAgICAgICAgICAgICAgMCAgICAgIDAgICAgIDkgICAg IDMyICAgICAyNiAgICAwCgpUT0NBTlRJTlMKICBQZWRybyBBZm9uc28gICAgICAgICAgICAw ICAgICAzNSAgICAgMSAgICAgMzMgICAgIC0tICAgIDAKICBQZWl4ZSAgICAgICAgICAgICAg ICAgICAwICAgICA1NiAgICAgNCAgICAgMzQgICAgIDI0ICAgIDAKICBQb3J0byBOYWNpb25h bCAgICAgICAgICA2ICAgICA1NyAgICAgMCAgICAgMzQgICAgIDI0ICAgIDAKICBUYWd1YXRp bmdhICAgICAgICAgICAgICA5ICAgIDEyNCAgICAgMCAgICAgMzIgICAgIDIxICAgIDAKICBD b25jZWljYW8gRG8gQXJhZ3VhICAgICAzICAgICA2NyAgICAgMCAgICAgMzIgICAgIDIzICAg IDAKClRlbDogKDkxMykzMjItNTE4MQoKR1dTIHdlYiBzaXRlOiBodHRwOi8vd3d3Lmdsb2Jh bHdlYXRoZXJzZXJ2aWNlcy5jb20gMjAwMy0wNC0wOCAxNTo1NDo1MQoKU2VuZCBjb21tZW50 cyB0bzogZ3dzbWFpbEBnbG9iYWx3ZWF0aGVyc2VydmljZXMuY29tCgouLi4gIAkgCgpLZXlX b3Jkcy4uLiAgCiAgICBhaXJwb3J0CiAgICBicmF6aWwKICAgIGNydXplaXJvCiAgICBwZW5u c3lsdmFuaWEKICAgIHN0YXRpc3RpY3MKICAgIHdlYXRoZXIKICAgIHdlYgogICAgV0VBVEhF Uk9yaWdpbiBBc3NpZ25lZEJ5PSJPc3RlckRvd0pvbmVzIiAvPgoKM/GSPjR0DgA2AAAANgAA AAAH6QoWXAACs50B5AgARQAAKLkfQAB9BkdyQXo9KEF6PSIAFLhMwIPfCubaVwVQEP1cH2oA ADPxkj70iA4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5IEAAfQZHcUF6PShBej0iABS4 TMCD3wrm2lcFUBH9XB9pAAAz8ZI+cIoOADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT+FA AD8G7rBBej0iQXo9KLhMABTm2lcFwIPfC1AQYQi7vQAAAAAAAAAAM/GSPjXXDgA8AAAAPAAA AAACs50B5AAH6QoWXAgARQAAKE/iQAA/Bu6vQXo9IkF6PSi3bQAV3fpJbrnIGuZQEGEInfMA AAAAAAAAADPxkj6HDw8ATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC5IUAAfQZHWEF6PShB ej0iABW3bbnIGubd+kluUBj5ZTaAAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQo08ZI+qEIB ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT+NAAD8G7q5Bej0iQXo9KLdtABXd+kluucga /lAQYQid2wAAAAAAAAAANPGSPmweCABwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjtwQAA/ BgLoQXo9IkF6PSiVDxtYGIzk/XR6BCCAGBbQFh8AAAEBCAoNRBslAEIbDTU0MHwxNDcyODAx fDEwNDk4MTczOTl8MS4wfDF8MzQwM3xoZWxsbyB3b3JsZAo08ZI+R4wLAEIAAABCAAAAAAfp ChZcAAKznQHkCABFAAA0llVAAH0GajBBej0oQXo9IhtYlQ90egQgGIzlK4AQtwJYAQAAAQEI CgBCGxYNRBslNfGSPsweCABvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTtxQAA/BgLoQXo9 IkF6PSiVDxtYGIzlK3R6BCCAGBbQjlAAAAEBCAoNRBuJAEIbFjU0MXwxNDcyODAyfDEwNDk4 MTc0MDB8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCjXxkj5FTwsAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSWVkAAfQZqL0F6PShBej0iG1iVD3R6BCAYjOVYgBC21VeTAAABAQgKAEIbIA1E G4k28ZI+Y6YJAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO3JAAD8GAuZBej0iQXo9KJUP G1gYjOVYdHoEIIAYFtAZ5QAAAQEICg1EG/cAQhsgNTQyfDE0NzI4MDN8MTA0OTgxNzQwMXwx LjB8MXwzMTE2fGhlbGxvIHdvcmxkCjbxkj58vQwAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSWV0AAfQZqLkF6PShBej0iG1iVD3R6BCAYjOWGgBC2p1caAAABAQgKAEIbKw1EG/c28ZI+ 5L4MAMwAAADMAAAAAAKznQHkAAfpChZcCABFAAC+O3NAAD8GAolBej0iQXo9KJUPG1gYjOWG dHoEIIAYFtBZGgAAAQEICg1EHAsAQhsrNTQzfDE0NzI4MDR8MTA0OTgxNzQwMXwxLjB8MXwz MzAxfGhlbGxvIHdvcmxkCjU0NHwxNDcyODA1fDEwNDk4MTc0MDF8MS4wfDF8MjIzNXxoZWxs byB3b3JsZAo1NDV8MTQ3MjgwNnwxMDQ5ODE3NDAyfDEuMHwxfDM0MjB8aGVsbG8gd29ybGQK N/GSPpfRAABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZYQAB9BmotQXo9KEF6PSIbWJUP dHoEIBiM5hCAELYdVwQAAAEBCAoAQhstDUQcCzfxkj60HwgAbwAAAG8AAAAAArOdAeQAB+kK FlwIAEUAAGE7dEAAPwYC5UF6PSJBej0olQ8bWBiM5hB0egQggBgW0H2GAAABAQgKDUQcUQBC Gy01NDZ8MTQ3MjgwN3wxMDQ5ODE3NDAyfDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAo38ZI+O9UK AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lllAAH0GaixBej0oQXo9IhtYlQ90egQgGIzm PYAQtfBWtwAAAQEICgBCGzQNRBxRN/GSPuDWCgBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAA Yjt1QAA/BgLjQXo9IkF6PSiVDxtYGIzmPXR6BCCAGBbQDoAAAAEBCAoNRBxiAEIbNDU0N3wx NDcyODA4fDEwNDk4MTc0MDJ8MS4wfDF8MzExNnxoZWxsbyB3b3JsZAo38ZI+yisOAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0llpAAH0GaitBej0oQXo9IhtYlQ90egQgGIzma4AQtcJW pAAAAQEICgBCGzYNRBxiOPGSPir1BAA8AAAAPAAAAAACs50B5AAH6QoWXAgGAAEIAAYEAAEA B+kKFlxBej0iAAAAAAAAQXo9KAAAAAAAAAAAAAAAAAAAAAAAADjxkj4+9QQAKgAAACoAAAAA B+kKFlwAArOdAeQIBgABCAAGBAACAAKznQHkQXo9KAAH6QoWXEF6PSI48ZI+raYJAHAAAABw AAAAAAKznQHkAAfpChZcCABFAABiO3ZAAD8GAuJBej0iQXo9KJUPG1gYjOZrdHoEIIAYFtAL 8QAAAQEICg1EHL8AQhs2NTQ4fDE0NzI4MDl8MTA0OTgxNzQwM3wxLjB8MXwzMjI1fGhlbGxv IHdvcmxkCjjxkj6LQwwAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWW0AAfQZqKkF6PShB ej0iG1iVD3R6BCAYjOaZgBC1lFY+AAABAQgKAEIbPw1EHL848ZI+eAMPAFAAAABQAAAAAAKz nQHkAAfpChZcCABFAABCT+RAAD8G7pNBej0iQXo9KLdtABXd+kluucga/lAYYQiL3wAAREVM RSAzNjE5OTk2Ny5vdXQuMDMwNDA4DQo48ZI+SUAPAHwAAAB8AAAAAAfpChZcAAKznQHkCABF AABuuSJAAH0GRylBej0oQXo9IgAVt225yBr+3fpJiFAY+Ut/WwAANTUwIDM2MTk5OTY3Lm91 dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiAN Cjnxkj6RCwAAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJP5UAAPwbukkF6PSJBej0ot20A Fd36SYi5yBtEUBhhCAG/AABQT1JUIDY1LDEyMiw2MSwzNCwxODQsNzcNCjnxkj46RgAAVAAA AFQAAAAAB+kKFlwAArOdAeQIAEUAAEa5I0AAfQZHUEF6PShBej0iABW3bbnIG0Td+kmiUBj5 MEgrAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQo58ZI+NUkAAFAAAABQAAAAAAKz nQHkAAfpChZcCABFAABCT+ZAAD8G7pFBej0iQXo9KLdtABXd+kmiucgbYlAYYQh5KwAAU1RP UiAzNjE5OTk2Ny5vdXQuMDMwNDA4DQo58ZI+ca4AAHgAAAB4AAAAAAfpChZcAAKznQHkCABF AABquSRAAH0GRytBej0oQXo9IgAVt225yBti3fpJvFAY+RYJHgAAMTUwIE9wZW5pbmcgQklO QVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTk2Ny5vdXQuMDMwNDA4Lg0KOfGS PugjAQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLklQAB9BkdkQXo9KEF6PSIAFLhNvyvH awAAAABwAvrwTEcAAAIEBWQBAQQCOfGSPs4lAQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAA ME/nQAA/Bu6iQXo9IkF6PSi4TQAU5vI/M78rx2xwEmEIv6gAAAEBBAICBAW0OfGSPsxdAQA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLkmQAB9BkdrQXo9KEF6PSIAFLhNvyvHbObyPzRQ EP1cUBgAADnxkj4GZQEANwUAADcFAAAAArOdAeQAB+kKFlwIAEUABSlP6EAAPwbpqEF6PSJB ej0ouE0AFObyPzS/K8dsUBhhCIHuAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3Mzc3IE1O PTM2MTk5OTY3Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZO PSJLbm9iaWFzIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIFMtODogRVROIFJl Z2lzdGVycyA1TSBTaGFyZXMgZm9yIENvbXBlbnNhdGlvbiBbZGVsYXllZF0KCi4uLiAgCSAK CkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIFJpZGdlbGFuZCwgTVMsIEFQUiAw OCwgMjAwMyAoRXZlbnRYL0tub2JpYXMuY29tIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29w eXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDIgS25vYmlhcy5jb20sIExMQywgQWxsIHJp Z2h0cyByZXNlcnZlZC4KCgouLi4KCgpLbm9iaWFzCgpFYXRvbiBDb3Jwb3JhdGlvbiAoTllT RTogRVROKSBmaWxlZCAyIFMtOCBzdGF0ZW1lbnRzIGR1cmluZyBUdWVzZGF5J3MKc2Vzc2lv bi4KClRoZSBDb21wYW55IGlzIHJlZ2lzdGVyaW5nIDMwLDAwMCBzaGFyZXMgb2YgY29tbW9u IHN0b2NrIGlzc3VhYmxlIHVuZGVyCml0cyAxOTk2IE5vbi1FbXBsb3llZSBEaXJlY3RvciBG ZWUgRGVmZXJyYWwgUGxhbiBhbmQgNSwwMDAsMDAwIHNoYXJlcyBvZgpjb21tb24gc3RvY2sg aXNzdWFibGUgdW5kZXIgaXRzIFNhdmluZ3MgUGxhbi4KCkdFVCBLTk9CSUFTIElOIFJFQUwt VElNRTogRGVsaXZlcnkgb2YgdGhpcyBwcm9wcmlldGFyeSBLbm9iaWFzIGFsZXJ0IGhhcwpi ZWVuIGRlbGF5ZWQgYnkgMjAgbWludXRlcy4gVG8gZ2V0IGFsbCBLbm9iaWFzIGFsZXJ0cyBp biByZWFsLXRpbWUgZGFpbHksCnZpc2l0IGh0dHA6Ly93d3cua25vYmlhcy5jb20vY210eAoK QUJPVVQgS05PQklBUzogS25vYmlhcyBpcyBhIGZpbmFuY2lhbCBpbmZvcm1hdGlvbiBwcm92 aWRlciBzZXJ2aW5nIHJldGFpbAppbnZlc3RvcnMgYW5kIHRyYWRpbmcgcHJvZmVzc2lvbmFs cy4gS25vYmlhcyBwcm92aWRlcyBjdXN0b21lcnMgd2l0aApDT01QTEVURSBERVNLVE9QIFNP TFVUSU9OUywgaW5jbHVkaW5nIFJlYWwtdGltZSBkZXNrdG9wIGFwcGxpY2F0aW9ucywKUmVh bC10aW1lIG5ld3MgJiBhbGVydHMgdmlhIFJBaURBUiBhbmQgYSBjb21wbGV0ZSBmdW5kYW1l bnRhbCBkYXRhYmFzZQpjb3ZlcmluZyBvdmVyIDEzLDAwMCBzdG9ja3MuCgpLbm9iaWFzLmNv bSwgTExDCjYwMS05NzgtMzM5OQo2MDEtOTc4LTM2NzUKaW5mb0Brbm9iaWFzLmNvbQp3d3cu a25vYmlhcy5jb20vY210eAoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgbnlzZQogICAg cmV0YWlsCgo58ZI+B2UBADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT+lAAD8G7qhBej0i QXo9KLhNABTm8kQ1vyvHbFARYQjnagAAAAAAAAAAOfGSPq/AAQA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLknQAB9BkdqQXo9KEF6PSIAFLhNvyvHbObyRDZQEPhbUBcAADnxkj6hzAEA NgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5KEAAfQZHaUF6PShBej0iABS4Tb8rx2zm8kQ2 UBH4W1AWAAA58ZI+mM0BADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT+pAAD8G7qdBej0i QXo9KLhNABTm8kQ2vyvHbVAQYQjnaQAAAAAAAAAAOfGSPogtAgA8AAAAPAAAAAACs50B5AAH 6QoWXAgARQAAKE/rQAA/Bu6mQXo9IkF6PSi3bQAV3fpJvLnIG6RQEGEInOcAAAAAAAAAADnx kj5HZgIATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC5KUAAfQZHUEF6PShBej0iABW3bbnI G6Td+km8UBj5FjXDAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQo58ZI+IW0CAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCT+xAAD8G7otBej0iQXo9KLdtABXd+km8ucgbvFAYYQiJ0wAA REVMRSAzNjE5OTk2OC5vdXQuMDMwNDA4DQo58ZI+0akCAHwAAAB8AAAAAAfpChZcAAKznQHk CABFAABuuSpAAH0GRyFBej0oQXo9IgAVt225yBu83fpJ1lAY+Px+nQAANTUwIDM2MTk5OTY4 Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVk LiANCjnxkj6vtQIAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJP7UAAPwbuikF6PSJBej0o t20AFd36Sda5yBwCUBhhCACyAABQT1JUIDY1LDEyMiw2MSwzNCwxODQsNzgNCjnxkj4W8AIA VAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa5K0AAfQZHSEF6PShBej0iABW3bbnIHALd+knw UBj44UduAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQo58ZI+YPMCAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCT+5AAD8G7olBej0iQXo9KLdtABXd+knwucgcIFAYYQh3HwAA U1RPUiAzNjE5OTk2OC5vdXQuMDMwNDA4DQo58ZI+3zADAHgAAAB4AAAAAAfpChZcAAKznQHk CABFAABquSxAAH0GRyNBej0oQXo9IgAVt225yBwg3fpKClAY+McIYAAAMTUwIE9wZW5pbmcg QklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTk2OC5vdXQuMDMwNDA4Lg0K OfGSPs0xAwA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLktQAB9BkdcQXo9KEF6PSIAFLhO r5xOmwAAAABwAvrw1KUAAAIEBWQBAQQCOfGSPiMzAwA+AAAAPgAAAAACs50B5AAH6QoWXAgA RQAAME/vQAA/Bu6aQXo9IkF6PSi4TgAU5vZIA6+cTpxwEmEIPzMAAAEBBAICBAW0OfGSPh1r AwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLkuQAB9BkdjQXo9KEF6PSIAFLhOr5xOnOb2 SARQEP1cz6IAADnxkj6GcgMAPwUAAD8FAAAAArOdAeQAB+kKFlwIAEUABTFP8EAAPwbpmEF6 PSJBej0ouE4AFOb2SASvnE6cUBhhCOc5AABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3Mzc3 IE1OPTM2MTk5OTY4Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIg UEZOPSJGVCBJbmZvcm1hdGlvbiAoRVVSKSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5l Li4uICBMYSBUcmlidW5lOiBGcmVuY2ggcmFpbCB1bmlvbiBvcHBvc2VzIGFudGktY29uZmxp Y3QgYWdyZWVtZW50CgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4u ICBBcHIgOCwgMjAwMywgKExhIFRyaWJ1bmUgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgp IC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lh bCBUaW1lcyBJbmZvcm1hdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIElu Zm9ybWF0aW9uIChFVVIpCgpUaGUgRnJlbmNoIHRyYWRlIHVuaW9uIENHVCwgd2hvc2UgbWVt YmVycyBpbmNsdWRlIGFuIHVucml2YWxsZWQgbnVtYmVyIG9mCkZyZW5jaCByYWlsIHdvcmtl cnMsIHNhaWQgeWVzdGVyZGF5IHRoYXQgaXQgcmVmdXNlcyB0byBzaWduIGEgZnJhbWV3b3Jr CmFncmVlbWVudCB3aXRoIHRoZSBGcmVuY2ggcmFpbCBvcGVyYXRvciAoU05DRikgdG8gaW1w cm92ZSBkaWFsb2d1ZSBhbmQKcHJldmVudCBpbmR1c3RyaWFsIGRpc3B1dGVzLiBUaGUgYWdy ZWVtZW50LCBleHBsYWluZWQgdGhlIENHVCwgZ3VhcmFudGVlcwpub3RoaW5nIGZvciBlbXBs b3llZXMgaW4gcmV0dXJuLgoKSW4gdGhlIHNhbWUgdmVpbiwgdGhlIEZPIHVuaW9uIGNsYWlt cyB0aGF0IHRoZSBwcm9wb3NlZCBhY2NvcmQgY291bGQgcGF2ZQp0aGUgd2F5IGZvciBjaGFu Z2VzIHRvIGxhd3MgY29uY2VybmluZyB0aGUgcmlnaHQgdG8gc3RyaWtlLCB3aGlsZSBhIHRo aXJkCnVuaW9uLCBTVUQsIGhhcyB1cmdlZCB0aGUgU05DRiB0byByZXZpZXcgaXQuIFRoZSBT TkNGJ3Mgc2Vjb25kLWJpZ2dlc3QKdW5pb24sIHRoZSBDRkRULCBoYXMgZGVjaWRlZCB0byB3 YWl0IHVudGlsIGFmdGVyIGFuIGludGVyLXVuaW9uIG1lZXRpbmcKb24gdGhlIHN1YmplY3Qg b24gVGh1cnNkYXkgdG8gbWFrZSBpdHMgb3duIHZpZXdzIGtub3duLiBTbyBmYXIsIG9ubHkg dGhlCkNGVEMgaGFzIGRlY2xhcmVkIGl0c2VsZiBpbiBmYXZvdXIgb2YgdGhlIGFncmVlbWVu dC4KCk9yaWdpbmFsIGFydGljbGUgYnkgQ0MKCkFic3RyYWN0ZWQgZnJvbSBMYSBUcmlidW5l CgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBpbmR1c3RyaWFsCiAgICBzdHJpa2UKICAg IHRyYWRlCiAgICB1bmlvbnMKCjnxkj6IcgMAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChP 8UAAPwbuoEF6PSJBej0ouE4AFOb2TQ2vnE6cUBFhCGbtAAAAAAAAAAA58ZI+9c0DADYAAAA2 AAAAAAfpChZcAAKznQHkCABFAAAouS9AAH0GR2JBej0oQXo9IgAUuE6vnE6c5vZNDlAQ+FPP oQAAOfGSPnbaAwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLkwQAB9BkdhQXo9KEF6PSIA FLhOr5xOnOb2TQ5QEfhTz6AAADnxkj6n2wMAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChP 8kAAPwbun0F6PSJBej0ouE4AFOb2TQ6vnE6dUBBhCGbsAAAAAAAAAAA58ZI+sp4EADwAAAA8 AAAAAAKznQHkAAfpChZcCABFAAAoT/NAAD8G7p5Bej0iQXo9KLdtABXd+koKucgcYlAQYQib 2wAAAAAAAAAAOfGSPmjXBABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLkxQAB9BkdIQXo9 KEF6PSIAFbdtucgcYt36SgpQGPjHNQYAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCjnxkj4U 3wQAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJP9EAAPwbug0F6PSJBej0ot20AFd36Sgq5 yBx6UBhhCIfHAABERUxFIDM2MTk5OTY5Lm91dC4wMzA0MDgNCjnxkj4/HAUAfAAAAHwAAAAA B+kKFlwAArOdAeQIAEUAAG65MkAAfQZHGUF6PShBej0iABW3bbnIHHrd+kokUBj4rX3fAAA1 NTAgMzYxOTk5Njkub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmls ZSBzcGVjaWZpZWQuIA0KOfGSPlkoBQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk/1QAA/ Bu6CQXo9IkF6PSi3bQAV3fpKJLnIHMBQGGEI/6QAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCw3 OQ0KOfGSPlBiBQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrkzQAB9BkdAQXo9KEF6PSIA FbdtucgcwN36Sj5QGPiSRrEAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCjnxkj5r ZQUAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJP9kAAPwbugUF6PSJBej0ot20AFd36Sj65 yBzeUBhhCHUTAABTVE9SIDM2MTk5OTY5Lm91dC4wMzA0MDgNCjnxkj4CowUAeAAAAHgAAAAA B+kKFlwAArOdAeQIAEUAAGq5NEAAfQZHG0F6PShBej0iABW3bbnIHN7d+kpYUBj4eAeiAAAx NTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTY5Lm91 dC4wMzA0MDguDQo58ZI+TrAFAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuTVAAH0GR1RB ej0oQXo9IgAUuE9k7HTCAAAAAHAC+vD5LQAAAgQFZAEBBAI58ZI+C7IFAD4AAAA+AAAAAAKz nQHkAAfpChZcCABFAAAwT/dAAD8G7pJBej0iQXo9KLhPABTm94wxZOx0w3ASYQgfjAAAAQEE AgIEBbQ58ZI+WuoFADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouTZAAH0GR1tBej0oQXo9 IgAUuE9k7HTD5veMMlAQ/Vyv+wAAOfGSPnTyBQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAF jE/4QAA/Buk1QXo9IkF6PSi4TwAU5veMMmTsdMNQEGEIohEAAFhZWlpZLi4uICBUQz0yIFRN PTEwNDk4MTczNzggTU49MzYxOTk5Njkub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBG Tj0iQ29tdGV4IiBQRk49Iktub2JpYXMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4u LiAgOC1LOiBNQUdSIEFubm91bmNlcyBNZ210LiBDaGFuZ2VzOyBDaGFuZ2UgaW4gQ29udHJv bCBbZGVsYXllZF0KCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4g IFJpZGdlbGFuZCwgTVMsIEFQUiAwOCwgMjAwMyAoRXZlbnRYL0tub2JpYXMuY29tIHZpYSBD T01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDIgS25v Ymlhcy5jb20sIExMQywgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpLbm9iaWFzCgpN YWdudW0gZCdPciBSZXNvdXJjZXMgSW5jIChPVENCQjogTUFHUikgZmlsZWQgYW4gOC1LIGR1 cmluZyBUdWVzZGF5J3MKc2Vzc2lvbiB0byBhbm5vdW5jZSB0aGF0IG9uIE1hcmNoIDEzLCAy MDAzIFJlbm8gSiBDYWxhYnJpZ28gd2FzIGVsZWN0ZWQKYXMgUHJlc2lkZW50LCBUcmVhc3Vy ZXIgYW5kIGEgRGlyZWN0b3Igb2YgdGhlIGNvbXBhbnkuIEluIGFkZGl0aW9uLCBKYW5ldApX aW5rbGFyIHdhcyBlbGVjdGVkIGFzIFNlY3JldGFyeSBhbmQgRGlyZWN0b3IuCgpUaGUgdGhy ZWUgZm9ybWVyIG9mZmljZXJzIGFuZCBkaXJlY3RvcnMgb2YgdGhlIENvbXBhbnksIFNhbmR5 IFdpbmljaywKSG93YXJkIEtsZWluIGFuZCBNaWNoYWVsIExldmluZSBoYXZlIHJlc2lnbmVk IGFzIG9mZmljZXJzIGFuZCBkaXJlY3RvcnMsCmFuZCB3aWxsIGJlIHRyYW5zZmVycmluZyB0 aGVpciBzaGFyZXMgdG8gTXIgQ2FsYWJyaWdvLiBNciBDYWxhYnJpZ28gd2lsbApiZSByZWNl aXZpbmcgYSB0b3RhbCBvZiBhcHByb3hpbWF0ZWx5IDE4LDM5NSw1MDAgc2hhcmVzIG9mIGNv bW1vbiBzdG9jay4KCkdFVCBLTk9CSUFTIElOIFJFQUwtVElNRTogRGVsaXZlcnkgb2YgdGhp cyBwcm9wcmlldGFyeSBLbm9iaWFzIGFsZXJ0IGhhcwpiZWVuIGRlbGF5ZWQgYnkgMjAgbWlu dXRlcy4gVG8gZ2V0IGFsbCBLbm9iaWFzIGFsZXJ0cyBpbiByZWFsLXRpbWUgZGFpbHksCnZp c2l0IGh0dHA6Ly93d3cua25vYmlhcy5jb20vY210eAoKQUJPVVQgS05PQklBUzogS25vYmlh cyBpcyBhIGZpbmFuY2lhbCBpbmZvcm1hdGlvbiBwcm92aWRlciBzZXJ2aW5nIHJldGFpbApp bnZlc3RvcnMgYW5kIHRyYWRpbmcgcHJvZmVzc2lvbmFscy4gS25vYmlhcyBwcm92aWRlcyBj dXN0b21lcnMgd2l0aApDT01QTEVURSBERVNLVE9QIFNPTFVUSU9OUywgaW5jbHVkaW5nIFJl YWwtdGltZSBkZXNrdG9wIGFwcGxpY2F0aW9ucywKUmVhbC10aW1lIG5ld3MgJiBhbGVydHMg dmlhIFJBaURBUiBhbjnxkj518gUA+QAAAPkAAAAAArOdAeQAB+kKFlwIAEUAAOtP+UAAPwbt 1UF6PSJBej0ouE8AFOb3kZZk7HTDUBhhCOxZAABkIGEgY29tcGxldGUgZnVuZGFtZW50YWwg ZGF0YWJhc2UKY292ZXJpbmcgb3ZlciAxMywwMDAgc3RvY2tzLgoKS25vYmlhcy5jb20sIExM Qwo2MDEtOTc4LTMzOTkKNjAxLTk3OC0zNjc1CmluZm9Aa25vYmlhcy5jb20Kd3d3Lmtub2Jp YXMuY29tL2NtdHgKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIHByZXNpZGVudAogICAg cmV0YWlsCgo58ZI+dvIFADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoT/pAAD8G7pdBej0i QXo9KLhPABTm95JZZOx0w1ARYQhGKAAAAAAAAAAAOfGSPuJQBgA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLk3QAB9BkdaQXo9KEF6PSIAFLhPZOx0w+b3kllQEP1cqdQAADnxkj6nUgYA NgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5OEAAfQZHWUF6PShBej0iABS4T2TsdMPm95Ja UBD9XKnTAAA58ZI+CmIGADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouTlAAH0GR1hBej0o QXo9IgAUuE9k7HTD5veSWlAR/Vyp0gAAOfGSPjFjBgA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKE/7QAA/Bu6WQXo9IkF6PSi4TwAU5veSWmTsdMRQEGEIRicAAAAAAAAAADnxkj7PDwcA PAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChP/EAAPwbulUF6PSJBej0ot20AFd36Sli5yB0g UBBhCJrPAAAAAAAAAAA58ZI+a0gHAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuTpAAH0G Rz9Bej0oQXo9IgAVt225yB0g3fpKWFAY+Hg0SQAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0K OfGSPiJRBwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk/9QAA/Bu56QXo9IkF6PSi3bQAV 3fpKWLnIHThQGGEIj7oAAERFTEUgMzYxOTk5NzAub3V0LjAzMDQwOA0KOfGSPlVOCAB8AAAA fAAAAAAH6QoWXAACs50B5AgARQAAbrk7QAB9BkcQQXo9KEF6PSIAFbdtucgdON36SnJQGPhe fCsAADU1MCAzNjE5OTk3MC5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRo ZSBmaWxlIHNwZWNpZmllZC4gDQo58ZI+/FoIAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABC T/5AAD8G7nlBej0iQXo9KLdtABXd+kpyucgdflAYYQj9oQAAUE9SVCA2NSwxMjIsNjEsMzQs MTg0LDgwDQo58ZI+VJUIAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuTxAAH0GRzdBej0o QXo9IgAVt225yB1+3fpKjFAY+ENF9AAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K OfGSPkeYCABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQk//QAA/Bu54QXo9IkF6PSi3bQAV 3fpKjLnIHZxQGGEIfQYAAFNUT1IgMzYxOTk5NzAub3V0LjAzMDQwOA0KOfGSPrg/CQB4AAAA eAAAAAAH6QoWXAACs50B5AgARQAAark9QAB9BkcSQXo9KEF6PSIAFbdtucgdnN36SqZQGPgp Be4AADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5 NzAub3V0LjAzMDQwOC4NCjnxkj6mQAkAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC5PkAA fQZHS0F6PShBej0iABS4UJnClMEAAAAAcAL68KRXAAACBAVkAQEEAjnxkj56QgkAPgAAAD4A AAAAArOdAeQAB+kKFlwIAEUAADBQAEAAPwbuiUF6PSJBej0ouFAAFOb7F3qZwpTCcBJhCD9p AAABAQQCAgQFtDnxkj5jegkANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5P0AAfQZHUkF6 PShBej0iABS4UJnClMLm+xd7UBD9XM/YAAA58ZI+GoIJAJoFAACaBQAAAAKznQHkAAfpChZc CABFAAWMUAFAAD8G6SxBej0iQXo9KLhQABTm+xd7mcKUwlAQYQiVKQAAWFlaWlkuLi4gIFRD PTIgVE09MTA0OTgxNzM3OSBNTj0zNjE5OTk3MC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRl eCIgUEZOPSJDb210ZXgiIFBGTj0iS25vYmlhcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRM aW5lLi4uICBQUkUgMTRBOiBESk8gVm90ZTsgUmVkdWNlICMgQXV0aCBTaGFyZXMgb2YgQ29t bSAmIFByZWZkIFtkZWxheWVkXQoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRl TGluZS4uLiAgUmlkZ2VsYW5kLCBNUywgQVBSIDA4LCAyMDAzIChFdmVudFgvS25vYmlhcy5j b20gdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQg MjAwMiBLbm9iaWFzLmNvbSwgTExDLCBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCktu b2JpYXMKCkFjY29yZGluZyB0byBhIFBSRSAxNEEgZmlsZWQgTW9uZGF5LCB0aGUgMjAwMyBB bm51YWwgTWVldGluZyBvZgpTdG9ja2hvbGRlcnMgb2YgZGogT3J0aG9wZWRpY3MsIEluYyAo TllTRTogREpPKSB3aWxsIGJlIGhlbGQgYXQgdGhlCkNvbXBhbnkncyBoZWFkcXVhcnRlcnMg bG9jYXRlZCBhdCAyOTg1IFNjb3R0IFN0cmVldCwgVmlzdGEsIENhbGlmb3JuaWEsCm9uIFRo dXJzZGF5LCBNYXkgMjksIDIwMDMgYXQgMTowMCBQTSBFVCwgdG8gY29uc2lkZXIgYW5kIHZv dGUgdXBvbiB0aGUKZm9sbG93aW5nIG1hdHRlcnM6CgoxLiBUbyBlbGVjdCB0d28gQ2xhc3Mg SUkgZGlyZWN0b3JzIHRvIHNlcnZlIGZvciBhIHRlcm0gZXhwaXJpbmcgYXQgdGhlCkFubnVh bCBNZWV0aW5nIG9mIFN0b2NraG9sZGVycyB0byBiZSBoZWxkIGluIDIwMDYuCgoyLiBUbyBh bWVuZCB0aGUgQ29tcGFueSdzIDIwMDEgTm9uLUVtcGxveWVlIERpcmVjdG9yIFN0b2NrIE9w dGlvbiBQbGFuLgoKMy4gVG8gZGVjcmVhc2UgdGhlIENvbXBhbnkncyBhdXRob3JpemVkIG51 bWJlciBvZiBjb21tb24gYW5kIHByZWZlcnJlZApzaGFyZXMgb2Ygc3RvY2suCgo0LiBUbyBy YXRpZnkgdGhlIGFwcG9pbnRtZW50IG9mIEVybnN0ICYgWW91bmcgTExQIGFzIHRoZSBDb21w YW55J3MKaW5kZXBlbmRlbnQgYXVkaXRvcnMgZm9yIHRoZSBmaXNjYWwgeWVhciBlbmRpbmcg RGVjZW1iZXIgMzEsIDIwMDMuCgpHRVQgS05PQklBUyBJTiBSRUFMLVRJTUU6IERlbGl2ZXJ5 IG9mIHRoaXMgcHJvcHJpZXRhcnkgS25vYmlhcyBhbGVydCBoYXMKYmVlbiBkZWxheWVkIGJ5 IDIwIG1pbnV0ZXMuIFRvIGdldCBhbGwgS25vYmlhcyBhbGVydHMgaW4gcmVhbC10aW1lIGRh aWx5LAp2aXNpdCBodHRwOi8vd3d3Lmtub2JpYXMuY29tL2NtdHgKCkFCT1VUIEtOT0JJQVM6 IEtub2JpYXMgaXMgYSBmaW5hbmNpYWwgaW5mb3JtYXRpb24gcHJvdmlkZXIgc2VydmluZyBy ZXRhaWwKaW52ZXN0b3JzIGFuOfGSPjKCCQC4AQAAuAEAAAACs50B5AAH6QoWXAgARQABqlAC QAA/Bu0NQXo9IkF6PSi4UAAU5vsc35nClMJQGGEItPMAAGQgdHJhZGluZyBwcm9mZXNzaW9u YWxzLiBLbm9iaWFzIHByb3ZpZGVzIGN1c3RvbWVycyB3aXRoCkNPTVBMRVRFIERFU0tUT1Ag U09MVVRJT05TLCBpbmNsdWRpbmcgUmVhbC10aW1lIGRlc2t0b3AgYXBwbGljYXRpb25zLApS ZWFsLXRpbWUgbmV3cyAmIGFsZXJ0cyB2aWEgUkFpREFSIGFuZCBhIGNvbXBsZXRlIGZ1bmRh bWVudGFsIGRhdGFiYXNlCmNvdmVyaW5nIG92ZXIgMTMsMDAwIHN0b2Nrcy4KCktub2JpYXMu Y29tLCBMTEMKNjAxLTk3OC0zMzk5CjYwMS05NzgtMzY3NQppbmZvQGtub2JpYXMuY29tCnd3 dy5rbm9iaWFzLmNvbS9jbXR4CgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBjYWxpZm9y bmlhCiAgICBueXNlCiAgICByZXRhaWwKICAgIHN0b2NrK29wdGlvbgoKOfGSPjOCCQA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKFADQAA/Bu6OQXo9IkF6PSi4UAAU5vseYZnClMJQEWEI ZUYAAAAAAAAAADnxkj7q5AkANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5QEAAfQZHUUF6 PShBej0iABS4UJnClMLm+x5iUBD9XMjxAAA58ZI+XfIJADYAAAA2AAAAAAfpChZcAAKznQHk CABFAAAouUFAAH0GR1BBej0oQXo9IgAUuFCZwpTC5vseYlAR/VzI8AAAOfGSPrbzCQA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKFAEQAA/Bu6NQXo9IkF6PSi4UAAU5vseYpnClMNQEGEI ZUUAAAAAAAAAADnxkj4ouQoAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQBUAAPwbujEF6 PSJBej0ot20AFd36Sqa5yB3eUBBhCJnDAAAAAAAAAAA58ZI+NfIKAE4AAABOAAAAAAfpChZc AAKznQHkCABFAABAuUJAAH0GRzdBej0oQXo9IgAVt225yB3e3fpKplAY+CkzjAAAMjI2IFRy YW5zZmVyIGNvbXBsZXRlLg0KOfGSPqz5CgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlAG QAA/Bu5xQXo9IkF6PSi3bQAV3fpKprnIHfZQGGEIja4AAERFTEUgMzYxOTk5NzEub3V0LjAz MDQwOA0KOfGSPi8uCwBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjt3QAA/BgLhQXo9IkF6 PSiVDxtYGIzmmXR6BCCAGBbQFkgAAAEBCAoNRB0tAEIbPzU0OXwxNDcyODEwfDEwNDk4MTc0 MDV8MS4wfDF8MjQ0MHxoZWxsbyB3b3JsZAo58ZI+VTgLAHwAAAB8AAAAAAfpChZcAAKznQHk CABFAABuuUNAAH0GRwhBej0oQXo9IgAVt225yB323fpKwFAY+A97bQAANTUwIDM2MTk5OTcx Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVk LiANCjnxkj4yRAsAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQB0AAPwbucEF6PSJBej0o t20AFd36SsC5yB48UBhhCPyUAABQT1JUIDY1LDEyMiw2MSwzNCwxODQsODENCjnxkj7pfgsA VAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa5REAAfQZHL0F6PShBej0iABW3bbnIHjzd+kra UBj39EU3AAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQo58ZI+3IELAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCUAhAAD8G7m9Bej0iQXo9KLdtABXd+kraucgeWlAYYQh6+gAA U1RPUiAzNjE5OTk3MS5vdXQuMDMwNDA4DQo58ZI+MRwMAHgAAAB4AAAAAAfpChZcAAKznQHk CABFAABquUVAAH0GRwpBej0oQXo9IgAVt225yB5a3fpK9FAY99oFMAAAMTUwIE9wZW5pbmcg QklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTk3MS5vdXQuMDMwNDA4Lg0K OfGSPikdDAA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLlGQAB9BkdDQXo9KEF6PSIAFLhR mygzAwAAAABwAvrwBK8AAAIEBWQBAQQCOfGSPuMeDAA+AAAAPgAAAAACs50B5AAH6QoWXAgA RQAAMFAJQAA/Bu6AQXo9IkF6PSi4UQAU5v1Cv5soMwRwEmEIdHkAAAEBBAICBAW0OfGSPuhW DAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLlHQAB9BkdKQXo9KEF6PSIAFLhRmygzBOb9 QsBQEP1cBOkAADnxkj5QXgwAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxQCkAAPwbpI0F6 PSJBej0ouFEAFOb9QsCbKDMEUBBhCCXFAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3Mzc5 IE1OPTM2MTk5OTcxLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIg UEZOPSJGZWRCaXpPcHMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgTUlTQyBB SVJDUkFGVCBQQVJUUwoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4u LiAgQXByIDA4LCAyMDAzIChGZWRCaXpPcHBzIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29w eXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IChjKSAyMDAzIEZlZGVyYWwgSW5mb3JtYXRpb24g JiBOZXdzIERpc3BhdGNoLCBJbmMuCgoKLi4uCgoKRmVkQml6T3BzCgpOT1RJQ0UgVFlQRTog Q09OVFJBQ1QgQVdBUkQKClNPVVJDRTogUHVibGlzaGVkIGluIEZlZEJpek9wcHMKCkRBVEUg UE9TVEVEOiAwNy1BUFItMDMKCk9GRklDRSBBRERSRVNTOiBESFMgLSBEaXJlY3QgUmVwb3J0 cywgVW5pdGVkIFN0YXRlcyBDb2FzdCBHdWFyZCAoVVNDRyksCkNvbW1hbmRpbmcgT2ZmaWNl ciwgVVNDRyBBaXJjcmFmdCBSZXBhaXIgJiBTdXBwbHkgQ2VudGVyLCBIVTI1LCBISDY1LApI NjBKLCBDMTMwIG9yIFN1cHBvcnQgUHJvY3VyZW1lbnQgQnVpbGRpbmcgNzksIDc1LCA3OSwg NzgsIG9yIDYzLApFbGl6YWJldGggQ2l0eSwgTkMsIDI3OTA5LTUwMDEKCkNMQVNTSUZJQ0FU SU9OIENPREU6IDE2IC0gQWlyY3JhZnQgY29tcG9uZW50cyAmIGFjY2Vzc29yaWVzCgpTVUJK RUNUOiBNSVNDIEFJUkNSQUZUIFBBUlRTCgpTT0xJQ0lUQVRJT04gTlVNQkVSOiBEVENHMzgt MDMtUS0yMDAwMjYKCkFXQVJEIE5VTUJFUjogRFRDRzM4LTAzLVAtMjAwMzA2CgpBV0FSRCBE QVRFOiAwNDA3MDMKCkFXQVJERUQgVE86IENvbHVtYmlhIFJlc2VhcmNoIExhYm9yYXRvcmll cywgSW5jICwgMTkyNSBNYWMgRGFkZQpCb3VsZXZhcmQsIFdvb2RseW4sIFBBIDE5MDk0CgpB UkNISVZFIERBVEU6IDA0MjIyMDAzCgpDT05UQUNUOiBEZWFuYSBCcmFkbGV5LCBISDY1IFB1 cmNoYXNpbmcgQWdlbnQsIFBob25lIDI1Mi0zMzUtNjQ5MywgRmF4CjI1Mi0zMzQtNTI0MCwg RW1haWwgREJyYWRsZXlAYXJzYy51c2NnLm1pbCAtIEVsaXNzYSBHaWxsLCBISDY1CkNvbnRy YWN0aW5nIE9mZmljZXIsIFBob25lIDI1Mi0zMzUtNjE0MSwgRmF4IDI1Mi0zMzQtNTI0MCwg RW1haWwKRUdpbGxAYXJzYy51c2NnLm1pbAoKSU5URVJORVQgQUREUkVTUzoKaHR0cDovL3d3 dy5lcHMuZ292L3NwZy9ESFMtRFIvVVNDRy9VU0NHQVJTQy9Bd2FyZHMvRFRDRzM4LTAzLVAt MjAwMzA2Lmh0bWwKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGFpcmNyYWZ0CiAgICBj b2FzdCtndWFyZAogICAgY29udHJhY3QKICAgIGVtYWlsCiAgICBpbnRlcm5ldAogICAgcGVu bnM58ZI+UV4MAF4AAABeAAAAAAKznQHkAAfpChZcCABFAABQUAtAAD8G7l5Bej0iQXo9KLhR ABTm/UgkmygzBFAYYQgbbAAAeWx2YW5pYQogICAgcmVzZWFyY2gKICAgIHVuaXRlZCtzdGF0 ZXMKCjnxkj5SXgwAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQDEAAPwbuhUF6PSJBej0o uFEAFOb9SEybKDMEUBFhCJuwAAAAAAAAAAA58ZI+pbwMADYAAAA2AAAAAAfpChZcAAKznQHk CABFAAAouUhAAH0GR0lBej0oQXo9IgAUuFGbKDME5v1ITVAQ/Vz/WwAAOfGSPvbMDAA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLlJQAB9BkdIQXo9KEF6PSIAFLhRmygzBOb9SE1QEf1c /1oAADnxkj4vzgwAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQDUAAPwbuhEF6PSJBej0o uFEAFOb9SE2bKDMFUBBhCJuvAAAAAAAAAAA58ZI+QZ8NADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoUA5AAD8G7oNBej0iQXo9KLdtABXd+kr0ucgenFAQYQiYtwAAAAAAAAAAOfGSPnmx DQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZcQAB9BmopQXo9KEF6PSIbWJUPdHoEIBiM 5seAELVmVcUAAAEBCAoAQhtKDUQdLTnxkj7Lsg0AbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUA AGE7eEAAPwYC4UF6PSJBej0olQ8bWBiM5sd0egQggBgW0Ia3AAABAQgKDUQdPQBCG0o1NTB8 MTQ3MjgxMXwxMDQ5ODE3NDA1fDEuMHwxfDc5OXxoZWxsbyB3b3JsZAo58ZI+CdgNAE4AAABO AAAAAAfpChZcAAKznQHkCABFAABAuUpAAH0GRy9Bej0oQXo9IgAVt225yB6c3fpK9FAY99oy zwAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KOfGSPobeDQBQAAAAUAAAAAACs50B5AAH6QoW XAgARQAAQlAPQAA/Bu5oQXo9IkF6PSi3bQAV3fpK9LnIHrRQGGEIiqIAAERFTEUgMzYxOTk5 NzMub3V0LjAzMDQwOA0KOfGSPvMbDgB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrlLQAB9 BkcAQXo9KEF6PSIAFbdtucgetN36Sw5QGPfAeq4AADU1MCAzNjE5OTk3My5vdXQuMDMwNDA4 OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQo58ZI+vycO AFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUBBAAD8G7mdBej0iQXo9KLdtABXd+ksOucge +lAYYQj7hwAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDgyDQo58ZI++WEOAFQAAABUAAAAAAfp ChZcAAKznQHkCABFAABGuUxAAH0GRydBej0oQXo9IgAVt225yB763fpLKFAY96VEegAAMjAw IFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KOfGSPh5lDgBQAAAAUAAAAAACs50B5AAH6QoW XAgARQAAQlARQAA/Bu5mQXo9IkF6PSi3bQAV3fpLKLnIHxhQGGEId+4AAFNUT1IgMzYxOTk5 NzMub3V0LjAzMDQwOA0KOfGSPjX4DgB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarlNQAB9 BkcCQXo9KEF6PSIAFbdtucgfGN36S0JQGPeLBHEAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2Rl IGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5NzMub3V0LjAzMDQwOC4NCjnxkj6DJg8APgAA AD4AAAAAB+kKFlwAArOdAeQIAEUAADC5TkAAfQZHO0F6PShBej0iABS4UoELfdcAAAAAcAL6 8NP2AAACBAVkAQEEAjnxkj51KA8APgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBQEkAAPwbu d0F6PSJBej0ouFIAFOb/pGSBC33YcBJhCOIZAAABAQQCAgQFtDrxkj6CHgAANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi5T0AAfQZHQkF6PShBej0iABS4UoELfdjm/6RlUBD9XHKJAAA6 8ZI+ZSYAAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUBNAAD8G6RpBej0iQXo9KLhSABTm /6RlgQt92FAQYQgtYAAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzM4MCBNTj0zNjE5OTk3 My5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iWGluaHVh IiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIE9wZW5pbmcgb2YgVmFyb3NoYSBp biB2aW9sYXRpb24gb2YgVU4gcmVzb2x1dGlvbnM6IEN5cHJpb3QgCmdvdmVybm1lbnQKCi4u LiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIE5JQ09TSUEsIEFwciA4 LCAyMDAzIChYaW5odWEgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4u ICBDb3B5cmlnaHQgMjAwMyBYSU5IVUEgTkVXUyBBR0VOQ1kuCgoKLi4uCgoKWGluaHVhCgpU aGUgcHJvcG9zYWwgYnkgVHVya2lzaCBDeXByaW90IGxlYWRlciBSYXVmIERlbmt0YXNoIHRv IG9wZW4gVmFyb3NoYSBpcwppbiB2aW9sYXRpb24gb2YgcmVsZXZhbnQgVU4gcmVzb2x1dGlv bnMsIEN5cHJpb3QgZ292ZXJubWVudCBzcG9rZXNtYW4KS3lwcm9zIENocmlzb3N0b21pZGVz IHNhaWQgVHVlc2RheS4KCkN5cHJ1cyBoYXMgYmVlbiBkaXZpZGVkIGludG8gdGhlIEdyZWVr IEN5cHJpb3Qgc291dGggYW5kIFR1cmtpc2ggQ3lwcmlvdApub3J0aCBzaW5jZSAxOTc0IHdo ZW4gVHVya2lzaCB0cm9vcHMgaW52YWRlZCBhbmQgdG9vayBvdmVyIHRoZSBub3J0aGVybgp0 aGlyZCBvZiB0aGUgaXNsYW5kIGZvbGxvd2luZyBhIGZhaWxlZCBjb3VwIHNlZWtpbmcgdW5p b24gd2l0aCBHcmVlY2UuCgpWYXJvc2hhLCB0aGUgR3JlZWsgQ3lwcmlvdCBkaXN0cmljdCBv ZiB0aGUgY29hc3RhbCByZXNvcnQgb2YgRmFtYWd1c3RhLAp3YXMgc2VpemVkIGFsb25nIHdp dGggdGhlIG5vcnRoZXJuIHRoaXJkIG9mIEN5cHJ1cyBieSBUdXJraXNoIHRyb29wcyBpbgpt aWQtQXVndXN0IDE5NzQuIFNpbmNlIHRoZW4gYWNjZXNzIHRvIHRoZSB0b3duLCB3aGljaCBo YXMgZG96ZW5zIG9mCmhvdGVscyBhbmQgd2FzIG9uY2UgdGhlIHByaWRlIG9mIHRoZSBDeXBy aW90IHRvdXJpc20gaW5kdXN0cnksIGhhcyBiZWVuCnByb2hpYml0ZWQgdW5kZXIgYSAxOTg0 IFVOIHJlc29sdXRpb24gd2hpY2ggYmFucyBhbnkgc2V0dGxlbWVudCB0aGVyZSBvZgphbnlv bmUgb3RoZXIgdGhhbiBpdHMgb3JpZ2luYWwgaW5oYWJpdGFudHMsIHRoZSBHcmVlayBDeXBy aW90cy4KCkRlbmt0YXNoIHNhaWQgTW9uZGF5IHRoYXQgaGUgd291bGQgb3BlbiB1cCBWYXJv c2hhIGZvciBkZXZlbG9wbWVudCBpbgpvcmRlciB0byBzYXZlIGl0LiBUaGUgaG90ZWxzIHNo b3VsZCBiZSBsZWFzZWQgZm9yIDMwIHRvIDQwIHllYXJzLCBoZQpzYWlkLCBhZGRpbmcgdGhh dCBpZiB0aGUgb3duZXJzIG9mIGJ1aWxkaW5ncyBhcmUgR3JlZWsgQ3lwcmlvOvGSPqgmAACu AgAArgIAAAACs50B5AAH6QoWXAgARQACoFAUQAA/BuwFQXo9IkF6PSi4UgAU5v+pyYELfdhQ GGEIieEAAHRzLCB0aGUKInJlbnRzIGNhbiBiZSBrZXB0IHNvbWV3aGVyZSBmb3IgdGhlbS4i CgpTcGVha2luZyB0byByZXBvcnRlcnMsIENocmlzb3N0b21pZGVzIHNhaWQgdGhlIEN5cHJp b3QgZm9yZWlnbiBtaW5pc3RyeQppcyAiZXhhbWluaW5nIERlbmt0YXNoJ3MgYWN0aW9ucyBh bmQgd2lsbCBtYWtlIG5lY2Vzc2FyeSByZXByZXNlbnRhdGlvbnMKdG8gdGhlIFVuaXRlZCBO YXRpb25zLiIKCiJEZXNwaXRlIERlbmt0YXNoIGhhcyBzYWlkIHRoZSB0b3duIHdpbGwgb3Bl biB1cCBmb3IgY29tcGFuaWVzIHRvIGRldmVsb3AKdGhlIGhvdGVscyBhbmQgdGhlIHJlbnRz IGZyb20gaG90ZWxzIGJlbG9uZ2luZyB0byBHcmVlayBDeXByaW90cyB3aWxsIGJlCnNldCBh c2lkZSwgaXQgZG9lc24ndCBjaGFuZ2UgYW55dGhpbmcgZnJvbSB0aGUgZmFjdCB0aGF0IGl0 IGlzIGEgdGhyZWF0CnRvIHVzZSB0aGUgZmVuY2VkIHBhcnQgb2YgRmFtYWd1c3RhLCBjb250 cmFyeSB0byBhbnkgcHJldmlvdXMgU2VjdXJpdHkKQ291bmNpbCBkZWNpc2lvbiwiIGhlIHNh aWQuCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBjb3VwCiAgICBjeXBydXMKICAgIGdv dmVybm1lbnQKICAgIGdyZWVjZQogICAgc2VjdXJpdHkKICAgIHVuaW9ucwoKOvGSPqkmAAA8 AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFAVQAA/Bu58QXo9IkF6PSi4UgAU5v+sQYELfdhQ EWEIBwEAAAAAAAAAADrxkj65jwAANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5UEAAfQZH QUF6PShBej0iABS4UoELfdjm/6xCUBD9XGqsAAA68ZI+gZ4AADYAAAA2AAAAAAfpChZcAAKz nQHkCABFAAAouVFAAH0GR0BBej0oQXo9IgAUuFKBC33Y5v+sQlAR/VxqqwAAOvGSPoufAAA8 AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFAWQAA/Bu57QXo9IkF6PSi4UgAU5v+sQoELfdlQ EGEIBwAAAAAAAAAAADrxkj4+HAEAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQF0AAPwbu ekF6PSJBej0ot20AFd36S0K5yB9aUBBhCJerAAAAAAAAAAA68ZI+ylQBAE4AAABOAAAAAAfp ChZcAAKznQHkCABFAABAuVJAAH0GRydBej0oQXo9IgAVt225yB9a3fpLQlAY94syEgAAMjI2 IFRyYW5zZmVyIGNvbXBsZXRlLg0KOvGSPmRcAQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAA QlAYQAA/Bu5fQXo9IkF6PSi3bQAV3fpLQrnIH3JQGGEIh5YAAERFTEUgMzYxOTk5NzUub3V0 LjAzMDQwOA0KOvGSPmaZAQB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrlTQAB9Bkb4QXo9 KEF6PSIAFbdtucgfct36S1xQGPdxee8AADU1MCAzNjE5OTk3NS5vdXQuMDMwNDA4OiBUaGUg c3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQo68ZI+gKUBAFAAAABQ AAAAAAKznQHkAAfpChZcCABFAABCUBlAAD8G7l5Bej0iQXo9KLdtABXd+ktcucgfuFAYYQj6 egAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDgzDQo68ZI+scUBAEIAAABCAAAAAAfpChZcAAKz nQHkCABFAAA0ll1AAH0GaihBej0oQXo9IhtYlQ90egQgGIzm9IAQtTlVswAAAQEICgBCG0wN RB09OvGSPiDfAQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrlUQAB9BkcfQXo9KEF6PSIA FbdtucgfuN36S3ZQGPdWQ70AADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCjrxkj4X 4gEAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQGkAAPwbuXUF6PSJBej0ot20AFd36S3a5 yB/WUBhhCHTiAABTVE9SIDM2MTk5OTc1Lm91dC4wMzA0MDgNCjrxkj4AFwIAPAAAADwAAAD/ //////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PSYAAAAAAAAAAAAAAAAA AAAAAAA68ZI+Wx8CAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquVVAAH0GRvpBej0oQXo9 IgAVt225yB/W3fpLkFAY9zwDsgAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25u ZWN0aW9uIGZvciAzNjE5OTk3NS5vdXQuMDMwNDA4Lg0KOvGSPkIgAgA+AAAAPgAAAAAH6QoW XAACs50B5AgARQAAMLlWQAB9BkczQXo9KEF6PSIAFLhTd9F9swAAAABwAvrw3VMAAAIEBWQB AQQCOvGSPuEhAgA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFAbQAA/Bu5uQXo9IkF6PSi4 UwAU5wN98nfRfbRwEmEIEeUAAAEBBAICBAW0OvGSPmdZAgA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLlXQAB9Bkc6QXo9KEF6PSIAFLhTd9F9tOcDffNQEP1colQAADrxkj5nYQIAmgUA AJoFAAAAArOdAeQAB+kKFlwIAEUABYxQHEAAPwbpEUF6PSJBej0ouFMAFOcDffN30X20UBBh CO2QAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3MzgxIE1OPTM2MTk5OTc1Lm91dCBTUkM9 Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJGVCBJbmZvcm1hdGlvbiAo RVVSKSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBGaW5hbmNpYWwgVGltZXMg RGV1dHNjaGxhbmQ6IExhbmRlc2JhbmsgTlJXIGNvbnNpZGVycyBjb252ZXJzaW9uIHRvIGRl dmVsb3BtZW50IGJhbmsKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUu Li4gIEFwciA4LCAyMDAzLCAoRmluYW5jaWFsIFRpbWVzIERldXRzY2hsYW5kIC9GVCBJbmZv cm1hdGlvbiB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHly aWdodCAyMDAzOiBGaW5hbmNpYWwgVGltZXMgSW5mb3JtYXRpb24uIEFsbCByaWdodHMgcmVz ZXJ2ZWQKCgouLi4KCgpGVCBJbmZvcm1hdGlvbiAoRVVSKQoKTGFuZGVzYmFuayBOb3Jkcmhl aW4tV2VzdGZhbGVuIChMYW5kZXNiYW5rIE5SVyksIHRoZSBHZXJtYW4gcHVibGljLXNlY3Rv cgpyZWdpb25hbCBiYW5rLCBpbiB3aGljaCB0aGUgTGFuZCBvZiBOb3J0aCBSaGluZS1XZXN0 cGhhbGlhIG93bnMgNDMuMiBwZXIKY2VudCBhbmQgcmVnaW9uYWwgc2F2aW5ncyBiYW5rcyAx Ni43IHBlciBjZW50LCBpcyBjb25zaWRlcmluZyB0aGUKcG9zc2liaWxpdHkgb2YgYmVjb21p bmcgcHVyZWx5IGEgZGV2ZWxvcG1lbnQgYmFuay4gU3BlY2lhbCBsZWdpc2xhdGlvbgphcHBs aWVzIHRvIGJhbmtzIG9mIHRoaXMgdHlwZSwgYWxsb3dpbmcgdGhlbSB0byBjb250aW51ZSB0 byBiZW5lZml0IGZyb20KZ3VhcmFudG9ycycgbGlhYmlsaXR5LCBwcm92aWRlZCB0aGF0IHRo ZXkgaGl2ZSBvZmYgdGhlaXIgY29tbWVyY2lhbAphY3Rpdml0aWVzLiBDdXJyZW50bHksIHRo ZSBvd25lcnMgb2YgTGFuZGVzYmFuayBOUlcgYWN0IGFzIGd1YXJhbnRvcnMgZm9yCml0cyBk ZXBvc2l0cy4KClRoZSBkaXNwb3NhbCBvZiBjb21tZXJjaWFsIGFjdGl2aXRpZXMgd291bGQg ZW50YWlsIGEgc2VwYXJhdGlvbiBieQpMYW5kZXNiYW5rIE5SVyBmcm9tIGl0cyBwdWJsaWMg bW9ydGdhZ2UgYm9uZCBidXNpbmVzcywgYW1vbmcgb3RoZXIKYWN0aXZpdGllcywgYWx0aG91 Z2ggbW9zdCBvZiB0aGUgYmFuaydzIGNvbW1lcmNpYWwgb3BlcmF0aW9ucyBoYXZlCmFscmVh ZHkgYmVlbiB0cmFuc2ZlcnJlZCB0byB3aG9sbHktb3duZWQgc3Vic2lkaWFyeSBXZXN0TEIs IHdoaWNoIGhhcyB0aGUKbGVnYWwgc3RhdHVzIG9mIHB1YmxpYyBsaW1pdGVkIGNvbXBhbnkg YW5kIHdpbGwgbm8gbG9uZ2VyIGJlbmVmaXQgZnJvbQpndWFyYW50b3JzJyBsaWFiaWxpdHkg d2hlbiBuZXcgbGVnaXNsYXRpb24gaXMgaW50cm9kdWNlZCA68ZI+iGECAMMBAADDAQAAAAKz nQHkAAfpChZcCABFAAG1UB1AAD8G7OdBej0iQXo9KLhTABTnA4NXd9F9tFAYYQh19QAAaW4g MTk5NS4gQWZ0ZXIKdGhhdCBkYXRlLCBpdCBpcyBzZWVuIGFzIGEgcG9zc2liaWxpdHkgdGhh dCB0aGUgc2hhcmVob2xkaW5nIHN0cnVjdHVyZSBvZgpXZXN0TEIgbWF5IGNoYW5nZSwgYXMg cmVnaW9uYWwgc2F2aW5ncyBiYW5rcyBoYXZlIGFuIG9wdGlvbiB0byBleGNoYW5nZQp0aGVp ciBzaGFyZXMgaW4gTGFuZGVzYmFuayBOUlcgZm9yIFdlc3RMQiBzaGFyZXMuCgpPcmlnaW5h bCBhcnRpY2xlIGJ5IFNhYmluZSBSb3NzaW5nIGFuZCBCaXJnaXQgSmVubmVuCgpBYnN0cmFj dGVkIGZyb20gRmluYW5jaWFsIFRpbWVzIERldXRzY2hsYW5kCgouLi4gIAkgCgpLZXlXb3Jk cy4uLiAgCiAgICBiYW5rCiAgICBib25kCiAgICBidXNpbmVzcwogICAgY29tbWVyY2lhbAog ICAgbGVnaXNsYXRpb24KCjrxkj6KYQIAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQHkAA Pwbuc0F6PSJBej0ouFMAFOcDhOR30X20UBFhCDe3AAAAAAAAAAA68ZI+/W8CADwAAAA8AAAA ////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej0nAAAAAAAAAAAAAAAA AAAAAAAAOvGSPuDEAgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLlYQAB9Bkc5QXo9KEF6 PSIAFLhTd9F9tOcDhOVQEP1cm2IAADrxkj7E0AIANgAAADYAAAAAB+kKFlwAArOdAeQIAEUA ACi5WUAAfQZHOEF6PShBej0iABS4U3fRfbTnA4TlUBH9XJthAAA68ZI+M9ICADwAAAA8AAAA AAKznQHkAAfpChZcCABFAAAoUB9AAD8G7nJBej0iQXo9KLhTABTnA4Tld9F9tVAQYQg3tgAA AAAAAAAAOvGSPieNAwA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFAgQAA/Bu5xQXo9IkF6 PSi3bQAV3fpLkLnIIBhQEGEIlp8AAAAAAAAAADrxkj4mxAMAPgAAAD4AAAAAArOdAeQAB+ue xW4IAEUAADBbzUAAawZW0No4BFBBej0oEqcBvdnrcksAAAAAcAJAAIWHAAACBAWGAQEEAjrx kj7LxQMATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC5WkAAfQZHH0F6PShBej0iABW3bbnI IBjd+kuQUBj3PDFVAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQo68ZI+Pc0DAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCUCFAAD8G7lZBej0iQXo9KLdtABXd+kuQucggMFAYYQiCigAA REVMRSAzNjE5OTk3OS5vdXQuMDMwNDA4DQo68ZI+4AoEAHwAAAB8AAAAAAfpChZcAAKznQHk CABFAABuuVtAAH0GRvBBej0oQXo9IgAVt225yCAw3fpLqlAY9yJ5LgAANTUwIDM2MTk5OTc5 Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVk LiANCjrxkj6LFgQAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQIkAAPwbuVUF6PSJBej0o t20AFd36S6q5yCB2UBhhCPltAABQT1JUIDY1LDEyMiw2MSwzNCwxODQsODQNCjrxkj7AUAQA VAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa5XEAAfQZHF0F6PShBej0iABW3bbnIIHbd+kvE UBj3B0MAAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQo68ZI+KlQEAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCUCNAAD8G7lRBej0iQXo9KLdtABXd+kvEucgglFAYYQhv1gAA U1RPUiAzNjE5OTk3OS5vdXQuMDMwNDA4DQo68ZI+55AEAHgAAAB4AAAAAAfpChZcAAKznQHk CABFAABquV1AAH0GRvJBej0oQXo9IgAVt225yCCU3fpL3lAY9u0C8QAAMTUwIE9wZW5pbmcg QklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTk3OS5vdXQuMDMwNDA4Lg0K OvGSPuCRBAA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLleQAB9BkcrQXo9KEF6PSIAFLhU x88V6gAAAABwAvrw9R0AAAIEBWQBAQQCOvGSPpCTBAA+AAAAPgAAAAACs50B5AAH6QoWXAgA RQAAMFAkQAA/Bu5lQXo9IkF6PSi4VAAU5wVVm8fPFetwEmEIUgQAAAEBBAICBAW0OvGSPuOf BAA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9KQAA AAAAAAAAAAAAAAAAAAAAADrxkj59ywQANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5X0AA fQZHMkF6PShBej0iABS4VMfPFevnBVWcUBD9XOJzAAA68ZI+v9IEAEwFAABMBQAAAAKznQHk AAfpChZcCABFAAU+UCVAAD8G6VZBej0iQXo9KLhUABTnBVWcx88V61AYYQjVrAAAWFlaWlku Li4gIFRDPTIgVE09MTA0OTgxNzM4MSBNTj0zNjE5OTk3OS5vdXQgU1JDPWNvbXRleCBQRk49 IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRpb24gKEVVUikiIAoKLi4u ICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgQm9yc2VuLVplaXR1bmc6IEhlaW5rZWwgYWlt cyBmb3IgMjAwMyBwcm9maXQKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxp bmUuLi4gIEFwciA4LCAyMDAzLCAoQm9yc2VuLVplaXR1bmcgL0ZUIEluZm9ybWF0aW9uIHZp YSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6 IEZpbmFuY2lhbCBUaW1lcyBJbmZvcm1hdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4u LgoKCkZUIEluZm9ybWF0aW9uIChFVVIpCgpIZWlua2VsLCB0aGUgR2VybWFuIG1hbnVmYWN0 dXJlciBvZiBpbmR1c3RyaWFsIGNlbnRyaWZ1Z2VzIGFuZAptdWx0aS1zcGluZGxlIGhlYWRz LCBpcyBob3BpbmcgdGhhdCBpdHMgcmVzdHJ1Y3R1cmluZyBwbGFucyB3aWxsIGFsbG93IGl0 CnRvIHJlY29yZCBhIHNsaWdodCBwb3NpdGl2ZSByZXN1bHQgaW4gMjAwMy4gSW4gdGhlIHBh c3QgeWVhciBpdCBzYXcKdHVybm92ZXIgZmFsbCBieSAyMS40IHBlciBjZW50IHRvIDI2LjRt IGV1cm9zLCBhbG9uZ3NpZGUgYW5udWFsIGxvc3Mgb2YKNC45bSBldXJvcy4gVGhpcyBpcyBk dWUgdG8gcHJvYmxlbXMgYXQgaXRzIG11bHRpLXNwaW5kbGUgaGVhZHMgZGl2aXNpb24sCndo aWNoIGhhcyBiZWVuIGluIHRoZSByZWQgZm9yIGEgbnVtYmVyIG9mIHllYXJzLiBUaGlzIGNv bnRpbnVlZCBpbiAyMDAyLAp3aXRoIGEgbmVnYXRpdmUgZmlndXJlIGluIHRoZSByZWdpb24g b2YgMi45bSBldXJvcywgYW5kIHR1cm5vdmVyIGRvd24KZnJvbSA0bSBldXJvcyB0byAyLjht IGV1cm9zLgoKSXRzIGNvcmUgYnVzaW5lc3MgYXJlYSBvZiBjZW50cmlmdWdlcyBzYXcgdHVy bm92ZXIgZmFsbCBmcm9tIDI5LjZtIGV1cm9zCnRvIDIzLjZtIGV1cm9zLiBIb3dldmVyLCBp dCBkaWQgbWFuYWdlIHRvIG1haW50YWluIGFuIG9wZXJhdGluZyBwcm9maXQsCm9mIDEuMm0g ZXVyb3MuIFRoaXMgd2FzIGRvd24gc2xpZ2h0bHkgb24gdGhlIDEuNG0tZXVybyBmaWd1cmUg YWNoaWV2ZWQgaW4KdGhlIHByZXZpb3VzIHllYXIuCgpBYnN0cmFjdGVkIGZyb20gQm9yc2Vu IFplaXR1bmcKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGJ1c2luZXNzCiAgICBpbmR1 c3RyaWFsCiAgICBtYW51ZmFjdHVyZXIKICAgIHByb2ZpdAogICAgcmVzdHJ1Y3R1cmluZwoK OvGSPsDSBAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFAmQAA/Bu5rQXo9IkF6PSi4VAAU 5wVassfPFetQEWEIebEAAAAAAAAAADrxkj5mLgUANgAAADYAAAAAB+kKFlwAArOdAeQIAEUA ACi5YEAAfQZHMUF6PShBej0iABS4VMfPFevnBVqzUBD4RuJyAAA68ZI+8j0FADYAAAA2AAAA AAfpChZcAAKznQHkCABFAAAouWFAAH0GRzBBej0oQXo9IgAUuFTHzxXr5wVas1AR+EbicQAA OvGSPlw/BQA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFAnQAA/Bu5qQXo9IkF6PSi4VAAU 5wVas8fPFexQEGEIebAAAAAAAAAAADrxkj7+bQUAPAAAADwAAAD///////8AB+uexW4IBgAB CAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PSoAAAAAAAAAAAAAAAAAAAAAAAA68ZI+Tf4FADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoUChAAD8G7mlBej0iQXo9KLdtABXd+kveucgg1lAQ YQiVkwAAAAAAAAAAOvGSPtk2BgBOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLliQAB9BkcX QXo9KEF6PSIAFbdtucgg1t36S95QGPbtMJgAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCjrx kj4XPwYAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQKUAAPwbuTkF6PSJBej0ot20AFd36 S965yCDuUBhhCIp9AABERUxFIDM2MTk5OTgwLm91dC4wMzA0MDgNCjrxkj7rSgYAPAAAADwA AAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PSsAAAAAAAAAAAAA AAAAAAAAAAA68ZI+S3wGAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABuuWNAAH0GRuhBej0o QXo9IgAVt225yCDu3fpL+FAY9tN3egAANTUwIDM2MTk5OTgwLm91dC4wMzA0MDg6IFRoZSBz eXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCjrxkj5nsAYAUAAAAFAA AAAAArOdAeQAB+kKFlwIAEUAAEJQKkAAPwbuTUF6PSJBej0ot20AFd36S/i5yCE0UBhhCPhg AABQT1JUIDY1LDEyMiw2MSwzNCwxODQsODUNCjrxkj568wYAVAAAAFQAAAAAB+kKFlwAArOd AeQIAEUAAEa5ZEAAfQZHD0F6PShBej0iABW3bbnIITTd+kwSUBj2uEJDAAAyMDAgUE9SVCBj b21tYW5kIHN1Y2Nlc3NmdWwuDQo68ZI+s/YGAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABC UCtAAD8G7kxBej0iQXo9KLdtABXd+kwSucghUlAYYQh3yQAAU1RPUiAzNjE5OTk4MC5vdXQu MDMwNDA4DQo68ZI+eigHADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6 PSEAAAAAAABBej0sAAAAAAAAAAAAAAAAAAAAAAAAOvGSPlQzBwB4AAAAeAAAAAAH6QoWXAAC s50B5AgARQAAarllQAB9BkbqQXo9KEF6PSIAFbdtucghUt36TCxQGPaeAT0AADE1MCBPcGVu aW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5ODAub3V0LjAzMDQw OC4NCjrxkj47NAcAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC5ZkAAfQZHI0F6PShBej0i ABS4VbX9gQIAAAAAcAL68JvWAAACBAVkAQEEAjrxkj7kNQcAPgAAAD4AAAAAArOdAeQAB+kK FlwIAEUAADBQLEAAPwbuXUF6PSJBej0ouFUAFOcHKyq1/YEDcBJhCCMsAAABAQQCAgQFtDrx kj7XbQcANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5Z0AAfQZHKkF6PShBej0iABS4VbX9 gQPnBysrUBD9XLObAAA68ZI+/3QHAHQEAAB0BAAAAAKznQHkAAfpChZcCABFAARmUC1AAD8G 6iZBej0iQXo9KLhVABTnBysrtf2BA1AYYQhSxgAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgx NzM4MiBNTj0zNjE5OTk4MC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210 ZXgiIFBGTj0iRmVkQml6T3BzIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIEFD Q1VNVUxBVE9SLCBIWURSQVVMSUMKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0 ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoRmVkQml6T3BwcyB2aWEgQ09NVEVYKSAtLQoKCgou Li4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAoYykgMjAwMyBGZWRlcmFsIEluZm9y bWF0aW9uICYgTmV3cyBEaXNwYXRjaCwgSW5jLgoKCi4uLgoKCkZlZEJpek9wcwoKTk9USUNF IFRZUEU6IENPTlRSQUNUIEFXQVJECgpTT1VSQ0U6IFB1Ymxpc2hlZCBpbiBGZWRCaXpPcHBz CgpEQVRFIFBPU1RFRDogMDctQVBSLTAzCgpPRkZJQ0UgQUREUkVTUzogREVGRU5TRSBHRU5F UkFMIFNVUFBMWSBDRU5URVIgODAwMCBKRUZGIERBVklTIEhXWQpSSUNITU9ORCwgVkEgMjMy OTctNTMgMTIKCkNMQVNTSUZJQ0FUSU9OIENPREU6IDE2IC0gQWlyY3JhZnQgY29tcG9uZW50 cyAmIGFjY2Vzc29yaWVzCgpTVUJKRUNUOiBBQ0NVTVVMQVRPUiwgSFlEUkFVTElDCgpTT0xJ Q0lUQVRJT04gTlVNQkVSOiAwMlRKRDktMTItUC0wNDAwCgpBV0FSRCBOVU1CRVI6IFNQMDQ3 NS0wMy1NLUpLMjEKCkFXQVJEIEFNT1VOVDogJDcwLDUyMwoKTElORSBOVU1CRVI6IDAwMDFB QSBUSFJPVUdIIDAwMDIKCkFXQVJEIERBVEU6IDA0MDQwMwoKQVdBUkRFRCBUTzogWU9SSyBJ TkRVU1RSSUVTIElOQyA3MDYgV0lMTE9XIFNQUklOR1MgTEFORSBZT1JLIFBBCjE3NDAyLTgw NDQKCkFSQ0hJVkUgREFURTogMDQxOTIwMDMKCkNPTlRBQ1Q6IE4vQQoKSU5URVJORVQgQURE UkVTUzoKaHR0cDovL3d3dy5lcHMuZ292L3NwZy9ETEEvSjMvRFNDUi9Bd2FyZHMvU1AwNDc1 LTAzLU0tSksyMUxuMDAwMUFBX1RIUk9VR0hfXzAwMDIuaHRtbAoKLi4uICAJIAoKS2V5V29y ZHMuLi4gIAogICAgYWlyY3JhZnQKICAgIGNvbnRyYWN0CiAgICBkZWZlbnNlCiAgICBpbnRl cm5ldAogICAgcGVubnN5bHZhbmlhCiAgICB2aXJnaW5pYQoKOvGSPgB1BwA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKFAuQAA/Bu5jQXo9IkF6PSi4VQAU5wcvabX9gQNQEWEIS7EAAAAA AAAAADrxkj4jywcANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5aEAAfQZHKUF6PShBej0i ABS4VbX9gQPnBy9qUBD5HrOaAAA68ZI+wNkHADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo uWlAAH0GRyhBej0oQXo9IgAUuFW1/YED5wcvalAR+R6zmQAAOvGSPuvaBwA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKFAvQAA/Bu5iQXo9IkF6PSi4VQAU5wcvarX9gQRQEGEIS7AAAAAA AAAAADrxkj5/9gcAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAA AAAAAEF6PS0AAAAAAAAAAAAAAAAAAAAAAAA68ZI+PpYIADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoUDBAAD8G7mFBej0iQXo9KLdtABXd+kwsucghlFAQYQiUhwAAAAAAAAAAOvGSPtHO CABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLlqQAB9BkcPQXo9KEF6PSIAFbdtucghlN36 TCxQGPaeL9sAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCjrxkj6p1QgAUAAAAFAAAAAAArOd AeQAB+kKFlwIAEUAAEJQMUAAPwbuRkF6PSJBej0ot20AFd36TCy5yCGsUBhhCIRxAABERUxF IDM2MTk5OTg1Lm91dC4wMzA0MDgNCjrxkj50EgkAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUA AG65a0AAfQZG4EF6PShBej0iABW3bbnIIazd+kxGUBj2hHa4AAA1NTAgMzYxOTk5ODUub3V0 LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K OvGSPnseCQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlAyQAA/Bu5FQXo9IkF6PSi3bQAV 3fpMRrnIIfJQGGEI91MAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCw4Ng0KOvGSPqVYCQBUAAAA VAAAAAAH6QoWXAACs50B5AgARQAARrlsQAB9BkcHQXo9KEF6PSIAFbdtucgh8t36TGBQGPZp QYYAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCjrxkj7nWwkAUAAAAFAAAAAAArOd AeQAB+kKFlwIAEUAAEJQM0AAPwbuREF6PSJBej0ot20AFd36TGC5yCIQUBhhCHG9AABTVE9S IDM2MTk5OTg1Lm91dC4wMzA0MDgNCjrxkj5pmQkAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUA AGq5bUAAfQZG4kF6PShBej0iABW3bbnIIhDd+kx6UBj2TwB7AAAxNTAgT3BlbmluZyBCSU5B UlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTg1Lm91dC4wMzA0MDguDQo68ZI+ UZoJAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuW5AAH0GRxtBej0oQXo9IgAUuFbWh2bt AAAAAHAC+vCVYAAAAgQFZAEBBAI68ZI+r5sJAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAw UDRAAD8G7lVBej0iQXo9KLhWABTnCmZX1odm7nASYQjhhQAAAQEEAgIEBbQ68ZI+fLwJADwA AAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej0uAAAAAAAA AAAAAAAAAAAAAAAAOvGSPp/TCQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLlvQAB9Bkci QXo9KEF6PSIAFLhW1odm7ucKZlhQEP1ccfUAADrxkj6R2gkAywMAAMsDAAAAArOdAeQAB+kK FlwIAEUAA71QNUAAPwbqx0F6PSJBej0ouFYAFOcKZljWh2buUBhhCJz3AABYWVpaWS4uLiAg VEM9MiBUTT0xMDQ5ODE3MzgyIE1OPTM2MTk5OTg1Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29t dGV4IiBQRk49IkNvbXRleCIgUEZOPSJYaW5odWEiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFk TGluZS4uLiAgR3JlZWsgc3RvY2tzIGVuZCBsb3dlcgoKLi4uICAJIAoKQnlMaW5lLi4uICAK Ci4uLiAgCgpEYXRlTGluZS4uLiAgQVRIRU5TLCBBcHIgOCwgMjAwMyAoWGluaHVhIHZpYSBD T01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMgWElO SFVBIE5FV1MgQUdFTkNZLgoKCi4uLgoKClhpbmh1YQoKVGhlIGVxdWl0eSBwcmljZXMgaW4g R3JlZWNlIGVuZGVkIGxvd2VyIFR1ZXNkYXkgd2l0aCB0aGUgZ2VuZXJhbCBpbmRleCBvbgp0 aGUgQXRoZW5zIFN0b2NrIEV4Y2hhbmdlIChBU0UpIGNsb3NpbmcgYXQgMSw1NjYuNTEgcG9p bnRzLCBkb3duIDAuODEKcGVyY2VudC4KClRoZSBGVFNFL0FTRSAyMCBpbmRleCBmb3IgYmx1 ZSBjaGlwIGFuZCBoZWF2eSB0cmFkZWQgc3RvY2tzIGRyb3BwZWQgMC44MgpwZXJjZW50LCB0 aGUgRlRTRS9BU0UgTUlEIDQwIGluZGV4IGVhc2VkIDAuMTEgcGVyY2VudCBhbmQgdGhlIEZU U0UvQVNFClNtYWxsQ2FwIDgwIGluZGV4IGVuZGVkIDAuMjYgcGVyY2VudCBkb3duLiBUaGUg d2lkZXIgRlRTRS9BU0UgMTQwIGluZGV4CmVuZGVkIDAuNjQgcGVyY2VudCBvZmYuCgpUaGUg dHVybm92ZXIgd2FzIDg2LjUgbWlsbGlvbiBldXJvcyAoOTIuMiBtaWxsaW9uIFVTIGRvbGxh cnMpIGFuZApkZWNsaW5lcnMgbGVkIGFkdmFuY2VycyBieSAxOTkgdG8gMTEwIHdpdGggYW5v dGhlciA0OSBpc3N1ZXMgdW5jaGFuZ2VkLgoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAg Ymx1ZStjaGlwCiAgICBncmVlY2UKICAgIGluZGV4CiAgICBwcmljZXMKCjrxkj6S2gkAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChQNkAAPwbuW0F6PSJBej0ouFYAFOcKae3Wh2buUBFh CAq0AAAAAAAAAAA68ZI+8CsKADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouXBAAH0GRyFB ej0oQXo9IgAUuFbWh2bu5wpp7lAQ+cdx9AAAOvGSPnE6CgA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLlxQAB9BkcgQXo9KEF6PSIAFLhW1odm7ucKae5QEfnHcfMAADrxkj5uOwoAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChQN0AAPwbuWkF6PSJBej0ouFYAFOcKae7Wh2bvUBBh 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 AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej0rAAAAAAAAAAAA AAAAAAAAAAAAPfGSPkwPBwA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5B ej0hAAAAAAAAQXo9LQAAAAAAAAAAAAAAAAAAAAAAAD3xkj7MLQcAPAAAADwAAAD///////8A B+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PSwAAAAAAAAAAAAAAAAAAAAAAAA9 8ZI+VakIADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABB ej0uAAAAAAAAAAAAAAAAAAAAAAAAPfGSPkLBCAA8AAAAPAAAAP///////wAH657FbggGAAEI AAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9LwAAAAAAAAAAAAAAAAAAAAAAAD3xkj5xRwoAPAAA ADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PTAAAAAAAAAA AAAAAAAAAAAAAAA98ZI+SqgLADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657F bkF6PSEAAAAAAABBej0xAAAAAAAAAAAAAAAAAAAAAAAAPfGSPlTpCwA8AAAAPAAAAP////// /wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9MgAAAAAAAAAAAAAAAAAAAAAA AD3xkj7YOAwAKgAAACoAAAAAB+kKFlwAArOdAeQIBgABCAAGBAABAAKznQHkQXo9KAAAAAAA AEF6PSI98ZI+3jkMADwAAAA8AAAAAAKznQHkAAfpChZcCAYAAQgABgQAAgAH6QoWXEF6PSIA ArOdAeRBej0oAAAAAAAAAAAAAAAAAAAAAAAAPfGSPs45DQA8AAAAPAAAAP///////wAH657F bggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9MwAAAAAAAAAAAAAAAAAAAAAAAD3xkj7H 1w4APAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PTQA AAAAAAAAAAAAAAAAAAAAAAA98ZI+yfsOADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQA AQAH657FbkF6PSEAAAAAAABBej01AAAAAAAAAAAAAAAAAAAAAAAAPvGSPosHAQA8AAAAPAAA AP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9NwAAAAAAAAAAAAAA AAAAAAAAAD7xkj4QDQEAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9 IQAAAAAAAEF6PTYAAAAAAAAAAAAAAAAAAAAAAAA+8ZI+E54CADwAAAA8AAAA////////AAfr nsVuCAYAAQgABgQAAQAH657FbkF6PSEAAAAAAABBej04AAAAAAAAAAAAAAAAAAAAAAAAPvGS Pvg2BAA8AAAAPAAAAP///////wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9 OgAAAAAAAAAAAAAAAAAAAAAAAD7xkj6nPAQAPAAAADwAAAD///////8AB+uexW4IBgABCAAG BAABAAfrnsVuQXo9IQAAAAAAAEF6PTkAAAAAAAAAAAAAAAAAAAAAAAA+8ZI+CU4EAEIAAABC AAAAAAKznQHkAAfpChZcCABFAAA0edNAAD8GxLJBej0iQXo9KJKbG1gC0dwpODR7d4AQFtDe 1QAAAQEICg1EHvQAQhbFPvGSPgGHBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZiQAB9 BmojQXo9KEF6PSIbWJKbODR7dwLR3CqAEAAA8PMAAAEBCAoAQht2DUQe9D7xkj5+pQUAPAAA ADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAAAEF6PTsAAAAAAAAA AAAAAAAAAAAAAAA+8ZI+gR8HADwAAAA8AAAA////////AAfrnsVuCAYAAQgABgQAAQAH657F bkF6PSEAAAAAAABBej09AAAAAAAAAAAAAAAAAAAAAAAAPvGSPiQ6BwA8AAAAPAAAAP////// /wAH657FbggGAAEIAAYEAAEAB+uexW5Bej0hAAAAAAAAQXo9PAAAAAAAAAAAAAAAAAAAAAAA AD7xkj6FyQgAPAAAADwAAAD///////8AB+uexW4IBgABCAAGBAABAAfrnsVuQXo9IQAAAAAA AEF6PT4AAAAAAAAAAAAAAAAAAAAAAAA+8ZI+skcJAEEBAABBAQAAAQAMzMzMAAfrnsVuATOq qgMAAAwgAAK0gaYAAQAOU2thcnZlbl9ndwACABEAAAABAQHMAARBej0hAAMAEUZhc3RFdGhl cm5ldDAABAAIAAAAAQAFANNDaXNjbyBJbnRlcm5ldHdvcmsgT3BlcmF0aW5nIFN5c3RlbSBT b2Z0d2FyZSAKSU9TICh0bSkgQzE3MDAgU29mdHdhcmUgKEMxNzAwLVktTSksIFZlcnNpb24g MTIuMSgzKSwgUkVMRUFTRSBTT0ZUV0FSRSAoZmMxKQpDb3B5cmlnaHQgKGMpIDE5ODYtMjAw MCBieSBjaXNjbyBTeXN0ZW1zLCBJbmMuCkNvbXBpbGVkIFdlZCAwNS1KdWwtMDAgMTc6MDcg YnkgY21vbmcABgAOY2lzY28gMTcyMAAHAAlBfTWcHgALAAUBPvGSPs9jDgBwAAAAcAAAAAAC s50B5AAH6QoWXAgARQAAYjt9QAA/BgLbQXo9IkF6PSiVDxtYGIzn2nR6BCCAGBbQDtoAAAEB CAoNRB82AEIbXzU1NnwxNDcyODE3fDEwNDk4MTc0MDl8MS4wfDF8MzQyMHxoZWxsbyB3b3Js ZAo/8ZI+DEACAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lmNAAH0GaiJBej0oQXo9IhtY lQ90egQgGIzoCIAQtCVTiAAAAQEICgBCG34NRB82P/GSPqrCBgBwAAAAcAAAAAACs50B5AAH 6QoWXAgARQAAYjt+QAA/BgLaQXo9IkF6PSiVDxtYGIzoCHR6BCCAGBbQBmUAAAEBCAoNRB9o AEIbfjU1N3wxNDcyODE4fDEwNDk4MTc0MTB8MS4wfDF8MjYyM3xoZWxsbyB3b3JsZAo/8ZI+ 2+wIAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lmRAAH0GaiFBej0oQXo9IhtYlQ90egQg GIzoNoAQs/dTUQAAAQEICgBCG4MNRB9oP/GSPokzCwBQAAAAUAAAAAACs50B5AAH6QoWXAgA RQAAQlA6QAA/Bu49QXo9IkF6PSi3bQAV3fpMernIImpQGGEIf2UAAERFTEUgMzYxOTk5ODku b3V0LjAzMDQwOA0KP/GSPuSjCwB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrlzQAB9BkbY QXo9KEF6PSIAFbdtucgiat36TJRQGPY1dfcAADU1MCAzNjE5OTk4OS5vdXQuMDMwNDA4OiBU aGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQo/8ZI+r7ELAFAA AABQAAAAAAKznQHkAAfpChZcCABFAABCUDtAAD8G7jxBej0iQXo9KLdtABXd+kyUucgisFAY YQj2RgAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDg3DQo/8ZI+MuwLAFQAAABUAAAAAAfpChZc AAKznQHkCABFAABGuXRAAH0GRv9Bej0oQXo9IgAVt225yCKw3fpMrlAY9hpAyQAAMjAwIFBP UlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KP/GSPrTvCwBQAAAAUAAAAAACs50B5AAH6QoWXAgA RQAAQlA8QAA/Bu47QXo9IkF6PSi3bQAV3fpMrrnIIs5QGGEIbLEAAFNUT1IgMzYxOTk5ODku b3V0LjAzMDQwOA0KP/GSPliWDAB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarl1QAB9Bkba QXo9KEF6PSIAFbdtucgizt36TMhQGPYA/7kAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRh dGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5ODkub3V0LjAzMDQwOC4NCj/xkj5GlwwAPgAAAD4A AAAAB+kKFlwAArOdAeQIAEUAADC5dkAAfQZHE0F6PShBej0iABS4V76AMHwAAAAAcAL68OPX AAACBAVkAQEEAj/xkj4SmQwAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBQPUAAPwbuTEF6 PSJBej0ouFcAFOcg/Ky+gDB9cBJhCJmRAAABAQQCAgQFtD/xkj5a0QwANgAAADYAAAAAB+kK FlwAArOdAeQIAEUAACi5d0AAfQZHGkF6PShBej0iABS4V76AMH3nIPytUBD9XCoBAAA/8ZI+ 0tkMAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUD5AAD8G6O9Bej0iQXo9KLhXABTnIPyt voAwfVAQYQhB+AAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzM4MyBNTj0zNjE5OTk4OS5v dXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iT3N0ZXJEb3dK b25lcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBHV1MgV2VhdGhlciBTdGF0 aXN0aWNzIDogRGFpbHkgR2xvYmFsIENvZmZlZSAtIEFwciAwOAoKLi4uICAJIAoKQnlMaW5l Li4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChPREogdmlhIENPTVRF WCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRv d0pvbmVzIENvbW1vZGl0eSBOZXdzIChPREopLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4u LgoKCk9zdGVyRG93Sm9uZXMKClJlcG9ydCBwZXJpb2QgQXByIDA4IDIwMDMgdGhyb3VnaCBB cHIgMDggMjAwMyBQcmVjaXBpdGF0aW9uIGluCm1pbGxpbWV0ZXJzLCB0ZW1wZXJhdHVyZSBp biBDZWxzaXVzLiAoMC4wNCBpbmNoPTEgbWlsbGltZXRlcjsKRmFocmVuaGVpdD1DZWxzaXVz IHRpbWVzIDEuOCwgcGx1cyAzMikKCiAgICAgICAgICAgICAgICAgIEFWRyAgTU9TVCAgUENU ICBBVkcgIEFWRyAgSFNUICBMU1QgIEFWRyAgU05PVwogIExPQ0FUSU9OICAgICAgIFBDUE4g IFBDUE4gIENWRyBISUdIICBMT1cgSElHSCAgTE9XICBUTVAgIERQVEgKCkJyYXppbAogIEVz cGlyaXRvIFNhbnRvICAgIDIgICAgIDIgICA1MCAgIDI4ICAgMjMgICAyOCAgIDIzICAgMjYg ICAgIDAKICBNaW5hcyBHZXJhaXMgICAgICA2ICAgIDE3ICAgMjUgICAyOSAgIDE5ICAgMzMg ICAxOCAgIDI0ICAgICAwCiAgUGFyYW5hICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMjkg ICAxNiAgIDI5ICAgMTYgICAyMyAgICAgMAogIFNhbyBQYXVsbyAgICAgICAgIDAgICAgIDAg ICAtLSAgIDI0ICAgMTggICAyNiAgIDE4ICAgMjAgICAgIDAKCkNvbG9tYmlhCiAgICAgICAg ICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMzAgICAxOCAgIDM0ICAgMTQgICAyNCAgICAg MAoKRWFzdCBBZnJpY2EKICBFdGhpb3BhICAgICAgICAgIC0tICAgIC0tICAgLS0gICAtLSAg IC0tICAgLS0gICAtLSAgIC0tICAgIC0tCiAgS2VueWEgICAgICAgICAgICAgMCAgICAgMCAg IC0tICAgMjcgICAxMiAgIDMwICAgMTIgICAyMSAgICAgMAogIFVnYW5kYSAgICAgICAgICAg IDAgICAgIDAgICAtLSAgIDI3ICAgLS0gICAyNyAgIC0tICAgLS0gICAgIDAKCkluZGlhCiAg QW5kaHJhIFByYWRlc2ggICAgMCAgICAgMCAgIC0tICAgMzUgICAyNSAgIDM4ICAgMjIgICAz MCAgICAgMAogIEthcm5hdGFrYSAgICAgICAgIDAgICAgIDAgICAtLSAgIDM1ICAgMjEgICAz NiAgIDIxICAgMjggICAgIDAKICBLZXJhbGEgICAgICAgICAgICAwICAgP/GSPi/aDADQAwAA 0AMAAAACs50B5AAH6QoWXAgARQADwlA/QAA/Buq4QXo9IkF6PSi4VwAU5yECEb6AMH1QGGEI l2MAACAgMCAgIC0tICAgMzMgICAyNiAgIDM0ICAgMjQgICAyOSAgICAgMAogIFRhbWlsIE5h ZHUgICAgICAgIDAgICAgIDAgICAtLSAgIDM1ICAgMjQgICAzNyAgIDIzICAgMjkgICAgIDAK Ck1leGljbwogIENoaWFwYXMgICAgICAgICAgIDAgICAgIDAgICAtLSAgIDM0ICAgMTggICAz OSAgIDEzICAgMjYgICAgIDAKICBHdWVycmVybyAgICAgICAgICAwICAgICAwICAgLS0gICAz MiAgIDE4ICAgMzIgICAxOCAgIDI1ICAgICAwCiAgSGlkYWxnbyAgICAgICAgICAgMyAgICAg MyAgMTAwICAgMzEgICAxMyAgIDMxICAgMTMgICAyMiAgICAgMAogIE9heGFjYSAgICAgICAg ICAgIDAgICAgIDAgICAtLSAgIDM3ICAgMTUgICAzNyAgIDE1ICAgMjYgICAgIDAKICBQdWVi bGEgICAgICAgICAgICAwICAgICAwICAgLS0gICAzMSAgIDEzICAgMzEgICAxMyAgIDIyICAg ICAwCiAgVmVyYSBDcnV6ICAgICAgICAgMCAgICAgMCAgIC0tICAgMzIgICAyMCAgIDM0ICAg MTcgICAyNiAgICAgMAoKVmlldG5hbQogICAgICAgICAgICAgICAgICAgIDAgICAgIDAgICAt LSAgIDMyICAgMjYgICAzMyAgIDI0ICAgMjkgICAgIDAKClRlbDogKDkxMykzMjItNTE4MQoK R1dTIHdlYiBzaXRlOiBodHRwOi8vd3d3Lmdsb2JhbHdlYXRoZXJzZXJ2aWNlcy5jb20gMjAw My0wNC0wOCAxNTo1NTozNwoKU2VuZCBjb21tZW50cyB0bzogZ3dzbWFpbEBnbG9iYWx3ZWF0 aGVyc2VydmljZXMuY29tCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhZnJpY2EKICAg IGJyYXppbAogICAgY29mZmVlCiAgICBjb2xvbWJpYQogICAgaW5kaWEKICAgIGtlbnlhCiAg ICBtZXhpY28KICAgIHN0YXRpc3RpY3MKICAgIHVnYW5kYQogICAgdmlldG5hbQogICAgd2Vh dGhlcgogICAgd2ViCiAgICBXRUFUSEVST3JpZ2luIEFzc2lnbmVkQnk9Ik9zdGVyRG93Sm9u ZXMiIC8+Cgo/8ZI+MdoMADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUEBAAD8G7lFBej0i QXo9KLhXABTnIQWrvoAwfVARYQi9VgAAAAAAAAAAP/GSPkZKDQA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLl4QAB9BkcZQXo9KEF6PSIAFLhXvoAwfechBaxQEP1cIQIAAD/xkj62Ug0A NgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5eUAAfQZHGEF6PShBej0iABS4V76AMH3nIQWs UBH9XCEBAAA/8ZI+8VMNADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUEFAAD8G7lBBej0i QXo9KLhXABTnIQWsvoAwflAQYQi9VQAAAAAAAAAAP/GSPhoVDgA8AAAAPAAAAAACs50B5AAH 6QoWXAgARQAAKFBCQAA/Bu5PQXo9IkF6PSi3bQAV3fpMyLnIIxBQEGEIkm8AAAAAAAAAAD/x kj7ZTQ4ATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC5ekAAfQZG/0F6PShBej0iABW3bbnI IxDd+kzIUBj2AC5hAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQo/8ZI++1UOAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCUENAAD8G7jRBej0iQXo9KLdtABXd+kzIucgjKFAYYQiHWAAA REVMRSAzNjE5OTk5MC5vdXQuMDMwNDA4DQo/8ZI+5pMOAHwAAAB8AAAAAAfpChZcAAKznQHk CABFAABuuXtAAH0GRtBBej0oQXo9IgAVt225yCMo3fpM4lAY9eZ0QwAANTUwIDM2MTk5OTkw Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVk LiANCj/xkj5+oA4AUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQREAAPwbuM0F6PSJBej0o t20AFd36TOK5yCNuUBhhCPU5AABQT1JUIDY1LDEyMiw2MSwzNCwxODQsODgNCj/xkj672g4A VAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa5fEAAfQZG90F6PShBej0iABW3bbnII27d+kz8 UBj1y0AMAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQo/8ZI+GN4OAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCUEVAAD8G7jJBej0iQXo9KLdtABXd+kz8ucgjjFAYYQh0pAAA U1RPUiAzNjE5OTk5MC5vdXQuMDMwNDA4DQo/8ZI+IzcPAHgAAAB4AAAAAAfpChZcAAKznQHk CABFAABquX1AAH0GRtJBej0oQXo9IgAVt225yCOM3fpNFlAY9bH+BQAAMTUwIE9wZW5pbmcg QklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjE5OTk5MC5vdXQuMDMwNDA4Lg0K QPGSPv9sAAA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLl+QAB9BkcLQXo9KEF6PSIAFLhY nbFuIAAAAABwAvrwxwEAAAIEBWQBAQQCQPGSPrJuAAA+AAAAPgAAAAACs50B5AAH6QoWXAgA RQAAMFBGQAA/Bu5DQXo9IkF6PSi4WAAU5ySMhJ2xbiFwEmEI7N8AAAEBBAICBAW0QPGSPnam AAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLl/QAB9BkcSQXo9KEF6PSIAFLhYnbFuIeck jIVQEP1cfU8AAEDxkj6lrgAAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxQR0AAPwbo5kF6 PSJBej0ouFgAFOckjIWdsW4hUBBhCBqmAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3Mzgz IE1OPTM2MTk5OTkwLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIg UEZOPSJQUiBOZXdzd2lyZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBCaW9M aW5rIFRlY2hub2xvZ2llcyBJbnRlcm5hdGlvbmFsLCBJbmMgIGFuZCBCTlggU3lzdGVtcywg SW5jICBQcm92aWRlCkFkdmFuY2VkIEF1dGhlbnRpY2F0aW9uIFNvbHV0aW9ucwoKLi4uICAJ IAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgVklFTk5BLCAgVmEuIGFuZCBN SVJJTUFSLCAgRmxhLiwgQXByIDgsIDIwMDMgL1BSTmV3c3dpcmUgdmlhIENPTVRFWC8gLS0K CgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKEMpIDIwMDMgUFIgTmV3c3dp cmUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKClBSIE5ld3N3aXJlCgpCTlggU3lz dGVtcywgSW5jICwgYSBsZWFkaW5nIHByb3ZpZGVyIG9mIGF1dGhlbnRpY2F0aW9uLCBpZGVu dGl0eQptYW5hZ2VtZW50IGFuZCBzaW5nbGUgc2lnbi1vbiAoU1NPKSBzb2x1dGlvbnMgZm9y IGVudGVycHJpc2UgYW5kIEludGVybmV0CnNlY3VyaXR5LCBhbmQgQmlvTGluayBUZWNobm9s b2dpZXMgSW50ZXJuYXRpb25hbCwgSW5jICwgYSBsZWFkaW5nCmRldmVsb3BlciBvZiBhdXRo ZW50aWNhdGlvbiBzb2x1dGlvbnMsIHRvZGF5IGFubm91bmNlZCB0aGV5IGhhdmUKcGFydG5l cmVkIHRvIGRlbGl2ZXIgYSBqb2ludCBhdXRoZW50aWNhdGlvbiBzb2x1dGlvbiB0aGF0IHBh aXJzIHRoZQpCaW9MaW5rIGZhbWlseSBvZiBVLU1hdGNoKFIpIGJpb21ldHJpYyBpbnB1dCBk ZXZpY2VzIHdpdGggdGhlIEJOWApJZGVudGl0eSBNYW5hZ2VtZW50IFN1aXRlKFRNKSBzb2Z0 d2FyZSBwbGF0Zm9ybS4gVXNpbmcgdGhlIEJOWCBTdWl0ZSBhcwp0aGVpciBpZGVudGl0eSBt YW5hZ2VtZW50IGZyYW1ld29yaywgb3JnYW5pemF0aW9ucyBhcmUgbm93IGFibGUgdG8gZGVw bG95CkJpb0xpbmsncyBhdXRoZW50aWNhdGlvbiBwcm9kdWN0cyB0byBjb25jbHVzaXZlbHkg dmVyaWZ5IHVzZXJzJwppZGVudGl0aWVzIHdoZW4gYWNjZXNzaW5nIHRoZWlyIGNvcnBvcmF0 ZSBuZXR3b3Jrcy4KClRoZSBqb2ludCBzb2x1dGlvbiwgZGV2ZWxvcGVkIGJ5IEJpb0xpbmsg YW5kIEJOWCwgYWxsb3dzIGNvbXBhbmllcyB0bwppbXBsZW1lbnQgbXVsdGktZmFjdG9yIGF1 dGhlbnRpY2F0aW9uIHNvbHV0aW9ucyB1c2luZyBCaW9MaW5rJ3MgYWR2YW5jZWQKYmlvbWV0 cmljIGZpbmdlcnByaW50IG1hdGNoaW5nIHRlY2hub2xvZ3ksIGluY2x1ZGluZyBpbmRpdmlk dWFsaXplZCBmaW5lLQphZGp1c3RtZW50IHNlY3VyaXR5IHNldHRpbmdzLCB0byBlbmhhbmNl IHNA8ZI+Ha8AAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUEhAAD8G6OVBej0iQXo9KLhY ABTnJJHpnbFuIVAYYQgB/gAAZWN1cml0eSBhbmQgcmVkdWNlIGNvc3RzIG9mCm1hbmFnaW5n IGEgcGFzc3dvcmQtYmFzZWQgYXV0aGVudGljYXRpb24gc3lzdGVtLgoKIlRoZSBCTlggZW50 ZXJwcmlzZSBvZmZlcmluZyBpcyBleHRyZW1lbHkgcm9idXN0IGFuZCBtZWV0cyB0aGUgZ3Jv d2luZwpuZWVkcyBvZiBjdXN0b21lcnMgZm9yIGNvbXBsZXRlLCBlYXN5IHRvIGltcGxlbWVu dCBpZGVudGl0eSBtYW5hZ2VtZW50CnNvbHV0aW9ucy4gV2UgbG9vayBmb3J3YXJkIHRvIGVu aGFuY2luZyB0aGUgb2ZmZXJpbmcgdGhyb3VnaCBCaW9MaW5rJ3MKc3Ryb25nIGF1dGhlbnRp Y2F0aW9uIHNvbHV0aW9uLCIgc2FpZCBHZW5lIENoYXlldnNreSwgUHJlc2lkZW50IGFuZCBD RU8Kb2YgQmlvTGluay4KCiJXZSBhcmUgdmVyeSBleGNpdGVkIHRvIHBhcnRuZXIgd2l0aCBC aW9MaW5rIHRvIGJyaW5nIGl0cyBsZWFkaW5nCmZpbmdlcnByaW50IG1hdGNoaW5nIHRlY2hu b2xvZ3kgdG8gb3VyIGN1c3RvbWVycywiIHNhaWQgSnVsaWFuIFdhaXRzLApWaWNlIFByZXNp ZGVudCBvZiBTYWxlcyBhbmQgQnVzaW5lc3MgRGV2ZWxvcG1lbnQgZm9yIEJOWC4gIkJpb0xp bmsKcHJvdmlkZXMgc29tZXRoaW5nIG1hbnkgaW4gdGhlIGluZHVzdHJ5IGhhdmUgYmVlbiB3 YWl0aW5nIGZvciAtIHByb3ZlbgpsYXJnZSBzY2FsZSBhdXRoZW50aWNhdGlvbiB0ZWNobm9s b2d5IGluIGFmZm9yZGFibGUgY29tbWVyY2lhbCBwcm9kdWN0cy4KQmlvTGluayB3aWxsIHBy b3ZpZGUgQk5YIHJlbGlhYmxlIGFuZCBtYXJrZXQgcHJvdmVuIHByb2R1Y3RzIHdpdGggdGhl CmJlc3QgcHJpY2UtIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBpbiB0aGUgaW5kdXN0 cnkuIgoKQWJvdXQgQk5YIFN5c3RlbXM6IEJOWCBTeXN0ZW1zIGRldmVsb3BzIGlkZW50aXR5 IG1hbmFnZW1lbnQgc29sdXRpb25zIGZvcgpjZW50cmFsbHkgbWFuYWdpbmcgYW5kIG9wdGlt aXppbmcgdXNlciBhdXRoZW50aWNhdGlvbiBhbmQgc2lnbi1vbgpwcm9jZXNzZXMsIGVuYWJs aW5nIGVudGVycHJpc2Ugb3JnYW5pemF0aW9ucyB0byBpbmNyZWFzZSBzZWN1cml0eSwKZW5o YW5jZSB1c2VyIGNvbnZlbmllbmNlIGFuZCByZWR1Y2UgY29zdHMuIFRoZSBjb21wYW55J3Mg ZmxhZ3NoaXAKcHJvZHVjdCwgdGhlIEJOWCBJZGVudGl0eSBNYW5hZ2VtZW50IFN1aXRlLCBp bmNsdWRlcyBhdXRoZW50aWNhdGlvbiBhbmQKc2luZ2xlIHNpZ24tb24gcHJvZHVjdHMgdGhh dCBwcm92aWRlIHRoZSB1bmlmaWVkIGNvbnRyb2wgbmVjZXNzYXJ5IHRvCmltcGxlbWVudCBz ZWN1cmUgdXNlciBhdXRoZW50aWNhdGlvbiBhbmQgY29uc29saWRhdGVkIHNpZ24tb24gZm9y CmNsaWVudC1zZXJ2ZXIsIGxlZ2FjeSBhbmQgV2ViLSBiYXNlZCBhcHBsaWNhdGlvQPGSPpKv AACaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFBJQAA/BujkQXo9IkF6PSi4WAAU5ySXTZ2x biFQGGEIb8IAAG5zLiBSZWNlbnQgaW5kdXN0cnkKYWNjb2xhZGVzIGZvciB0aGUgQk5YIHBy b2R1Y3Qgc3VpdGUgaW5jbHVkZSBOZXR3b3JrIENvbXB1dGluZydzCiJXZWxsLUNvbm5lY3Rl ZCIgYW5kICJFZGl0b3IncyBDaG9pY2UiIGF3YXJkcyBhbmQgTmV0d29yayBXb3JsZCdzCiJX b3JsZC1DbGFzcyIgYW5kICJCZXN0IG9mIHRoZSBUZXN0cyIgYXdhcmRzLiBQcml2YXRlbHkg aGVsZCwgQk5YIFN5c3RlbXMKaXMgaGVhZHF1YXJ0ZXJlZCBpbiBWaWVubmEsIFZhLiwgYW5k IGlzIGFjY2Vzc2libGUgdmlhIHRoZSBXZWIgYXQKd3d3LmJueC5jb20gLgoKQWJvdXQgQmlv TGluayBUZWNobm9sb2dpZXMgSW50ZXJuYXRpb25hbDogQmlvTGluaywgYSBsZWFkaW5nIHNl Y3VyaXR5CnRlY2hub2xvZ3kgcHJvdmlkZXIsIGRldmVsb3BzLCBtYW51ZmFjdHVyZXMsIGFu ZCBtYXJrZXRzIGFkdmFuY2VkCmZpbmdlcnByaW50IGJpb21ldHJpYyBwcm9kdWN0cy4gVGhl IGNvbXBhbnkncyBzb2x1dGlvbnMgZm9ybSB0aGUgY29yZSBvZgpiaW9tZXRyaWMgYXV0aGVu dGljYXRpb24gc29sdXRpb25zIGZvciBsb2dpY2FsIGFjY2VzcywgaW5jbHVkaW5nCmNvbXB1 dGVycywgbmV0d29ya3MsIGFuZCB3ZWItYmFzZWQgcmVzb3VyY2VzLCBwaHlzaWNhbCBhY2Nl c3MsIGFuZApsYXJnZS1zY2FsZSBjaXZpbCBpZGVudGlmaWNhdGlvbiBhbmQgbGF3IGVuZm9y Y2VtZW50IGFwcGxpY2F0aW9ucy4KQmlvTGluaydzIHNvbHV0aW9ucyBhcmUgYmVpbmcgaW1w bGVtZW50ZWQgYnkgY29ycG9yYXRlIGFuZCBnb3Zlcm5tZW50CmVudGl0aWVzIHdvcmxkd2lk ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHd3dy5iaW9saW5rdXNhLmNvbSAuCgpD T05UQUNUOiBEYXJyZWxsIEdldXN6IG9mIEJpb0xpbmssICsxLTk1NC00NTAtNzA2MSBleHQg MTE2LApkZ2V1c3pAYmlvbGlua3VzYS5jb20gLgoKU09VUkNFIEJpb0xpbmsgVGVjaG5vbG9n aWVzIEludGVybmF0aW9uYWwKCkRhcnJlbGwgR2V1c3ogb2YgQmlvTGluaywgKzEtOTU0LTQ1 MC03MDYxIGV4dCAxMTYsCmRnZXVzekBiaW9saW5rdXNhLmNvbSAsIG9yIFN0ZXZlIFNpbW9u IG9mIFMmUyBQdWJsaWMgUmVsYXRpb25zLAorMS04NDctOTU1LTc3MzAgZXh0IDIzNywgc3Rl dmVAc3Nwci5jb20gLCBvciBDaGVyeWwgQnJlZGVob2VmdCBvZiBCTlgsCisxLTcwMy03MzQt OTIwMCBleHQuIDE1NSwgY2JyZWRlaG9lZnRAYm54LmNvbQoKaHR0cDovL3d3dy5ibnguY29t CgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBidXNpbmVzcwogICAgY2VvCiAgICBjb21t ZXJjaWFsCiAgICBjb3Jwb3JhdGUKICAgIGZhbWlseQogICAgZ292ZXJubWVudAogICAgaW50 ZXJuZXQKICAgIGxhdytlbmZvcmNlbWVudAogICAgbWFudWZhY3R1ckDxkj62KQEANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi5gEAAfQZHEUF6PShBej0iABS4WJ2xbiHnJJdNUBD9XHKH AABA8ZI+VSsBAKgAAACoAAAAAAKznQHkAAfpChZcCABFAACaUEpAAD8G7dVBej0iQXo9KLhY ABTnJJyxnbFuIVAZYQhxGgAAZXIKICAgIG1hcmtldAogICAgcHJlc2lkZW50CiAgICBwcm9k dWN0cwogICAgc2FsZXMKICAgIHNlY3VyaXR5CiAgICBzb2Z0d2FyZQogICAgdGVjaG5vbG9n eQogICAgdmlyZ2luaWEKICAgIHdlYgoKQPGSPo9mAQA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLmBQAB9BkcQQXo9KEF6PSIAFLhYnbFuIecknSRQEP1cbLAAAEDxkj7jagEAPAAAADwA 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 QhvwDUQjq0rxkj4P+gcAngAAAJ4AAAAAArOdAeQAB+kKFlwIAEUAAJA7jkAAPwYCnEF6PSJB ej0olQ8bWBiM6z10egQggBgW0BgkAAABAQgKDUQjuwBCG/A1NzV8MTQ3MjgzNnwxMDQ5ODE3 NDIxfDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKNTc2fDE0NzI4Mzd8MTA0OTgxNzQyMXwxLjB8 MXwzMzAxfGhlbGxvIHdvcmxkCkrxkj6fTwsAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW dEAAfQZqEUF6PShBej0iG1iVD3R6BCAYjOuZgBCwlE6PAAABAQgKAEIb8g1EI7tN8ZI+LhgH AHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO49AAD8GAslBej0iQXo9KJUPG1gYjOuZdHoE IIAYFtD82AAAAQEICg1EJOIAQhvyNTc3fDE0NzI4Mzh8MTA0OTgxNzQyM3wxLjB8MXwzNTcz fGhlbGxvIHdvcmxkCk3xkj51mAoAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWdUAAfQZq EEF6PShBej0iG1iVD3R6BCAYjOvHgBCwZk1KAAABAQgKAEIcEA1EJOJN8ZI+V5oKAIMBAACD AQAAAAKznQHkAAfpChZcCABFAAF1O5BAAD8GAbVBej0iQXo9KJUPG1gYjOvHdHoEIIAYFtB2 LAAAAQEICg1EJPkAQhwQNTc4fDE0NzI4Mzl8MTA0OTgxNzQyM3wxLjB8MXwzNTczfGhlbGxv IHdvcmxkCjU3OXwxNDcyODQwfDEwNDk4MTc0MjN8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZAo1 ODB8MTQ3Mjg0MXwxMDQ5ODE3NDIzfDEuMHwxfDMzMDF8aGVsbG8gd29ybGQKNTgxfDE0NzI4 NDJ8MTA0OTgxNzQyM3wxLjB8MXwyMTN8aGVsbG8gd29ybGQKNTgyfDE0NzI4NDN8MTA0OTgx NzQyNHwxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCjU4M3wxNDcyODQ0fDEwNDk4MTc0MjR8MS4w fDF8MzExNnxoZWxsbyB3b3JsZAo1ODR8MTQ3Mjg0NXwxMDQ5ODE3NDI0fDEuMHwxfDI4NTh8 aGVsbG8gd29ybGQKTfGSPuruDQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZ2QAB9BmoP QXo9KEF6PSIbWJUPdHoEIBiM7QiAEK8lTTEAAAEBCAoAQhwSDUQk+U3xkj518A0AcAAAAHAA AAAAArOdAeQAB+kKFlwIAEUAAGI7kUAAPwYCx0F6PSJBej0olQ8bWBiM7Qh0egQggBgW0PkZ AAABAQgKDUQlDwBCHBI1ODV8MTQ3Mjg0NnwxMDQ5ODE3NDI1fDEuMHwxfDE3ODd8aGVsbG8g d29ybGQKTvGSPicDAgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZ3QAB9BmoOQXo9KEF6 PSIbWJUPdHoEIBiM7TaAEK73TRkAAAEBCAoAQhwUDUQlD07xkj6LqgsAbwAAAG8AAAAAArOd AeQAB+kKFlwIAEUAAGE7kkAAPwYCx0F6PSJBej0olQ8bWBiM7TZ0egQggBgW0G1WAAABAQgK DUQlZABCHBQ1ODZ8MTQ3Mjg0N3wxMDQ5ODE3NDI2fDEuMHwxfDY1NHxoZWxsbyB3b3JsZApO 8ZI+8rENAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lnhAAH0Gag1Bej0oQXo9IhtYlQ90 egQgGIztY4AQrspMvAAAAQEICgBCHBwNRCVkTvGSPm+zDQBvAAAAbwAAAAACs50B5AAH6QoW XAgARQAAYTuTQAA/BgLGQXo9IkF6PSiVDxtYGIztY3R6BCCAGBbQaBgAAAEBCAoNRCVxAEIc HDU4N3wxNDcyODQ4fDEwNDk4MTc0MjZ8MS4wfDF8NDgyfGhlbGxvIHdvcmxkCk/xkj4vxgEA QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWeUAAfQZqDEF6PShBej0iG1iVD3R6BCAYjO2Q gBCunUytAAABAQgKAEIcHg1EJXFP8ZI+oMcBAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABi O5RAAD8GAsRBej0iQXo9KJUPG1gYjO2QdHoEIIAYFtD5EQAAAQEICg1EJYcAQhweNTg4fDE0 NzI4NDl8MTA0OTgxNzQyNnwxLjB8MXwzMTE2fGhlbGxvIHdvcmxkCk/xkj5vHAUAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSWekAAfQZqC0F6PShBej0iG1iVD3R6BCAYjO2+gBCub0yV AAABAQgKAEIcIA1EJYdP8ZI+tLkOAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhO5VAAD8G AsRBej0iQXo9KJUPG1gYjO2+dHoEIIAYFtBvUQAAAQEICg1EJdwAQhwgNTg5fDE0NzI4NTB8 MTA0OTgxNzQyN3wxLjB8MXwxNjB8aGVsbG8gd29ybGQKUPGSPhWJAQBCAAAAQgAAAAAH6QoW XAACs50B5AgARQAANJZ7QAB9BmoKQXo9KEF6PSIbWJUPdHoEIBiM7euAEK5CTDgAAAEBCAoA QhwoDUQl3FDxkj7aigEAJwEAACcBAAAAArOdAeQAB+kKFlwIAEUAARk7lkAAPwYCC0F6PSJB ej0olQ8bWBiM7et0egQggBgW0OnJAAABAQgKDUQl6QBCHCg1OTB8MTQ3Mjg1MXwxMDQ5ODE3 NDI3fDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAo1OTF8MTQ3Mjg1MnwxMDQ5ODE3NDI3fDEuMHwx fDI4NTh8aGVsbG8gd29ybGQKNTkyfDE0NzI4NTN8MTA0OTgxNzQyN3wxLjB8MXwyNDQwfGhl bGxvIHdvcmxkCjU5M3wxNDcyODU0fDEwNDk4MTc0Mjd8MS4wfDF8MzExNnxoZWxsbyB3b3Js ZAo1OTR8MTQ3Mjg1NXwxMDQ5ODE3NDI3fDEuMHwxfDM1NzN8aGVsbG8gd29ybGQKUPGSPpLf BABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJZ8QAB9BmoJQXo9KEF6PSIbWJUPdHoEIBiM 7tCAEK1dTCkAAAEBCAoAQhwqDUQl6VDxkj7Ntw4AbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUA AGE7l0AAPwYCwkF6PSJBej0olQ8bWBiM7tB0egQggBgW0G/GAAABAQgKDUQmQABCHCo1OTV8 MTQ3Mjg1NnwxMDQ5ODE3NDI4fDEuMHwxfDMyN3xoZWxsbyB3b3JsZApR8ZI+cvcCAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0ln1AAH0GaghBej0oQXo9IhtYlQ90egQgGIzu/YAQrTBL yQAAAQEICgBCHDMNRCZAUfGSPgr5AgBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjuYQAA/ BgLAQXo9IkF6PSiVDxtYGIzu/XR6BCCAGBbQ/bwAAAEBCAoNRCZXAEIcMzU5NnwxNDcyODU3 fDEwNDk4MTc0Mjh8MS4wfDF8MzMwMXxoZWxsbyB3b3JsZApR8ZI+qE0GAEIAAABCAAAAAAfp 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 MHwxfDE2MHxoZWxsbyB3b3JsZAo2MTB8MTQ3Mjg3MXwxMDQ5ODE3NDM0fDEuMHwxfDM0MjB8 aGVsbG8gd29ybGQKNjExfDE0NzI4NzJ8MTA0OTgxNzQzNHwxLjB8MXwyODU4fGhlbGxvIHdv cmxkCjYxMnwxNDcyODczfDEwNDk4MTc0MzV8MS4wfDF8MzU3M3xoZWxsbyB3b3JsZAo2MTN8 MTQ3Mjg3NHwxMDQ5ODE3NDM1fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKNjE0fDE0NzI4NzV8 MTA0OTgxNzQzNXwxLjB8MXwzMjI1fGhlbGxvIHdvcmxkCljxkj5EpAkAQgAAAEIAAAAAB+kK FlwAArOdAeQIAEUAADSWhUAAfQZqAEF6PShBej0iG1iVD3R6BCAYjPJigBCpy0iXAAABAQgK AEIcfQ1EKShY8ZI+OvsLAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO6BAAD8GArhBej0i QXo9KJUPG1gYjPJidHoEIIAYFtDuIAAAAQEICg1EKU4AQhx9NjE1fDE0NzI4NzZ8MTA0OTgx NzQzNnwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCljxkj4wpg4AQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSWhkAAfQZp/0F6PShBej0iG1iVD3R6BCAYjPKQgBCpnUhuAAABAQgKAEIcgA1E KU5Y8ZI+pqcOAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO6FAAD8GArdBej0iQXo9KJUP G1gYjPKQdHoEIIAYFtDx2wAAAQEICg1EKV8AQhyANjE2fDE0NzI4Nzd8MTA0OTgxNzQzNnwx LjB8MXwzMTE2fGhlbGxvIHdvcmxkClnxkj5rugIAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSWh0AAfQZp/kF6PShBej0iG1iVD3R6BCAYjPK+gBCpb0haAAABAQgKAEIcgw1EKV9a8ZI+ C+0GACoAAAAqAAAAAAfpChZcAAKznQHkCAYAAQgABgQAAQACs50B5EF6PSgAAAAAAABBej0i WvGSPsztBgA8AAAAPAAAAAACs50B5AAH6QoWXAgGAAEIAAYEAAIAB+kKFlxBej0iAAKznQHk QXo9KAAAAAAAAAAAAAAAAAAAAAAAAFvxkj5lMQ8AbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUA AGE7okAAPwYCt0F6PSJBej0olQ8bWBiM8r50egQggBgW0GI7AAABAQgKDUQqjwBCHIM2MTd8 MTQ3Mjg3OHwxMDQ5ODE3NDM4fDEuMHwxfDIxM3xoZWxsbyB3b3JsZApc8ZI+ZwMCAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0lohAAH0Gaf1Bej0oQXo9IhtYlQ90egQgGIzy64AQqUJH DQAAAQEICgBCHKANRCqPXPGSPigFAgCBAQAAgQEAAAACs50B5AAH6QoWXAgARQABczujQAA/ BgGkQXo9IkF6PSiVDxtYGIzy63R6BCCAGBbQx8wAAAEBCAoNRCqcAEIcoDYxOHwxNDcyODc5 fDEwNDk4MTc0Mzh8MS4wfDF8Nzk5fGhlbGxvIHdvcmxkCjYxOXwxNDcyODgwfDEwNDk4MTc0 Mzh8MS4wfDF8MTEyMnxoZWxsbyB3b3JsZAo2MjB8MTQ3Mjg4MXwxMDQ5ODE3NDM4fDEuMHwx fDMyN3xoZWxsbyB3b3JsZAo2MjF8MTQ3Mjg4MnwxMDQ5ODE3NDM4fDEuMHwxfDMzMDF8aGVs bG8gd29ybGQKNjIyfDE0NzI4ODN8MTA0OTgxNzQzOHwxLjB8MXwxMjAzfGhlbGxvIHdvcmxk CjYyM3wxNDcyODg0fDEwNDk4MTc0Mzh8MS4wfDF8MzMwMXxoZWxsbyB3b3JsZAo2MjR8MTQ3 Mjg4NXwxMDQ5ODE3NDM5fDEuMHwxfDQ4MnxoZWxsbyB3b3JsZApc8ZI+vlkFAEIAAABCAAAA AAfpChZcAAKznQHkCABFAAA0lolAAH0GafxBej0oQXo9IhtYlQ90egQgGIz0KoAQqANG/gAA AQEICgBCHKINRCqcXPGSPnpbBQDMAAAAzAAAAAACs50B5AAH6QoWXAgARQAAvjukQAA/BgJY QXo9IkF6PSiVDxtYGIz0KnR6BCCAGBbQIzcAAAEBCAoNRCqyAEIcojYyNXwxNDcyODg2fDEw NDk4MTc0Mzl8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAo2MjZ8MTQ3Mjg4N3wxMDQ5ODE3NDM5 fDEuMHwxfDMzMDF8aGVsbG8gd29ybGQKNjI3fDE0NzI4ODh8MTA0OTgxNzQzOXwxLjB8MXwx MjAzfGhlbGxvIHdvcmxkClzxkj48sAgAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWikAA fQZp+0F6PShBej0iG1iVD3R6BCAYjPS0gBCneUblAAABAQgKAEIcpQ1EKrJd8ZI+RP0CAG8A AABvAAAAAAKznQHkAAfpChZcCABFAABhO6VAAD8GArRBej0iQXo9KJUPG1gYjPS0dHoEIIAY FtBVsAAAAQEICg1EKwcAQhylNjI4fDE0NzI4ODl8MTA0OTgxNzQ0MHwxLjB8MXw0ODJ8aGVs bG8gd29ybGQKXfGSPsIcBQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJaLQAB9Bmn6QXo9 KEF6PSIbWJUPdHoEIBiM9OGAEKdMRokAAAEBCAoAQhysDUQrB13xkj5lHgUA+QAAAPkAAAAA ArOdAeQAB+kKFlwIAEUAAOs7pkAAPwYCKUF6PSJBej0olQ8bWBiM9OF0egQggBgW0BY8AAAB AQgKDUQrFQBCHKw2Mjl8MTQ3Mjg5MHwxMDQ5ODE3NDQwfDEuMHwxfDQ4MnxoZWxsbyB3b3Js ZAo2MzB8MTQ3Mjg5MXwxMDQ5ODE3NDQwfDEuMHwxfDE1MDh8aGVsbG8gd29ybGQKNjMxfDE0 NzI4OTJ8MTA0OTgxNzQ0MHwxLjB8MXwzNDAzfGhlbGxvIHdvcmxkCjYzMnwxNDcyODkzfDEw NDk4MTc0NDB8MS4wfDF8MzU3M3xoZWxsbyB3b3JsZApd8ZI+JnMIAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0loxAAH0GaflBej0oQXo9IhtYlQ90egQgGIz1mIAQppVGeQAAAQEICgBC HK4NRCsVXvGSPn+eAQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlBOQAA/Bu4pQXo9IkF6 PSi3bQAV3fpNFrnII+ZQGGEIg0wAAERFTEUgMzYxOTk5OTMub3V0LjAzMDQwOA0KXvGSPhnd AQB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrmEQAB9BkbHQXo9KEF6PSIAFbdtucgj5t36 TTBQGPWXc4MAADU1MCAzNjE5OTk5My5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBm aW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQpe8ZI+2uoBAFEAAABRAAAAAAKznQHkAAfpChZc CABFAABDUE9AAD8G7idBej0iQXo9KLdtABXd+k0wucgkLFAYYQjMMQAAUE9SVCA2NSwxMjIs NjEsMzQsMTg0LDEwMg0KXvGSPqclAgBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrmFQAB9 BkbuQXo9KEF6PSIAFbdtucgkLN36TUtQGPrwOdoAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vz c2Z1bC4NCl7xkj7KKAIAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQUEAAPwbuJ0F6PSJB ej0ot20AFd36TUu5yCRKUBhhCHCXAABTVE9SIDM2MTk5OTkzLm91dC4wMzA0MDgNCl7xkj7j ZQIAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq5hkAAfQZGyUF6PShBej0iABW3bbnIJErd +k1lUBj61vfQAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9y IDM2MTk5OTkzLm91dC4wMzA0MDguDQpe8ZI+5mYCAD4AAAA+AAAAAAfpChZcAAKznQHkCABF AAAwuYdAAH0GRwJBej0oQXo9IgAUuGaOMAJOAAAAAHAC+vBCRwAAAgQFZAEBBAJe8ZI+smgC AD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUFFAAD8G7jhBej0iQXo9KLhmABTnrwTEjjAC T3ASYQjvWgAAAQEEAgIEBbRe8ZI+D6ECADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouYhA AH0GRwlBej0oQXo9IgAUuGaOMAJP568ExVAQ/Vx/ygAAXvGSPj2pAgCaBQAAmgUAAAACs50B 5AAH6QoWXAgARQAFjFBSQAA/BujbQXo9IkF6PSi4ZgAU568ExY4wAk9QEGEInkQAAFhZWlpZ Li4uICBUQz0yIFRNPTEwNDk4MTc0MTQgTU49MzYxOTk5OTMub3V0IFNSQz1jb210ZXggUEZO PSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVyRG93Sm9uZXMiIAoKLi4uICAKCgou Li4gCSAKCgpIZWFkTGluZS4uLiAgR1dTIFdlYXRoZXIgU3RhdGlzdGljcyA6IERhaWx5IEds b2JhbCBDb3R0b24gLSBBcHIgMDgKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0 ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoT0RKIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29w eXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMgT3N0ZXJEb3dKb25lcyBDb21tb2RpdHkg TmV3cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpPc3RlckRvd0pvbmVz CgpSZXBvcnQgcGVyaW9kIEFwciAwOCAyMDAzIHRocm91Z2ggQXByIDA4IDIwMDMgUHJlY2lw aXRhdGlvbiBpbgptaWxsaW1ldGVycywgdGVtcGVyYXR1cmUgaW4gQ2Vsc2l1cy4gKDAuMDQg aW5jaD0xIG1pbGxpbWV0ZXI7CkZhaHJlbmhlaXQ9Q2Vsc2l1cyB0aW1lcyAxLjgsIHBsdXMg MzIpCgogICAgICAgICAgICAgICAgICAgICAgQVZHICBNT1NUICBQQ1QgIEFWRyAgQVZHICBI U1QgIExTVCAgQVZHICBTTk9XCiAgTE9DQVRJT04gICAgICAgICAgIFBDUE4gIFBDUE4gIENW RyBISUdIICBMT1cgSElHSCAgTE9XICBUTVAgIERQVEgKCiAgQXJnZW50aW5hICAgICAgICAg ICAgIDAgICAgIDAgICAtLSAgIDI3ICAgMTQgICAyOCAgIDEzICAgMjAgICAgIDAKICBBdXN0 cmFsaWEgICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMjcgICAxMiAgIDI5ICAgMTAgICAy MCAgICAgMAogIEJyYXppbCAgICAgICAgICAgICAgICAwICAgICAwICAgLS0gICAyNyAgIDE1 ICAgMjkgICAxMiAgIDIxICAgICAwCiAgQ2hpbmEgWWFuZ3ppICAgICAgICAgIDEgICAgIDQg ICAzNyAgIDE1ICAgMTEgICAyMSAgICA2ICAgMTMgICAgIDAKICBDaGluYSBZZWxsb3cgUml2 ZXIgICAgMCAgICAgMSAgIC0tICAgMTkgICAxMyAgIDI0ICAgMTAgICAxNiAgICAgMAogIENJ UyBBc2lhbiBzdGF0ZXMgICAgICAyICAgICA2ICAgMjUgICAyMyAgIDEyICAgMzAgICAgOSAg IDE3ICAgICAwCiAgQ0lTIFRyYW5zIENhdWNhc3VzICAgLS0gICAgLS0gICAtLSAgIC0tICAg LS0gICAtLSAgIC0tICAgLS0gICAgLS0KICBJbmRpYSBOb3J0aGVybiAgICAgICAgMCAgICAg MCAgIC0tICAgMzYgICAxOSAgIDM4ICAgMTcgICAyOCAgICAgMAogIEluZGlhIFNvdXRoZXJu ICAgICAgICAyICAgICA4ICAgMjggICAzOSAgIDIyICAgNDIgICAxOSAgIDMwICAgICAwCiAg TWV4aWNvIEUgIENvYXN0ICAgICAgIDAgICAgIDAgICAtLSAgIDMyICAgMjIgICAzNCAgIDE5 ICAgMjcgICAgIDAKICBNZXhpY28gVyAgQ17xkj6YqQIAvAMAALwDAAAAArOdAeQAB+kKFlwI AEUAA65QU0AAPwbquEF6PSJBej0ouGYAFOevCimOMAJPUBhhCBIXAABvYXN0ICAgICAgLS0g ICAgLS0gICAtLSAgIC0tICAgLS0gICAtLSAgIC0tICAgLS0gICAgLS0KICBQYXJhZ3VheSAg ICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMjcgICAxNiAgIDI4ICAgMTUgICAyMSAgICAg MAogIFR1cmtleSAgICAgICAgICAgICAgICAzICAgIDEwICAgMzMgICAxNyAgICA5ICAgMTkg ICAgOCAgIDEzICAgICAwCiAgVVMgRGVsdGEgICAgICAgICAgICAgIDAgICAgIDAgICAtLSAg IDIwICAgMTEgICAyNiAgICA4ICAgMTYgICAgIDAKICBVUyBEZXNlcnQgU1cgICAgICAgICAg MCAgICAgMCAgIC0tICAgMjUgICAgOSAgIDI4ICAgIDUgICAxNyAgICAgMAogIFVTIFNhbiBK b2FxdWluICAgICAgICAwICAgICAwICAgLS0gICAyMyAgIDEwICAgMjMgICAgOSAgIDE2ICAg ICAwCiAgVVMgU291dGhlYXN0ICAgICAgICAgMjAgICAgNDggICA4MCAgIDE4ICAgMTMgICAy OSAgICA0ICAgMTUgICAgIDAKICBVUyBUZXhhcyAgICAgICAgICAgICAgMCAgICAgMSAgIC0t ICAgMjMgICAgOSAgIDI4ICAgIDAgICAxNiAgICAgMAoKVGVsOiAoOTEzKTMyMi01MTgxCgpH V1Mgd2ViIHNpdGU6IGh0dHA6Ly93d3cuZ2xvYmFsd2VhdGhlcnNlcnZpY2VzLmNvbSAyMDAz LTA0LTA4IDE1OjU1OjM5CgpTZW5kIGNvbW1lbnRzIHRvOiBnd3NtYWlsQGdsb2JhbHdlYXRo ZXJzZXJ2aWNlcy5jb20KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGFyZ2VudGluYQog ICAgYXVzdHJhbGlhCiAgICBicmF6aWwKICAgIGNoaW5hCiAgICBjaXMKICAgIGNvdHRvbgog ICAgaW5kaWEKICAgIG1leGljbwogICAgcGFyYWd1YXkKICAgIHN0YXRpc3RpY3MKICAgIHR1 cmtleQogICAgd2VhdGhlcgogICAgd2ViCiAgICBGSUJFUk9yaWdpbiBBc3NpZ25lZEJ5PSJP c3RlckRvd0pvbmVzIiAvPldFQVRIRVIKCl7xkj6ZqQIAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChQVEAAPwbuPUF6PSJBej0ouGYAFOevDa+OMAJPUBFhCBM0AAAAAAAAAABe8ZI+4hgD ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouYlAAH0GRwhBej0oQXo9IgAUuGaOMAJP568N sFAQ/Vx23wAAXvGSPhAmAwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLmKQAB9BkcHQXo9 KEF6PSIAFLhmjjACT+evDbBQEf1cdt4AAF7xkj6fJwMAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChQVUAAPwbuPEF6PSJBej0ouGYAFOevDbCOMAJQUBBhCBMzAAAAAAAAAABe8ZI+294D ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUFZAAD8G7jtBej0iQXo9KLdtABXd+k1lucgk jFAQYQiQVgAAAAAAAAAAXvGSPtgWBABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLmLQAB9 BkbuQXo9KEF6PSIAFbdtucgkjN36TWVQGPrWJ3IAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4N Cl7xkj7GhAQAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE7p0AAPwYCskF6PSJBej0olQ8b WBiM9Zh0egQggBgW0GFOAAABAQgKDUQrdQBCHK42MzN8MTQ3Mjg5NHwxMDQ5ODE3NDQxfDEu MHwxfDY1NHxoZWxsbyB3b3JsZApe8ZI+kIwFADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo UFdAAD8G7jpBej0iQXo9KLdtABXd+k1lucgkpFAQYQiQPgAAAAAAAAAAXvGSPtiKBgBCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJaNQAB9Bmn4QXo9KEF6PSIbWJUPdHoEIBiM9cWAEKZo RhAAAAEBCAoAQhy3DUQrdV7xkj6HjAYA+QAAAPkAAAAAArOdAeQAB+kKFlwIAEUAAOs7qEAA PwYCJ0F6PSJBej0olQ8bWBiM9cV0egQggBgW0Ba+AAABAQgKDUQrggBCHLc2MzR8MTQ3Mjg5 NXwxMDQ5ODE3NDQxfDEuMHwxfDMyN3xoZWxsbyB3b3JsZAo2MzV8MTQ3Mjg5NnwxMDQ5ODE3 NDQxfDEuMHwxfDE3ODd8aGVsbG8gd29ybGQKNjM2fDE0NzI4OTd8MTA0OTgxNzQ0MXwxLjB8 MXwyMjM1fGhlbGxvIHdvcmxkCjYzN3wxNDcyODk4fDEwNDk4MTc0NDF8MS4wfDF8MTIwM3xo ZWxsbyB3b3JsZApe8ZI+XuEJAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lo5AAH0GafdB ej0oQXo9IhtYlQ90egQgGIz2fIAQpbFGAQAAAQEICgBCHLkNRCuCX/GSPgULBgBvAAAAbwAA AAACs50B5AAH6QoWXAgARQAAYTupQAA/BgKwQXo9IkF6PSiVDxtYGIz2fHR6BCCAGBbQVfAA AAEBCAoNRCvjAEIcuTYzOHwxNDcyODk5fDEwNDk4MTc0NDJ8MS4wfDF8NjU0fGhlbGxvIHdv cmxkCl/xkj4o+QcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWj0AAfQZp9kF6PShBej0i G1iVD3R6BCAYjPapgBClhEWXAAABAQgKAEIcwg1EK+Nf8ZI+xPoHAHAAAABwAAAAAAKznQHk AAfpChZcCABFAABiO6pAAD8GAq5Bej0iQXo9KJUPG1gYjPapdHoEIIAYFtDs+gAAAQEICg1E K+8AQhzCNjM5fDE0NzI5MDB8MTA0OTgxNzQ0MnwxLjB8MXwzNDAzfGhlbGxvIHdvcmxkCl/x kj7qTwsAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWkEAAfQZp9UF6PShBej0iG1iVD3R6 BCAYjPbXgBClVkWJAAABAQgKAEIcxA1EK+9i8ZI+pbkHAG8AAABvAAAAAAKznQHkAAfpChZc CABFAABhO6tAAD8GAq5Bej0iQXo9KJUPG1gYjPbXdHoEIIAYFtBjWQAAAQEICg1ELRoAQhzE NjQwfDE0NzI5MDF8MTA0OTgxNzQ0NHwxLjB8MXw2NTR8aGVsbG8gd29ybGQKYvGSPq2YCgBC AAAAQgAAAAAH6QoWXAACs50B5AgARQAANJaRQAB9Bmn0QXo9KEF6PSIbWJUPdHoEIBiM9wSA EKUpREAAAAEBCAoAQhziDUQtGmLxkj4dmgoAnAAAAJwAAAAAArOdAeQAB+kKFlwIAEUAAI47 rEAAPwYCgEF6PSJBej0olQ8bWBiM9wR0egQggBgW0AhcAAABAQgKDUQtLABCHOI2NDF8MTQ3 MjkwMnwxMDQ5ODE3NDQ0fDEuMHwxfDY1NHxoZWxsbyB3b3JsZAo2NDJ8MTQ3MjkwM3wxMDQ5 ODE3NDQ2fDEuMHwxfDY1NHxoZWxsbyB3b3JsZApi8ZI+Me8NAEIAAABCAAAAAAfpChZcAAKz nQHkCABFAAA0lpJAAH0GafNBej0oQXo9IhtYlQ90egQgGIz3XoAQpM9ELAAAAQEICgBCHOQN RC0sYvGSPqXwDQBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTutQAA/BgKsQXo9IkF6PSiV DxtYGIz3XnR6BCCAGBbQXpAAAAEBCAoNRC1CAEIc5DY0M3wxNDcyOTA0fDEwNDk4MTc0NDZ8 MS4wfDF8MjMwfGhlbGxvIHdvcmxkCmPxkj5JAwIAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSWk0AAfQZp8kF6PShBej0iG1iVD3R6BCAYjPeLgBCkokQUAAABAQgKAEIc5g1ELUJj8ZI+ QwwEAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUFhAAD8G7h9Bej0iQXo9KLdtABXd+k1l ucgkpFAYYQiBPwAAREVMRSAzNjE5OTk5NC5vdXQuMDMwNDA4DQpj8ZI+gkkEAHwAAAB8AAAA AAfpChZcAAKznQHkCABFAABuuYxAAH0GRr9Bej0oQXo9IgAVt225yCSk3fpNf1AY+rxtUAAA NTUwIDM2MTk5OTk0Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZp bGUgc3BlY2lmaWVkLiANCmPxkj7jVgQAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENQWUAA PwbuHUF6PSJBej0ot20AFd36TX+5yCTqUBhhCMokAABQT1JUIDY1LDEyMiw2MSwzNCwxODQs MTAzDQpj8ZI+lJEEAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuY1AAH0GRuZBej0oQXo9 IgAVt225yCTq3fpNmlAY+qA5HQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KY/GS PuuUBABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlBaQAA/Bu4dQXo9IkF6PSi3bQAV3fpN mrnIJQhQGGEIbooAAFNUT1IgMzYxOTk5OTQub3V0LjAzMDQwOA0KY/GSPgbSBAB4AAAAeAAA AAAH6QoWXAACs50B5AgARQAAarmOQAB9BkbBQXo9KEF6PSIAFbdtucglCN36TbRQGPqG9xIA ADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYxOTk5OTQu b3V0LjAzMDQwOC4NCmPxkj7+0gQAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC5j0AAfQZG +kF6PShBej0iABS4Z7lq5JMAAAAAcAL68DTGAAACBAVkAQEEAmPxkj7B1AQAPgAAAD4AAAAA ArOdAeQAB+kKFlwIAEUAADBQW0AAPwbuLkF6PSJBej0ouGcAFOfENwe5auSUcBJhCK+BAAAB AQQCAgQFtGPxkj5JDAUANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5kEAAfQZHAUF6PShB ej0iABS4Z7lq5JTnxDcIUBD9XD/xAABj8ZI+8hMFAJoFAACaBQAAAAKznQHkAAfpChZcCABF AAWMUFxAAD8G6NFBej0iQXo9KLhnABTnxDcIuWrklFAQYQiT/AAAWFlaWlkuLi4gIFRDPTIg VE09MTA0OTgxNzQxNSBNTj0zNjE5OTk5NC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIg UEZOPSJDb210ZXgiIFBGTj0iUFIgTmV3c3dpcmUiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFk TGluZS4uLiAgT25DYWxsIFN5c3RlbXMgTGF1bmNoZXMgdGhlIEZpcnN0IFNwZWVjaC1CYXNl ZCBSZWNydWl0aW5nIFBsYXRmb3JtClRvIFN0cmVhbWxpbmUgSGlyaW5nIG9mIEhvdXJseSBX b3JrZXJzCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBTQU4g Sk9TRSwgIENhbGlmLiwgQXByIDgsIDIwMDMgL1BSTmV3c3dpcmUgdmlhIENPTVRFWC8gLS0K CgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKEMpIDIwMDMgUFIgTmV3c3dp cmUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKClBSIE5ld3N3aXJlCgpPbkNhbGwg U3lzdGVtcywgSW5jICwgdGhlIGZpcnN0IGNvbXBhbnkgdG8gY29ubmVjdCBlbXBsb3llcnMg YW5kIGpvYgpzZWVrZXJzIHVzaW5nIHNwZWVjaCB0ZWNobm9sb2d5LCB0b2RheSBhbm5vdW5j ZWQgdGhlIGF2YWlsYWJpbGl0eSBvZiBpdHMKcGhvbmUtYmFzZWQgcmVjcnVpdGluZyBzb2x1 dGlvbiwgYXMgd2VsbCBhcyB0aGUgc2lnbmluZyBvZiBUaGUgVmVuZXRpYW4KUmVzb3J0IEhv dGVsIENhc2lubyBpbiBMYXMgVmVnYXMsIE5WIGFzIGEgY3VzdG9tZXIuCgpEZXNpZ25lZCBm b3IgY29tcGFuaWVzIGhpcmluZyBob3VybHkgYW5kIHBhcnQtdGltZSB3b3JrZXJzLCBPbkNh bGwKZXh0ZW5kcyB0aGUgZWZmaWNpZW5jeSBvZiB3ZWItYmFzZWQgcmVjcnVpdG1lbnQgdG8g aGlyaW5nIG9mIGhvdXJseQp3b3JrZXJzIHRocm91Z2ggYSBzcGVlY2gtYmFzZWQgcGxhdGZv cm0gdGhhdCBhdXRvbWF0ZXMgc291cmNpbmcsCnByZS1zY3JlZW5pbmcgYW5kIGludGVydmll dyBzY2hlZHVsaW5nIG9mIGhvdXJseSB3b3JrZXJzIHZpYSBhIHBob25lLgoKIkluIHRoZSBj dXJyZW50IGVjb25vbXksIGNvbXBhbmllcyBtdXN0IGRpc3Rpbmd1aXNoIHRoZWlyIHNlcnZp Y2UgdGhyb3VnaApoaWdoZXN0IHF1YWxpdHkgd29ya2VycywgYW5kIHlldCBhY2hpZXZlIGNv c3QgY29tcGV0aXRpdmUgb3BlcmF0aW9ucywiCnNhaWQgUmVlbmEgSmFkaGF2LCBjby1mb3Vu ZGVyIGFuZCBjaGllZiBtYXJrZXRpbmcgb2ZmaWNlciBvZiBPbkNhbGwKU3lzdGVtcy4gIk9u Q2FsbCBkZWxpdmVycyBvbiBib3RoIG9iamVjdGl2ZXMgYnkgcXVpY2tseSBpZGVudGlmeWlu ZyB0aGUKaGlnaGVzdCBxdWFsaXR5IHByZS1zY3JlZW5lZCBjYW5kaWRhdGVzIGFuZCBkZWNy ZWFzaW5nIGNvc3QgcGVyIGhpcmUuIgoKSG91cmx5IHdvcmtlcnMsIHdoaWNoIG1ha2UgdXAg b3ZlciA3MCUgb2YgVVMgY/GSPmkUBQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFBdQAA/ BujQQXo9IkF6PSi4ZwAU58Q8bLlq5JRQGGEIdvcAAHdvcmtlcnMsIGFyZSBtdWNoIGxlc3MK bGlrZWx5IHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBJbnRlcm5ldCwgYnV0IHRoZXkgZG8gaGF2 ZSB0ZWxlcGhvbmVzLCBNcy4KSmFkaGF2IHNhaWQuIE9uQ2FsbCBjb252ZXJ0cyB0aGUgam9i IHNlZWtlcnMgcGhvbmUgaW50byBhIHBvd2VyZnVsCnBlcnNvbmFsaXplZCBqb2Igc2VhcmNo IHRvb2wuIEZvciB0aGUgZmlyc3QgdGltZSBqb2JzZWVrZXJzIGNhbiBtYW5hZ2UKdGhlIGVu dGlyZSBwcm9jZXNzIG9mIG9idGFpbmluZyBhIGpvYiBieSBwaG9uZS4gVGhleSBhcmUgZ2l2 ZW4gYW4gYWNjb3VudAp0aHJvdWdoIHdoaWNoIHRoZXkgY2FuIGNyZWF0ZSBhbmQgdXBkYXRl IHRoZWlyIHJlc3VtZXMsIHJlY2VpdmUgcmVhbC10aW1lCmpvYiBvcGVuaW5nIGFsZXJ0cywg c3RhdHVzIHVwZGF0ZXMsIGFuZCBtYW5hZ2UgaW50ZXJ2aWV3IGFwcG9pbnRtZW50cy4KCkVt cGxveWVycyBvZiBob3VybHkgd29ya2VycyBjYW4gdHJhbnNmb3JtIHRoZWlyIHJlY3J1aXRp bmcgcHJvY2VzcyBieQpyZXBsYWNpbmcgdGhlaXIgc3RhdGljIGpvYiBob3RsaW5lIHdpdGgg T25DYWxsJ3MgYXV0b21hdGVkIGJpbGluZ3VhbAp2b2ljZSByZWNydWl0ZXIuIFRoZXkgY2Fu IGFjY29tcGxpc2ggY29zdCBlZmZlY3RpdmUgc291cmNpbmcgYnkKY29sbGVjdGluZyByZXN1 bWVzIDI0LzcgZm9yIGN1cnJlbnQgYW5kIGZ1dHVyZSBqb2Igb3BlbmluZ3MuIE5ldyBqb2IK b3BlbmluZ3MgYXJlIGF1dG9tYXRpY2FsbHkgYnJvYWRjYXN0IGJ5IHBob25lIHRvIGludGVy ZXN0ZWQgbWF0Y2hpbmcKY2FuZGlkYXRlcy4gRW1wbG95ZXJzIGNhbiBhbHNvIGFjaGlldmUg aGlnaGVyIHF1YWxpdHkgaGlyZXMgYnkKcHJlLXNjcmVlbmluZyBhbmQgc2NoZWR1bGluZyBx dWFsaWZpZWQgY2FuZGlkYXRlcyBmb3IgYW4gaW50ZXJ2aWV3IG9uIHRoZQpmaXJzdCBjYWxs IGl0c2VsZi4gVGhleSBjYW4gYWxzbyBwcm90ZWN0IGFuZCBidWlsZCB0aGVpciBicmFuZCBi eQpwcmVzZW50aW5nIGEgY29uc2lzdGVudCwgb2JqZWN0aXZlIEhSIHBlcnNvbmEuCgpPbkNh bGwncyB3ZWItYmFzZWQgc3VpdGUgZW5hYmxlcyB0aGUgaGlyaW5nIG1hbmFnZXIgdG8gYWRt aW5pc3RlciBhbmQKYXV0b21hdGUgdGhlIGVudGlyZSByZWNydWl0aW5nIHByb2Nlc3MsIGlu Y2x1ZGluZyB0aGUgcmVhbC10aW1lIHBvc3RpbmcKb2Ygam9icywgcmV2aWV3aW5nIG9mIGNh bmRpZGF0ZXMnICJ0YWxraW5nIHJlc3VtZXMsIiBhbmQgc2NoZWR1bGluZyBvZgppbnRlcnZp ZXdzLgoKT25DYWxsIHN5c3RlbXMgbGF1bmNoZXMgdGhlIGZpcnN0IHNwZWVjaC1iYXNlZCBS ZWNydWl0aW5nIHBsYXRmb3JtLzIKClRoZSBWZW5ldGlhbiwgd2hpY2ggaXMgdW52ZWlsaW5n IGEgbmV3IGPxkj7eFAUAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxQXkAAPwboz0F6PSJB ej0ouGcAFOfEQdC5auSUUBhhCE+PAABob3RlbCB0b3dlciBhbmQgZXhwYW5kZWQKY29udmVu dGlvbiBzcGFjZSBpbiBKdW5lIDIwMDMsIGhhcyBkZXBsb3llZCB0aGUgT25DYWxsIHN5c3Rl bSB0byByZWNydWl0CmFuZCBzY3JlZW4gcG90ZW50aWFsIGVtcGxveWVlcyBmb3IgdGhlIFRv d2VyIGFzIHdlbGwgYXMgZnVsZmlsbCBvbmdvaW5nCmhpcmluZyBuZWVkcy4gVGhlIGhvdGVs J3MgbWFuYWdlbWVudCBzYWlkIGl0IG5lZWRlZCBhIHNlcnZpY2UgdGhhdApkZWxpdmVyZWQg aGlnaC1wZXJmb3JtYW5jZSByZWNydWl0aW5nIGNhcGFiaWxpdGllcyB0YXJnZXRpbmcgaG91 cmx5CndvcmtlcnMsIHdoaWxlIHRoZSBodW1hbiByZXNvdXJjZXMgc3RhZmYgbmVlZGVkIGEg bW9yZSBwcmVjaXNlIHdheSB0bwppZGVudGlmeSB0aGUgYmVzdC1xdWFsaWZpZWQgY2FuZGlk YXRlcy4KCiJUaGUgVmVuZXRpYW4gcHJpZGVzIGl0c2VsZiBpbiBvZmZlcmluZyBhIHJld2Fy ZGluZywgZXhjZXB0aW9uYWwgd29yawplbnZpcm9ubWVudCBhbmQgYXMgYSByZXN1bHQsIHdl IGF0dHJhY3QgYSBsb3Qgb2YgdGFsZW50LCIgc2FpZCBEYXZlCk5ld3RvbiwgdmljZSBwcmVz aWRlbnQgb2YgaHVtYW4gcmVzb3VyY2VzIGZvciB0aGUgVmVuZXRpYW4gUmVzb3J0IEhvdGVs CkNhc2lubyBpbiBMYXMgVmVnYXMsIE5WICJPdXIgZ29hbCBpcyB0byBoYXZlIG91ciBlbXBs b3ltZW50IHBlb3BsZSBzcGVuZAp0aGVpciB0aW1lIGludGVydmlld2luZyB0aGUgbW9zdCBx dWFsaWZpZWQgY2FuZGlkYXRlcy4gT25DYWxsIGVuYWJsZXMgdXMKdG8gZG8gdGhpcyBieSBh dXRvbWF0aWNhbGx5IHByZS1zY3JlZW5pbmcgYW5kIHNjaGVkdWxpbmcgaW50ZXJ2aWV3cyB3 aXRoCnF1YWxpZmllZCBjYW5kaWRhdGVzIGZvciBvcGVuIGpvYnMuIEl0IGFsc28gYWxsb3dz IHVzIHRvIGNvbGxlY3QgcmVzdW1lcwpmb3IgZnV0dXJlIG9wZW5pbmdzLiIKCk9uQ2FsbCBo YXMgc2ltcGxpZmllZCB0aGUgZGVjaXNpb24gbWFraW5nIHByb2Nlc3MgYnkgb2ZmZXJpbmcg dGhlIHN5c3RlbQpvbiBhIHNlcnZpY2UgYnVyZWF1IG1vZGVsIHdpdGggdHVybmtleSBkZXBs b3ltZW50LCBmb3IgbW9udGhseQpzdWJzY3JpcHRpb24gZmVlcy4gQ3VzdG9taXplZCBwcml2 YXRlIGxhYmVsIGltcGxlbWVudGF0aW9ucyBhcmUgYXZhaWxhYmxlCm9uIGFuIGFubnVhbCBs aWNlbnNlIGNvbnRyYWN0LCBNcy4gSmFkaGF2IHNhaWQuCgpBYm91dCBPbkNhbGwgU3lzdGVt cywgSW5jCgpPbkNhbGwgU3lzdGVtcywgSW5jIGlzIGxvY2F0ZWQgaW4gU2FuIEpvc2UsIENh bGlmb3JuaWEuIFRoZSBjb21wYW55J3MKaW52ZXN0b3JzIGluY2x1ZGUgTW9zYWljIFZlbnR1 cmUgUGFydG5lcnMsIFRoZSBCYW5kIG9mIEFuZ2VscyBhbmQgU2FiZWVyCkJoYXRpYSwgZm9j 8ZI+m44FADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouZFAAH0GRwBBej0oQXo9IgAUuGe5 auSU58RB0FAQ/Vw1KQAAY/GSPrCQBQBPAgAATwIAAAACs50B5AAH6QoWXAgARQACQVBfQAA/ BuwZQXo9IkF6PSi4ZwAU58RHNLlq5JRQGWEITsgAAHVuZGVyIG9mIEhvdG1haWwuY29tLiBG b3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgdmlzaXQKd3d3Lm9uY2FsbHN5c3RlbXMuY29t LgoKU09VUkNFIE9uQ2FsbCBTeXN0ZW1zLCBJbmMKCkxpc2EgS2VsYWl0YSwgbGtlbGFpdGFA dmNwci5jb20sIG9yIEthdGhsZWVuIEdpbGxlcywKa2dpbGxlc0B2Y3ByLmNvbSwgYm90aCBv ZiBWQ1BSLCBpbmMgLCArMS02NTAtMzQwLTY3NjYsIGZvciBPbkNhbGwgU3lzdGVtcywKSW5j IDsgb3IgUmVlbmEgSmFkaGF2IG9mIE9uQ2FsbCBTeXN0ZW1zLCBJbmMgLCArMS00MTUtNTA1 LTUwNzcsIG9yCnJlZW5hQG9uY2FsbHN5c3RlbXMuY29tCgpodHRwOi8vd3d3Lm9uY2FsbHN5 c3RlbXMuY29tCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBjYWxpZm9ybmlhCiAgICBj b250cmFjdAogICAgZWNvbm9teQogICAgZW1wbG95bWVudAogICAgZW52aXJvbm1lbnQKICAg IGhvdGVsCiAgICBodW1hbityZXNvdXJjZXMKICAgIHByZXNpZGVudAogICAgc3Vic2NyaXB0 aW9uCiAgICB0ZWNobm9sb2d5CiAgICB3ZWIKCmPxkj6+1wUANgAAADYAAAAAB+kKFlwAArOd AeQIAEUAACi5kkAAfQZG/0F6PShBej0iABS4Z7lq5JTnxElOUBD9XC2rAABj8ZI+5OgFADYA AAA2AAAAAAfpChZcAAKznQHkCABFAAAouZNAAH0GRv5Bej0oQXo9IgAUuGe5auSU58RJTlAR /VwtqgAAY/GSPhnqBQA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFBgQAA/Bu4xQXo9IkF6 PSi4ZwAU58RJTrlq5JVQEGEIyf4AAAAAAAAAAGPxkj5UUAYAPAAAADwAAAAAArOdAeQAB+kK FlwIAEUAAChQYUAAPwbuMEF6PSJBej0ot20AFd36TbS5yCVKUBBhCI9JAAAAAAAAAABj8ZI+ 8YgGAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuZRAAH0GRuVBej0oQXo9IgAVt225yCVK 3fpNtFAY+oYmtQAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KY/GSPkCSBgBQAAAAUAAAAAAC s50B5AAH6QoWXAgARQAAQlBiQAA/Bu4VQXo9IkF6PSi3bQAV3fpNtLnIJWJQGGEIfjIAAERF TEUgMzYxOTk5OTYub3V0LjAzMDQwOA0KY/GSPm3PBgB8AAAAfAAAAAAH6QoWXAACs50B5AgA RQAAbrmVQAB9Bka2QXo9KEF6PSIAFbdtucglYt36Tc5QGPpsbJEAADU1MCAzNjE5OTk5Ni5v dXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4g DQpj8ZI+pdsGAFEAAABRAAAAAAKznQHkAAfpChZcCABFAABDUGNAAD8G7hNBej0iQXo9KLdt ABXd+k3OucglqFAYYQjIFwAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDEwNA0KY/GSPpwVBwBU AAAAVAAAAAAH6QoWXAACs50B5AgARQAARrmWQAB9BkbdQXo9KEF6PSIAFbdtucglqN36TelQ GPpQOGAAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCmPxkj4MGQcAUAAAAFAAAAAA ArOdAeQAB+kKFlwIAEUAAEJQZEAAPwbuE0F6PSJBej0ot20AFd36Tem5yCXGUBhhCGt9AABT VE9SIDM2MTk5OTk2Lm91dC4wMzA0MDgNCmPxkj5XVgcAeAAAAHgAAAAAB+kKFlwAArOdAeQI AEUAAGq5l0AAfQZGuEF6PShBej0iABW3bbnIJcbd+k4DUBj6NvZTAAAxNTAgT3BlbmluZyBC SU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MTk5OTk2Lm91dC4wMzA0MDguDQpj 8ZI+QVcHAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuZhAAH0GRvFBej0oQXo9IgAUuGhq HJgcAAAAAHAC+vDQigAAAgQFZAEBBAJj8ZI+0lgHAD4AAAA+AAAAAAKznQHkAAfpChZcCABF AAAwUGVAAD8G7iRBej0iQXo9KLhoABTnx3peahyYHXASYQgH7AAAAQEEAgIEBbRj8ZI+hJAH ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouZlAAH0GRvhBej0oQXo9IgAUuGhqHJgd58d6 X1AQ/VyYWwAAY/GSPtWWBwBiAwAAYgMAAAACs50B5AAH6QoWXAgARQADVFBmQAA/Bur/QXo9 IkF6PSi4aAAU58d6X2ocmB1QGGEIZv4AAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc0MTUg TU49MzYxOTk5OTYub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQ Rk49IkZUIEluZm9ybWF0aW9uIChFVVIpIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUu Li4gIEV4cGFuc2lvbjogV2FuYWRvbyBFc3BhbmEgc2lnbnMgYWdyZWVtZW50IHdpdGggR3J1 cG8gSGFjaGV0dGUgRmlsaXBhY2NoaQoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpE YXRlTGluZS4uLiAgQXByIDIsIDIwMDMsIChFeHBhbnNpb24gL0ZUIEluZm9ybWF0aW9uIHZp YSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6 IEZpbmFuY2lhbCBUaW1lcyBJbmZvcm1hdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4u LgoKCkZUIEluZm9ybWF0aW9uIChFVVIpCgpXYW5hZG9vIEVzcGFuYSwgdGhlIFNwYW5pc2gg c3Vic2lkaWFyeSBvZiBGcmVuY2ggaW50ZXJuZXQgc2VydmljZQpwcm92aWRlciBXYW5hZG9v LCBoYXMgc2lnbmVkIGFuIGFncmVlbWVudCB3aXRoIHRoZSBTcGFuaXNoIHN1YnNpZGlhcnkg b2YKSGFjaGV0dGUgRmlsaXBhY2NoaSwgdGhlIEZyZW5jaCBwdWJsaXNoaW5nIGdyb3VwLCBh cyBwYXJ0IG9mIHdoaWNoIGl0CndpbGwgZGV2ZWxvcCBvbmxpbmUgdmVyc2lvbnMgb2YgdGhl IGxhdHRlcidzIHB1YmxpY2F0aW9ucyBpbiBTcGFpbi4KCkFic3RyYWN0ZWQgZnJvbSBFeHBh bnNpb24KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGV4cGFuc2lvbgogICAgb25saW5l CiAgICBwdWJsaXNoaW5nCiAgICBzcGFpbgoKY/GSPtaWBwA8AAAAPAAAAAACs50B5AAH6QoW XAgARQAAKFBnQAA/Bu4qQXo9IkF6PSi4aAAU58d9i2ocmB1QEWEIMYMAAAAAAAAAAGPxkj47 5QcANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5mkAAfQZG90F6PShBej0iABS4aGocmB3n x32MUBD6MJhaAABj8ZI+yu8HADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouZtAAH0GRvZB ej0oQXo9IgAUuGhqHJgd58d9jFAR+jCYWQAAY/GSPjPxBwA8AAAAPAAAAAACs50B5AAH6QoW XAgARQAAKFBoQAA/Bu4pQXo9IkF6PSi4aAAU58d9jGocmB5QEGEIMYIAAAAAAAAAAGPxkj5a wQgAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQaUAAPwbuKEF6PSJBej0ot20AFd36TgO5 yCYIUBBhCI48AAAAAAAAAABj8ZI+AvoIAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuZxA AH0GRt1Bej0oQXo9IgAVt225yCYI3fpOA1AY+jYl+AAAMjI2IFRyYW5zZmVyIGNvbXBsZXRl Lg0KY/GSPnYCCQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlBqQAA/Bu4NQXo9IkF6PSi3 bQAV3fpOA7nIJiBQGGEIfCUAAERFTEUgMzYxOTk5OTcub3V0LjAzMDQwOA0KY/GSPn4/CQB8 AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrmdQAB9BkauQXo9KEF6PSIAFbdtucgmIN36Th1Q GPoca9MAADU1MCAzNjE5OTk5Ny5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5k IHRoZSBmaWxlIHNwZWNpZmllZC4gDQpj8ZI+pUsJAFEAAABRAAAAAAKznQHkAAfpChZcCABF AABDUGtAAD8G7gtBej0iQXo9KLdtABXd+k4ducgmZlAYYQjGCgAAUE9SVCA2NSwxMjIsNjEs MzQsMTg0LDEwNQ0KY/GSPouFCQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrmeQAB9BkbV QXo9KEF6PSIAFbdtucgmZt36TjhQGPoAN6MAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1 bC4NCmPxkj6jiAkAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQbEAAPwbuC0F6PSJBej0o t20AFd36Tji5yCaEUBhhCGlwAABTVE9SIDM2MTk5OTk3Lm91dC4wMzA0MDgNCmPxkj5mxQkA eAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq5n0AAfQZGsEF6PShBej0iABW3bbnIJoTd+k5S UBj55vWVAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2 MTk5OTk3Lm91dC4wMzA0MDguDQpj8ZI+TcYJAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAw uaBAAH0GRulBej0oQXo9IgAUuGmwNJnQAAAAAHAC+vCIvQAAAgQFZAEBBAJj8ZI+/McJAD4A AAA+AAAAAAKznQHkAAfpChZcCABFAAAwUG1AAD8G7hxBej0iQXo9KLhpABTnyFBCsDSZ0XAS YQjqOQAAAQEEAgIEBbRj8ZI+o/8JADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouaFAAH0G RvBBej0oQXo9IgAUuGmwNJnR58hQQ1AQ/Vx6qQAAY/GSPpkGCgBhBAAAYQQAAAACs50B5AAH 6QoWXAgARQAEU1BuQAA/Bun4QXo9IkF6PSi4aQAU58hQQ7A0mdFQGGEIZ44AAFhZWlpZLi4u ICBUQz0yIFRNPTEwNDk4MTc0MTYgTU49MzYxOTk5OTcub3V0IFNSQz1jb210ZXggUEZOPSJD b210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4uLiAJIAoK CkhlYWRMaW5lLi4uICBQQVJUUyBLSVQsIFZBTFZFCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoK Li4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKEZlZEJpek9wcHMgdmlhIENPTVRF WCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKGMpIDIwMDMgRmVk ZXJhbCBJbmZvcm1hdGlvbiAmIE5ld3MgRGlzcGF0Y2gsIEluYy4KCgouLi4KCgpGZWRCaXpP cHMKCk5PVElDRSBUWVBFOiBDT05UUkFDVCBBV0FSRAoKU09VUkNFOiBQdWJsaXNoZWQgaW4g RmVkQml6T3BwcwoKREFURSBQT1NURUQ6IDA3LUFQUi0wMwoKT0ZGSUNFIEFERFJFU1M6IERF RkVOU0UgR0VORVJBTCBTVVBQTFkgQ0VOVEVSIDgwMDAgSkVGRiBEQVZJUyBIV1kKUklDSE1P TkQsIFZBIDIzMjk3LTUzIDEyCgpDTEFTU0lGSUNBVElPTiBDT0RFOiAxNiAtIEFpcmNyYWZ0 IGNvbXBvbmVudHMgJiBhY2Nlc3NvcmllcwoKU1VCSkVDVDogUEFSVFMgS0lULCBWQUxWRQoK U09MSUNJVEFUSU9OIE5VTUJFUjogMDNUQkU3LTgyLVAtMDQwMAoKQVdBUkQgTlVNQkVSOiBT UDA0NzAtMDMtTS1CSjk0CgpBV0FSRCBBTU9VTlQ6ICQzMSwyNzgKCkxJTkUgTlVNQkVSOiAw MDAxCgpBV0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQgVE86IENBUkxFVE9OIFRFQ0hOT0xP R0lFUyBJTkMgMTAgQ09CSEFNIERSSVZFIE9SQ0hBUkQgUEFSSyBOWQoxNDEyNwoKQVJDSElW RSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFDVDogTi9BCgpJTlRFUk5FVCBBRERSRVNTOgpodHRw Oi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJkcy9TUDA0NzAtMDMtTS1CSjk0 TG4wMDAxLmh0bWwKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGFpcmNyYWZ0CiAgICBj b250cmFjdAogICAgZGVmZW5zZQogICAgaW50ZXJuZXQKICAgIG5ld195b3JrCiAgICBvcmNo YXJkCiAgICB0ZWNobm9sb2d5CiAgICB2aXJnaW5pYQoKY/GSPpoGCgA8AAAAPAAAAAACs50B 5AAH6QoWXAgARQAAKFBvQAA/Bu4iQXo9IkF6PSi4aQAU58hUbrA0mdFQEWEIEtIAAAAAAAAA AGPxkj74WwoANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5okAAfQZG70F6PShBej0iABS4 abA0mdHnyFRvUBD5MXqoAABj8ZI+yGYKADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouaNA AH0GRu5Bej0oQXo9IgAUuGmwNJnR58hUb1AR+TF6pwAAY/GSPiNoCgA8AAAAPAAAAAACs50B 5AAH6QoWXAgARQAAKFBwQAA/Bu4hQXo9IkF6PSi4aQAU58hUb7A0mdJQEGEIEtEAAAAAAAAA AGPxkj5dMgsAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQcUAAPwbuIEF6PSJBej0ot20A Fd36TlK5yCbGUBBhCI0vAAAAAAAAAABj8ZI+TGsLAE4AAABOAAAAAAfpChZcAAKznQHkCABF AABAuaRAAH0GRtVBej0oQXo9IgAVt225yCbG3fpOUlAY+eYlOwAAMjI2IFRyYW5zZmVyIGNv bXBsZXRlLg0KY/GSPuByCwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlByQAA/Bu4FQXo9 IkF6PSi3bQAV3fpOUrnIJt5QGGEIehgAAERFTEUgMzYxOTk5OTgub3V0LjAzMDQwOA0KY/GS PrivCwB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrmlQAB9BkamQXo9KEF6PSIAFbdtucgm 3t36TmxQGPnMaxUAADU1MCAzNjE5OTk5OC5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5v dCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQpj8ZI+UbsLAFEAAABRAAAAAAKznQHkAAfp ChZcCABFAABDUHNAAD8G7gNBej0iQXo9KLdtABXd+k5sucgnJFAYYQjD/QAAUE9SVCA2NSwx MjIsNjEsMzQsMTg0LDEwNg0KY/GSPt71CwBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrmm QAB9BkbNQXo9KEF6PSIAFbdtucgnJN36TodQGPmwNuYAADIwMCBQT1JUIGNvbW1hbmQgc3Vj Y2Vzc2Z1bC4NCmPxkj47+QsAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQdEAAPwbuA0F6 PSJBej0ot20AFd36Toe5yCdCUBhhCGdjAABTVE9SIDM2MTk5OTk4Lm91dC4wMzA0MDgNCmPx kj6ONgwAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq5p0AAfQZGqEF6PShBej0iABW3bbnI J0Ld+k6hUBj5lvTXAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24g Zm9yIDM2MTk5OTk4Lm91dC4wMzA0MDguDQpj8ZI+dzcMAD4AAAA+AAAAAAfpChZcAAKznQHk CABFAAAwuahAAH0GRuFBej0oQXo9IgAUuGq6s9oNAAAAAHAC+vA+AAAAAgQFZAEBBAJj8ZI+ BzkMAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUHVAAD8G7hRBej0iQXo9KLhqABTnyu+s urPaDnASYQgAEAAAAQEEAgIEBbRj8ZI+4HAMADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo ualAAH0GRuhBej0oQXo9IgAUuGq6s9oO58rvrVAQ/VyQfwAAY/GSPpV4DACaBQAAmgUAAAAC s50B5AAH6QoWXAgARQAFjFB2QAA/Bui3QXo9IkF6PSi4agAU58rvrbqz2g5QEGEIahUAAFhZ WlpZLi4uICBUQz0yIFRNPTEwNDk4MTc0MTYgTU49MzYxOTk5OTgub3V0IFNSQz1jb210ZXgg UEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVyRG93Sm9uZXMiIAoKLi4uICAK CgouLi4gCSAKCgpIZWFkTGluZS4uLiAgR1dTIFdlYXRoZXIgU3RhdGlzdGljcyA6IERhaWx5 IEdsb2JhbCBPaWxzZWVkcyAtIEFwciAwOAoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAg CgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChPREogdmlhIENPTVRFWCkgLS0KCgoKLi4u CgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRvd0pvbmVzIENvbW1v ZGl0eSBOZXdzIChPREopLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCk9zdGVyRG93 Sm9uZXMKClJlcG9ydCBwZXJpb2QgQXByIDA4IDIwMDMgdGhyb3VnaCBBcHIgMDggMjAwMyBQ cmVjaXBpdGF0aW9uIGluCm1pbGxpbWV0ZXJzLCB0ZW1wZXJhdHVyZSBpbiBDZWxzaXVzLiAo MC4wNCBpbmNoPTEgbWlsbGltZXRlcjsKRmFocmVuaGVpdD1DZWxzaXVzIHRpbWVzIDEuOCwg cGx1cyAzMikKCiAgICAgICAgICAgICAgICAgICAgICBBVkcgIE1PU1QgIFBDVCAgQVZHICBB VkcgIEhTVCAgTFNUICBBVkcgIFNOT1cKICBMT0NBVElPTiAgICAgICAgICAgUENQTiAgUENQ TiAgQ1ZHIEhJR0ggIExPVyBISUdIICBMT1cgIFRNUCAgRFBUSAoKUGVhbnV0cyBOb3J0aGVy biBIZW1pc3BoZXJlCiAgQ2hpbmEgTkUgQ29hc3QgICAgICAgIDEgICAgIDYgICAxNSAgIDE3 ICAgMTEgICAyMSAgICA2ICAgMTMgICAgIDAKICBDaGluYSBTRSBDb2FzdCAgICAgICAgMiAg ICAgNiAgIDM2ICAgMTggICAxMiAgIDIyICAgMTEgICAxNSAgICAgMAogIE4gSW5kaWEgICAg ICAgICAgICAgICAwICAgICAwICAgLS0gICAzOCAgIDI0ICAgNDIgICAxOSAgIDMxICAgICAw CiAgUyBJbmRpYSAgICAgICAgICAgICAgIDEgICAgIDggICAyMCAgIDM2ICAgMjMgICAzOCAg IDE5ICAgMzAgICAgIDAKICBVUyBNaWQtQXRsYW50aWMgICAgICAzMSAgICA0NCAgMTAwICAg MTEgICAgOCAgIDIwICAgIDQgICAgOSAgICAgMAogIFVTIFNvdXRoZWFzdCAgICAgICAgIDMy ICAgIDQ4ICAgODAgICAyNSAgIDE3ICAgMjkgICAxMyAgIDIxICAgICAwCiAgVVMgVGV4YXMv T2tsYSAgICAgICAgIDAgICAgIDAgICAtLSAgIDIxICAgIDcgICAyOSAgICAyICAgMTQgICAg IDAKClN1bmZsb3dlcnMgTm9ydGhlcm4gSGVtaXNwaGVyZQogIEJ1bGdhcmlhICAgICAgICAg ICAgICA3ICAgIDEyICAgODUgICAgMyAgIC0zICAgIDQgICAtOCAgICAwICAgICA3CiAgQ2Fu YWRhICAgICAgICAgICAgICAgIDAgICAgIDEgICAxMCAgICA4ICAgLTEgICAgOSAgIC0yICAg IDQgICAgIDAKICBDSVMgRSBCbGFjayBTb2lsIGPxkj4VeQwAmgUAAJoFAAAAArOdAeQAB+kK FlwIAEUABYxQd0AAPwbotkF6PSJBej0ouGoAFOfK9RG6s9oOUBhhCOUlAAAgICAgIDEgICAg IDEgICAxNiAgICA2ICAgIDAgICAgOCAgIC0xICAgIDMgICAgIDAKICBDSVMgVyBCbGFjayBT b2lsICAgICAgMiAgICAgNSAgIDgwICAgIDIgICAtMSAgICA2ICAgLTIgICAgMSAgICAxMgog IENJUyBFIFVrcmFpbmUgICAgICAgICAyICAgICA4ICAgMTYgICAgNyAgICAyICAgMTAgICAt MSAgICA0ICAgICAwCiAgQ0lTIE5DIFVrcmFpbmUgICAgICAgIDQgICAgMTIgICA3MiAgICAy ICAgLTIgICAgNiAgIC0zICAgIDAgICAgIDcKICBDSVMgTkUgVWtyYWluZSAgICAgICAgMyAg ICAgNyAgIDc1ICAgIDMgICAgMCAgICA4ICAgLTIgICAgMiAgICAgOAogIENJUyBTIFVrcmFp bmUgICAgICAgICA1ICAgIDE1ICAgNTAgICAgOCAgICAzICAgMTEgICAtMSAgICA1ICAgICAy CiAgQ0lTIEtyYXNub2RhciAgICAgICAgIDAgICAgIDAgICAtLSAgIDEyICAgIDQgICAxNCAg ICAyICAgIDcgICAgIDAKICBDSVMgTG93ZXIgVm9sZ2EgICAgICAgMCAgICAgMSAgIDE0ICAg MTIgICAgNCAgIDE0ICAgIDIgICAgOCAgICAgMAogIENJUyBNaWRkbGUgVm9sZ2EgICAgICAw ICAgICAxICAgMTQgICAgNyAgICAwICAgMTQgICAtNCAgICA0ICAgICAwCiAgQ0lTIE5FIENh dWNhc3VzICAgICAgIDAgICAgIDEgICAtLSAgIDE0ICAgIDMgICAxNyAgICAyICAgIDggICAg IDAKICBVUyBOQyBTdGF0ZXMgICAgICAgICAgMCAgICAgMCAgIC0tICAgMTAgICAtMyAgIDIx ICAgLTkgICAgMyAgICAgMAogIFJvbWFuaWEgICAgICAgICAgICAgICAyICAgICA5ICAgMzMg ICAgNSAgIC0yICAgIDcgICAtNCAgICAxICAgICAxCgpTdW5mbG93ZXJzIFNvdXRoZXJuIEhl bWlzcGhlcmUKICBBcmdlbnRpbmEgICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMjcgICAx NCAgIDI4ICAgMTIgICAyMCAgICAgMAoKUGFsbSBPaWwKICBFYXN0IE1hbGF5c2lhICAgICAg ICAgMiAgICAxMCAgIDQwICAgMzMgICAyNSAgIDM0ICAgMjMgICAyOSAgICAgMAogIFdlc3Qg TWFsYXlzaWEgICAgICAgICA2ICAgIDIxICAgMzMgICAzMyAgIDI0ICAgMzQgICAyNCAgIDI5 ICAgICAwCgpDb3ByYQogIE1hbGF5c2lhIChFYXN0ZXJuKSAgICAwICAgICAxICAgLS0gICAz MiAgIDI0ICAgMzIgICAyNCAgIDI4ICAgICAwCiAgUGhpbGlwcGluZXMgICAgICAgICAgIDAg ICAgIDAgICAtLSAgIDI0ICAgMTEgICAyNyAgICA3ICAgMTggICAgIDAKClJhcGVzZWVkcyBO b3J0aGVybiBIZW1pc3BoZXJlCiAgQ2hpbmEgICAgICAgICAgICAgICAgIDEgICAgIDYgICAy NSAgIDE4ICAgMTEgICAyNCAgICA2ICAgMTUgICAgIDAKICBJbmRpYSBHYW5nZXMgUGxhaW4g ICAgMCAgICAgMCAgIC0tICAgMzYgICAyMCAgIDM4ICAgMTkgICAyOCAgICAgMAogIENhbmFk YSAgICAgICAgICAgICAgICAxICBj8ZI+WHkMANQCAADUAgAAAAKznQHkAAfpChZcCABFAALG UHhAAD8G63tBej0iQXo9KLhqABTnyvp1urPaDlAYYQh2NAAAICAgOCAgIDEwICAgIDcgICAt MSAgIDEzICAgLTMgICAgMyAgICAgMAogIEVhc3Rlcm4gR2VybWFueSAgICAgICAwICAgICAw ICAgLS0gICAgMyAgIC00ICAgIDMgICAtNiAgICAwICAgICAwCiAgRnJhbmNlICAgICAgICAg ICAgICAgIDAgICAgIDAgICAtLSAgICA5ICAgLTIgICAxMyAgIC02ICAgIDQgICAgIDAKICBQ b2xhbmQgICAgICAgICAgICAgICAgMSAgICAgMyAgIDI3ICAgIDEgICAtMyAgICAzICAgLTUg ICAtMSAgICAgMgoKVGVsOiAoOTEzKTMyMi01MTgxCgpHV1Mgd2ViIHNpdGU6IGh0dHA6Ly93 d3cuZ2xvYmFsd2VhdGhlcnNlcnZpY2VzLmNvbSAyMDAzLTA0LTA4IDE1OjU1OjQwCgpTZW5k IGNvbW1lbnRzIHRvOiBnd3NtYWlsQGdsb2JhbHdlYXRoZXJzZXJ2aWNlcy5jb20KCi4uLiAg CSAKCktleVdvcmRzLi4uICAKICAgIGFyZ2VudGluYQogICAgYnVsZ2FyaWEKICAgIGNhbmFk YQogICAgY2hpbmEKICAgIGNpcwogICAgZnJhbmNlCiAgICBnZXJtYW55CiAgICBpbmRpYQog ICAgbWFsYXlzaWEKICAgIG5vcnRoK2Nhcm9saW5hCiAgICBwaGlsaXBwaW5lcwogICAgcG9s YW5kCiAgICByb21hbmlhCiAgICBzdGF0aXN0aWNzCiAgICB1a3JhaW5lCiAgICB3ZWF0aGVy CiAgICB3ZWIKICAgIFdFQVRIRVJPcmlnaW4gQXNzaWduZWRCeT0iT3N0ZXJEb3dKb25lcyIg Lz4KCmPxkj5aeQwAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQeUAAPwbuGEF6PSJBej0o uGoAFOfK/RO6s9oOUBFhCB9tAAAAAAAAAABj8ZI+/PMMADYAAAA2AAAAAAfpChZcAAKznQHk CABFAAAouapAAH0GRudBej0oQXo9IgAUuGq6s9oO58r6dVAQ/VyFtwAAY/GSPlD/DAA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLmrQAB9BkbmQXo9KEF6PSIAFLhqurPaDufK/RRQEPq+ hbYAAGPxkj5JDg0ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5rEAAfQZG5UF6PShBej0i ABS4arqz2g7nyv0UUBH6voW1AABj8ZI+ZQ8NADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo UHpAAD8G7hdBej0iQXo9KLhqABTnyv0UurPaD1AQYQgfbAAAAAAAAAAAY/GSPlujDQA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKFB7QAA/Bu4WQXo9IkF6PSi3bQAV3fpOobnIJ4RQEGEI jCIAAAAAAAAAAGPxkj483A0ATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC5rUAAfQZGzEF6 PShBej0iABW3bbnIJ4Td+k6hUBj5liR+AAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQpj8ZI+ EOMNAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUHxAAD8G7ftBej0iQXo9KLdtABXd+k6h ucgnnFAYYQiTHAAAREVMRSAzNjIwMDAwMC5vdXQuMDMwNDA4DQpj8ZI++h8OAHwAAAB8AAAA AAfpChZcAAKznQHkCABFAABuua5AAH0GRp1Bej0oQXo9IgAVt225yCec3fpOu1AY+Xx7cgAA NTUwIDM2MjAwMDAwLm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZp bGUgc3BlY2lmaWVkLiANCmPxkj5rKw4AUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENQfUAA Pwbt+UF6PSJBej0ot20AFd36Tru5yCfiUBhhCMHwAABQT1JUIDY1LDEyMiw2MSwzNCwxODQs MTA3DQpj8ZI+/GUOAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGua9AAH0GRsRBej0oQXo9 IgAVt225yCfi3fpO1lAY+WA2KQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KY/GS PlJpDgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlB+QAA/Bu35QXo9IkF6PSi3bQAV3fpO 1rnIKABQGGEIgGcAAFNUT1IgMzYyMDAwMDAub3V0LjAzMDQwOA0KY/GSPvKnDgB4AAAAeAAA AAAH6QoWXAACs50B5AgARQAAarmwQAB9BkafQXo9KEF6PSIAFbdtucgoAN36TvBQGPlGBTUA ADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwMDAu b3V0LjAzMDQwOC4NCmPxkj5TqQ4APgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC5sUAAfQZG 2EF6PShBej0iABS4a1oCHtYAAAAAcAL68FnoAAACBAVkAQEEAmPxkj4eqw4APgAAAD4AAAAA ArOdAeQAB+kKFlwIAEUAADBQf0AAPwbuCkF6PSJBej0ouGsAFOfNEpNaAh7XcBJhCPkOAAAB AQQCAgQFtGPxkj7s4g4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5skAAfQZG30F6PShB ej0iABS4a1oCHtfnzRKUUBD9XIl+AABj8ZI+feoOAJoFAACaBQAAAAKznQHkAAfpChZcCABF AAWMUIBAAD8G6K1Bej0iQXo9KLhrABTnzRKUWgIe11AQYQhXiQAAWFlaWlkuLi4gIFRDPTIg VE09MTA0OTgxNzQxNyBNTj0zNjIwMDAwMC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIg UEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRpb24gKEVVUikiIAoKLi4uICAKCgouLi4g CSAKCgpIZWFkTGluZS4uLiAgRXhwYW5zaW9uOiBUZWxlZm9uaWNhIE1vdmlsZXMgZmFpbHMg dG8gcHVibGlzaCBpbmRpdmlkdWFsIHNhbGFyaWVzIG9mIGl0cyBleGVjdXRpdmVzCgouLi4g IAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMiwgMjAwMywgKEV4 cGFuc2lvbiAvRlQgSW5mb3JtYXRpb24gdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmln aHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMzogRmluYW5jaWFsIFRpbWVzIEluZm9ybWF0aW9u LiBBbGwgcmlnaHRzIHJlc2VydmVkCgoKLi4uCgoKRlQgSW5mb3JtYXRpb24gKEVVUikKCkEg cmVwb3J0IHB1Ymxpc2hlZCBieSBUZWxlZm9uaWNhIE1vdmlsZXMsIFNwYWluJ3MgbGVhZGlu ZyBtb2JpbGUKdGVsZXBob25lIG9wZXJhdG9yLCBoYXMgZmFpbGVkIHRvIGluZm9ybSBzaGFy ZWhvbGRlcnMgcmVnYXJkaW5nIHRoZQppbmRpdmlkdWFsIHNhbGFyaWVzIG9mIHRoZSBjb21w YW55J3MgMTIgYm9hcmQgbWVtYmVycyBpbiAyMDAyLCBhbHRob3VnaAp0aGUgc3Vic2lkaWFy eSBvZiBUZWxlZm9uaWNhLCBTcGFpbidzIGZvcm1lciB0ZWxlY29tbXVuaWNhdGlvbnMgbW9u b3BvbHksCnN0cmVzc2VkIHRoYXQgdGhlIHB1YmxpY2F0aW9uIG9mIGV4ZWN1dGl2ZXMnIHNh bGFyaWVzIHdhcyBhIGtleSBpc3N1ZSBvZgppdHMgY29ycG9yYXRlIGdvdmVybmFuY2Ugc3Rh bmRhcmRzLgoKVGhlIGNvbXBhbnkncyBib2FyZCBtZW1iZXJzIHJlY2VpdmVkIHRvdGFsIHNh bGFyaWVzIG9mIHJvdWdobHkgMi42bSBldXJvcwpsYXN0IHllYXIuIFRoZSBmaWd1cmUgaW5j bHVkZXMgYmFzaWMgc2FsYXJpZXMgb2YgYXBwcm94aW1hdGVseSAxbSBldXJvcwpvciA5MCwx NTEgZXVyb3MgcGVyIGJvYXJkIG1lbWJlciwgYm9udXMgcGF5bWVudHMgZm9yIG1lbWJlcnNo aXAgb2YKdmFyaW91cyBleGVjdXRpdmUgY29tbWl0dGVlcyBhbmQgb3RoZXIgZmFjdG9ycy4g U2hhcmVob2xkZXJzIGhhdmUKYXBwcm92ZWQgdGhlIGludHJvZHVjdGlvbiBvZiBhIG1heGlt dW0gYmFzaWMgc2FsYXJ5IG9mIDJtIGV1cm9zIGZvciBhbGwKZXhlY3V0aXZlcyB0YWtlbiB0 b2dldGhlciwgd2hpY2ggaXMgdmlydHVhbGx5IHR3aWNlIGFzIG11Y2ggYXMgYm9hcmQKbWVt YmVycyByZWNlaXZlZCBsYXN0IHllYXIuIFRoZSBhcHBvaW50bWVudCBvZiBGZXJuYW5kbyBk ZSBBbG1hbnNhIGFuZApBbGVqYW5kcm8gQnVyaWxsbyBpbmNyZWFzZXMgdGhlIG51bWJlciBv ZiBib2FyZCBtZW1iZXJzY/GSPn7qDgDYAAAA2AAAAAACs50B5AAH6QoWXAgARQAAylCBQAA/ Bu1uQXo9IkF6PSi4awAU580X+FoCHtdQGGEIt1kAACB0byAxNC4KCkFic3RyYWN0ZWQgZnJv bSBFeHBhbnNpb24KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGNvcnBvcmF0ZQogICAg ZXhlY3V0aXZlCiAgICBleHBhbnNpb24KICAgIHNhbGFyaWVzCiAgICBzcGFpbgogICAgc3Rh bmRhcmRzCiAgICB0ZWxlY29tbXVuaWNhdGlvbnMKCmPxkj5/6g4APAAAADwAAAAAArOdAeQA B+kKFlwIAEUAAChQgkAAPwbuD0F6PSJBej0ouGsAFOfNGJpaAh7XUBFhCB/MAAAAAAAAAABk 8ZI+igYAADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoubNAAH0GRt5Bej0oQXo9IgAUuGta Ah7X580Ym1AQ/VyDdwAAZPGSPokSAAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLm0QAB9 BkbdQXo9KEF6PSIAFLhrWgIe1+fNGJtQEf1cg3YAAGTxkj7nEwAAPAAAADwAAAAAArOdAeQA B+kKFlwIAEUAAChQg0AAPwbuDkF6PSJBej0ouGsAFOfNGJtaAh7YUBBhCB/LAAAAAAAAAABk 8ZI+ItIAADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUIRAAD8G7g1Bej0iQXo9KLdtABXd +k7wucgoQlAQYQiLFQAAAAAAAAAAZPGSPhsKAQBOAAAATgAAAAAH6QoWXAACs50B5AgARQAA QLm1QAB9BkbEQXo9KEF6PSIAFbdtucgoQt36TvBQGPlGI8EAADIyNiBUcmFuc2ZlciBjb21w bGV0ZS4NCmTxkj5JEQEAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQhUAAPwbt8kF6PSJB ej0ot20AFd36TvC5yChaUBhhCJEPAABERUxFIDM2MjAwMDAxLm91dC4wMzA0MDgNCmTxkj77 TgEAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG65tkAAfQZGlUF6PShBej0iABW3bbnIKFrd +k8KUBj5LHq0AAA1NTAgMzYyMDAwMDEub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3Qg ZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KZPGSPkhaAQBRAAAAUQAAAAACs50B5AAH6QoW XAgARQAAQ1CGQAA/Bu3wQXo9IkF6PSi3bQAV3fpPCrnIKKBQGGEIv+MAAFBPUlQgNjUsMTIy LDYxLDM0LDE4NCwxMDgNCmTxkj77lAEAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa5t0AA fQZGvEF6PShBej0iABW3bbnIKKDd+k8lUBj5EDVsAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nl c3NmdWwuDQpk8ZI+LpgBAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUIdAAD8G7fBBej0i QXo9KLdtABXd+k8lucgovlAYYQh+WgAAU1RPUiAzNjIwMDAwMS5vdXQuMDMwNDA4DQpk8ZI+ t9UBAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqubhAAH0GRpdBej0oQXo9IgAVt225yCi+ 3fpPP1AY+PYEdwAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZv ciAzNjIwMDAwMS5vdXQuMDMwNDA4Lg0KZPGSPqvWAQA+AAAAPgAAAAAH6QoWXAACs50B5AgA RQAAMLm5QAB9BkbQQXo9KEF6PSIAFLhsXLqffQAAAABwAvrw1ocAAAIEBWQBAQQCZPGSPvnX AQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFCIQAA/Bu4BQXo9IkF6PSi4bAAU59GIuVy6 n35wEmEI/4MAAAEBBAICBAW0ZPGSPtcPAgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLm6 QAB9BkbXQXo9KEF6PSIAFLhsXLqffufRiLpQEP1cj/MAAGTxkj58FwIAmgUAAJoFAAAAArOd AeQAB+kKFlwIAEUABYxQiUAAPwbopEF6PSJBej0ouGwAFOfRiLpcup9+UBBhCBa0AABYWVpa WS4uLiAgVEM9MiBUTT0xMDQ5ODE3NDE4IE1OPTM2MjAwMDAxLm91dCBTUkM9Y29tdGV4IFBG Tj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJPc3RlckRvd0pvbmVzIiAKCi4uLiAgCgoK Li4uIAkgCgoKSGVhZExpbmUuLi4gIEdXUyBXZWF0aGVyIFN0YXRpc3RpY3MgOiBEYWlseSBH bG9iYWwgUmljZSAtIEFwciAwOAoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRl TGluZS4uLiAgQXByIDA4LCAyMDAzIChPREogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5 cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0eSBO ZXdzIChPREopLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9uZXMK ClJlcG9ydCBwZXJpb2QgQXByIDA4IDIwMDMgdGhyb3VnaCBBcHIgMDggMjAwMyBQcmVjaXBp dGF0aW9uIGluCm1pbGxpbWV0ZXJzLCB0ZW1wZXJhdHVyZSBpbiBDZWxzaXVzLiAoMC4wNCBp bmNoPTEgbWlsbGltZXRlcjsKRmFocmVuaGVpdD1DZWxzaXVzIHRpbWVzIDEuOCwgcGx1cyAz MikKCiAgICAgICAgICAgICAgICAgICAgICAgQVZHICBNT1NUICBQQ1QgIEFWRyAgQVZHICBI U1QgIExTVCAgQVZHICBTTk9XCiAgTE9DQVRJT04gICAgICAgICAgICBQQ1BOICBQQ1BOICBD VkcgSElHSCAgTE9XIEhJR0ggIExPVyAgVE1QICBEUFRICgpDaGluYSAoU291dGggQ29hc3Qp CiAgQ29hc3RhbCBzb3VyY2UgICAgICAgIDExICAgIDY4ICAgMzggICAyMiAgIDE0ICAgMzEg ICAgNiAgIDE4ICAgICAwCiAgRnVqaWFuICAgICAgICAgICAgICAgICA1ICAgIDE2ICAgMzMg ICAxOCAgIDE0ICAgMTkgICAxMyAgIDE2ICAgICAwCiAgR3Vhbmdkb25nICAgICAgICAgICAg IDEzICAgIDMxICAgODggICAyMiAgIDE4ICAgMjcgICAxNiAgIDIwICAgICAwCiAgR3Vhbmd4 aSAgICAgICAgICAgICAgICAxICAgICAzICAgMjcgICAyNSAgIDE3ICAgMzEgICAxMyAgIDIx ICAgICAwCiAgWXVubmFuICAgICAgICAgICAgICAgICAwICAgICAwICAgLS0gICAyOSAgIDEz ICAgMjkgICAxMSAgIDIxICAgICAwCiAgWmhlamlhbmcgICAgICAgICAgICAgICAwICAgICAx ICAgLS0gICAyMCAgIDEyICAgMjIgICAxMSAgIDE2ICAgICAwCgpDaGluYSAoWWFuZ3ppKQog IEFuaHVpICAgICAgICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMjEgICAxMyAgIDIyICAg MTEgICAxNyAgICAgMAogIEd1aXpob3UgICAgICAgICAgICAgICAgMCAgICAgMCAgIC0tICAg MjMgICAxMiAgIDI0ICAgMTEgICAxOCAgICAgMAogIEh1YmVpICAgICAgICAgICAgICAgICAg MCAgICAgMCAgIC0tICAgMjMgICAxMSAgIDI3ICAgIDcgICAxNyAgICAgMAogIEh1bmFuICAg ICAgICAgICAgICAgICAgMCAgICAgMCAgIC1k8ZI++BcCAJoFAACaBQAAAAKznQHkAAfpChZc CABFAAWMUIpAAD8G6KNBej0iQXo9KLhsABTn0Y4eXLqfflAYYQhZ+gAALSAgIDIxICAgMTIg ICAyMyAgICA4ICAgMTYgICAgIDAKICBKaWFuZ3N1ICAgICAgICAgICAgICAgIDEgICAgIDIg ICA1MCAgIDE2ICAgMTIgICAyMCAgICA3ICAgMTQgICAgIDAKICBKaWFuZ3hpICAgICAgICAg ICAgICAgIDAgICAgIDAgICAtLSAgIDE4ICAgMTIgICAyMiAgICA3ICAgMTUgICAgIDAKICBT aWNodWFuICAgICAgICAgICAgICAgIDIgICAgIDUgICA0NSAgIDIyICAgIDggICAyNSAgICAx ICAgMTUgICAgIDAKICBZYW5nemkgc291cmNlICAgICAgICAgIDEgICAgIDkgICAxNyAgIDIw ICAgIDggICAzMSAgIC02ICAgMTUgICAgIDAKCkluZGlhCiAgQW5kaHJhIFByYWRlc2ggICAg ICAgICAwICAgICAwICAgLS0gICAzNCAgIDI2ICAgMzUgICAyNiAgIDMwICAgICAwCiAgQmlo YXIvVXR0YXIgUHJhZGVzaCAgICAwICAgICAwICAgLS0gICAzNSAgIDIwICAgMzkgICAxOCAg IDI4ICAgICAwCiAgRWFzdGVybiBTdGF0ZXMgICAgICAgICAxICAgICA2ICAgMTYgICAzNCAg IDIyICAgMzUgICAxOCAgIDI5ICAgICAwCiAgR3VqYXJhdCAgICAgICAgICAgICAgICAwICAg ICAwICAgLS0gICA0MSAgIDI1ICAgNDIgICAyMiAgIDMzICAgICAwCiAgS2VyYWxhICAgICAg ICAgICAgICAgICAwICAgICAwICAgLS0gICAzNCAgIDI2ICAgMzQgICAyNCAgIDMwICAgICAw CiAgTWFoYXJhc2h0cmEgICAgICAgICAgICAwICAgICAwICAgLS0gICAzNCAgIDIzICAgMzcg ICAxOSAgIDI5ICAgICAwCiAgT3Jpc3NhICAgICAgICAgICAgICAgICAwICAgICAwICAgLS0g ICAtLSAgIDI0ICAgLS0gICAyMiAgIC0tICAgICAwCiAgVGFtaWwgTmFkdSAgICAgICAgICAg ICAwICAgICAwICAgLS0gICAzNCAgIDI0ICAgMzcgICAyMyAgIDI5ICAgICAwCiAgV2VzdCBC ZW5nYWwgICAgICAgICAgICAwICAgICAwICAgLS0gICAzNiAgIDI2ICAgMzcgICAyNSAgIDMy ICAgICAwCgpKYXBhbgogIE5vcnRoZXJuIEphcGFuICAgICAgICAgMCAgICAgMyAgIDEwICAg MTUgICAgNyAgIDIwICAgIDEgICAxMSAgICAgMAogIFNvdXRoZXJuIEphcGFuICAgICAgICAg OSAgICA0NiAgIDczICAgMjAgICAxNCAgIDIzICAgMTEgICAxNyAgICAgMAoKVW5pdGVkIFN0 YXRlcwogIERlbHRhICAgICAgICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMjAgICAxMCAg IDI2ICAgIDggICAxNSAgICAgMAogIExvdWlzaWFuYSAgICAgICAgICAgICAyOSAgICA1NSAg IDc1ICAgMjMgICAxOCAgIDI2ICAgMTcgICAyMSAgICAgMAogIFNhY3JhbWVudG8gVmFsbGV5 ICAgICAgMCAgICAgMCAgIC0tICAgMjEgICAgNyAgIDIyICAgIDcgICAxNCAgICAgMAogIFRl eGFzICAgICAgICAgICAgICAgICAgOSAgICAzMSAgIDc1ICAgMjQgICAxNiAgIDI2ICAgMTUg ICAyMCAgICAgMAoKT3RoZXIKZPGSPjwYAgDaAgAA2gIAAAACs50B5AAH6QoWXAgARQACzFCL QAA/ButiQXo9IkF6PSi4bAAU59GTgly6n35QGGEIfz8AACAgQnJhemlsICAgICAgICAgICAg ICAgICAxICAgICA3ICAgMTEgICAyNiAgIDE2ICAgMjkgICAgOSAgIDIxICAgICAwCiAgU291 dGggS29yZWEgICAgICAgICAgIDIwICAgIDYzICAxMDAgICAxOCAgICA4ICAgMjcgICAgNyAg IDEzICAgICAwCiAgVGhhaWxhbmQgICAgICAgICAgICAgICA2ICAgIDQzICAgMTAgICAzNyAg IDI2ICAgMzkgICAyNCAgIDMyICAgICAwCiAgVmlldG5hbSAgICAgICAgICAgICAgICAwICAg ICAyICAgMTYgICAzMSAgIDI0ICAgMzYgICAyMSAgIDI3ICAgICAwCgpUZWw6ICg5MTMpMzIy LTUxODEKCkdXUyB3ZWIgc2l0ZTogaHR0cDovL3d3dy5nbG9iYWx3ZWF0aGVyc2VydmljZXMu Y29tIDIwMDMtMDQtMDggMTU6NTU6NDMKClNlbmQgY29tbWVudHMgdG86IGd3c21haWxAZ2xv YmFsd2VhdGhlcnNlcnZpY2VzLmNvbQoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYnJh emlsCiAgICBjaGluYQogICAgZ3Vhbmdkb25nCiAgICBpbmRpYQogICAgamFwYW4KICAgIGxv dWlzaWFuYQogICAgcmljZQogICAgc291dGgra29yZWEKICAgIHN0YXRpc3RpY3MKICAgIHRl eGFzCiAgICB0aGFpbGFuZAogICAgdW5pdGVkK3N0YXRlcwogICAgdmlldG5hbQogICAgd2Vh dGhlcgogICAgd2ViCiAgICBXRUFUSEVST3JpZ2luIEFzc2lnbmVkQnk9Ik9zdGVyRG93Sm9u ZXMiIC8+Cgpk8ZI+PRgCADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUIxAAD8G7gVBej0i QXo9KLhsABTn0ZYmXLqfflARYQge2wAAAAAAAAAAZPGSPgCTAgA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLm7QAB9BkbWQXo9KEF6PSIAFLhsXLqffufRk4JQEP1chSsAAGTxkj5LngIA NgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5vEAAfQZG1UF6PShBej0iABS4bFy6n37n0ZYn UBD6uIUqAABk8ZI+kagCADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoub1AAH0GRtRBej0o QXo9IgAUuGxcup9+59GWJ1AR+riFKQAAZPGSPv2pAgA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKFCNQAA/Bu4EQXo9IkF6PSi4bAAU59GWJ1y6n39QEGEIHtoAAAAAAAAAAGTxkj5CQwMA PAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQjkAAPwbuA0F6PSJBej0ot20AFd36Tz+5yCkA UBBhCIoIAAAAAAAAAABk8ZI+LnwDAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAub5AAH0G RrtBej0oQXo9IgAVt225yCkA3fpPP1AY+PYjBAAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0K ZPGSPvyCAwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlCPQAA/Bu3oQXo9IkF6PSi3bQAV 3fpPP7nIKRhQGGEIjQIAAERFTEUgMzYyMDAwMDQub3V0LjAzMDQwOA0KZPGSPgPAAwB8AAAA fAAAAAAH6QoWXAACs50B5AgARQAAbrm/QAB9BkaMQXo9KEF6PSIAFbdtucgpGN36T1lQGPjc efQAADU1MCAzNjIwMDAwNC5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRo ZSBmaWxlIHNwZWNpZmllZC4gDQpk8ZI+iMwDAFEAAABRAAAAAAKznQHkAAfpChZcCABFAABD UJBAAD8G7eZBej0iQXo9KLdtABXd+k9ZucgpXlAYYQi91gAAUE9SVCA2NSwxMjIsNjEsMzQs MTg0LDEwOQ0KZPGSPpgGBABUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrnAQAB9BkazQXo9 KEF6PSIAFbdtucgpXt36T3RQGPjANK8AADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4N CmTxkj7mCQQAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQkUAAPwbt5kF6PSJBej0ot20A Fd36T3S5yCl8UBhhCHpNAABTVE9SIDM2MjAwMDA0Lm91dC4wMzA0MDgNCmTxkj7xRgQAeAAA AHgAAAAAB+kKFlwAArOdAeQIAEUAAGq5wUAAfQZGjkF6PShBej0iABW3bbnIKXzd+k+OUBj4 pgO3AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAw MDA0Lm91dC4wMzA0MDguDQpk8ZI+qbkEAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwucJA AH0GRsdBej0oQXo9IgAUuG2/hryuAAAAAHAC+vBWiQAAAgQFZAEBBAJk8ZI+XrsEAD4AAAA+ AAAAAAKznQHkAAfpChZcCABFAAAwUJJAAD8G7fdBej0iQXo9KLhtABTn0wP4v4a8r3ASYQgE RQAAAQEEAgIEBbRk8ZI+zfMEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoucNAAH0GRs5B ej0oQXo9IgAUuG2/hryv59MD+VAQ/VyUtAAAZPGSPlb7BACaBQAAmgUAAAACs50B5AAH6QoW XAgARQAFjFCTQAA/BuiaQXo9IkF6PSi4bQAU59MD+b+GvK9QEGEIgesAAFhZWlpZLi4uICBU Qz0yIFRNPTEwNDk4MTc0MTggTU49MzYyMDAwMDQub3V0IFNSQz1jb210ZXggUEZOPSJDb210 ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVyRG93Sm9uZXMiIAoKLi4uICAKCgouLi4gCSAK CgpIZWFkTGluZS4uLiAgR1dTIFdlYXRoZXIgU3RhdGlzdGljcyA6IERhaWx5IEdsb2JhbCBT dWdhciAtIEFwciAwOAoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4u LiAgQXByIDA4LCAyMDAzIChPREogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRM aW5lLi4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0eSBOZXdzIChP REopLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9uZXMKClJlcG9y dCBwZXJpb2QgQXByIDA4IDIwMDMgdGhyb3VnaCBBcHIgMDggMjAwMyBQcmVjaXBpdGF0aW9u IGluCm1pbGxpbWV0ZXJzLCB0ZW1wZXJhdHVyZSBpbiBDZWxzaXVzLiAoMC4wNCBpbmNoPTEg bWlsbGltZXRlcjsKRmFocmVuaGVpdD1DZWxzaXVzIHRpbWVzIDEuOCwgcGx1cyAzMikKCiAg ICAgICAgICAgICAgICAgICAgICAgIEFWRyAgTU9TVCAgUENUICBBVkcgIEFWRyAgSFNUICBM U1QgIEFWRyAgU05PVwogIExPQ0FUSU9OICAgICAgICAgICAgIFBDUE4gIFBDUE4gIENWRyBI SUdIICBMT1cgSElHSCAgTE9XICBUTVAgIERQVEgKCiAgQXVzdHJhbGlhICAgICAgICAgICAg ICAgMCAgICAgMiAgIDE0ICAgMjkgICAxOCAgIDMxICAgMTUgICAyNCAgICAgMAogIEJyYXpp bCBFYXN0IENvYXN0ICAgICAgIDEgICAgIDQgICAyMCAgIDI2ICAgMTcgICAzMiAgICA5ICAg MjEgICAgIDAKICBCcmF6aWwgTkUgQ29hc3QgICAgICAgICAwICAgICAwICAgLS0gICAzNiAg IDI0ICAgMzYgICAyNCAgIDMwICAgICAwCiAgQ3ViYSAgICAgICAgICAgICAgICAgICAtLSAg ICAtLSAgIC0tICAgLS0gICAtLSAgIC0tICAgLS0gICAtLSAgICAtLQogIEN6ZWNob3Nsb3Zh a2lhICAgICAgICAgIDEgICAgIDIgICAzMyAgICAxICAgLTIgICAgMiAgIC0yICAgIDAgICAg IDAKICBFIEJsYWNrIFNvaWwgICAgICAgICAgICAxICAgICAxICAgMTYgICAgNiAgICAwICAg IDggICAtMSAgICAzICAgICAwCiAgRSAgR2VybWFueSAgICAgICAgICAgICAgMCAgICAgMCAg IC0tICAgIDMgICAtNSAgICAzICAgLTcgICAtMSAgICAgMAogIEVhc3QgQ29hc3QgICAgICAg ICAgICAgIDAgICAgIDAgICAtLSAgIDM0ICAgMjUgICAzNyAgIDIzICAgMzAgICAgIDAKICBF bmdsYW5kICAgICAgICAgICAgICAgIC0tICAgIC0tICAgLS0gICAtLSAgIC0tICAgLS0gICAt LSAgIC0tICAgIC0tCiAgRnJhbmNlICAgICAgICAgICAgICAgICAgMCAgICAgMCAgIC0tICAg IDggICAtMyAgICA4ICAgLTYgIGTxkj7R+wQAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxQ lEAAPwbomUF6PSJBej0ouG0AFOfTCV2/hryvUBhhCPVaAAAgIDIgICAgIDAKICBGdWppYW4g ICAgICAgICAgICAgICAgICA1ICAgIDE2ICAgMzMgICAxOCAgIDE0ICAgMTkgICAxMyAgIDE2 ICAgICAwCiAgR2FuZ2VzIFBsYWluICAgICAgICAgICAgMCAgICAgMCAgIC0tICAgMzcgICAx OSAgIDM4ICAgMTggICAyOCAgICAgMAogIEd1YW5nZG9uZyAgICAgICAgICAgICAgMTMgICAg MzEgICA4OCAgIDIyICAgMTggICAyNyAgIDE2ICAgMjAgICAgIDAKICBHdWFuZ3hpICAgICAg ICAgICAgICAgICAxICAgICAzICAgMjcgICAyNSAgIDE3ICAgMzEgICAxMyAgIDIxICAgICAw CiAgSXRhbHkgKFBvIFJpdmVyKSAgICAgICAgMCAgICAgMSAgIC0tICAgMTAgICAtMiAgIDEy ICAgLTIgICAgNCAgICAgMAogIE1leEVhc3QgQ29hc3QgICAgICAgICAgIDAgICAgIDAgICAt LSAgIDMyICAgMjIgICAzNCAgIDE3ICAgMjcgICAgIDAKICBNZXhXZXN0IENvYXN0ICAgICAg ICAgICAwICAgICAwICAgLS0gICAzMSAgIDIxICAgMzEgICAxOCAgIDI2ICAgICAwCiAgTkMg VWtyYWluZSAgICAgICAgICAgICAgNCAgICAxMiAgIDcyICAgIDIgICAtMiAgICA2ICAgLTMg ICAgMCAgICAgNwogIE5FIENhdWNhc3VzICAgICAgICAgICAgIDAgICAgIDEgICAtLSAgIDE0 ICAgIDMgICAxNyAgICAyICAgIDggICAgIDAKICBORSBVa3JhaW5lICAgICAgICAgICAgICAz ICAgICA3ICAgNzUgICAgMyAgICAwICAgIDggICAtMiAgICAyICAgICA4CiAgUGhpbGlwcGlu ZXMgICAgICAgICAgICAtLSAgICAtLSAgIC0tICAgLS0gICAtLSAgIC0tICAgLS0gICAtLSAg ICAtLQogIFBvbGFuZCAgICAgICAgICAgICAgICAgIDEgICAgIDUgICA1MCAgICAxICAgLTMg ICAgMyAgIC00ICAgLTEgICAgIDUKICBTb3V0aCBBZnJpY2EgKE5hdGFsKSAgICAwICAgICAw ICAgLS0gICAyOSAgIDE2ICAgMzAgICAgOSAgIDIyICAgICAwCiAgVGhhaWxhbmQgICAgICAg ICAgICAgICAgNiAgICA0MyAgIDExICAgMzcgICAyNSAgIDM5ICAgMjMgICAzMSAgICAgMAog IFVTIFdlc3Rlcm4gTmVicmFza2EgICAgIDAgICAgIDAgICAtLSAgICAxICAgLTggICAgMiAg IC05ICAgLTMgICAgIDAKICBVU0NhbGlmIFZhbGxleSAgICAgICAgICAwICAgICAwICAgLS0g ICAyMiAgICA4ICAgMjMgICAgNyAgIDE1ICAgICAwCiAgVVNGbG9yaWRhICAgICAgICAgICAg ICAyMiAgICA1NSAgIDQyICAgMjYgICAyMCAgIDMxICAgMTcgICAyMyAgICAgMAogIFVTUmVk IFJpdmVyIE5vcnRoICAgICAgIDAgICAgIDEgICAtLSAgICA3ICAgLTQgICAgOSAgIC03ICAg IDIgICAgIDAKICBVU1NuYWtlIFJpdmVyICAgICAgICAgICAwICAgICAxICAgLS0gICAxMCAg IC0yICAgMTMgICAtNSAgICA0ICAgICAwCiAgVyBCbGFjayBTb2lsICAgICAgICAgICAgMiAg ICAgNSAgIDgwICBk8ZI+KPwEAHsDAAB7AwAAAAKznQHkAAfpChZcCABFAANtUJVAAD8G6rdB ej0iQXo9KLhtABTn0w7Bv4a8r1AYYQg7QQAAICAyICAgLTEgICAgNiAgIC0yICAgIDEgICAg MTIKICBXICBHZXJtYW55ICAgICAgICAgICAgICAwICAgICAwICAgLS0gICAgNyAgIC03ICAg IDggICAtOCAgICAwICAgICAwCiAgV2VzdCBDb2FzdCAgICAgICAgICAgICAgMCAgICAgMCAg IC0tICAgMzUgICAyNCAgIDQxICAgMjIgICAzMCAgICAgMAogIFdlc3QgVWtyYWluZSAgICAg ICAgICAgIDMgICAgIDggICA2MiAgICAxICAgLTMgICAgNSAgIC02ICAgLTEgICAgIDUKICBZ dW5uYW4gICAgICAgICAgICAgICAgICAwICAgICAwICAgLS0gICAyOSAgIDEzICAgMjkgICAx MSAgIDIxICAgICAwCiAgWmhlamlhbmcgICAgICAgICAgICAgICAgMCAgICAgMSAgIC0tICAg MjAgICAxMiAgIDIyICAgMTEgICAxNiAgICAgMAoKVGVsOiAoOTEzKTMyMi01MTgxCgpHV1Mg d2ViIHNpdGU6IGh0dHA6Ly93d3cuZ2xvYmFsd2VhdGhlcnNlcnZpY2VzLmNvbSAyMDAzLTA0 LTA4IDE1OjU1OjQ1CgpTZW5kIGNvbW1lbnRzIHRvOiBnd3NtYWlsQGdsb2JhbHdlYXRoZXJz ZXJ2aWNlcy5jb20KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGF1c3RyYWxpYQogICAg YnJhemlsCiAgICBjdWJhCiAgICBlbmdsYW5kCiAgICBmcmFuY2UKICAgIGdlcm1hbnkKICAg IGd1YW5nZG9uZwogICAgaXRhbHkKICAgIG5lYnJhc2thCiAgICBub3J0aCtjYXJvbGluYQog ICAgcGhpbGlwcGluZXMKICAgIHBvbGFuZAogICAgc291dGgrYWZyaWNhCiAgICBzdGF0aXN0 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 AAAAArOdAeQAB+kKFlwIAEUAALw7t0AAPwYCR0F6PSJBej0olQ8bWBiM+a90egQggBgW0AuB AAABAQgKDUQv0wBCHSY2NTZ8MTQ3MjkxN3wxMDQ5ODE3NDUyfDEuMHwxfDIzMHxoZWxsbyB3 b3JsZAo2NTd8MTQ3MjkxOHwxMDQ5ODE3NDUyfDEuMHwxfDY1NHxoZWxsbyB3b3JsZAo2NTh8 MTQ3MjkxOXwxMDQ5ODE3NDUyfDEuMHwxfDMyMjV8aGVsbG8gd29ybGQKafGSPqyYCgBCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJadQAB9BmnoQXo9KEF6PSIbWJUPdHoEIBiM+jeAEKH2 QUEAAAEBCAoAQh0oDUQv02nxkj4lmgoAzAAAAMwAAAAAArOdAeQAB+kKFlwIAEUAAL47uEAA PwYCREF6PSJBej0olQ8bWBiM+jd0egQggBgW0CV6AAABAQgKDUQv6ABCHSg2NTl8MTQ3Mjky MHwxMDQ5ODE3NDUyfDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKNjYwfDE0NzI5MjF8MTA0OTgx NzQ1MnwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjY2MXwxNDcyOTIyfDEwNDk4MTc0NTJ8MS4w fDF8OTY2MnxoZWxsbyB3b3JsZApp8ZI+We8NAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lp5AAH0GaedBej0oQXo9IhtYlQ90egQgGIz6wYAQoWxBKgAAAQEICgBCHSoNRC/oavGSPsDk BwBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTu5QAA/BgKgQXo9IkF6PSiVDxtYGIz6wXR6 BCCAGBbQVuUAAAEBCAoNRDA7AEIdKjY2MnwxNDcyOTIzfDEwNDk4MTc0NTN8MS4wfDF8NjU0 fGhlbGxvIHdvcmxkCmrxkj62WwoAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWn0AAfQZp 5kF6PShBej0iG1iVD3R6BCAYjPrugBChP0DPAAABAQgKAEIdMg1EMDtq8ZI+NF0KAPkAAAD5 AAAAAAKznQHkAAfpChZcCABFAADrO7pAAD8GAhVBej0iQXo9KJUPG1gYjPrudHoEIIAYFtAX ZgAAAQEICg1EMEsAQh0yNjYzfDE0NzI5MjR8MTA0OTgxNzQ1M3wxLjB8MXw0ODJ8aGVsbG8g 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 MDQ5ODE3NDU3fDEuMHwxfDIzMHxoZWxsbyB3b3JsZApt8ZI+ZaYOAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0lqhAAH0Gad1Bej0oQXo9IhtYlQ90egQgGIz9QYAQnuw/ZQAAAQEICgBC HVINRDGFbfGSPvmnDgCeAAAAngAAAAACs50B5AAH6QoWXAgARQAAkDvDQAA/BgJnQXo9IkF6 PSiVDxtYGIz9QXR6BCCAGBbQ8dkAAAEBCAoNRDGTAEIdUjY3NnwxNDcyOTM3fDEwNDk4MTc0 NTd8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAo2Nzd8MTQ3MjkzOHwxMDQ5ODE3NDU3fDEuMHwx fDM0MjB8aGVsbG8gd29ybGQKbvGSPp66AgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJap QAB9BmncQXo9KEF6PSIbWJUPdHoEIBiM/Z2AEJ6QP1QAAAEBCAoAQh1VDUQxk3Hxkj5JbQAA cAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI7xEAAPwYClEF6PSJBej0olQ8bWBiM/Z10egQg gBgW0M6PAAABAQgKDUQyxgBCHVU2Nzh8MTQ3MjkzOXwxMDQ5ODE3NDU4fDEuMHwxfDI5MTV8 aGVsbG8gd29ybGQKcfGSPtauAwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJaqQAB9Bmnb QXo9KEF6PSIbWJUPdHoEIBiM/cuAEJ5iPgMAAAEBCAoAQh1zDUQyxnHxkj6xsAMAVAEAAFQB AAAAArOdAeQAB+kKFlwIAEUAAUY7xUAAPwYBr0F6PSJBej0olQ8bWBiM/ct0egQggBgW0G4M AAABAQgKDUQy2wBCHXM2Nzl8MTQ3Mjk0MHwxMDQ5ODE3NDU5fDEuMHwxfDQ4MnxoZWxsbyB3 b3JsZAo2ODB8MTQ3Mjk0MXwxMDQ5ODE3NDU5fDEuMHwxfDM1NzN8aGVsbG8gd29ybGQKNjgx fDE0NzI5NDJ8MTA0OTgxNzQ1OXwxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCjY4MnwxNDcyOTQz fDEwNDk4MTc0NTl8MS4wfDF8MjYyM3xoZWxsbyB3b3JsZAo2ODN8MTQ3Mjk0NHwxMDQ5ODE3 NDU5fDEuMHwxfDIwMDF8aGVsbG8gd29ybGQKNjg0fDE0NzI5NDV8MTA0OTgxNzQ2MHwxLjB8 MXwyMTN8aGVsbG8gd29ybGQKcfGSPiIFBwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJar QAB9BmnaQXo9KEF6PSIbWJUPdHoEIBiM/t2AEJ1QPewAAAEBCAoAQh11DUQy23Hxkj6kBgcA VQEAAFUBAAAAArOdAeQAB+kKFlwIAEUAAUc7xkAAPwYBrUF6PSJBej0olQ8bWBiM/t10egQg gBgW0NFDAAABAQgKDUQy8QBCHXU2ODV8MTQ3Mjk0NnwxMDQ5ODE3NDYwfDEuMHwxfDUyNHxo ZWxsbyB3b3JsZAo2ODZ8MTQ3Mjk0N3wxMDQ5ODE3NDYwfDEuMHwxfDE3ODd8aGVsbG8gd29y bGQKNjg3fDE0NzI5NDh8MTA0OTgxNzQ2MHwxLjB8MXwzMjI1fGhlbGxvIHdvcmxkCjY4OHwx NDcyOTQ5fDEwNDk4MTc0NjB8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAo2ODl8MTQ3Mjk1MHwx MDQ5ODE3NDYwfDEuMHwxfDI2MjN8aGVsbG8gd29ybGQKNjkwfDE0NzI5NTF8MTA0OTgxNzQ2 MHwxLjB8MXwyMjM1fGhlbGxvIHdvcmxkCnHxkj6PyQcAPAAAADwAAAAAArOdAeQAB+kKFlwI BgABCAAGBAABAAfpChZcQXo9IgAAAAAAAEF6PSgAAAAAAAAAAAAAAAAAAAAAAABx8ZI+oMkH ACoAAAAqAAAAAAfpChZcAAKznQHkCAYAAQgABgQAAgACs50B5EF6PSgAB+kKFlxBej0icfGS PstbCgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJasQAB9BmnZQXo9KEF6PSIbWJUPdHoE IBiM//CAEJw9PdMAAAEBCAoAQh14DUQy8XLxkj4neAMAbwAAAG8AAAAAArOdAeQAB+kKFlwI AEUAAGE7x0AAPwYCkkF6PSJBej0olQ8bWBiM//B0egQggBgW0FNmAAABAQgKDUQzPgBCHXg2 OTF8MTQ3Mjk1MnwxMDQ5ODE3NDYxfDEuMHwxfDIxM3xoZWxsbyB3b3JsZApy8ZI+O8gGAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0lq1AAH0GadhBej0oQXo9IhtYlQ90egQgGI0AHYAQ nBA9fwAAAQEICgBCHX8NRDM+cvGSPsjJBgAlAQAAJQEAAAACs50B5AAH6QoWXAgARQABFzvI QAA/BgHbQXo9IkF6PSiVDxtYGI0AHXR6BCCAGBbQnFkAAAEBCAoNRDNTAEIdfzY5MnwxNDcy OTUzfDEwNDk4MTc0NjF8MS4wfDF8MTM1M3xoZWxsbyB3b3JsZAo2OTN8MTQ3Mjk1NHwxMDQ5 ODE3NDYxfDEuMHwxfDE2MHxoZWxsbyB3b3JsZAo2OTR8MTQ3Mjk1NXwxMDQ5ODE3NDYxfDEu MHwxfDc5OXxoZWxsbyB3b3JsZAo2OTV8MTQ3Mjk1NnwxMDQ5ODE3NDYxfDEuMHwxfDMyMjV8 aGVsbG8gd29ybGQKNjk2fDE0NzI5NTd8MTA0OTgxNzQ2MXwxLjB8MXwzMjd8aGVsbG8gd29y bGQKcvGSPpseCgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJauQAB9BmnXQXo9KEF6PSIb WJUPdHoEIBiNAQCAEJstPWcAAAEBCAoAQh2CDUQzU3Pxkj5veQMAbwAAAG8AAAAAArOdAeQA B+kKFlwIAEUAAGE7yUAAPwYCkEF6PSJBej0olQ8bWBiNAQB0egQggBgW0EDrAAABAQgKDUQz ogBCHYI2OTd8MTQ3Mjk1OHwxMDQ5ODE3NDYyfDEuMHwxfDE2MHxoZWxsbyB3b3JsZApz8ZI+ L4sGAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lq9AAH0GadZBej0oQXo9IhtYlQ90egQg GI0BLYAQmwA9EQAAAQEICgBCHYkNRDOic/GSPnyMBgCeAAAAngAAAAACs50B5AAH6QoWXAgA RQAAkDvKQAA/BgJgQXo9IkF6PSiVDxtYGI0BLXR6BCCAGBbQ5JIAAAEBCAoNRDO2AEIdiTY5 OHwxNDcyOTU5fDEwNDk4MTc0NjJ8MS4wfDF8MjYyM3xoZWxsbyB3b3JsZAo2OTl8MTQ3Mjk2 MHwxMDQ5ODE3NDYyfDEuMHwxfDMxMTZ8aGVsbG8gd29ybGQKc/GSPpzhCQBCAAAAQgAAAAAH 6QoWXAACs50B5AgARQAANJawQAB9BmnVQXo9KEF6PSIbWJUPdHoEIBiNAYmAEJqkPPsAAAEB CAoAQh2LDUQztnTxkj5/AAUAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI7y0AAPwYCjUF6 PSJBej0olQ8bWBiNAYl0egQggBgW0N8pAAABAQgKDUQ0EABCHYs3MDB8MTQ3Mjk2MXwxMDQ5 ODE3NDYzfDEuMHwxfDEzNTN8aGVsbG8gd29ybGQKdPGSPnP5BwBCAAAAQgAAAAAH6QoWXAAC s50B5AgARQAANJaxQAB9BmnUQXo9KEF6PSIbWJUPdHoEIBiNAbeAEJp2PJgAAAEBCAoAQh2U DUQ0EHTxkj6wDQgAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI7zEAAPwYCjEF6PSJBej0o lQ8bWBiNAbd0egQggBgW0NThAAABAQgKDUQ0JABCHZQ3MDF8MTQ3Mjk2MnwxMDQ5ODE3NDYz fDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKdPGSPuVPCwBCAAAAQgAAAAAH6QoWXAACs50B5AgA RQAANJayQAB9BmnTQXo9KEF6PSIbWJUPdHoEIBiNAeWAEJpIPIIAAAEBCAoAQh2WDUQ0JHTx kj5xUQsAyQAAAMkAAAAAArOdAeQAB+kKFlwIAEUAALs7zUAAPwYCMkF6PSJBej0olQ8bWBiN AeV0egQggBgW0HAlAAABAQgKDUQ0OQBCHZY3MDJ8MTQ3Mjk2M3wxMDQ5ODE3NDYzfDEuMHwx fDMyN3xoZWxsbyB3b3JsZAo3MDN8MTQ3Mjk2NHwxMDQ5ODE3NDYzfDEuMHwxfDc5OXxoZWxs byB3b3JsZAo3MDR8MTQ3Mjk2NXwxMDQ5ODE3NDYzfDEuMHwxfDc5OXxoZWxsbyB3b3JsZAp0 8ZI+h6YOAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lrNAAH0GadJBej0oQXo9IhtYlQ90 egQgGI0CbIAQmcE8awAAAQEICgBCHZgNRDQ5dfGSPiqHBgBvAAAAbwAAAAACs50B5AAH6QoW XAgARQAAYTvOQAA/BgKLQXo9IkF6PSiVDxtYGI0CbHR6BCCAGBbQRo8AAAEBCAoNRDR+AEId mDcwNXwxNDcyOTY2fDEwNDk4MTc0NjR8MS4wfDF8MjEzfGhlbGxvIHdvcmxkCnXxkj62ZwkA QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWtEAAfQZp0UF6PShBej0iG1iVD3R6BCAYjQKZ gBCZlDwfAAABAQgKAEIdnw1ENH518ZI+ceUJAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABh O89AAD8GAopBej0iQXo9KJUPG1gYjQKZdHoEIIAYFtBDQAAAAQEICg1ENJQAQh2fNzA2fDE0 NzI5Njd8MTA0OTgxNzQ2NXwxLjB8MXw1MjR8aGVsbG8gd29ybGQKdfGSPji+DABCAAAAQgAA AAAH6QoWXAACs50B5AgARQAANJa1QAB9BmnQQXo9KEF6PSIbWJUPdHoEIBiNAsaAEJlnPAcA AAEBCAoAQh2hDUQ0lHbxkj6jUwoAKgAAACoAAAAAB+kKFlwAArOdAeQIBgABCAAGBAABAAKz nQHkQXo9KAAAAAAAAEF6PSJ28ZI+alQKADwAAAA8AAAAAAKznQHkAAfpChZcCAYAAQgABgQA AgAH6QoWXEF6PSIAArOdAeRBej0oAAAAAAAAAAAAAAAAAAAAAAAAdvGSPs4dCwBvAAAAbwAA AAACs50B5AAH6QoWXAgARQAAYTvQQAA/BgKJQXo9IkF6PSiVDxtYGI0CxnR6BCCAGBbQPaMA AAEBCAoNRDUAAEIdoTcwN3wxNDcyOTY4fDEwNDk4MTc0NjZ8MS4wfDF8NjU0fGhlbGxvIHdv cmxkCnbxkj5zLA4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWtkAAfQZpz0F6PShBej0i G1iVD3R6BCAYjQLzgBCZOjuQAAABAQgKAEIdrA1ENQB28ZI+GS4OAFUBAABVAQAAAAKznQHk AAfpChZcCABFAAFHO9FAAD8GAaJBej0iQXo9KJUPG1gYjQLzdHoEIIAYFtBKVwAAAQEICg1E NRQAQh2sNzA4fDE0NzI5Njl8MTA0OTgxNzQ2NnwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCjcw OXwxNDcyOTcwfDEwNDk4MTc0NjZ8MS4wfDF8MTc4N3xoZWxsbyB3b3JsZAo3MTB8MTQ3Mjk3 MXwxMDQ5ODE3NDY2fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKNzExfDE0NzI5NzJ8MTA0OTgx NzQ2NnwxLjB8MXwzMjd8aGVsbG8gd29ybGQKNzEyfDE0NzI5NzN8MTA0OTgxNzQ2NnwxLjB8 MXwyNjIzfGhlbGxvIHdvcmxkCjcxM3wxNDcyOTc0fDEwNDk4MTc0NjZ8MS4wfDF8MzU3M3xo ZWxsbyB3b3JsZAp38ZI+kEACAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lrdAAH0Gac5B ej0oQXo9IhtYlQ90egQgGI0EBoAQmCc7egAAAQEICgBCHa4NRDUUd/GSPlccCwBwAAAAcAAA AAACs50B5AAH6QoWXAgARQAAYjvSQAA/BgKGQXo9IkF6PSiVDxtYGI0EBnR6BCCAGBbQ1TAA AAEBCAoNRDVkAEIdrjcxNHwxNDcyOTc1fDEwNDk4MTc0Njd8MS4wfDF8MzQyMHxoZWxsbyB3 b3JsZAp38ZI+Ze8NAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lrhAAH0Gac1Bej0oQXo9 IhtYlQ90egQgGI0ENIAQl/k7IgAAAQEICgBCHbYNRDVkd/GSPt3wDQDJAAAAyQAAAAACs50B 5AAH6QoWXAgARQAAuzvTQAA/BgIsQXo9IkF6PSiVDxtYGI0ENHR6BCCAGBbQU2EAAAEBCAoN RDV2AEIdtjcxNXwxNDcyOTc2fDEwNDk4MTc0Njd8MS4wfDF8Nzk5fGhlbGxvIHdvcmxkCjcx NnwxNDcyOTc3fDEwNDk4MTc0Njd8MS4wfDF8Nzk5fGhlbGxvIHdvcmxkCjcxN3wxNDcyOTc4 fDEwNDk4MTc0Njd8MS4wfDF8Nzk5fGhlbGxvIHdvcmxkCnjxkj7SAwIAQgAAAEIAAAAAB+kK FlwAArOdAeQIAEUAADSWuUAAfQZpzEF6PShBej0iG1iVD3R6BCAYjQS7gBCXcjsOAAABAQgK AEIduA1ENXZ48ZI+ugUCAFYBAABWAQAAAAKznQHkAAfpChZcCABFAAFIO9RAAD8GAZ5Bej0i QXo9KJUPG1gYjQS7dHoEIIAYFtBL1wAAAQEICg1ENYwAQh24NzE4fDE0NzI5Nzl8MTA0OTgx NzQ2N3wxLjB8MXwzMzAxfGhlbGxvIHdvcmxkCjcxOXwxNDcyOTgwfDEwNDk4MTc0Njd8MS4w fDF8MzU3M3xoZWxsbyB3b3JsZAo3MjB8MTQ3Mjk4MXwxMDQ5ODE3NDY3fDEuMHwxfDMxMTZ8 aGVsbG8gd29ybGQKNzIxfDE0NzI5ODJ8MTA0OTgxNzQ2N3wxLjB8MXwxMjAzfGhlbGxvIHdv cmxkCjcyMnwxNDcyOTgzfDEwNDk4MTc0Njd8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAo3MjN8 MTQ3Mjk4NHwxMDQ5ODE3NDY3fDEuMHwxfDI1NjZ8aGVsbG8gd29ybGQKePGSPh5aBQBCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJa6QAB9BmnLQXo9KEF6PSIbWJUPdHoEIBiNBc+AEJZe OvYAAAEBCAoAQh26DUQ1jHjxkj5/owwAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE71UAA PwYChEF6PSJBej0olQ8bWBiNBc90egQggBgW0DujAAABAQgKDUQ10gBCHbo3MjR8MTQ3Mjk4 NXwxMDQ5ODE3NDY4fDEuMHwxfDc5OXxoZWxsbyB3b3JsZAp58ZI+ahsAAEIAAABCAAAAAAfp ChZcAAKznQHkCABFAAA0lrtAAH0GacpBej0oQXo9IhtYlQ90egQgGI0F/IAQljE6qQAAAQEI CgBCHcENRDXSefGSPvkcAACcAAAAnAAAAAACs50B5AAH6QoWXAgARQAAjjvWQAA/BgJWQXo9 IkF6PSiVDxtYGI0F/HR6BCCAGBbQ2bMAAAEBCAoNRDXkAEIdwTcyNXwxNDcyOTg2fDEwNDk4 MTc0Njh8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCjcyNnwxNDcyOTg3fDEwNDk4MTc0Njh8MS4w fDF8Nzk5fGhlbGxvIHdvcmxkCnnxkj7kcQMAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW vEAAfQZpyUF6PShBej0iG1iVD3R6BCAYjQZWgBCV1zqVAAABAQgKAEIdww1ENeR58ZI+Z3MD AJ4AAACeAAAAAAKznQHkAAfpChZcCABFAACQO9dAAD8GAlNBej0iQXo9KJUPG1gYjQZWdHoE IIAYFtDY7QAAAQEICg1ENfkAQh3DNzI3fDE0NzI5ODh8MTA0OTgxNzQ2OHwxLjB8MXwxMjAz fGhlbGxvIHdvcmxkCjcyOHwxNDcyOTg5fDEwNDk4MTc0Njh8MS4wfDF8MzQwM3xoZWxsbyB3 b3JsZAp58ZI+NcgGAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lr1AAH0GachBej0oQXo9 IhtYlQ90egQgGI0GsoAQlXs6fgAAAQEICgBCHcUNRDX5efGSPq0pDgBvAAAAbwAAAAACs50B 5AAH6QoWXAgARQAAYTvYQAA/BgKBQXo9IkF6PSiVDxtYGI0GsnR6BCCAGBbQPksAAAEBCAoN RDZAAEIdxTcyOXwxNDcyOTkwfDEwNDk4MTc0Njl8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCnrx kj62iQEAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWvkAAfQZpx0F6PShBej0iG1iVD3R6 BCAYjQbfgBCVTjowAAABAQgKAEIdzA1ENkB68ZI+04oBAG8AAABvAAAAAAKznQHkAAfpChZc CABFAABhO9lAAD8GAoBBej0iQXo9KJUPG1gYjQbfdHoEIIAYFtBGBQAAAQEICg1ENlEAQh3M NzMwfDE0NzI5OTF8MTA0OTgxNzQ2OXwxLjB8MXw2NTR8aGVsbG8gd29ybGQKevGSPu2wBABC AAAAQgAAAAACs50B5AAH6QoWXAgARQAANJlVQAA/BqUwQXo9IkF6PSiTKBtYjYrZQS3RJHCA EBbQnhcAAAEBCAoNRDZmAEIZHXrxkj4N4AQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW v0AAfQZpxkF6PShBej0iG1iVD3R6BCAYjQcMgBCVITodAAABAQgKAEIdzg1ENlF68ZI+MuEE AHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO9pAAD8GAn5Bej0iQXo9KJUPG1gYjQcMdHoE IIAYFtDXAwAAAQEICg1ENmcAQh3ONzMxfDE0NzI5OTJ8MTA0OTgxNzQ2OXwxLjB8MXwzMzAx fGhlbGxvIHdvcmxkCnrxkj426QQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSWwEAAfQZp xUF6PShBej0iG1iTKC3RJHCNitlCgBAAALA1AAABAQgKAEIdzg1ENmZ68ZI+fTYIAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0lsFAAH0GacRBej0oQXo9IhtYlQ90egQgGI0HOoAQlPM6 BQAAAQEICgBCHdANRDZnevGSPrN3CQBBAQAAQQEAAAEADMzMzAAH657FbgEzqqoDAAAMIAAC tIGmAAEADlNrYXJ2ZW5fZ3cAAgARAAAAAQEBzAAEQXo9IQADABFGYXN0RXRoZXJuZXQwAAQA CAAAAAEABQDTQ2lzY28gSW50ZXJuZXR3b3JrIE9wZXJhdGluZyBTeXN0ZW0gU29mdHdhcmUg CklPUyAodG0pIEMxNzAwIFNvZnR3YXJlIChDMTcwMC1ZLU0pLCBWZXJzaW9uIDEyLjEoMyks IFJFTEVBU0UgU09GVFdBUkUgKGZjMSkKQ29weXJpZ2h0IChjKSAxOTg2LTIwMDAgYnkgY2lz Y28gU3lzdGVtcywgSW5jLgpDb21waWxlZCBXZWQgMDUtSnVsLTAwIDE3OjA3IGJ5IGNtb25n AAYADmNpc2NvIDE3MjAABwAJQX01nB4ACwAFAXvxkj74bgAAbwAAAG8AAAAAArOdAeQAB+kK FlwIAEUAAGE720AAPwYCfkF6PSJBej0olQ8bWBiNBzp0egQggBgW0D9bAAABAQgKDUQ2rgBC HdA3MzJ8MTQ3Mjk5M3wxMDQ5ODE3NDcwfDEuMHwxfDE2MHxoZWxsbyB3b3JsZAp78ZI+0vcC AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lsJAAH0GacNBej0oQXo9IhtYlQ90egQgGI0H Z4AQlMY5twAAAQEICgBCHdcNRDaue/GSPmH5AgCdAAAAnQAAAAACs50B5AAH6QoWXAgARQAA jzvcQAA/BgJPQXo9IkF6PSiVDxtYGI0HZ3R6BCCAGBbQIfwAAAEBCAoNRDa+AEId1zczM3wx NDcyOTk0fDEwNDk4MTc0NzB8MS4wfDF8NDgyfGhlbGxvIHdvcmxkCjczNHwxNDcyOTk1fDEw NDk4MTc0NzB8MS4wfDF8MjQ0MHxoZWxsbyB3b3JsZAp78ZI+Jk4GAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0lsNAAH0GacJBej0oQXo9IhtYlQ90egQgGI0HwoAQlGs5pQAAAQEICgBC HdkNRDa+fPGSPvr1AQBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTvdQAA/BgJ8QXo9IkF6 PSiVDxtYGI0HwnR6BCCAGBbQPFIAAAEBCAoNRDccAEId2TczNXwxNDcyOTk2fDEwNDk4MTc0 NzF8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCnzxkj4TZgQAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSWxEAAfQZpwUF6PShBej0iG1iVD3R6BCAYjQfvgBCUPjk+AAABAQgKAEId4g1ENxx8 8ZI+XAMFAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO95AAD8GAnpBej0iQXo9KJUPG1gY jQfvdHoEIIAYFtDJTQAAAQEICg1ENzAAQh3iNzM2fDE0NzI5OTd8MTA0OTgxNzQ3MXwxLjB8 MXwxMjAzfGhlbGxvIHdvcmxkCnzxkj5evAcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW xUAAfQZpwEF6PShBej0iG1iVD3R6BCAYjQgdgBCUEDkoAAABAQgKAEId5A1ENzB88ZI+570H AJ4AAACeAAAAAAKznQHkAAfpChZcCABFAACQO99AAD8GAktBej0iQXo9KJUPG1gYjQgddHoE IIAYFtDWxQAAAQEICg1EN0EAQh3kNzM3fDE0NzI5OTh8MTA0OTgxNzQ3MXwxLjB8MXwxMjAz fGhlbGxvIHdvcmxkCjczOHwxNDcyOTk5fDEwNDk4MTc0NzF8MS4wfDF8MzQyMHxoZWxsbyB3 b3JsZAp88ZI+4xILAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lsZAAH0Gab9Bej0oQXo9 IhtYlQ90egQgGI0IeYAQk7Q5FQAAAQEICgBCHeYNRDdBffGSPk4DBQBwAAAAcAAAAAACs50B 5AAH6QoWXAgARQAAYjvgQAA/BgJ4QXo9IkF6PSiVDxtYGI0IeXR6BCCAGBbQ1l0AAAEBCAoN RDeUAEId5jczOXwxNDczMDAwfDEwNDk4MTc0NzJ8MS4wfDF8MjQ0MHxoZWxsbyB3b3JsZAp9 8ZI+d38HAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lsdAAH0Gab5Bej0oQXo9IhtYlQ90 egQgGI0Ip4AQk4Y4ugAAAQEICgBCHe4NRDeUffGSPpweCwBwAAAAcAAAAAACs50B5AAH6QoW XAgARQAAYjvhQAA/BgJ3QXo9IkF6PSiVDxtYGI0Ip3R6BCCAGBbQ3QIAAAEBCAoNRDe8AEId 7jc0MHwxNDczMDAxfDEwNDk4MTc0NzN8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAp98ZI+iiwO AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lshAAH0Gab1Bej0oQXo9IhtYlQ90egQgGI0I 1YAQk1g4jgAAAQEICgBCHfINRDe8ffGSPkouDgD6AAAA+gAAAAACs50B5AAH6QoWXAgARQAA 7DviQAA/BgHsQXo9IkF6PSiVDxtYGI0I1XR6BCCAGBbQPgAAAAEBCAoNRDfQAEId8jc0MXwx NDczMDAyfDEwNDk4MTc0NzN8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAo3NDJ8MTQ3MzAwM3wx MDQ5ODE3NDczfDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKNzQzfDE0NzMwMDR8MTA0OTgxNzQ3 M3wxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjc0NHwxNDczMDA1fDEwNDk4MTc0NzN8MS4wfDF8 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 AAAAVAAAAAAH6QoWXAACs50B5AgARQAARrnJQAB9BkaqQXo9KEF6PSIAFbdtucgqHN36T8NQ GPhwM/IAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCoLxkj60dwYAUAAAAFAAAAAA ArOdAeQAB+kKFlwIAEUAAEJQnEAAPwbt20F6PSJBej0ot20AFd36T8O5yCo6UBhhCHhAAABT VE9SIDM2MjAwMDA1Lm91dC4wMzA0MDgNCoLxkj4J3QYAeAAAAHgAAAAAB+kKFlwAArOdAeQI AEUAAGq5ykAAfQZGhUF6PShBej0iABW3bbnIKjrd+k/dUBj4VgL5AAAxNTAgT3BlbmluZyBC SU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDA1Lm91dC4wMzA0MDguDQqC 8ZI+ilUHAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuctAAH0GRr5Bej0oQXo9IgAUuHaQ 9WGtAAAAAHAC+vDgEgAAAgQFZAEBBAKC8ZI+iVcHAD4AAAA+AAAAAAKznQHkAAfpChZcCABF AAAwUJ1AAD8G7exBej0iQXo9KLh2ABToVFaskPVhrnASYQg6mQAAAQEEAgIEBbSC8ZI+HJAH ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoucxAAH0GRsVBej0oQXo9IgAUuHaQ9WGu6FRW rVAQ/VzLCAAAgvGSPm6XBwAsBAAALAQAAAACs50B5AAH6QoWXAgARQAEHlCeQAA/Bun9QXo9 IkF6PSi4dgAU6FRWrZD1Ya5QGGEI0JUAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc0NDkg TU49MzYyMDAwMDUub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQ Rk49IkZUIEluZm9ybWF0aW9uIChFVVIpIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUu Li4gIEVsIFBhaXM6IFNhY3lyIFZhbGxlaGVybW9zbyB0byByZW50IGJ1aWxkaW5nIGZyb20g bGF3IGZpcm0KCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFw ciA4LCAyMDAzLCAoRWwgUGFpcyAvRlQgSW5mb3JtYXRpb24gdmlhIENPTVRFWCkgLS0KCgoK Li4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMzogRmluYW5jaWFsIFRpbWVz IEluZm9ybWF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkCgoKLi4uCgoKRlQgSW5mb3JtYXRp b24gKEVVUikKClNhY3lyIFZhbGxlaGVybW9zbywgdGhlIFNwYW5pc2ggcHJvcGVydHkgZ3Jv dXAsIGlzIGFib3V0IHRvIGNvbmNsdWRlIGFuCmFncmVlbWVudCB3aXRoIFVyaWEgJiBNZW5l bmRleiwgdGhlIGxhdyBmaXJtLCB3aXRoIGEgdmlldyB0byByZW50aW5nIGEKYnVpbGRpbmcg ZnJvbSB0aGUgbGF0dGVyLCBhY2NvcmRpbmcgdG8gU2FjeXIgVmFsbGVoZXJtb3NvIHNvdXJj ZXMuCgpFbmRlc2EsIHRoZSBTcGFuaXNoIHBvd2VyIGdyb3VwLCBjdXJyZW50bHkgaGFzIGl0 cyBoZWFkcXVhcnRlcnMgaW4gdGhlCmJ1aWxkaW5nLCBsb2NhdGVkIGluIG51bWJlciAxOTcg Q2FsbGUgUHJpbmNpcGUgZGUgVmVyZ2FyYSwgTWFkcmlkLiBUaGUKb3BlcmF0aW9uIHdpbGwg YmUgY2FycmllZCBvdXQgdmlhIHRoZSBUZXN0YSBzdWJzaWRpYXJ5LCB3aGljaCBtYW5hZ2Vz ClZhbGxlaGVybW9zbydzIHBvcnRmb2xpbyBvZiBidWlsZGluZ3MuCgpPcmlnaW5hbCBhcnRp Y2xlIGJ5IFNhbnRpYWdvIEhlcm5hbmRlegoKQWJzdHJhY3RlZCBmcm9tIEVsIFBhaXMKCi4u LiAgCSAKCktleVdvcmRzLi4uICAKICAgIGxhdwogICAgbWFkcmlkCiAgICBwcmluY2lwZQog ICAgcHJvcGVydHkKCoLxkj5vlwcAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQn0AAPwbt 8kF6PSJBej0ouHYAFOhUWqOQ9WGuUBFhCGNmAAAAAAAAAACC8ZI+V+sHADYAAAA2AAAAAAfp ChZcAAKznQHkCABFAAAouc1AAH0GRsRBej0oQXo9IgAUuHaQ9WGu6FRapFAQ+WbLBwAAgvGS Prf6BwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLnOQAB9BkbDQXo9KEF6PSIAFLh2kPVh ruhUWqRQEflmywYAAILxkj7m+wcAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQoEAAPwbt 8UF6PSJBej0ouHYAFOhUWqSQ9WGvUBBhCGNlAAAAAAAAAACC8ZI+Mk8IADwAAAA8AAAAAAKz nQHkAAfpChZcCABFAAAoUKFAAD8G7fBBej0iQXo9KLdtABXd+k/ducgqfFAQYQiH7gAAAAAA AAAAgvGSPm6HCABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLnPQAB9BkaqQXo9KEF6PSIA FbdtucgqfN36T91QGPhWIYoAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCoLxkj73/AkAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChQokAAPwbt70F6PSJBej0ot20AFd36T925yCqUUBBh CIfWAAAAAAAAAACD8ZI+tMMJAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhO+lAAD8GAnBB ej0iQXo9KJUPG1gYjQsodHoEIIAYFtA/zwAAAQEICg1EOgsAQh4ONzU0fDE0NzMwMTV8MTA0 OTgxNzQ3N3wxLjB8MXwyMzB8aGVsbG8gd29ybGQKg/GSPmm+DABCAAAAQgAAAAAH6QoWXAAC s50B5AgARQAANJbQQAB9Bmm1QXo9KEF6PSIbWJUPdHoEIBiNC1WAEJDYNgQAAAEBCAoAQh4t DUQ6C4Pxkj6iwAwACAIAAAgCAAAAArOdAeQAB+kKFlwIAEUAAfo76kAAPwYA1kF6PSJBej0o lQ8bWBiNC1V0egQggBgW0KxEAAABAQgKDUQ6HgBCHi03NTV8MTQ3MzAxNnwxMDQ5ODE3NDc3 fDEuMHwxfDc5OXxoZWxsbyB3b3JsZAo3NTZ8MTQ3MzAxN3wxMDQ5ODE3NDc3fDEuMHwxfDc5 OXxoZWxsbyB3b3JsZAo3NTd8MTQ3MzAxOHwxMDQ5ODE3NDc3fDEuMHwxfDEzNTN8aGVsbG8g d29ybGQKNzU4fDE0NzMwMTl8MTA0OTgxNzQ3N3wxLjB8MXw2NTR8aGVsbG8gd29ybGQKNzU5 fDE0NzMwMjB8MTA0OTgxNzQ3N3wxLjB8MXwyMTN8aGVsbG8gd29ybGQKNzYwfDE0NzMwMjF8 MTA0OTgxNzQ3OHwxLjB8MXw2NTR8aGVsbG8gd29ybGQKNzYxfDE0NzMwMjJ8MTA0OTgxNzQ3 OHwxLjB8MXwzMjd8aGVsbG8gd29ybGQKNzYyfDE0NzMwMjN8MTA0OTgxNzQ3OHwxLjB8MXwx Nzg3fGhlbGxvIHdvcmxkCjc2M3wxNDczMDI0fDEwNDk4MTc0Nzh8MS4wfDF8MTM1M3xoZWxs byB3b3JsZAo3NjR8MTQ3MzAyNXwxMDQ5ODE3NDc4fDEuMHwxfDM0MjB8aGVsbG8gd29ybGQK hPGSPqzSAABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbRQAB9Bmm0QXo9KEF6PSIbWJUP dHoEIBiNDRuAEI8SNe8AAAEBCAoAQh4vDUQ6HoTxkj5MkwUAcAAAAHAAAAAAArOdAeQAB+kK FlwIAEUAAGI760AAPwYCbUF6PSJBej0olQ8bWBiNDRt0egQggBgW0MmpAAABAQgKDUQ6UwBC Hi83NjV8MTQ3MzAyNnwxMDQ5ODE3NDc5fDEuMHwxfDMxMTZ8aGVsbG8gd29ybGQKhPGSPod/ BwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbSQAB9BmmzQXo9KEF6PSIbWJUPdHoEIBiN DUmAEI7kNbUAAAEBCAoAQh40DUQ6U4Txkj4igQcAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUA AGI77EAAPwYCbEF6PSJBej0olQ8bWBiNDUl0egQggBgW0MpqAAABAQgKDUQ6YABCHjQ3NjZ8 MTQ3MzAyN3wxMDQ5ODE3NDc5fDEuMHwxfDMzMDF8aGVsbG8gd29ybGQKhPGSPuzVCgBCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJbTQAB9BmmyQXo9KEF6PSIbWJUPdHoEIBiNDXeAEI62 NaYAAAEBCAoAQh42DUQ6YIXxkj7lIAIAbwAAAG8AAAAAArOdAeQAB+kKFlwIAEUAAGE77UAA PwYCbEF6PSJBej0olQ8bWBiNDXd0egQggBgW0DXHAAABAQgKDUQ6oQBCHjY3Njd8MTQ3MzAy OHwxMDQ5ODE3NDgwfDEuMHwxfDIzMHxoZWxsbyB3b3JsZAqF8ZI+UpcFAEIAAABCAAAAAAfp ChZcAAKznQHkCABFAAA0ltRAAH0GabFBej0oQXo9IhtYlQ90egQgGI0NpIAQjok1XgAAAQEI CgBCHj0NRDqhhfGSPr2YBQDLAAAAywAAAAACs50B5AAH6QoWXAgARQAAvTvuQAA/BgIPQXo9 IkF6PSiVDxtYGI0NpHR6BCCAGBbQCF0AAAEBCAoNRDq3AEIePTc2OHwxNDczMDI5fDEwNDk4 MTc0ODB8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCjc2OXwxNDczMDMwfDEwNDk4MTc0ODB8MS4w fDF8MjIzNXxoZWxsbyB3b3JsZAo3NzB8MTQ3MzAzMXwxMDQ5ODE3NDgwfDEuMHwxfDEyMDN8 aGVsbG8gd29ybGQKhfGSPrDtCABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbVQAB9Bmmw QXo9KEF6PSIbWJUPdHoEIBiNDi2AEI4ANUYAAAEBCAoAQh4/DUQ6t4fxkj4kfQgAUAAAAFAA AAAAArOdAeQAB+kKFlwIAEUAAEJQo0AAPwbt1EF6PSJBej0ot20AFd36T925yCqUUBhhCIfo AABERUxFIDM2MjAwMDA3Lm91dC4wMzA0MDgNCofxkj7LuQgAfAAAAHwAAAAAB+kKFlwAArOd AeQIAEUAAG650EAAfQZGe0F6PShBej0iABW3bbnIKpTd+k/3UBj4PHh3AAA1NTAgMzYyMDAw MDcub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZp ZWQuIA0Kh/GSPjTHCABRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1CkQAA/Bu3SQXo9IkF6 PSi3bQAV3fpP97nIKtpQGGEIw7oAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxMjENCofxkj4P AQkAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa50UAAfQZGokF6PShBej0iABW3bbnIKtrd +lASUBj4IDM1AAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQqH8ZI+WgQJAFAAAABQ AAAAAAKznQHkAAfpChZcCABFAABCUKVAAD8G7dJBej0iQXo9KLdtABXd+lASucgq+FAYYQh1 MwAAU1RPUiAzNjIwMDAwNy5vdXQuMDMwNDA4DQqH8ZI+pEAJAHgAAAB4AAAAAAfpChZcAAKz nQHkCABFAABqudJAAH0GRn1Bej0oQXo9IgAVt225yCr43fpQLFAY+AYCOgAAMTUwIE9wZW5p bmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDAwNy5vdXQuMDMwNDA4 Lg0Kh/GSPqtBCQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLnTQAB9Bka2QXo9KEF6PSIA FLh5WelqsgAAAABwAvrwDhcAAAIEBWQBAQQCh/GSPi9DCQA+AAAAPgAAAAACs50B5AAH6QoW XAgARQAAMFCmQAA/Bu3jQXo9IkF6PSi4eQAU6G6gfVnparNwEmEIHrIAAAEBBAICBAW0h/GS PhV7CQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLnUQAB9Bka9QXo9KEF6PSIAFLh5Welq s+huoH5QEP1cryEAAIfxkj5kggkAUwQAAFMEAAAAArOdAeQAB+kKFlwIAEUABEVQp0AAPwbp zUF6PSJBej0ouHkAFOhuoH5Z6WqzUBhhCKMsAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3 NDUwIE1OPTM2MjAwMDA3Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRl eCIgUEZOPSJGZWRCaXpPcHMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgQkVM TENSQU5LLCBDTFVTVEVSCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5l Li4uICBBcHIgMDgsIDIwMDMgKEZlZEJpek9wcHMgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpD b3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKGMpIDIwMDMgRmVkZXJhbCBJbmZvcm1hdGlv biAmIE5ld3MgRGlzcGF0Y2gsIEluYy4KCgouLi4KCgpGZWRCaXpPcHMKCk5PVElDRSBUWVBF OiBDT05UUkFDVCBBV0FSRAoKU09VUkNFOiBQdWJsaXNoZWQgaW4gRmVkQml6T3BwcwoKREFU RSBQT1NURUQ6IDA3LUFQUi0wMwoKT0ZGSUNFIEFERFJFU1M6IERFRkVOU0UgR0VORVJBTCBT VVBQTFkgQ0VOVEVSIDgwMDAgSkVGRiBEQVZJUyBIV1kKUklDSE1PTkQsIFZBIDIzMjk3LTUz IDEyCgpDTEFTU0lGSUNBVElPTiBDT0RFOiAxNiAtIEFpcmNyYWZ0IGNvbXBvbmVudHMgJiBh Y2Nlc3NvcmllcwoKU1VCSkVDVDogQkVMTENSQU5LLCBDTFVTVEVSCgpTT0xJQ0lUQVRJT04g TlVNQkVSOiAwM1RCSDEtMTItUC0wNDAwCgpBV0FSRCBOVU1CRVI6IFNQMDQwMC0wMy1WLUE2 MjgKCkFXQVJEIEFNT1VOVDogJDU5LDgxMgoKTElORSBOVU1CRVI6IDAwMDEKCkFXQVJEIERB VEU6IDA0MDQwMwoKQVdBUkRFRCBUTzogSU5URVJOQVRJT05BTCBQUkVDSVNJT04gSU5DIDk1 MjYgVkFTU0FSIEFWRS4gQ0hBVFNXT1JUSCBDQQo5MTMxMS00MTYgOAoKQVJDSElWRSBEQVRF OiAwNDE5MjAwMwoKQ09OVEFDVDogTi9BCgpJTlRFUk5FVCBBRERSRVNTOgpodHRwOi8vd3d3 LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJkcy9TUDA0MDAtMDMtVi1BNjI4TG4wMDAx Lmh0bWwKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGFpcmNyYWZ0CiAgICBjYWxpZm9y bmlhCiAgICBjb250cmFjdAogICAgZGVmZW5zZQogICAgaW50ZXJuZXQKICAgIHZpcmdpbmlh CgqH8ZI+ZYIJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUKhAAD8G7elBej0iQXo9KLh5 ABTobqSbWelqs1ARYQhHWAAAAAAAAAAAh/GSPlDXCQA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLnVQAB9Bka8QXo9KEF6PSIAFLh5Welqs+hupJxQEPk/ryAAAIfxkj7F4gkANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi51kAAfQZGu0F6PShBej0iABS4eVnparPobqScUBH5P68f AACH8ZI+0+MJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUKlAAD8G7ehBej0iQXo9KLh5 ABTobqScWelqtFAQYQhHVwAAAAAAAAAAh/GSPr3ACgA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKFCqQAA/Bu3nQXo9IkF6PSi3bQAV3fpQLLnIKzpQEGEIhuEAAAAAAAAAAIfxkj6H+QoA TgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC510AAfQZGokF6PShBej0iABW3bbnIKzrd+lAs UBj4BiDNAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQqH8ZI+bwILAFAAAABQAAAAAAKznQHk AAfpChZcCABFAABCUKtAAD8G7cxBej0iQXo9KLdtABXd+lAsucgrUlAYYQiE2wAAREVMRSAz NjIwMDAwOS5vdXQuMDMwNDA4DQqH8ZI+nj4LAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABu udhAAH0GRnNBej0oQXo9IgAVt225yCtS3fpQRlAY9+x3uAAANTUwIDM2MjAwMDA5Lm91dC4w MzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCofx kj6rSgsAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENQrEAAPwbtykF6PSJBej0ot20AFd36 UEa5yCuYUBhhCMGtAABQT1JUIDY1LDEyMiw2MSwzNCwxODQsMTIyDQqH8ZI+IIULAFQAAABU AAAAAAfpChZcAAKznQHkCABFAABGudlAAH0GRppBej0oQXo9IgAVt225yCuY3fpQYVAY99Ay eAAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0Kh/GSPm6ICwBQAAAAUAAAAAACs50B 5AAH6QoWXAgARQAAQlCtQAA/Bu3KQXo9IkF6PSi3bQAV3fpQYbnIK7ZQGGEIciYAAFNUT1Ig MzYyMDAwMDkub3V0LjAzMDQwOA0Kh/GSPt/FCwB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAA arnaQAB9BkZ1QXo9KEF6PSIAFbdtucgrtt36UHtQGPe2AXsAADE1MCBPcGVuaW5nIEJJTkFS WSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwMDkub3V0LjAzMDQwOC4NCofxkj7G xgsAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC520AAfQZGrkF6PShBej0iABS4endeyp0A AAAAcAL68JC1AAACBAVkAQEEAofxkj47yAsAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBQ rkAAPwbt20F6PSJBej0ouHoAFOhxxP53XsqecBJhCHzMAAABAQQCAgQFtIfxkj4YAAwANgAA ADYAAAAAB+kKFlwAArOdAeQIAEUAACi53EAAfQZGtUF6PShBej0iABS4endeyp7occT/UBD9 XA08AACH8ZI+xwcMAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUK9AAD8G6H5Bej0iQXo9 KLh6ABToccT/d17KnlAQYQgIlQAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzQ1MCBNTj0z NjIwMDAwOS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0i T3N0ZXJEb3dKb25lcyBTZWxlY3QiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAg T0RKIE9zdGVyRG93Sm9uZXMgTWFzdGVyIE5ld3MgTWVudQoKLi4uICAJIAoKQnlMaW5lLi4u ICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChPREogU2VsZWN0IHZpYSBD T01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMgT3N0 ZXJEb3dKb25lcyBDb21tb2RpdHkgTmV3cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K CgouLi4KCgpPc3RlckRvd0pvbmVzIFNlbGVjdAoKVGhlIHN0b3J5IG51bWJlcnMgbGlzdGVk IGJlbG93IGFwcGx5IHRvIEZ1dHVyZVNvdXJjZSBwcm9kdWN0cyBvbmx5LiBUaGUKc2FtZSBp dGVtcyBhcmUgYXZhaWxhYmxlIG9uIG90aGVyIHNlcnZpY2VzIGJ1dCBtaWdodCBub3QgdXRp bGl6ZSB0aGUgc2FtZQpzdG9yeSBudW1iZXJzLiBJZiBubyBudW1iZXIgaXMgbGlzdGVkIGJl Zm9yZSBhbiBpdGVtLCB0aGVyZSBpcyBubwphc3NvY2lhdGVkIHJlZ3VsYXIgc3RvcnkgbnVt YmVyLgoKTm90IGFsbCBzdG9yaWVzIGxpc3RlZCBhcmUgYXZhaWxhYmxlIGluIGFsbCBuZXdz IHBhY2thZ2VzLiBGb3IgYSBjb21wbGV0ZQpsaXN0IG9mIHJlcG9ydHMgaW5jbHVkZWQgaW4g ZWFjaCBPREogcGFja2FnZSwgZ28gdG8gd3d3Lm9zdGVyZG93am9uZXMuY29tCmFuZCBjbGlj ayBpbiAiY29udGVudCIuIEFwcmlsIDgsIDIwMDMKCk51bWJlciAgICAgICBUaXRsZQotLS0t LS0gICAgICAgLS0tLS0KMSAgICAgICAgICAgICBNYXN0ZXIgTmV3cyBNZW51CgoxMCAgICAg ICAgICAgIFNvZnRzIC0gQ29mZmVlCjExICAgICAgICAgICAgU29mdHMgLSBDb2NvYQoxMiAg ICAgICAgICAgIFNvZnRzIC0gU3VnYXIKMTMgICAgICAgICAgICBTb2Z0cyAtIENpdHJ1cyBh bmQgRGFpcnkgUHJvZHVjdHMKCjE1ICAgICAgICAgICAgRmliZXIgLSBDb3R0b24KMTYgICAg ICAgICAgICBGaWJlciAtIEZvcmVzdHJ5CgoxOS0yMCAgICAgICAgIEdyYWlucyAtIEFtZXJp Y2FzIENhc2ggTWFya2V0cwoyMSAgICAgICAgICAgIEdyYWlucyAtIEFtZXJpY2FzIEZ1dHVy ZXMgTWFya2V0cwoyMiAgICAgICAgICAgIEdyYWlucyAtIFdlZWtseSBVUyBHb3Zlcm5tZW50 IFJlcG9ydHMKMjMgICAgICAgICAgICBHcmFpbnMgLSBNb250aGx5IFVTIEdvdmVybm1lbnQg UmVwb3J0cwoyNCAgICAgICAgICAgIEdyYWlucyAtIEV1cm9wZSwgQXNpYSwgQXVzdHJhbGlh CgoyNSAgICAgICAgICAgIFNoaXBwaW5nCgozMCAgICAgICAgICAgIExpdmVzdG9jayAth/GS PkYIDACaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFCwQAA/Buh9QXo9IkF6PSi4egAU6HHK Y3deyp5QGGEIfEcAACBGdXR1cmVzLCBDYXNoLCBMb2NrdXAgUmVwb3J0cwozMS0zMiAgICAg ICAgIExpdmVzdG9jayAtIFVTREEgQ2F0dGxlL0JlZWYKMzMgICAgICAgICAgICBMaXZlc3Rv Y2sgLSBVU0RBIEhvZ3MvUG9yawozNCAgICAgICAgICAgIExpdmVzdG9jayAtIFVTREEgSW1w b3J0L0V4cG9ydCwgUG91bHRyeSwgU2hlZXAKMzUgICAgICAgICAgICBMaXZlc3RvY2sgLSBV U0RBIEF1Y3Rpb24gUmVwb3J0cwoKMzggICAgICAgICAgICBBZ3JpY3VsdHVyYWwgV2VhdGhl ciAtIEdsb2JhbCBhbmQgQW1lcmljYXMKMzkgICAgICAgICAgICBBZ3JpY3VsdHVyYWwgV2Vh dGhlciAtIEV1cm9wZSBhbmQgQXNpYQoKNDAgICAgICAgICAgICBNZXRhbHMgLSBCYXNlIGFu ZCBQcmVjaW91cyBNZXRhbHMKCjQ1ICAgICAgICAgICAgRW5lcmd5Cgo0OSAgICAgICAgICAg IEZpbmFuY2lhbAoKNTAgICAgICAgICAgICBHZW5lcmFsCgpDYWxlbmRhcnMgYW5kIEdlbmVy YWwgTmV3cyA1MSw1Miw1Myw1NCBHbG9iYWwgTW9udGhseSBDb21tb2RpdHkgQ2FsZW5kYXIK CjU4ICAgICAgICAgICAgQ01FIEZpbmFuY2lhbCBGdXR1cmVzL09wdGlvbnMgQ2FsZW5kYXIK NTkgICAgICAgICAgICBOeW1leCBFbmVyZ3kgRnV0dXJlcy9PcHRpb25zIENhbGVuZGFyCjYw ICAgICAgICAgICAgQ0JPVCBGaW5hbmNpYWwgRnV0dXJlcy9PcHRpb25zIENhbGVuZGFyCjIw MDMgICAgICAgICAgTWV0YWxzIEZ1dHVyZXMvT3B0aW9ucyBDYWxlbmRhcgoyNzYwICAgICAg ICAgIEFncmljdWx0dXJlIEZ1dHVyZXMvT3B0aW9ucyBDYWxlbmRhcgozNjQ3ICAgICAgICAg IENvZmZlZSBGdXR1cmVzL09wdGlvbnMgQ2FsZW5kYXIKMzY4MCAgICAgICAgICBDb2NvYSBG dXR1cmVzL09wdGlvbnMgQ2FsZW5kYXIKMzkwMSAgICAgICAgICBTdWdhciBGdXR1cmVzL09w dGlvbnMgQ2FsZW5kYXIKClVTIFBvbGl0aWNhbCwgRWNvbm9taWMgQ2FsZW5kYXI6IFdlZWsg QWhlYWQKClVLIFBvbGl0aWNhbCwgRWNvbm9taWMgQ2FsZW5kYXI6IFdlZWsgQWhlYWQKCkZy YW5jZSBQb2xpdGljYWwsIEVjb25vbWljIENhbGVuZGFyOiBXZWVrIEFoZWFkCgpHZXJtYW55 IFBvbGl0aWNhbCwgRWNvbm9taWMgQ2FsZW5kYXI6IFdlZWsgQWhlYWQKCkctNyBQb2xpdGlj YWwsIEVjb25vbWljIENhbGVuZGFyOiBXZWVrIEFoZWFkCgpKYXBhbiBPdXRsb29rOiBDYWxl bmRhciBhbmQgRXZlbnRzCgoxMDY0ICAgICAgICAgIEhvbGlkYXkgTm90aWNlOiBNYXJrZXQg Q2xvc2luZ3MKCi0tLSBPc3RlckRvd0pvbmVzCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAg ICBhZ3JpY3VsdHVyYWwKICAgIGFncmljdWx0dXJlCiAgICBhc2lhCiAgICBhdXN0cmFsaWEK ICAgIGNtZQogICAgY29jb2EKICAgIGNvZmZlZQogICAgY29tbW9kaXR5Cofxkj5bCAwAmgEA AJoBAAAAArOdAeQAB+kKFlwIAEUAAYxQsUAAPwbsfEF6PSJBej0ouHoAFOhxz8d3XsqeUBhh CEVfAAAgICAgY290dG9uCiAgICBkYWlyeQogICAgZW5lcmd5CiAgICBldXJvcGUKICAgIGV4 cG9ydAogICAgZm9yZXN0cnkKICAgIGZyYW5jZQogICAgZnV0dXJlcwogICAgZy03CiAgICBn ZXJtYW55CiAgICBpbXBvcnQKICAgIGphcGFuCiAgICBsaXZlc3RvY2sKICAgIG1hcmtldAog ICAgbWV0YWxzCiAgICBueW1leAogICAgcG9saXRpY3MKICAgIHBvdWx0cnkKICAgIHByZWNp b3VzK21ldGFscwogICAgcHJvZHVjdHMKICAgIHNoaXBwaW5nCiAgICBzdWdhcgogICAgdXNk YQogICAgd2VhdGhlcgogICAgRU5FUkdZT3JpZ2luIEFzc2lnbmVkQnk9Ik9zdGVyRG93Sm9u ZXMgU2VsZWN0IiAvPkZJTkFOQ0lBTE1FVEFMU1dFQVRIRVIKCofxkj5cCAwAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChQskAAPwbt30F6PSJBej0ouHoAFOhx0St3XsqeUBFhCJ1jAAAA AAAAAACH8ZI+aoIMADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoud1AAH0GRrRBej0oQXo9 IgAUuHp3Xsqe6HHPx1AQ/VwCdAAAh/GSPuaGDAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLneQAB9BkazQXo9KEF6PSIAFLh6d17Knuhx0SxQEPv4AnMAAIfxkj5ZkAwANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi530AAfQZGskF6PShBej0iABS4endeyp7ocdEsUBH7+AJyAACH 8ZI+Y5EMADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoULNAAD8G7d5Bej0iQXo9KLh6ABTo cdEsd17Kn1AQYQidYgAAAAAAAAAAh/GSPrIxDQA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAA KFC0QAA/Bu3dQXo9IkF6PSi3bQAV3fpQe7nIK/hQEGEIhdQAAAAAAAAAAIfxkj6dag0ATgAA AE4AAAAAB+kKFlwAArOdAeQIAEUAAEC54EAAfQZGmUF6PShBej0iABW3bbnIK/jd+lB7UBj3 tiAQAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQqH8ZI+tXMNAFAAAABQAAAAAAKznQHkAAfp ChZcCABFAABCULVAAD8G7cJBej0iQXo9KLdtABXd+lB7ucgsEFAYYQiKzQAAREVMRSAzNjIw MDAxMi5vdXQuMDMwNDA4DQqH8ZI+/7ANAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABuueFA AH0GRmpBej0oQXo9IgAVt225yCwQ3fpQlVAY95x2AgAANTUwIDM2MjAwMDEyLm91dC4wMzA0 MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCofxkj4g vQ0AUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENQtkAAPwbtwEF6PSJBej0ot20AFd36UJW5 yCxWUBhhCL+gAABQT1JUIDY1LDEyMiw2MSwzNCwxODQsMTIzDQqH8ZI+Q/cNAFQAAABUAAAA AAfpChZcAAKznQHkCABFAABGueJAAH0GRpFBej0oQXo9IgAVt225yCxW3fpQsFAY94AxuwAA MjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0Kh/GSPor6DQBQAAAAUAAAAAACs50B5AAH 6QoWXAgARQAAQlC3QAA/Bu3AQXo9IkF6PSi3bQAV3fpQsLnILHRQGGEIeBgAAFNUT1IgMzYy MDAwMTIub3V0LjAzMDQwOA0Kh/GSPq83DgB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarnj QAB9BkZsQXo9KEF6PSIAFbdtucgsdN36UMpQGPdm/8QAADE1MCBPcGVuaW5nIEJJTkFSWSBt b2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwMTIub3V0LjAzMDQwOC4NCofxkj6VOA4A PgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC55EAAfQZGpUF6PShBej0iABS4e7tE9KcAAAAA cAL68CLEAAACBAVkAQEEAofxkj5mOg4APgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBQuEAA Pwbt0UF6PSJBej0ouHsAFOh1Q/m7RPSocBJhCI/cAAABAQQCAgQFtIfxkj4Pcg4ANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi55UAAfQZGrEF6PShBej0iABS4e7tE9KjodUP6UBD9XCBM AACH8ZI+X3kOAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMULlAAD8G6HRBej0iQXo9KLh7 ABTodUP6u0T0qFAQYQimNQAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzQ1MSBNTj0zNjIw MDAxMi5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iT3N0 ZXJEb3dKb25lcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBPREogTmV3cyBN ZW51OiBTb2Z0cyAtIENvZmZlZQoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRl TGluZS4uLiAgQXByIDA4LCAyMDAzIChPREogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5 cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0eSBO ZXdzIChPREopLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9uZXMK ClRoZSBzdG9yeSBudW1iZXJzIGxpc3RlZCBiZWxvdyBhcHBseSB0byBGdXR1cmVTb3VyY2Ug cHJvZHVjdHMgb25seS4gVGhlCnNhbWUgaXRlbXMgYXJlIGF2YWlsYWJsZSBvbiBvdGhlciBz ZXJ2aWNlcyBidXQgbWlnaHQgbm90IHV0aWxpemUgdGhlIHNhbWUKc3RvcnkgbnVtYmVycy4g SWYgbm8gbnVtYmVyIGlzIGxpc3RlZCBiZWZvcmUgYW4gaXRlbSwgdGhlcmUgaXMgbm8KYXNz b2NpYXRlZCByZWd1bGFyIHN0b3J5IG51bWJlci4KCk5vdCBhbGwgc3RvcmllcyBsaXN0ZWQg YXJlIGF2YWlsYWJsZSBpbiBhbGwgbmV3cyBwYWNrYWdlcy4gRm9yIGEgY29tcGxldGUKbGlz dCBvZiByZXBvcnRzIGluY2x1ZGVkIGluIGVhY2ggT0RKIHBhY2thZ2UsIGdvIHRvIHd3dy5v c3RlcmRvd2pvbmVzLmNvbQphbmQgY2xpY2sgaW4gImNvbnRlbnQiLiBBcHJpbCA4LCAyMDAz CgotLS0gU3RvcnkgLS0tCk51bWJlciAgVGl0bGUKLS0tLS0tICAtLS0tLQozNjQ3ICAgQ29m ZmVlIENhbGVuZGFyIC0gRnV0dXJlcy9PcHRpb25zIERhdGVzIChEYWlseSkKMzY5MiAgIElu dGVybmF0aW9uYWwgQ29mZmVlIE9yZ2FuaXphdGlvbiBQcmljZXMgKERhaWx5KQo1MDYzICAg Q3VycmVuY3kgUmF0ZXMgSW4gTWFqb3IgQ29mZmVlIE5hdGlvbnMgKERhaWx5KQozNzMxICAg Q1NDRSBDb2ZmZWUgRnV0dXJlcyBQcmUtT3BlbiAoRGFpbHkpCjM3MDQgICBDU0NFIENvZmZl ZSBGdXR1cmVzIE1pZGRheSAoRGFpbHkpCjM3MzQgICBDU0NFIENvZmZlZSBGdXR1cmVzIFJl dmlldyAoRGFpbHkpCjIyNjcgICBDU0NFIENvY29hLCBDb2ZmZWUsIFN1Z2FyIEVzdGltYXRl ZCBWb2x1bWVzIChEYWlseSkKMzc1MiAgIENTQ0UgQ29mZmVlLCBTdWdhciwgQ29jb2EgQ2xv c2luZyBFc3RpbWF0ZWQgVm9sdW1lcyAoRGFpbHkpCjM3NTAgICBDU0NFIENvZmZlZSwgU3Vn YXIsIENvY29hIEZ1dHVyZXMgRmluYWwgVm9sdW1lcyAoRGFpbHkpCjM3NTEgICBDU0NFIENv ZmZlZSwgU3VnYXIsIENvY29hIEZ1dHVyZXMgT3BlbiBJbnRlcmVzdCAoRGFpbHkph/GSPtV5 DgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFC6QAA/BuhzQXo9IkF6PSi4ewAU6HVJXrtE 9KhQGGEIBJkAAAozNzU1ICAgQ1NDRSBDb2ZmZWUgRnV0dXJlcyBDbG9zZSAoRGFpbHkpCjM3 NTQgICBDU0NFIENvZmZlZSBGdXR1cmVzIE9wZW4gKERhaWx5KQozNzU2ICAgQ1NDRSBDb2Zm ZWUgT3B0aW9ucyBDbG9zZSAoRGFpbHkpCjM3NTcgICBDU0NFIENvZmZlZSBPcHRpb25zIFZv bHVtZS9PcGVuIEludGVyZXN0IChEYWlseSkKMzk0NSAgIENTQ0UgTWluaSBDb2ZmZWUgRnV0 dXJlcyBDbG9zZSAoRGFpbHkpCjM5MjMgICBDU0NFIE1pbmkgQ29mZmVlIEZ1dHVyZXMgT3Bl biAoRGFpbHkpCjM3NTkgICBDU0NFIENvZmZlZSBXYXJlaG91c2UgU3RvY2tzIEJ5IENvdW50 cnkgT2YgT3JpZ2luIChEYWlseSkKMzcyNyAgIENTQ0UgQ29mZmVlIERlbGl2ZXJpZXMgKFBl cmlvZGljKQozNzE5ICAgQ0ZUQyBDb21taXRtZW50cyBvZiBUcmFkZXJzOiBDU0NFIENvZmZl ZSBGdXR1cmVzIChGcmlkYXkpCjg3MTkgICBDRlRDIENvbW1pdG1lbnRzIG9mIFRyYWRlcnM6 IENTQ0UgQ29mZmVlIEZ1dHVyZXMvT3B0aW9ucyAoRnJpZGF5KQozNjY2ICAgUmVhY3Rpb24g VG8gQ29tbWl0bWVudCBPZiBUcmFkZXJzIFJlcG9ydCAtIENvZmZlZSAoUGVyaW9kaWMpCjM3 MTcgICBVUyBDb2ZmZWUgUm9hc3RpbmdzIChXZWVrbHkpCjM2ODQgICBVUyBDb2ZmZWUsIENv Y29hIEltcG9ydHMgKE1vbnRobHkpCjM3MTIgICBVUyBDb2ZmZWUsIFRlYSBleHBvcnQsIFJl LWV4cG9ydHMgKE1vbnRobHkpCjQ3OTUgICBVUyBDb2ZmZWUgSW1wb3J0cyAoTW9udGhseSkK Mzc2MyAgIEdyZWVuIENvZmZlZSBBc3NuLiBXYXJlaG91c2UgU3RvY2tzIChNb250aGx5KQoK MzY2OCBMaWZmZSBDb2ZmZWUgRnV0dXJlcyBNaWRkYXkgKERhaWx5KSAzNjY3IExpZmZlIENv ZmZlZSBGdXR1cmVzIFJldmlldwooRGFpbHkpIDM3MjAgTGlmZmUgQ29mZmVlIFZvbHVtZSBB bmQgT3BlbiBJbnRlcmVzdCAoRGFpbHkpIDM2ODggTGlmZmUKQ29mZmVlIEdyYWRpbmdzLCBU ZW5kZXJzIChEYWlseSkgMzY4NyBMaWZmZSBSb2J1c3RhIENvZmZlZSBDbG9zZSAoRGFpbHkp CjUwMzggTGlmZmUgVGVuZGVyYWJsZSBDZXJ0aWZpZWQgQ29mZmVlIFN0b2NrcyAoV2Vla2x5 KQoKMzc0MSBCcmF6aWwgQk0mRiBDb2ZmZWUgUmV2aWV3IChEYWlseSkgMzc5NyBCcmF6aWwg Qk0mRiBDb2ZmZWUgRnV0dXJlcwpDbG9zaW5nIFByaWNlcyAoRGFpbHkpIDM3OTAgQnJhemls IEVzYWxxL0JNJkYgQ29mZmVlIENhc2ggSW5kZXggKERhaWx5KQoKQnJhemlsIENhc2ggQ29m ZmVlIENvbW1lbnRzIChXZWVrbHkpIDUwODcgQnJhemlsIENvZmZlZSBFeHBvcnRzIChXZWVr bHkpCjUwODUgQnJhemlsIENvZmZlZSBFeHBvcnQgUmV2ZW51ZXMgKFdlZWtseSkgMzc4OSBC cmF6aWwgUGh5c2ljYWwgQ29mZmVlClByaWNlcyAoRGFpbHkpIDUwM4fxkj5Jeg4AmgUAAJoF AAAAArOdAeQAB+kKFlwIAEUABYxQu0AAPwbockF6PSJBej0ouHsAFOh1TsK7RPSoUBhhCEL8 AAA1IEJyYXppbGlhbiBDYXNoIENvZmZlZSBEaWZmZXJlbnRpYWxzIChXZWVrbHkpIDUwNDEK TWV4aWNvLCBDIEFtZXJpY2EgQ2FzaCBDb2ZmZWUgQ29tbWVudHMgKFdlZWtseSkgNTA4MiBD b2xvbWJpYSBDYXNoCkFyYWJpY2EgQ29mZmVlIFByaWNlcyAoV2Vla2x5KSAzNzk4IENvbG9t YmlhIENvZmZlZSBFeHBvcnQgUHJpY2UgKERhaWx5KQo1MDgzIENvbG9tYmlhIEZlZGVjYWZl IENvZmZlZSBQcmljZXMgKE1vbnRobHkpCgpFY3VhZG9yIENvZmZlZSBFeHBvcnQgUHJpY2Ug KFdlZWtseSkgNTA0NyBNZXhpY28sIEMgQW1lcmljYSBDYXNoIENvZmZlZQpDb21tZW50cyAo V2Vla2x5KSA1MDUwIENhc2ggUHJpY2VzIEZvciBDZW50cmFsIEFtZXJpY2EgQXJhYmljYSBD b2ZmZWUKKFdlZWtseSkgNTA2NyBDYXNoIFByaWNlcyBJbiBVUyBGb3IgTWV4aWNvIEFyYWJp Y2EgQ29mZmVlKFdlZWtseSkKCjUwNDYgS2VueWEgQ29mZmVlIEF1Y3Rpb24gKFdlZWtseSkg NTA3MCBDYXNoIFByaWNlcyBGb3IgVWdhbmRhJ3MgUm9idXN0YQpDb2ZmZWUgKFdlZWtseSkg NTA2OCBUYW56YW5pYSBDb2ZmZWUgQXVjdGlvbiAoUGVyaW9kaWMpIDUwNjQgQWZyaWNhbgpB cmFiaWNhIENvZmZlZSBEaWZmZXJlbnRpYWxzIChXZWVrbHkpIDUwNDMgQWZyaWNhIFJvYnVz dGEgQ29mZmVlCkRpZmZlcmVudGlhbHMgKFdlZWtseSkgNTA2NSBDYXNoIFByaWNlcyBJbiBF dXJvcGUgRm9yIEFmcmljYSBSb2J1c3RhCkNvZmZlZSAoV2Vla2x5KSAzNzk5IEFzaWEgQXJh YmljYSBDb2ZmZWUgQ29tbWVudHMgKFdlZWtseSkgNTA0OCBBc2lhClJvYnVzdGEgQ29mZmVl IENvbW1lbnRzICgzeCBBIFdlZWspIDUwNTYgQXNpYSBQaHlzaWNhbCBDb2ZmZWUgUHJpY2Vz CihEYWlseSkgNTA0NCBJbmRpYSBDb2ZmZWUgQ29tbWVudHMgKFdlZWtseSkgMzkwNiBJbmRp YSBCYW5nYWxvcmUgQ29mZmVlCkNvbW1lbnQgKFdlZWtseSkgNTA5MCBJbmRpYSBQZXJtaXR0 ZWQgQ29mZmVlIEV4cG9ydHMgKFdlZWtseSkgNTA1NApCYW5nYWxvcmUgQXJhYmljYSwgUm9i dXN0YSBDb2ZmZWUgRnV0dXJlcyBQcmljZXMgKERhaWx5KSA1MDU1IFRva3lvIEdyYWluCkV4 Y2hhbmdlIENvZmZlZSBGdXR1cmVzIFByaWNlcyAoRGFpbHkpCgpDaGluYSBUcmFkZSBEYXRh IE9uIENvZmZlZSwgQ29jb2EgKE1vbnRobHkpCgo0MDAzIFVTREEgV29ybGQgQ29mZmVlIFBy b2R1Y3Rpb24gKFF1YXJ0ZXJseSkKCi0tLSBPc3RlckRvd0pvbmVzCgouLi4gIAkgCgpLZXlX b3Jkcy4uLiAgCiAgICBhZnJpY2EKICAgIGFzaWEKICAgIGJyYXppbAogICAgY2VudHJhbCth bWVyaWNhCiAgICBjaGluYQogICAgY29jb2EKICAgIGNvZmZlZQogICAgY29sb21iaWEKICAg IGN1cnJlbmN5CiAgICBlY3VhZG9yCiAgICBldXJvcGWH8ZI+T/QOADYAAAA2AAAAAAfpChZc AAKznQHkCABFAAAoueZAAH0GRqtBej0oQXo9IgAUuHu7RPSo6HVOwlAQ/VwVhAAAh/GSPsr1 DgAaAQAAGgEAAAACs50B5AAH6QoWXAgARQABDFC8QAA/BuzxQXo9IkF6PSi4ewAU6HVUJrtE 9KhQGWEIh1EAAAogICAgZXhwb3J0CiAgICBmdXR1cmVzCiAgICBncmFpbgogICAgaW5kZXgK ICAgIGluZGlhCiAgICBrZW55YQogICAgbGlmZmUKICAgIG1leGljbwogICAgcHJpY2VzCiAg ICBwcm9kdWN0cwogICAgcmF0ZXMKICAgIHN1Z2FyCiAgICB0YW56YW5pYQogICAgdG9reW8K ICAgIHRyYWRlCiAgICB1Z2FuZGEKICAgIHVzZGEKICAgIEZPT0RPcmlnaW4gQXNzaWduZWRC eT0iT3N0ZXJEb3dKb25lcyIgLz4KCofxkj7IMw8ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUA ACi550AAfQZGqkF6PShBej0iABS4e7tE9KjodVULUBD9XA87AACH8ZI+xT4PADYAAAA2AAAA AAfpChZcAAKznQHkCABFAAAouehAAH0GRqlBej0oQXo9IgAUuHu7RPSo6HVVC1AR/VwPOgAA h/GSPuc/DwA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFC9QAA/Bu3UQXo9IkF6PSi4ewAU 6HVVC7tE9KlQEGEIq44AAAAAAAAAAIjxkj5yYAAAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUA AChQvkAAPwbt00F6PSJBej0ot20AFd36UMq5yCy2UBBhCITHAAAAAAAAAACI8ZI+aZgAAE4A AABOAAAAAAfpChZcAAKznQHkCABFAABAuelAAH0GRpBBej0oQXo9IgAVt225yCy23fpQylAY 92YfUwAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KiPGSPkMOAgA8AAAAPAAAAAACs50B5AAH 6QoWXAgARQAAKFC/QAA/Bu3SQXo9IkF6PSi3bQAV3fpQyrnILM5QEGEIhK8AAAAAAAAAAIjx kj6BVgUAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI770AAPwYCaUF6PSJBej0olQ8bWBiN Di10egQggBgW0NABAAABAQgKDUQ74gBCHj83NzF8MTQ3MzAzMnwxMDQ5ODE3NDgxfDEuMHwx fDEyMDN8aGVsbG8gd29ybGQKiPGSPsE2CABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbW QAB9BmmvQXo9KEF6PSIbWJUPdHoEIBiNDluAEI3SM/4AAAEBCAoAQh5cDUQ74ojxkj4hOAgA yQAAAMkAAAAAArOdAeQAB+kKFlwIAEUAALs78EAAPwYCD0F6PSJBej0olQ8bWBiNDlt0egQg gBgW0HE/AAABAQgKDUQ79ABCHlw3NzJ8MTQ3MzAzM3wxMDQ5ODE3NDgyfDEuMHwxfDUyNHxo ZWxsbyB3b3JsZAo3NzN8MTQ3MzAzNHwxMDQ5ODE3NDgyfDEuMHwxfDIxM3xoZWxsbyB3b3Js ZAo3NzR8MTQ3MzAzNXwxMDQ5ODE3NDgzfDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAqI8ZI+Jo0L AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0ltdAAH0Gaa5Bej0oQXo9IhtYlQ90egQgGI0O 4oAQjUsz6gAAAQEICgBCHl4NRDv0iPGSPqaOCwDMAAAAzAAAAAACs50B5AAH6QoWXAgARQAA vjvxQAA/BgILQXo9IkF6PSiVDxtYGI0O4nR6BCCAGBbQ8nAAAAEBCAoNRDwKAEIeXjc3NXwx NDczMDM2fDEwNDk4MTc0ODN8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAo3NzZ8MTQ3MzAzN3wx MDQ5ODE3NDgzfDEuMHwxfDIyMzV8aGVsbG8gd29ybGQKNzc3fDE0NzMwMzh8MTA0OTgxNzQ4 M3wxLjB8MXwyNTY2fGhlbGxvIHdvcmxkCojxkj7D4w4AQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSW2EAAfQZprUF6PShBej0iG1iVD3R6BCAYjQ9sgBCMwTPRAAABAQgKAEIeYQ1EPAqJ 8ZI+4dsGAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhO/JAAD8GAmdBej0iQXo9KJUPG1gY jQ9sdHoEIIAYFtAw6gAAAQEICg1EPFAAQh5hNzc4fDE0NzMwMzl8MTA0OTgxNzQ4NHwxLjB8 MXwzMjd8aGVsbG8gd29ybGQKifGSPu+kCQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbZ QAB9BmmsQXo9KEF6PSIbWJUPdHoEIBiND5mAEIyUM4UAAAEBCAoAQh5nDUQ8UInxkj5HcAsA cAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI780AAPwYCZUF6PSJBej0olQ8bWBiND5l0egQg gBgW0MjXAAABAQgKDUQ8bgBCHmc3Nzl8MTQ3MzA0MHwxMDQ5ODE3NDg1fDEuMHwxfDI0NDB8 aGVsbG8gd29ybGQKifGSPrGmDgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbaQAB9Bmmr QXo9KEF6PSIbWJUPdHoEIBiND8eAEIxmM2QAAAEBCAoAQh5qDUQ8bonxkj78pw4AngAAAJ4A AAAAArOdAeQAB+kKFlwIAEUAAJA79EAAPwYCNkF6PSJBej0olQ8bWBiND8d0egQggBgW0OlH AAABAQgKDUQ8gwBCHmo3ODB8MTQ3MzA0MXwxMDQ5ODE3NDg1fDEuMHwxfDI4NTh8aGVsbG8g d29ybGQKNzgxfDE0NzMwNDJ8MTA0OTgxNzQ4NXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCorx kj7bugIAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW20AAfQZpqkF6PShBej0iG1iVD3R6 BCAYjRAjgBCMCjNMAAABAQgKAEIebQ1EPIOK8ZI+GXELAG8AAABvAAAAAAKznQHkAAfpChZc CABFAABhO/VAAD8GAmRBej0iQXo9KJUPG1gYjRAjdHoEIIAYFtA1pQAAAQEICg1EPNIAQh5t NzgyfDE0NzMwNDN8MTA0OTgxNzQ4NnwxLjB8MXw0ODJ8aGVsbG8gd29ybGQKivGSPrRpDgBC AAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbcQAB9BmmpQXo9KEF6PSIbWJUPdHoEIBiNEFCA EIvdMvYAAAEBCAoAQh50DUQ80orxkj6vaw4A9wAAAPcAAAAAArOdAeQAB+kKFlwIAEUAAOk7 9kAAPwYB20F6PSJBej0olQ8bWBiNEFB0egQggBgW0EcYAAABAQgKDUQ85QBCHnQ3ODN8MTQ3 MzA0NHwxMDQ5ODE3NDg2fDEuMHwxfDUyNHxoZWxsbyB3b3JsZAo3ODR8MTQ3MzA0NXwxMDQ5 ODE3NDg2fDEuMHwxfDY1NHxoZWxsbyB3b3JsZAo3ODV8MTQ3MzA0NnwxMDQ5ODE3NDg2fDEu MHwxfDUyNHxoZWxsbyB3b3JsZAo3ODZ8MTQ3MzA0N3wxMDQ5ODE3NDg2fDEuMHwxfDMxMTZ8 aGVsbG8gd29ybGQKi/GSPtZ9AgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbdQAB9Bmmo QXo9KEF6PSIbWJUPdHoEIBiNEQWAEIsoMuAAAAEBCAoAQh53DUQ85Yvxkj7D9wwAbwAAAG8A AAAAArOdAeQAB+kKFlwIAEUAAGE790AAPwYCYkF6PSJBej0olQ8bWBiNEQV0egQggBgW0ClA AAABAQgKDUQ9QABCHnc3ODd8MTQ3MzA0OHwxMDQ5ODE3NDg3fDEuMHwxfDc5OXxoZWxsbyB3 b3JsZAqM8ZI+z5UAAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lt5AAH0GaadBej0oQXo9 IhtYlQ90egQgGI0RMoAQivsyfQAAAQEICgBCHn8NRD1AjPGSPkSXAACeAAAAngAAAAACs50B 5AAH6QoWXAgARQAAkDv4QAA/BgIyQXo9IkF6PSiVDxtYGI0RMnR6BCCAGBbQ3PUAAAEBCAoN RD1SAEIefzc4OHwxNDczMDQ5fDEwNDk4MTc0ODd8MS4wfDF8MzQyMHxoZWxsbyB3b3JsZAo3 ODl8MTQ3MzA1MHwxMDQ5ODE3NDg3fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKjPGSPiXsAwBC AAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbfQAB9BmmmQXo9KEF6PSIbWJUPdHoEIBiNEY6A EIqfMmkAAAEBCAoAQh6BDUQ9Uozxkj4e3QYAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI7 +UAAPwYCX0F6PSJBej0olQ8bWBiNEY50egQggBgW0NC5AAABAQgKDUQ9fABCHoE3OTB8MTQ3 MzA1MXwxMDQ5ODE3NDg3fDEuMHwxfDIwMDF8aGVsbG8gd29ybGQKjPGSPrztCABCAAAAQgAA AAAH6QoWXAACs50B5AgARQAANJbgQAB9BmmlQXo9KEF6PSIbWJUPdHoEIBiNEbyAEIpxMjsA AAEBCAoAQh6FDUQ9fIzxkj7r9wwAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI7+kAAPwYC XkF6PSJBej0olQ8bWBiNEbx0egQggBgW0MJfAAABAQgKDUQ9pABCHoU3OTF8MTQ3MzA1Mnwx MDQ5ODE3NDg4fDEuMHwxfDE1MDh8aGVsbG8gd29ybGQKjfGSPqpYAABCAAAAQgAAAAAH6QoW XAACs50B5AgARQAANJbhQAB9BmmkQXo9KEF6PSIbWJUPdHoEIBiNEeqAEIpDMg8AAAEBCAoA Qh6JDUQ9pI3xkj5mWgAAVgEAAFYBAAAAArOdAeQAB+kKFlwIAEUAAUg7+0AAPwYBd0F6PSJB ej0olQ8bWBiNEep0egQggBgW0EeNAAABAQgKDUQ9tQBCHok3OTJ8MTQ3MzA1M3wxMDQ5ODE3 NDg4fDEuMHwxfDE1MDh8aGVsbG8gd29ybGQKNzkzfDE0NzMwNTR8MTA0OTgxNzQ4OHwxLjB8 MXwzMzAxfGhlbGxvIHdvcmxkCjc5NHwxNDczMDU1fDEwNDk4MTc0ODh8MS4wfDF8Mjg1OHxo ZWxsbyB3b3JsZAo3OTV8MTQ3MzA1NnwxMDQ5ODE3NDg4fDEuMHwxfDEyMDN8aGVsbG8gd29y bGQKNzk2fDE0NzMwNTd8MTA0OTgxNzQ4OHwxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCjc5N3wx NDczMDU4fDEwNDk4MTc0ODh8MS4wfDF8MzMwMXxoZWxsbyB3b3JsZAqN8ZI+Ia8DAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0luJAAH0GaaNBej0oQXo9IhtYlQ90egQgGI0S/oAQiS8x /AAAAQEICgBCHosNRD21jvGSPvTCAABvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTv8QAA/ BgJdQXo9IkF6PSiVDxtYGI0S/nR6BCCAGBbQK1kAAAEBCAoNRD4cAEIeizc5OHwxNDczMDU5 fDEwNDk4MTc0ODl8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCo7xkj4ecgMAQgAAAEIAAAAAB+kK FlwAArOdAeQIAEUAADSW40AAfQZpokF6PShBej0iG1iVD3R6BCAYjRMrgBCJAjGLAAABAQgK AEIelQ1EPhyO8ZI+i3MDAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO/1AAD8GAltBej0i QXo9KJUPG1gYjRMrdHoEIIAYFtC/RwAAAQEICg1EPi0AQh6VNzk5fDE0NzMwNjB8MTA0OTgx NzQ4OXwxLjB8MXw5NjYyfGhlbGxvIHdvcmxkCo7xkj5yyAYAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSW5EAAfQZpoUF6PShBej0iG1iVD3R6BCAYjRNZgBCI1DF4AAABAQgKAEIelw1E Pi2O8ZI+98kGAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiO/5AAD8GAlpBej0iQXo9KJUP G1gYjRNZdHoEIIAYFtDKFAAAAQEICg1EPkMAQh6XODAwfDE0NzMwNjF8MTA0OTgxNzQ4OXwx LjB8MXwzNDIwfGhlbGxvIHdvcmxkCo7xkj7yHgoAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSW5UAAfQZpoEF6PShBej0iG1iVD3R6BCAYjROHgBCIpjFfAAABAQgKAEIemg1EPkOP8ZI+ c8MAAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhO/9AAD8GAlpBej0iQXo9KJUPG1gYjROH dHoEIIAYFtAzbgAAAQEICg1EPoAAQh6aODAxfDE0NzMwNjJ8MTA0OTgxNzQ5MHwxLjB8MXw2 NTR8aGVsbG8gd29ybGQKj/GSPg41AwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbmQAB9 BmmfQXo9KEF6PSIbWJUPdHoEIBiNE7SAEIh5MR0AAAEBCAoAQh6fDUQ+gI/xkj6mNgMAygAA AMoAAAAAArOdAeQAB+kKFlwIAEUAALw8AEAAPwYB/kF6PSJBej0olQ8bWBiNE7R0egQggBgW 0MluAAABAQgKDUQ+kABCHp84MDJ8MTQ3MzA2M3wxMDQ5ODE3NDkwfDEuMHwxfDMyN3xoZWxs byB3b3JsZAo4MDN8MTQ3MzA2NHwxMDQ5ODE3NDkwfDEuMHwxfDE1MDh8aGVsbG8gd29ybGQK ODA0fDE0NzMwNjV8MTA0OTgxNzQ5MHwxLjB8MXw3OTl8aGVsbG8gd29ybGQKj/GSPrqLBgBC AAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbnQAB9BmmeQXo9KEF6PSIbWJUPdHoEIBiNFDyA EIfxMQsAAAEBCAoAQh6hDUQ+kI/xkj4NjQYAngAAAJ4AAAAAArOdAeQAB+kKFlwIAEUAAJA8 AUAAPwYCKUF6PSJBej0olQ8bWBiNFDx0egQggBgW0M2NAAABAQgKDUQ+pgBCHqE4MDV8MTQ3 MzA2NnwxMDQ5ODE3NDkwfDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKODA2fDE0NzMwNjd8MTA0 OTgxNzQ5MHwxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCo/xkj7t4QkAQgAAAEIAAAAAB+kKFlwA ArOdAeQIAEUAADSW6EAAfQZpnUF6PShBej0iG1iVD3R6BCAYjRSYgBCHlTDzAAABAQgKAEIe ow1EPqaQ8ZI+KlkFAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPAJAAD8GAlZBej0iQXo9 KJUPG1gYjRSYdHoEIIAYFtCvFAAAAQEICg1EPwIAQh6jODA3fDE0NzMwNjh8MTA0OTgxNzQ5 MXwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCpDxkj7g+QcAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSW6UAAfQZpnEF6PShBej0iG1iVD3R6BCAYjRTGgBCHZzCOAAABAQgKAEIerA1EPwKQ 8ZI+h/sHAJ4AAACeAAAAAAKznQHkAAfpChZcCABFAACQPANAAD8GAidBej0iQXo9KJUPG1gY jRTGdHoEIIAYFtDWjgAAAQEICg1EPxMAQh6sODA4fDE0NzMwNjl8MTA0OTgxNzQ5MXwxLjB8 MXwxMjAzfGhlbGxvIHdvcmxkCjgwOXwxNDczMDcwfDEwNDk4MTc0OTF8MS4wfDF8MjAwMXxo ZWxsbyB3b3JsZAqQ8ZI+IFALAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lupAAH0GaZtB ej0oQXo9IhtYlQ90egQgGI0VIoAQhwswewAAAQEICgBCHq4NRD8TkfGSPmtYBQBvAAAAbwAA AAACs50B5AAH6QoWXAgARQAAYTwEQAA/BgJVQXo9IkF6PSiVDxtYGI0VInR6BCCAGBbQNdUA AAEBCAoNRD9mAEIerjgxMHwxNDczMDcxfDEwNDk4MTc0OTJ8MS4wfDF8MzI3fGhlbGxvIHdv cmxkCpHxkj63vAcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW60AAfQZpmkF6PShBej0i G1iVD3R6BCAYjRVPgBCG3jAgAAABAQgKAEIetg1EP2aR8ZI++b0HAPoAAAD6AAAAAAKznQHk AAfpChZcCABFAADsPAVAAD8GAclBej0iQXo9KJUPG1gYjRVPdHoEIIAYFtAWEgAAAQEICg1E P3UAQh62ODExfDE0NzMwNzJ8MTA0OTgxNzQ5MnwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjgx MnwxNDczMDczfDEwNDk4MTc0OTJ8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAo4MTN8MTQ3MzA3 NHwxMDQ5ODE3NDkyfDEuMHwxfDI5MTV8aGVsbG8gd29ybGQKODE0fDE0NzMwNzV8MTA0OTgx NzQ5MnwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCpHxkj4yEwsAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSW7EAAfQZpmUF6PShBej0iG1iVD3R6BCAYjRYHgBCGJjAPAAABAQgKAEIeuA1E P3WU8ZI+yo4IAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPAZAAD8GAlJBej0iQXo9KJUP G1gYjRYHdHoEIIAYFtCw6AAAAQEICg1EQKcAQh64ODE1fDE0NzMwNzZ8MTA0OTgxNzQ5NHwx LjB8MXwxNTA4fGhlbGxvIHdvcmxkCpTxkj53BwwAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSW7UAAfQZpmEF6PShBej0iG1iVD3R6BCAYjRY1gBCF+C6+AAABAQgKAEIe1w1EQKeU8ZI+ 5wgMAMoAAADKAAAAAAKznQHkAAfpChZcCABFAAC8PAdAAD8GAfdBej0iQXo9KJUPG1gYjRY1 dHoEIIAYFtCpgQAAAQEICg1EQL0AQh7XODE2fDE0NzMwNzd8MTA0OTgxNzQ5NHwxLjB8MXwx NjB8aGVsbG8gd29ybGQKODE3fDE0NzMwNzh8MTA0OTgxNzQ5NHwxLjB8MXwxNzg3fGhlbGxv IHdvcmxkCjgxOHwxNDczMDc5fDEwNDk4MTc0OTV8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCpXx kj67GwAAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW7kAAfQZpl0F6PShBej0iG1iVD3R6 BCAYjRa9gBCFcC6mAAABAQgKAEIe2Q1EQL2V8ZI+He8AAG8AAABvAAAAAAKznQHkAAfpChZc CABFAABhPAhAAD8GAlFBej0iQXo9KJUPG1gYjRa9dHoEIIAYFtArnAAAAQEICg1EQNkAQh7Z ODE5fDE0NzMwODB8MTA0OTgxNzQ5NnwxLjB8MXwyMTN8aGVsbG8gd29ybGQKlfGSPgZyAwBC AAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbvQAB9BmmWQXo9KEF6PSIbWJUPdHoEIBiNFuqA EIVDLogAAAEBCAoAQh7bDURA2ZXxkj55cwMAyQAAAMkAAAAAArOdAeQAB+kKFlwIAEUAALs8 CUAAPwYB9kF6PSJBej0olQ8bWBiNFup0egQggBgW0Go1AAABAQgKDURA6QBCHts4MjB8MTQ3 MzA4MXwxMDQ5ODE3NDk2fDEuMHwxfDIxM3xoZWxsbyB3b3JsZAo4MjF8MTQ3MzA4MnwxMDQ5 ODE3NDk2fDEuMHwxfDIzMHxoZWxsbyB3b3JsZAo4MjJ8MTQ3MzA4M3wxMDQ5ODE3NDk2fDEu MHwxfDY1NHxoZWxsbyB3b3JsZAqV8ZI+m8gGAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lvBAAH0GaZVBej0oQXo9IhtYlQ90egQgGI0XcYAQhLwudgAAAQEICgBCHt0NREDplfGSPuTJ BgCeAAAAngAAAAACs50B5AAH6QoWXAgARQAAkDwKQAA/BgIgQXo9IkF6PSiVDxtYGI0XcXR6 BCCAGBbQ2KwAAAEBCAoNRED/AEIe3TgyM3wxNDczMDg0fDEwNDk4MTc0OTZ8MS4wfDF8MzU3 M3xoZWxsbyB3b3JsZAo4MjR8MTQ3MzA4NXwxMDQ5ODE3NDk2fDEuMHwxfDIwMDF8aGVsbG8g d29ybGQKlfGSPgMfCgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbxQAB9BmmUQXo9KEF6 PSIbWJUPdHoEIBiNF82AEIRgLl0AAAEBCAoAQh7gDURA/5bxkj6k+gMAcAAAAHAAAAAAArOd AeQAB+kKFlwIAEUAAGI8C0AAPwYCTUF6PSJBej0olQ8bWBiNF810egQggBgW0LZLAAABAQgK DURBUQBCHuA4MjV8MTQ3MzA4NnwxMDQ5ODE3NDk3fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQK lvGSPrmLBgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJbyQAB9BmmTQXo9KEF6PSIbWJUP dHoEIBiNF/uAEIQyLgQAAAEBCAoAQh7nDURBUZfxkj6bdAIAbwAAAG8AAAAAArOdAeQAB+kK FlwIAEUAAGE8DEAAPwYCTUF6PSJBej0olQ8bWBiNF/t0egQggBgW0CB/AAABAQgKDURBqwBC Huc4MjZ8MTQ3MzA4N3wxMDQ5ODE3NDk4fDEuMHwxfDE2MHxoZWxsbyB3b3JsZAqX8ZI+aqME AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lvNAAH0GaZJBej0oQXo9IhtYlQ90egQgGI0Y KIAQhAUtoQAAAQEICgBCHvANREGrl/GSPvqlBACdAAAAnQAAAAACs50B5AAH6QoWXAgARQAA jzwNQAA/BgIeQXo9IkF6PSiVDxtYGI0YKHR6BCCAGBbQBBkAAAEBCAoNREG5AEIe8DgyN3wx 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 CgBCHxINREL1mvGSPsGaCgCcAAAAnAAAAAACs50B5AAH6QoWXAgARQAAjjwWQAA/BgIWQXo9 IkF6PSiVDxtYGI0Z8HR6BCCAGBbQwVMAAAEBCAoNREMMAEIfEjgzN3wxNDczMDk4fDEwNDk4 MTc1MDF8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCjgzOHwxNDczMDk5fDEwNDk4MTc1MDF8MS4w fDF8Nzk5fGhlbGxvIHdvcmxkCprxkj7V7w0AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSW /UAAfQZpiEF6PShBej0iG1iVD3R6BCAYjRpKgBCB4ywcAAABAQgKAEIfFA1EQwyd8ZI+TrsI AG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhPBdAAD8GAkJBej0iQXo9KJUPG1gYjRpKdHoE IIAYFtAohAAAAQEICg1ERCwAQh8UODM5fDE0NzMxMDB8MTA0OTgxNzUwM3wxLjB8MXw2NTR8 aGVsbG8gd29ybGQKnfGSPpCNCwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJb+QAB9BmmH QXo9KEF6PSIbWJUPdHoEIBiNGneAEIG2KuAAAAEBCAoAQh8wDURELJ3xkj6ejwsArgEAAK4B AAAAArOdAeQAB+kKFlwIAEUAAaA8GEAAPwYBAkF6PSJBej0olQ8bWBiNGnd0egQggBgW0AEX AAABAQgKDUREPgBCHzA4NDB8MTQ3MzEwMXwxMDQ5ODE3NTAzfDEuMHwxfDY1NHxoZWxsbyB3 b3JsZAo4NDF8MTQ3MzEwMnwxMDQ5ODE3NTAzfDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAo4NDJ8 MTQ3MzEwM3wxMDQ5ODE3NTAzfDEuMHwxfDY1NHxoZWxsbyB3b3JsZAo4NDN8MTQ3MzEwNHwx MDQ5ODE3NTAzfDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKODQ0fDE0NzMxMDV8MTA0OTgxNzUw M3wxLjB8MXwyMjM1fGhlbGxvIHdvcmxkCjg0NXwxNDczMTA2fDEwNDk4MTc1MDN8MS4wfDF8 MzMwMXxoZWxsbyB3b3JsZAo4NDZ8MTQ3MzEwN3wxMDQ5ODE3NTA0fDEuMHwxfDIxM3xoZWxs byB3b3JsZAo4NDd8MTQ3MzEwOHwxMDQ5ODE3NTA0fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQK 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 OHwxNDczMTE5fDEwNDk4MTc1MTN8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAqm8ZI+3pQBADYA AAA2AAAAAAfpChZcAAKznQHkCABFAAAoue5AAH0GRqNBej0oQXo9IgAUuIOHxQr36Pi0QlAQ /VzMqQAApvGSPrGcAQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFDEQAA/BuhpQXo9IkF6 PSi4gwAU6Pi0QofFCvdQEGEIuAoAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc0ODYgTU49 MzYyMDAwMTUub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49 Ik9zdGVyRG93Sm9uZXMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgT0RKIE5l d3MgTWVudTogU29mdHMgLSBDb2NvYQoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpE YXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChPREogdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpD b3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMyBPc3RlckRvd0pvbmVzIENvbW1vZGl0 eSBOZXdzIChPREopLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCk9zdGVyRG93Sm9u ZXMKClRoZSBzdG9yeSBudW1iZXJzIGxpc3RlZCBiZWxvdyBhcHBseSB0byBGdXR1cmVTb3Vy Y2UgcHJvZHVjdHMgb25seS4gVGhlCnNhbWUgaXRlbXMgYXJlIGF2YWlsYWJsZSBvbiBvdGhl ciBzZXJ2aWNlcyBidXQgbWlnaHQgbm90IHV0aWxpemUgdGhlIHNhbWUKc3RvcnkgbnVtYmVy cy4gSWYgbm8gbnVtYmVyIGlzIGxpc3RlZCBiZWZvcmUgYW4gaXRlbSwgdGhlcmUgaXMgbm8K YXNzb2NpYXRlZCByZWd1bGFyIHN0b3J5IG51bWJlci4KCk5vdCBhbGwgc3RvcmllcyBsaXN0 ZWQgYXJlIGF2YWlsYWJsZSBpbiBhbGwgbmV3cyBwYWNrYWdlcy4gRm9yIGEgY29tcGxldGUK bGlzdCBvZiByZXBvcnRzIGluY2x1ZGVkIGluIGVhY2ggT0RKIHBhY2thZ2UsIGdvIHRvIHd3 dy5vc3RlcmRvd2pvbmVzLmNvbQphbmQgY2xpY2sgaW4gImNvbnRlbnQiLiBBcHJpbCA4LCAy MDAzCgotLS0gU3RvcnkgLS0tCk51bWJlciAgVGl0bGUKLS0tLS0tICAtLS0tLQozNjgwICAg Q29jb2EgQ2FsZW5kYXIgLSBGdXR1cmVzL09wdGlvbnMgRGF0ZXMgKERhaWx5KQozNjkzICAg SUNDTyBDb2NvYSBEYWlseSBQcmljZSAoRGFpbHkpCjM3MzcgICBDU0NFIENvY29hIEZ1dHVy ZXMgTWlkZGF5IChEYWlseSkKMzczOCAgIENTQ0UgQ29jb2EgRnV0dXJlcyBSZXZpZXcgKERh aWx5KQozNzUyICAgQ1NDRSBDbG9zaW5nIEVzdGltYXRlZCBWb2x1bWVzIChEYWlseSkKMjI2 NyAgIENTQ0UgQ29jb2EsIENvZmZlZSwgU3VnYXIgRXN0aW1hdGVkIFZvbHVtZXMgKERhaWx5 KQozNzUwICAgQ1NDRSBDb2ZmZWUsIFN1Z2FyLCBDb2NvYSBGdXR1cmVzIEZpbmFsIFZvbHVt ZXMgKERhaWx5KQozNzUxICAgQ1NDRSBDb2ZmZWUsIFN1Z2FyLCBDb2NvYSBGdXR1cmVzIE9w ZW4gSW50ZXJlc3QgKERhaWx5KQozNzY3ICAgQ1NDRSBDb2NvYSBPcHRpb25zIFZvbHVtZS9P cGVuIEludGVyZXN0IChEYWlseSkKMzc2NSAgIENTQ0UgQ29jb2EgRnV0dXJlcyBDbG9zZSAo RGFpbHkpCjM3NjQgICBDU0NFIENvY29hIEZ1dHVyZXMgT3BlbiAoRGFpbHkpCjM3NjYgIKbx kj4WnQEAwgQAAMIEAAAAArOdAeQAB+kKFlwIAEUABLRQxUAAPwbpQEF6PSJBej0ouIMAFOj4 uaaHxQr3UBhhCE83AAAgQ1NDRSBDb2NvYSBPcHRpb25zIENsb3NlIChEYWlseSkKMzc2OCAg IENTQ0UgQ29jb2EgV2FyZWhvdXNlIFN0b2NrcyAoRGFpbHkpCjM3NzEgICBDU0NFIENvY29h IERlbGl2ZXJpZXMgKFBlcmlvZGljKQozNzE4ICAgQ0ZUQyBDb21taXRtZW50cyBvZiBUcmFk ZXJzOiBDU0NFIENvY29hIEZ1dHVyZXMgKEZyaWRheSkKODcxOCAgIENGVEMgQ29tbWl0bWVu dHMgb2YgVHJhZGVyczogQ1NDRSBDb2NvYSBGdXR1cmVzL09wdGlvbnMgKEZyaWRheSkKMzY4 MiAgIFJlYWN0aW9uIFRvIENvbW1pdG1lbnQgT2YgVHJhZGVycyBSZXBvcnQgLSBDb2NvYSAo UGVyaW9kaWMpCjM3NjkgICBDTUEgU3BvdCBDb2NvYSBCZWFuIEFuZCBQcm9kdWN0IFByaWNl cyAoRGFpbHkpCjM2ODQgICBVUyBDb2ZmZWUsIENvY29hIEltcG9ydHMgKE1vbnRobHkpCgoz OTIwIEJyYXppbCBDb2NvYSBBcnJpdmFscyAoV2Vla2x5KQoKMzY3MiBMaWZmZSBDb2NvYSBG dXR1cmVzIE1pZGRheSAoRGFpbHkpIDM2NzAgTGlmZmUgQ29jb2EgRnV0dXJlcyBSZXZpZXcK KERhaWx5KSAzNjk1IExpZmZlIENvY29hIENsb3NlIChEYWlseSkgMzY3NCBMaWZmZSBDb2Nv YSBHcmFkaW5ncyAoRGFpbHkpCjM3MjAgTGlmZmUgQ29mZmVlLCBDb2NvYSBWb2x1bWVzIEFu ZCBPcGVuIEludGVyZXN0IChEYWlseSkKCjM2ODUgICBBc2lhIENvY29hIChXZWVrbHkpCjM3 NzIgICBNYWxheXNpYW4vSW5kb25lc2lhbiBDb2NvYSBQcmljZXMgKERhaWx5KQo2MDEwICAg Q2hpbmEgVHJhZGUgRGF0YSBPbiBDb2ZmZWUsIENvY29hIChNb250aGx5KQo1MDg5ICAgQ2hp bmEgTW9udGhseSBJbXBvcnQgQW5kIEV4cG9ydCBEYXRhIChNb250aGx5KQo1MDg4ICAgUHJp Y2VzIEZvciBDb2NvYSBBdCBJdm9yeSBDb2FzdCBQb3J0cyAoRGFpbHkpCgotLS0gT3N0ZXJE b3dKb25lcwoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYXNpYQogICAgYnJhemlsCiAg ICBjaGluYQogICAgY29jb2EKICAgIGNvZmZlZQogICAgZXhwb3J0CiAgICBmdXR1cmVzCiAg ICBpbXBvcnQKICAgIGluZG9uZXNpYQogICAgaXZvcnkrY29hc3QKICAgIGxpZmZlCiAgICBt YWxheXNpYQogICAgcHJpY2VzCiAgICBwcm9kdWN0cwogICAgc3VnYXIKICAgIHRyYWRlCiAg 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 RpRBej0oQXo9IgAUuIV6jQ4EAAAAAHAC+vBKFQAAAgQFZAEBBAKr8ZI+r8gDAD4AAAA+AAAA AAKznQHkAAfpChZcCABFAAAwUM1AAD8G7bxBej0iQXo9KLiFABTpDiTNeo0OBXASYQjVwAAA AQEEAgIEBbSr8ZI+PwAEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoufZAAH0GRptBej0o QXo9IgAUuIV6jQ4F6Q4kzlAQ/VxmMAAAq/GSPj8HBABrBAAAawQAAAACs50B5AAH6QoWXAgA RQAEXVDOQAA/BumOQXo9IkF6PSi4hQAU6Q4kznqNDgVQGGEIOYkAAFhZWlpZLi4uICBUQz0y IFRNPTEwNDk4MTc0OTIgTU49MzYyMDAwMTYub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgi IFBGTj0iQ29tdGV4IiBQRk49IkZUIEluZm9ybWF0aW9uIChFVVIpIiAKCi4uLiAgCgoKLi4u IAkgCgoKSGVhZExpbmUuLi4gIEV4cGFuc2lvbjogWHN0cmF0YSBidXlzIE1JTSAgICBIb2xk aW5ncwoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDgs IDIwMDMsIChFeHBhbnNpb24gL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgpIC0tCgoKCi4u LgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lhbCBUaW1lcyBJ bmZvcm1hdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIEluZm9ybWF0aW9u IChFVVIpCgpTd2lzcyBtaW5pbmcgZ3JvdXAgWHN0cmF0YSwgd2hpY2ggb3ducyBTcGFuaXNo IG1ldGFscyBncm91cCBBenNhLAp5ZXN0ZXJkYXkgYW5ub3VuY2VkIHRoZSBwdXJjaGFzZSBv ZiBBdXN0cmFsaWFuIG1pbmluZyBncm91cCBNSU0gSG9sZGluZ3MKTGltaXRlZC4gVGhlIG9w ZXJhdGlvbiwgd2hpY2ggY29zdCBYc3RyYXRhICQyLjk1OWJuLCBpbmNsdWRpbmcgODk0bSBl dXJvcwppbiBkZWJ0LCBpcyBiZWluZyBmaW5hbmNlZCBieSBhIDEuNGJuLWV1cm8gY2FwaXRh bCBpbmNyZWFzZS4gU2FudGlhZ28KWmFsZHVtYmlkZSwgY2hhaXJtYW4gb2YgdGhlIFNwYW5p c2ggc3Vic2lkaWFyeSwgc2F5cyB0aGF0IHRoZSBvcGVyYXRpb24Kd2lsbCBpbmNyZWFzZSB0 aGUgbWluaW5nIGNhcGFjaXR5IG9mIEF6c2EuCgpNSU0gSG9sZGluZ3MgaXMgdGhlIHdvcmxk J3MgZmlmdGggbGFyZ2VzdCBjb2FsIHByb2R1Y2VyIGFuZCBvbmUgb2YgdGhlCmJpZ2dlc3Qg bWFudWZhY3R1cmVycyBvZiBsZWFkLCBnb2xkLCBzaWx2ZXIgYW5kIGNvcHBlci4KCkFic3Ry YWN0ZWQgZnJvbSBFeHBhbnNpb24KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGF1c3Ry YWxpYQogICAgY29hbAogICAgY29wcGVyCiAgICBkZWJ0CiAgICBleHBhbnNpb24KICAgIGdv bGQKICAgIG1ldGFscwogICAgbWluaW5nCiAgICBzaWx2ZXIKCqvxkj5ABwQAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChQz0AAPwbtwkF6PSJBej0ouIUAFOkOKQN6jQ4FUBFhCP5OAAAA AAAAAACr8ZI+pFwEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoufdAAH0GRppBej0oQXo9 IgAUuIV6jQ4F6Q4pBFAQ+SdmLwAAq/GSPpxnBAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLn4QAB9BkaZQXo9KEF6PSIAFLiFeo0OBekOKQRQEfknZi4AAKvxkj7HaAQAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChQ0EAAPwbtwUF6PSJBej0ouIUAFOkOKQR6jQ4GUBBhCP5NAAAA AAAAAACr8ZI+geAEAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lw9AAH0GaXZBej0oQXo9 IhtYlQ90egQgGI0fF4AQfRYlBgAAAQEICgBCH7gNREl+q/GSPvnhBACcAAAAnAAAAAACs50B 5AAH6QoWXAgARQAAjjwoQAA/BgIEQXo9IkF6PSiVDxtYGI0fF3R6BCCAGBbQvQ0AAAEBCAoN REmKAEIfuDg2NnwxNDczMTI3fDEwNDk4MTc1MTh8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCjg2 N3wxNDczMTI4fDEwNDk4MTc1MTh8MS4wfDF8MjEzfGhlbGxvIHdvcmxkCqvxkj7tRQUAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChQ0UAAPwbtwEF6PSJBej0ot20AFd36UWi5yC4yUBBh CIKtAAAAAAAAAACr8ZI+r34FAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuflAAH0GRoBB ej0oQXo9IgAVt225yC4y3fpRaFAY9sYd2QAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0Kq/GS PnyFBQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlDSQAA/Bu2lQXo9IkF6PSi3bQAV3fpR aLnILkpQGGEIgqYAAERFTEUgMzYyMDAwMTcub3V0LjAzMDQwOA0Kq/GSPmXCBQB8AAAAfAAA AAAH6QoWXAACs50B5AgARQAAbrn6QAB9BkZRQXo9KEF6PSIAFbdtucguSt36UYJQGPasc8YA ADU1MCAzNjIwMDAxNy5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBm aWxlIHNwZWNpZmllZC4gDQqr8ZI+3s4FAFEAAABRAAAAAAKznQHkAAfpChZcCABFAABDUNNA AD8G7aNBej0iQXo9KLdtABXd+lGCucgukFAYYQi7eAAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0 LDEzNA0Kq/GSPhkJBgBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrn7QAB9BkZ4QXo9KEF6 PSIAFbdtucgukN36UZ1QGPaQL4QAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCqvx kj7PDAYAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJQ1EAAPwbto0F6PSJBej0ot20AFd36 UZ25yC6uUBhhCG/xAABTVE9SIDM2MjAwMDE3Lm91dC4wMzA0MDgNCqvxkj5OSgYAeAAAAHgA AAAAB+kKFlwAArOdAeQIAEUAAGq5/EAAfQZGU0F6PShBej0iABW3bbnILq7d+lG3UBj2dv2I AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDE3 Lm91dC4wMzA0MDguDQqr8ZI+PUsGAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuf1AAH0G RoxBej0oQXo9IgAUuIbCIOpFAAAAAHAC+vAmPwAAAgQFZAEBBAKr8ZI+vUwGAD4AAAA+AAAA AAKznQHkAAfpChZcCABFAAAwUNVAAD8G7bRBej0iQXo9KLiGABTpEKYswiDqRnASYQgwiQAA AQEEAgIEBbSr8ZI+YIQGADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouf5AAH0GRpNBej0o QXo9IgAUuIbCIOpG6RCmLVAQ/VzA+AAAq/GSPl2LBgBhBAAAYQQAAAACs50B5AAH6QoWXAgA RQAEU1DWQAA/BumQQXo9IkF6PSi4hgAU6RCmLcIg6kZQGGEI2TkAAFhZWlpZLi4uICBUQz0y IFRNPTEwNDk4MTc0OTMgTU49MzYyMDAwMTcub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgi IFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRM aW5lLi4uICBTSEFGVCBBU1NFTUJMWSxGTEVYSUJMRQoKLi4uICAJIAoKQnlMaW5lLi4uICAK Ci4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChGZWRCaXpPcHBzIHZpYSBDT01U RVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IChjKSAyMDAzIEZl ZGVyYWwgSW5mb3JtYXRpb24gJiBOZXdzIERpc3BhdGNoLCBJbmMuCgoKLi4uCgoKRmVkQml6 T3BzCgpOT1RJQ0UgVFlQRTogQ09OVFJBQ1QgQVdBUkQKClNPVVJDRTogUHVibGlzaGVkIGlu IEZlZEJpek9wcHMKCkRBVEUgUE9TVEVEOiAwNy1BUFItMDMKCk9GRklDRSBBRERSRVNTOiBE RUZFTlNFIEdFTkVSQUwgU1VQUExZIENFTlRFUiA4MDAwIEpFRkYgREFWSVMgSFdZClJJQ0hN T05ELCBWQSAyMzI5Ny01MyAxMgoKQ0xBU1NJRklDQVRJT04gQ09ERTogMTYgLSBBaXJjcmFm dCBjb21wb25lbnRzICYgYWNjZXNzb3JpZXMKClNVQkpFQ1Q6IFNIQUZUIEFTU0VNQkxZLEZM RVhJQkxFCgpTT0xJQ0lUQVRJT04gTlVNQkVSOiAwM1ROOTMtMDItUC0wNDAwCgpBV0FSRCBO VU1CRVI6IFNQMDQ3MC0wMy1NLUJKNTUKCkFXQVJEIEFNT1VOVDogJDI5LDQzNwoKTElORSBO VU1CRVI6IDAwMDEgVEhST1VHSCAwMDAyCgpBV0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQg VE86IENFRiBJTkRVU1RSSUVTIElOQyAzMjAgU09VVEggQ0hVUkNIIFNUIEFERElTT04gSUwg NjAxMDEtMzc1MAoKQVJDSElWRSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFDVDogTi9BCgpJTlRF Uk5FVCBBRERSRVNTOgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJk cy9TUDA0NzAtMDMtTS1CSjU1TG4wMDAxX19fVEhST1VHSF9fMDAwMi5odG1sCgouLi4gIAkg CgpLZXlXb3Jkcy4uLiAgCiAgICBhaXJjcmFmdAogICAgY29udHJhY3QKICAgIGRlZmVuc2UK ICAgIGludGVybmV0CiAgICB2aXJnaW5pYQoKq/GSPl+LBgA8AAAAPAAAAAACs50B5AAH6QoW XAgARQAAKFDXQAA/Bu26QXo9IkF6PSi4hgAU6RCqWMIg6kZQEWEIWSEAAAAAAAAAAKvxkj6l 4AYANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi5/0AAfQZGkkF6PShBej0iABS4hsIg6kbp EKpZUBD5McD3AACr8ZI+xO8GADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAougBAAH0GRpFB ej0oQXo9IgAUuIbCIOpG6RCqWVAR+THA9gAAq/GSPs/wBgA8AAAAPAAAAAACs50B5AAH6QoW XAgARQAAKFDYQAA/Bu25QXo9IkF6PSi4hgAU6RCqWcIg6kdQEGEIWSAAAAAAAAAAAKvxkj7x tgcAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQ2UAAPwbtuEF6PSJBej0ot20AFd36Ube5 yC7wUBBhCIGgAAAAAAAAAACr8ZI+wu8HAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAugFA AH0GRnhBej0oQXo9IgAVt225yC7w3fpRt1AY9nYdHAAAMjI2IFRyYW5zZmVyIGNvbXBsZXRl Lg0Kq/GSPov3BwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlDaQAA/Bu2dQXo9IkF6PSi3 bQAV3fpRt7nILwhQGGEIgJkAAERFTEUgMzYyMDAwMTgub3V0LjAzMDQwOA0Kq/GSPmI0CAB8 AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbroCQAB9BkZJQXo9KEF6PSIAFbdtucgvCN36UdFQ GPZccwgAADU1MCAzNjIwMDAxOC5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5k IHRoZSBmaWxlIHNwZWNpZmllZC4gDQqr8ZI+9TYIAEIAAABCAAAAAAfpChZcAAKznQHkCABF AAA0lxBAAH0GaXVBej0oQXo9IhtYlQ90egQgGI0fcYAQfLwk+AAAAQEICgBCH7oNREmKq/GS PoA4CACeAAAAngAAAAACs50B5AAH6QoWXAgARQAAkDwpQAA/BgIBQXo9IkF6PSiVDxtYGI0f cXR6BCCAGBbQyDMAAAEBCAoNREmgAEIfujg2OHwxNDczMTI5fDEwNDk4MTc1MTh8MS4wfDF8 MzQwM3xoZWxsbyB3b3JsZAo4Njl8MTQ3MzEzMHwxMDQ5ODE3NTE4fDEuMHwxfDEyMDN8aGVs bG8gd29ybGQKq/GSPj5ACABRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1DbQAA/Bu2bQXo9 IkF6PSi3bQAV3fpR0bnIL05QGGEIuWsAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxMzUNCqvx kj6QeggAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa6A0AAfQZGcEF6PShBej0iABW3bbnI L07d+lHsUBj2QC7HAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQqr8ZI+ln0IAFAA AABQAAAAAAKznQHkAAfpChZcCABFAABCUNxAAD8G7ZtBej0iQXo9KLdtABXd+lHsucgvbFAY YQht5AAAU1RPUiAzNjIwMDAxOC5vdXQuMDMwNDA4DQqr8ZI+37kIAHgAAAB4AAAAAAfpChZc AAKznQHkCABFAABqugRAAH0GRktBej0oQXo9IgAVt225yC9s3fpSBlAY9ib8ygAAMTUwIE9w ZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDAxOC5vdXQuMDMw NDA4Lg0Kq/GSPsm6CAA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLoFQAB9BkaEQXo9KEF6 PSIAFLiHcbPX7QAAAABwAvrwiQMAAAIEBWQBAQQCq/GSPnO8CAA+AAAAPgAAAAACs50B5AAH 6QoWXAgARQAAMFDdQAA/Bu2sQXo9IkF6PSi4hwAU6RToHnGz1+5wEmEIUVcAAAEBBAICBAW0 q/GSPnr0CAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLoGQAB9BkaLQXo9KEF6PSIAFLiH cbPX7ukU6B9QEP1c4cYAAKvxkj6Q+ggAnQIAAJ0CAAAAArOdAeQAB+kKFlwIAEUAAo9Q3kAA PwbrTEF6PSJBej0ouIcAFOkU6B9xs9fuUBhhCIgeAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5 ODE3NDk0IE1OPTM2MjAwMDE4Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNv bXRleCIgUEZOPSJPc3RlckRvd0pvbmVzIFNlbGVjdCIgCgouLi4gIAoKCi4uLiAJIAoKCkhl YWRMaW5lLi4uICBESiAgTG9uZG9uIExhdGUgR29sZCAkMzIyLjcwLSQzMjMuMjAgQW4gT3Vu Y2UKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIExPTkRPTiwg QXByIDA4LCAyMDAzIChPREogU2VsZWN0IHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJp Z2h0TGluZS4uLiAgKEMpIENvcHlyaWdodCAyMDAzIE9ESgoKCi4uLgoKCk9zdGVyRG93Sm9u ZXMgU2VsZWN0CgooRG93IEpvbmVzKS0tR29sZCB3YXMgcXVvdGVkIGF0ICQzMjIuNzAtJDMy My4yMCBhbiBvdW5jZSBsYXRlIHRvZGF5IHZzCiQzMjMuNDAgYXQgdGhlIGFmdGVybm9vbiBm aXhpbmcgYW5kICQzMjIuMzAgYXQgdGhlIG1vcm5pbmcgZml4aW5nLgoKLi4uICAJIAoKS2V5 V29yZHMuLi4gIAogICAgZG93K2pvbmVzCiAgICBnb2xkCiAgICBsb25kb24KICAgIEdFTkVS QUxPcmlnaW4gQXNzaWduZWRCeT0iT3N0ZXJEb3dKb25lcyBTZWxlY3QiIC8+TUVUQUxTCgqr 8ZI+kfoIADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUN9AAD8G7bJBej0iQXo9KLiHABTp FOqGcbPX7lARYQh7swAAAAAAAAAAq/GSPntDCQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLoHQAB9BkaKQXo9KEF6PSIAFLiHcbPX7ukU6odQEPr14cUAAKvxkj5dTgkANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi6CEAAfQZGiUF6PShBej0iABS4h3Gz1+7pFOqHUBH69eHEAACr 8ZI+W08JADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUOBAAD8G7bFBej0iQXo9KLiHABTp FOqHcbPX71AQYQh7sgAAAAAAAAAAq/GSPgYoCgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAA KFDhQAA/Bu2wQXo9IkF6PSi3bQAV3fpSBrnIL65QEGEIgJMAAAAAAAAAAKvxkj7cYAoATgAA AE4AAAAAB+kKFlwAArOdAeQIAEUAAEC6CUAAfQZGcEF6PShBej0iABW3bbnIL67d+lIGUBj2 JhxfAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQqr8ZI+t2gKAFAAAABQAAAAAAKznQHkAAfp ChZcCABFAABCUOJAAD8G7ZVBej0iQXo9KLdtABXd+lIGucgvxlAYYQh+jAAAREVMRSAzNjIw MDAxOS5vdXQuMDMwNDA4DQqr8ZI+daUKAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABuugpA AH0GRkFBej0oQXo9IgAVt225yC/G3fpSIFAY9gxySgAANTUwIDM2MjAwMDE5Lm91dC4wMzA0 MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCqvxkj6F sQoAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENQ40AAPwbtk0F6PSJBej0ot20AFd36UiC5 yDAMUBhhCLdeAABQT1JUIDY1LDEyMiw2MSwzNCwxODQsMTM2DQqr8ZI+AvUKAFQAAABUAAAA AAfpChZcAAKznQHkCABFAABGugtAAH0GRmhBej0oQXo9IgAVt225yDAM3fpSO1AY9fAuCgAA MjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0Kq/GSPl34CgBQAAAAUAAAAAACs50B5AAH 6QoWXAgARQAAQlDkQAA/Bu2TQXo9IkF6PSi3bQAV3fpSO7nIMCpQGGEIa9cAAFNUT1IgMzYy MDAwMTkub3V0LjAzMDQwOA0Kq/GSPnxKCwB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAaroM QAB9BkZDQXo9KEF6PSIAFbdtucgwKt36UlVQGPXW/AwAADE1MCBPcGVuaW5nIEJJTkFSWSBt b2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwMTkub3V0LjAzMDQwOC4NCqvxkj5sTAsA PgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC6DUAAfQZGfEF6PShBej0iABS4iMyaMiUAAAAA cAL68NPjAAACBAVkAQEEAqvxkj4wTgsAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBQ5UAA PwbtpEF6PSJBej0ouIgAFOkVr4/MmjImcBJhCNTFAAABAQQCAgQFtKvxkj4ZhgsANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi6DkAAfQZGg0F6PShBej0iABS4iMyaMibpFa+QUBD9XGU1 AACr8ZI+Y40LAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lxFAAH0GaXRBej0oQXo9IhtY lQ90egQgGI0fzYAQfGAk4AAAAQEICgBCH7wNREmgq/GSPr2NCwCaBQAAmgUAAAACs50B5AAH 6QoWXAgARQAFjFDmQAA/BuhHQXo9IkF6PSi4iAAU6RWvkMyaMiZQEGEIIzAAAFhZWlpZLi4u ICBUQz0yIFRNPTEwNDk4MTc0OTYgTU49MzYyMDAwMTkub3V0IFNSQz1jb210ZXggUEZOPSJD b210ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ilhpbmh1YSIgCgouLi4gIAoKCi4uLiAJIAoKCkhl YWRMaW5lLi4uICBMYXRlc3QgZGV2ZWxvcG1lbnRzIG9uIGJhdHRsZWZpZWxkIGluIElyYXEK Ci4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEJFSUpJTkcsIEFw ciA4LCAyMDAzIChYaW5odWEgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5l Li4uICBDb3B5cmlnaHQgMjAwMyBYSU5IVUEgTkVXUyBBR0VOQ1kuCgoKLi4uCgoKWGluaHVh CgpUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGF0ZXN0IGRldmVsb3BtZW50cyBvbiB0aGUgYmF0 dGxlZmllbGQgaW4gSXJhcToKCiAgIElOIEFORCBBUk9VTkQgQkFHSERBRAogICAtLSBUaGUg VVMgQ2VudHJhbCBDb21tYW5kIGNvbmZpcm1lZCBUdWVzZGF5IHRoYXQgdGhlIFVTIGFpcgpm b3JjZXMgaGFkIHN0cnVjayBhICJsZWFkZXJzaGlwIHRhcmdldCIgaW4gQmFnaGRhZCBvbiBN b25kYXksIHdoZXJlIHNvbWUgdG9wIElyYXFpIG9mZmljaWFscyB3ZXJlIGhvbGRpbmcgYSBt ZWV0aW5nLgoKTWFqb3IgQnJhZCBCYXJ0bGV0dCwgYSBzcG9rZXNtYW4gYXQgdGhlIFFhdGFy LWJhc2VkIHdhciBoZWFkcXVhcnRlcnMgb2YKdGhlIFVTIENlbnRyYWwgQ29tbWFuZCwgdG9s ZCByZXBvcnRlcnMgdGhhdCBhIFVTIEItIDEgYm9tYmVyIGRyb3BwZWQgZm91cgpoZWF2eSBi b21icywgZWFjaCBvZiAyLDAwMCBwb3VuZHMsIGF0IGEgYnVpbGRpbmcgaW4gdGhlIEJhZ2hk YWQgZGlzdHJpY3QKb2YgTWFuc3VyIG9uIE1vbmRheSBhZnRlcm5vb24uCgotLSBJcmFxaSBm b3JjZXMgbGF1bmNoZWQgYW4gYXJ0aWxsZXJ5IGF0dGFjayBlYXJseSBUdWVzZGF5IG1vcm5p bmcKYWdhaW5zdCB0aGUgVW5pdGVkIFN0YXRlcyB0cm9vcHMgd2hvIG9jY3VwaWVkIElyYXFp IFByZXNpZGVudCBTYWRkYW0KSHVzc2VpbidzIG1haW4gUmVwdWJsaWNhbiBQYWxhY2UgY29t cG91bmQgaW4gZWFzdGVybiBCYWdoZGFkLgoKLS0gSXJhcWkgdHJvb3BzIHJldG9vayBmcm9t IHRoZSBVUyBmb3JjZXMgcGFydHMgb2YgdGhlIElyYXFpIE1pbmlzdHJ5IG9mCkluZm9ybWF0 aW9uIG9uIHRoZSBlYXN0ZXJuIGJhbmsgb2YgVGlncmlzIHJpdmVyLCB3aGljaCB0aGUgVVMg dHJvb3BzCnNlaXplZCBvbiBNb25kYXksIGEgWGluaHVhIHJlcG9ydGVyIHNhaWQuCgpMaWdo dCB3ZWFwb25zIGZpcmUgd2FzIGhlYXJkIGluIHdlc3Rlcm4gcGFydCBvZiB0aGUgSXJhcWkg Y2FwaXRhbCwgd2hpY2gKdGhlIFVTIHRyb29wcyBoYXZlIG5vdCB5ZXQgZW50ZXJlZCBhbmQg cmVtYWlucyB1bmRlciB0aGUgSXJhcavxkj46jgsAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUA BYxQ50AAPwboRkF6PSJBej0ouIgAFOkVtPTMmjImUBhhCD8+AABpIGNvbnRyb2wuCgotLSBU aGUgaW52YWRpbmcgVVMgZm9yY2VzIGFuZCB0aGUgSXJhcWkgdHJvb3BzIGV4Y2hhbmdlZCBm aXJlIGluIGVhc3QKQmFnaGRhZCBvbiBUdWVzZGF5LgoKSXQgd2FzIHRoZSBmaXJzdCB0aW1l IHRoYXQgc3VjaCBhbiBleGNoYW5nZSBvZiBmaXJlIHRvb2sgcGxhY2UgaW4gZWFzdApCYWdo ZGFkLiBFYXJsaWVyLCB0d28gVVMgQWJyYW1zIHRhbmtzIHJvbGxlZCBvbnRvIGEgbWFqb3Ig YnJpZGdlIG92ZXIgdGhlClRpZ3JpcyByaXZlciwgd2hpY2ggdHJpZ2dlcmVkIHRoZSBoZWF2 eSBmaWdodGluZy4KClVTIHBsYW5lcyBhcmUgc2VlbiBob3ZlcmluZyBvdmVyIEJhZ2hkYWQs IGF0dGFja2luZyB0aGUgcG9zaXRpb25zIG9mIHRoZQpJcmFxaSBmb3JjZXMuCgotLSBUaGUg VVMgZm9yY2VzIGFuZCBJcmFxaSB0cm9vcHMgb24gVHVlc2RheSBleGNoYW5nZWQgZmlyZSBv dmVyIHR3byBrZXkKYnJpZGdlcyBpbiBjZW50cmFsIEJhZ2hkYWQuCgpVUyBhcm1vcmVkIHZl aGljbGVzIGFuZCB0YW5rcyBmaXJlZCBjYW5ub24gYW5kIG1hY2hpbmVndW5zIGZyb20gdGhl Cndlc3Rlcm4gZW5kcyBvZiB0aGUgR3VtaHVyaXlhIGFuZCBTaW5hayBicmlkZ2VzIG92ZXIg dGhlIFRpZ3JpcyByaXZlciBpbgp0aGUgY2VudHJhbCBzZWN0aW9uIG9mIHRoZSBjYXBpdGFs IGNpdHkgYXMgSXJhcWkgZm9yY2VzIGZpcmVkIGJhY2sgZnJvbQp0aGUgZWFzdGVybiBiYW5r LgoKLS0gQSBVUyBBLTEwICJXYXJ0aG9nIiBwbGFuZSB3ZW50IGRvd24gbmVhciBCYWdoZGFk IGFpcnBvcnQgb24gVHVlc2RheQpidXQgdGhlIHBpbG90IHdhcyByZXNjdWVkLCB0aGUgVVMg Q2VudHJhbCBDb21tYW5kIHNhaWQgaW4gYSBzdGF0ZW1lbnQuCgoiVGhlIHBpbG90IGVqZWN0 ZWQgc2FmZWx5IGZyb20gdGhlIGFpcmNyYWZ0IGFuZCB3YXMgcmVjb3ZlcmVkIGJ5CmNvYWxp dGlvbiBncm91bmQgZm9yY2VzIG5lYXIgdGhlIGFpcnBvcnQsIiB0aGUgc3RhdGVtZW50IHNh aWQuCgotLSBJcmFxaSBJbmZvcm1hdGlvbiBNaW5pc3RlciBNb2hhbW1hZCBTYWlkIGFsLVNh aGFmIHN0cmVzc2VkIGhlcmUgb24KVHVlc2RheSB0aGF0IGhpcyBjb3VudHJ5IHdpbGwgZGVm ZWF0IGludmFkaW5nIFVTLWxlZCBjb2FsaXRpb24gZm9yY2VzLgoKIldlIHdpbGwgZGVzdHJv eSB0aGVtLCIgU2FoYWYgdG9sZCByZXBvcnRlcnMgbmVhciB0aGUgUGFsZXN0aW5lIEhvdGVs LAp3aGljaCB3YXMgaGl0IGR1cmluZyB0aGUgY29hbGl0aW9uJ3MgYm9tYmFyZG1lbnQgb24g dGhlIElyYXFpIGNhcGl0YWwKZWFybGllci4KCiJVUyBmb3JjZXMgd2lsbCBiZSByZXBlbGxl ZCBpbiBCYWdoZGFkLCIgaGUgc2FpZCwgYWRkaW5nIHRoZSBmb3JjZXMgd2VyZQpiZWluZyB0 cmFwcGVkIGluIHRhbmur8ZI+O44LANwAAADcAAAAAAKznQHkAAfpChZcCABFAADOUOhAAD8G 7QNBej0iQXo9KLiIABTpFbpYzJoyJlAYYQgJswAAcywgd2hpY2ggYXJlIGluY2FwYWJsZSBv ZiBsZWF2aW5nIEJhZ2hkYWQuCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhaXJwb3J0 CiAgICBiYW5rCiAgICBmaXJlCiAgICBob3RlbAogICAgaXJhcQogICAgcHJlc2lkZW50CiAg ICByZXB1YmxpY2FuCiAgICB3YXIKICAgIHdlYXBvbnMKCqvxkj48jgsAPAAAADwAAAAAArOd AeQAB+kKFlwIAEUAAChQ6UAAPwbtqEF6PSJBej0ouIgAFOkVuv7MmjImUBFhCPYaAAAAAAAA AACr8ZI+WQkMADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoug9AAH0GRoJBej0oQXo9IgAU uIjMmjIm6RW6/lAQ/VxZxwAAq/GSPlsKDAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLoQ QAB9BkaBQXo9KEF6PSIAFLiIzJoyJukVuv9QEP1cWcYAAKvxkj4iEgwANgAAADYAAAAAB+kK FlwAArOdAeQIAEUAACi6EUAAfQZGgEF6PShBej0iABS4iMyaMibpFbr/UBH9XFnFAACr8ZI+ ZBMMADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUOpAAD8G7adBej0iQXo9KLiIABTpFbr/ zJoyJ1AQYQj2GQAAAAAAAAAAq/GSPhzADAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFDr QAA/Bu2mQXo9IkF6PSi3bQAV3fpSVbnIMGxQEGEIf4YAAAAAAAAAAKvxkj73+AwATgAAAE4A AAAAB+kKFlwAArOdAeQIAEUAAEC6EkAAfQZGZ0F6PShBej0iABW3bbnIMGzd+lJVUBj11hui AAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQqr8ZI+1G0OADwAAAA8AAAAAAKznQHkAAfpChZc CABFAAAoUOxAAD8G7aVBej0iQXo9KLdtABXd+lJVucgwhFAQYQh/bgAAAAAAAAAArPGSPq/w AgBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTwqQAA/BgIvQXo9IkF6PSiVDxtYGI0fzXR6 BCCAGBbQIJoAAAEBCAoNREniAEIfvDg3MHwxNDczMTMxfDEwNDk4MTc1MTl8MS4wfDF8NDgy fGhlbGxvIHdvcmxkCqzxkj7hTgYAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXEkAAfQZp c0F6PShBej0iG1iVD3R6BCAYjR/6gBB8MySXAAABAQgKAEIfww1ESeKs8ZI+8k8GAG8AAABv AAAAAAKznQHkAAfpChZcCABFAABhPCtAAD8GAi5Bej0iQXo9KJUPG1gYjR/6dHoEIIAYFtAd RgAAAQEICg1ESfgAQh/DODcxfDE0NzMxMzJ8MTA0OTgxNzUxOXwxLjB8MXw3OTl8aGVsbG8g d29ybGQKrPGSPjelCQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJcTQAB9BmlyQXo9KEF6 PSIbWJUPdHoEIBiNICeAEHwGJH8AAAEBCAoAQh/FDURJ+K3xkj4k/gUAcAAAAHAAAAAAArOd AeQAB+kKFlwIAEUAAGI8LEAAPwYCLEF6PSJBej0olQ8bWBiNICd0egQggBgW0K4GAAABAQgK DURKWgBCH8U4NzJ8MTQ3MzEzM3wxMDQ5ODE3NTIwfDEuMHwxfDMxMTZ8aGVsbG8gd29ybGQK rfGSPk5oCQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJcUQAB9BmlxQXo9KEF6PSIbWJUP dHoEIBiNIFWAEHvYJBMAAAEBCAoAQh/PDURKWq7xkj4F1wIAPAAAADwAAAAAArOdAeQAB+kK FlwIBgABCAAGBAABAAfpChZcQXo9IgAAAAAAAEF6PSgAAAAAAAAAAAAAAAAAAAAAAACu8ZI+ FtcCACoAAAAqAAAAAAfpChZcAAKznQHkCAYAAQgABgQAAgACs50B5EF6PSgAB+kKFlxBej0i sPGSPuOsBwBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTwtQAA/BgIsQXo9IkF6PSiVDxtY GI0gVXR6BCCAGBbQGlIAAAEBCAoNREuRAEIfzzg3M3wxNDczMTM0fDEwNDk4MTc1MjN8MS4w fDF8NjU0fGhlbGxvIHdvcmxkCrDxkj6DXAoAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSX FUAAfQZpcEF6PShBej0iG1iVD3R6BCAYjSCCgBB7qyK9AAABAQgKAEIf7g1ES5Gw8ZI+vV0K AJ0AAACdAAAAAAKznQHkAAfpChZcCABFAACPPC5AAD8GAf1Bej0iQXo9KJUPG1gYjSCCdHoE IIAYFtD/6gAAAQEICg1ES6IAQh/uODc0fDE0NzMxMzV8MTA0OTgxNzUyM3wxLjB8MXw2NTF8 aGVsbG8gd29ybGQKODc1fDE0NzMxMzZ8MTA0OTgxNzUyNHwxLjB8MXwxMjAzfGhlbGxvIHdv cmxkCrDxkj4bsw0AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXFkAAfQZpb0F6PShBej0i G1iVD3R6BCAYjSDdgBB7UCKqAAABAQgKAEIf8A1ES6Kz8ZI+DeQKAHAAAABwAAAAAAKznQHk AAfpChZcCABFAABiPC9AAD8GAilBej0iQXo9KJUPG1gYjSDddHoEIIAYFtChnQAAAQEICg1E TNIAQh/wODc2fDE0NzMxMzd8MTA0OTgxNzUyNXwxLjB8MXw5NjYyfGhlbGxvIHdvcmxkCrPx kj71+wwAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXF0AAfQZpbkF6PShBej0iG1iVD3R6 BCAYjSELgBB7IiFdAAABAQgKAEIgDQ1ETNKz8ZI+SP0MAPkAAAD5AAAAAAKznQHkAAfpChZc CABFAADrPDBAAD8GAZ9Bej0iQXo9KJUPG1gYjSELdHoEIIAYFtBuIAAAAQEICg1ETN8AQiAN ODc3fDE0NzMxMzh8MTA0OTgxNzUyNnwxLjB8MXwzMjI1fGhlbGxvIHdvcmxkCjg3OHwxNDcz MTM5fDEwNDk4MTc1MjZ8MS4wfDF8MTc4N3xoZWxsbyB3b3JsZAo4Nzl8MTQ3MzE0MHwxMDQ5 ODE3NTI2fDEuMHwxfDI0NDB8aGVsbG8gd29ybGQKODgwfDE0NzMxNDF8MTA0OTgxNzUyN3wx LjB8MXw2NTR8aGVsbG8gd29ybGQKtPGSPkUQAQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA NJcYQAB9BmltQXo9KEF6PSIbWJUPdHoEIBiNIcKAEHprIU0AAAEBCAoAQiAQDURM37Txkj7t EQEAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI8MUAAPwYCJ0F6PSJBej0olQ8bWBiNIcJ0 egQggBgW0K1/AAABAQgKDURM9QBCIBA4ODF8MTQ3MzE0MnwxMDQ5ODE3NTI3fDEuMHwxfDEy MDN8aGVsbG8gd29ybGQKtPGSPqtmBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJcZQAB9 BmlsQXo9KEF6PSIbWJUPdHoEIBiNIfCAEHo9ITUAAAEBCAoAQiASDURM9bXxkj6fugEAcAAA AHAAAAAAArOdAeQAB+kKFlwIAEUAAGI8MkAAPwYCJkF6PSJBej0olQ8bWBiNIfB0egQggBgW 0KjjAAABAQgKDURNXgBCIBI4ODJ8MTQ3MzE0M3wxMDQ5ODE3NTI4fDEuMHwxfDM0MDN8aGVs bG8gd29ybGQKtfGSPq8pBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJcaQAB9BmlrQXo9 KEF6PSIbWJUPdHoEIBiNIh6AEHoPIMIAAAEBCAoAQiAcDURNXrXxkj6dRQoAKgAAACoAAAAA B+kKFlwAArOdAeQIBgABCAAGBAABAAKznQHkQXo9KAAAAAAAAEF6PSK18ZI+M0YKADwAAAA8 AAAAAAKznQHkAAfpChZcCAYAAQgABgQAAgAH6QoWXEF6PSIAArOdAeRBej0oAAAAAAAAAAAA AAAAAAAAAAAAtfGSPvzvDQBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTwzQAA/BgImQXo9 IkF6PSiVDxtYGI0iHnR6BCCAGBbQFx8AAAEBCAoNRE2uAEIgHDg4M3wxNDczMTQ1fDEwNDk4 MTc1Mjl8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCrbxkj48lgAAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSXG0AAfQZpakF6PShBej0iG1iVD3R6BCAYjSJLgBB54iBrAAABAQgKAEIgIw1E Ta628ZI+5ZcAAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPDRAAD8GAiRBej0iQXo9KJUP G1gYjSJLdHoEIIAYFtClHAAAAQEICg1ETboAQiAjODg0fDE0NzMxNDZ8MTA0OTgxNzUyOXwx LjB8MXwxMjAzfGhlbGxvIHdvcmxkCrbxkj6y7AMAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSXHEAAfQZpaUF6PShBej0iG1iVD3R6BCAYjSJ5gBB5tCBdAAABAQgKAEIgJQ1ETbq28ZI+ Ku4DAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPDVAAD8GAiNBej0iQXo9KJUPG1gYjSJ5 dHoEIIAYFtCfzQAAAQEICg1ETdAAQiAlODg1fDE0NzMxNDd8MTA0OTgxNzUyOXwxLjB8MXwz NTczfGhlbGxvIHdvcmxkCrbxkj6FngQAQgAAAEIAAAAAArOdAeQAB+kKFlwIAEUAADR51EAA PwbEsUF6PSJBej0okpsbWALR3Ck4NHt3gBAW0KtDAAABAQgKDURN1QBCG3a28ZI+o8UEAEIA AABCAAAAAAKznQHkAAfpChZcCABFAAA0edVAAD8GxLBBej0iQXo9KJKbG1gC0dwpODR7d4AQ FtCrQgAAAQEICg1ETdYAQht2tvGSPiXXBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJcd QAB9BmloQXo9KEF6PSIbWJKbODR7dwLR3CqAEAAAvWMAAAEBCAoAQiAlDURN1bbxkj7U/QQA QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXHkAAfQZpZ0F6PShBej0iG1iSmzg0e3cC0dwq gBAAAL1iAAABAQgKAEIgJQ1ETda28ZI+BEMHAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lx9AAH0GaWZBej0oQXo9IhtYlQ90egQgGI0ip4AQeYYgRAAAAQEICgBCICgNRE3QtvGSPsmp CQBBAQAAQQEAAAEADMzMzAAH657FbgEzqqoDAAAMIAACtIGmAAEADlNrYXJ2ZW5fZ3cAAgAR AAAAAQEBzAAEQXo9IQADABFGYXN0RXRoZXJuZXQwAAQACAAAAAEABQDTQ2lzY28gSW50ZXJu ZXR3b3JrIE9wZXJhdGluZyBTeXN0ZW0gU29mdHdhcmUgCklPUyAodG0pIEMxNzAwIFNvZnR3 YXJlIChDMTcwMC1ZLU0pLCBWZXJzaW9uIDEyLjEoMyksIFJFTEVBU0UgU09GVFdBUkUgKGZj MSkKQ29weXJpZ2h0IChjKSAxOTg2LTIwMDAgYnkgY2lzY28gU3lzdGVtcywgSW5jLgpDb21w aWxlZCBXZWQgMDUtSnVsLTAwIDE3OjA3IGJ5IGNtb25nAAYADmNpc2NvIDE3MjAABwAJQX01 nB4ACwAFAbbxkj6DVQsAQgAAAEIAAAAAArOdAeQAB+kKFlwIAEUAADR51kAAPwbEr0F6PSJB ej0okpsbWALR3Ck4NHt3gBAW0KZoAAABAQgKDUROAQBCICW28ZI+kY0LAEIAAABCAAAAAAfp ChZcAAKznQHkCABFAAA0lyBAAH0GaWVBej0oQXo9IhtYkps4NHt3AtHcKoAQAAC9MgAAAQEI CgBCICoNRE4BtvGSPoPxDQBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjw2QAA/BgIiQXo9 IkF6PSiVDxtYGI0ip3R6BCCAGBbQlGYAAAEBCAoNRE4SAEIgKDg4NnwxNDczMTQ4fDEwNDk4 MTc1MzB8MS4wfDF8Mjg1OHxoZWxsbyB3b3JsZAq38ZI+aAQCAEIAAABCAAAAAAfpChZcAAKz nQHkCABFAAA0lyFAAH0GaWRBej0oQXo9IhtYlQ90egQgGI0i1YAQeVgf/AAAAQEICgBCIC4N RE4St/GSPtEFAgBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTw3QAA/BgIiQXo9IkF6PSiV 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 ZWxsbyB3b3JsZAo5MDZ8MTQ3MzE2OHwxMDQ5ODE3NTQyfDEuMHwxfDY1NHxoZWxsbyB3b3Js ZArE8ZI+mkECAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0lzNAAH0GaVJBej0oQXo9IhtY lQ90egQgGI0mYoAQdcsaZQAAAQEICgBCILANRFMnxPGSPiu8AwBvAAAAbwAAAAACs50B5AAH 6QoWXAgARQAAYTxFQAA/BgIUQXo9IkF6PSiVDxtYGI0mYnR6BCCAGBbQArMAAAEBCAoNRFNH AEIgsDkwN3wxNDczMTY5fDEwNDk4MTc1NDN8MS4wfDF8NTI0fGhlbGxvIHdvcmxkCsTxkj5E QwcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXNEAAfQZpUUF6PShBej0iG1iVD3R6BCAY jSaPgBB1nhpBAAABAQgKAEIgtA1EU0fH8ZI+cWwFAG8AAABvAAAAAAKznQHkAAfpChZcCABF AABhPEZAAD8GAhNBej0iQXo9KJUPG1gYjSaPdHoEIIAYFtADTAAAAQEICg1EVH4AQiC0OTA4 fDE0NzMxNzB8MTA0OTgxNzU0NHwxLjB8MXw0ODJ8aGVsbG8gd29ybGQKx/GSPoI3CABCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJc1QAB9BmlQQXo9KEF6PSIbWJUPdHoEIBiNJryAEHVx GOwAAAEBCAoAQiDSDURUfsfxkj4YOQgAzAAAAMwAAAAAArOdAeQAB+kKFlwIAEUAAL48R0AA PwYBtUF6PSJBej0olQ8bWBiNJrx0egQggBgW0N2UAAABAQgKDURUkABCINI5MDl8MTQ3MzE3 MXwxMDQ5ODE3NTQ1fDEuMHwxfDMxMTZ8aGVsbG8gd29ybGQKOTEwfDE0NzMxNzJ8MTA0OTgx NzU0NXwxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCjkxMXwxNDczMTczfDEwNDk4MTc1NDV8MS4w fDF8MzU3M3xoZWxsbyB3b3JsZArH8ZI+yo0LAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0 lzZAAH0GaU9Bej0oQXo9IhtYlQ90egQgGI0nRoAQdOcY2AAAAQEICgBCINQNRFSQx/GSPnWP CwBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTxIQAA/BgIRQXo9IkF6PSiVDxtYGI0nRnR6 BCCAGBbQCU0AAAEBCAoNRFSmAEIg1DkxMnwxNDczMTc0fDEwNDk4MTc1NDd8MS4wfDF8MjMw fGhlbGxvIHdvcmxkCsfxkj6B5A4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXN0AAfQZp TkF6PShBej0iG1iVD3R6BCAYjSdzgBB0uhi/AAABAQgKAEIg1w1EVKbI8ZI+BIYLAHAAAABw AAAAAAKznQHkAAfpChZcCABFAABiPElAAD8GAg9Bej0iQXo9KJUPG1gYjSdzdHoEIIAYFtCN 8wAAAQEICg1EVQoAQiDXOTEzfDE0NzMxNzV8MTA0OTgxNzU0OHwxLjB8MXwyOTE1fGhlbGxv IHdvcmxkCsjxkj5wpw4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXOEAAfQZpTUF6PShB ej0iG1iVD3R6BCAYjSehgBB0jBhSAAABAQgKAEIg4A1EVQrJ8ZI+QfMMAFAAAABQAAAAAAKz nQHkAAfpChZcCABFAABCUO1AAD8G7YpBej0iQXo9KLdtABXd+lJVucgwhFAYYQh/fgAAREVM RSAzNjIwMDAyNy5vdXQuMDMwNDA4DQrJ8ZI+6gwNAHAAAABwAAAAAAKznQHkAAfpChZcCABF AABiPEpAAD8GAg5Bej0iQXo9KJUPG1gYjSehdHoEIIAYFtCLRwAAAQEICg1EVXgAQiDgOTE0 fDE0NzMxNzZ8MTA0OTgxNzU0OXwxLjB8MXwxNzg3fGhlbGxvIHdvcmxkCsnxkj7lMA0AfAAA AHwAAAAAB+kKFlwAArOdAeQIAEUAAG66E0AAfQZGOEF6PShBej0iABW3bbnIMITd+lJvUBj1 vHCPAAA1NTAgMzYyMDAwMjcub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0 aGUgZmlsZSBzcGVjaWZpZWQuIA0KyfGSPkE+DQBRAAAAUQAAAAACs50B5AAH6QoWXAgARQAA Q1DuQAA/Bu2IQXo9IkF6PSi3bQAV3fpSb7nIMMpQGGEItk8AAFBPUlQgNjUsMTIyLDYxLDM0 LDE4NCwxNTYNCsnxkj6YeA0AVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa6FEAAfQZGX0F6 PShBej0iABW3bbnIMMrd+lKKUBj1oC1NAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwu DQrJ8ZI+k3sNAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUO9AAD8G7YhBej0iQXo9KLdt ABXd+lKKucgw6FAYYQhsyQAAU1RPUiAzNjIwMDAyNy5vdXQuMDMwNDA4DQrJ8ZI+MrgNAHgA AAB4AAAAAAfpChZcAAKznQHkCABFAABquhVAAH0GRjpBej0oQXo9IgAVt225yDDo3fpSpFAY +vD05wAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIw MDAyNy5vdXQuMDMwNDA4Lg0KyfGSPkO5DQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLoW QAB9BkZzQXo9KEF6PSIAFLicuRlcPAAAAABwAvrwvTkAAAIEBWQBAQQCyfGSPvK6DQA+AAAA PgAAAAACs50B5AAH6QoWXAgARQAAMFDwQAA/Bu2ZQXo9IkF6PSi4nAAU6bYkkbkZXD1wEmEI SHkAAAEBBAICBAW0yfGSPmPyDQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLoXQAB9BkZ6 QXo9KEF6PSIAFLicuRlcPem2JJJQEP1c2OgAAMnxkj4H+g0AmgUAAJoFAAAAArOdAeQAB+kK FlwIAEUABYxQ8UAAPwboPEF6PSJBej0ouJwAFOm2JJK5GVw9UBBhCMOCAABYWVpaWS4uLiAg VEM9MiBUTT0xMDQ5ODE3NTI4IE1OPTM2MjAwMDI3Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29t dGV4IiBQRk49IkNvbXRleCIgUEZOPSJPc3RlckRvd0pvbmVzIiAKCi4uLiAgCgoKLi4uIAkg CgoKSGVhZExpbmUuLi4gIE9ESiBOZXdzIE1lbnU6IFNvZnRzIC0gU3VnYXIKCi4uLiAgCSAK CkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoT0RKIHZp YSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMg T3N0ZXJEb3dKb25lcyBDb21tb2RpdHkgTmV3cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZl ZC4KCgouLi4KCgpPc3RlckRvd0pvbmVzCgpUaGUgc3RvcnkgbnVtYmVycyBsaXN0ZWQgYmVs b3cgYXBwbHkgdG8gRnV0dXJlU291cmNlIHByb2R1Y3RzIG9ubHkuIFRoZQpzYW1lIGl0ZW1z IGFyZSBhdmFpbGFibGUgb24gb3RoZXIgc2VydmljZXMgYnV0IG1pZ2h0IG5vdCB1dGlsaXpl IHRoZSBzYW1lCnN0b3J5IG51bWJlcnMuIElmIG5vIG51bWJlciBpcyBsaXN0ZWQgYmVmb3Jl IGFuIGl0ZW0sIHRoZXJlIGlzIG5vCmFzc29jaWF0ZWQgcmVndWxhciBzdG9yeSBudW1iZXIu CgpOb3QgYWxsIHN0b3JpZXMgbGlzdGVkIGFyZSBhdmFpbGFibGUgaW4gYWxsIG5ld3MgcGFj a2FnZXMuIEZvciBhIGNvbXBsZXRlCmxpc3Qgb2YgcmVwb3J0cyBpbmNsdWRlZCBpbiBlYWNo IE9ESiBwYWNrYWdlLCBnbyB0byB3d3cub3N0ZXJkb3dqb25lcy5jb20KYW5kIGNsaWNrIGlu ICJjb250ZW50Ii4gQXByaWwgOCwgMjAwMwoKLS0tIFN0b3J5IC0tLQpOdW1iZXIgIFRpdGxl Ci0tLS0tLSAgLS0tLS0KMzkwMSAgIFN1Z2FyIENhbGVuZGFyIC0gRnV0dXJlcy9PcHRpb25z IERhdGVzIChEYWlseSkKCjM3MDMgSW50ZXJuYXRpb25hbCBTdWdhciBPcmdhbml6YXRpb24g UHJpY2UgKERhaWx5KSAzNzQ1IENTQ0UgU3VnYXIKRnV0dXJlcyBQcmUtT3BlbiAoRGFpbHkp IDM3NDkgQ1NDRSBTdWdhciBMYXRlIENhbGxzIChEYWlseSkgMzkyOCBDU0NFClN1Z2FyIEZ1 dHVyZXMgTWlkZGF5IChEYWlseSkgMzc0MiBDU0NFIFN1Z2FyIEZ1dHVyZXMgUmV2aWV3IChE YWlseSkgMzc1MgpDU0NFIENsb3NpbmcgRXN0aW1hdGVkIFZvbHVtZXMgKERhaWx5KSAzNzUw IENTQ0UgQ29mZmVlLCBTdWdhciwgQ29jb2EKRnV0dXJlcyBGaW5hbCBWb2x1bWVzIChEYWls eSkgMzc1MSBDU0NFIENvZmZlZSwgU3VnYXIsIENvY29hIEZ1dHVyZXMgT3BlbgpJbnRlcmVz dCAoRGFpbHkpIDM3NzggQ1NDRSBTdWdhciBPcHRpb25zIFZvbHVtZS9PcGVuIEludGVyZXN0 IChEYWlseSkKMzc3NSBDU0NFIFN1Z2FyIDExIENsb3NlIChEYWlseSkgMzc3NCBDU0NFIFN1 Z2FyIDExIE9wZW4gKERhaWx5KSDJ8ZI+i/oNAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWM UPJAAD8G6DtBej0iQXo9KLicABTptin2uRlcPVAYYQjZpQAAMzc3NwpDU0NFIFN1Z2FyIDEx IE9wdGlvbnMgQ2xvc2UgKERhaWx5KSAzNzc2IENTQ0UgU3VnYXIgMTQgQ2xvc2UgKERhaWx5 KSAzNzc5CkNTQ0UgU3BvdCBTdWdhciBQcmljZSAoRGFpbHkpIDM3MjIgQ1NDRSBTdWdhciAx MSBEZWxpdmVyaWVzIChQZXJpb2RpYykKODczMiBDU0NFIFN1Z2FyIDE0IERlbGl2ZXJpZXMg KFBlcmlvZGljKSAzNzgwIENGVEMgQ29tbWl0bWVudHMgT2YKVHJhZGVyczogQ1NDRSBTdWdh ciBGdXR1cmVzIChGcmlkYXkpIDg3MjAgQ0ZUQyBDb21taXRtZW50cyBPZiBUcmFkZXJzOgpD U0NFIFN1Z2FyIEZ1dHVyZXMvT3B0aW9ucyAoRnJpZGF5KSAzOTA1IFJlYWN0aW9uIFRvIENv bW1pdG1lbnQgT2YKVHJhZGVycyBSZXBvcnQgLSBTdWdhciAoUGVyaW9kaWMpIDI0MzcgVVNE QSBVUyBDcm9wIFByb2R1Y3Rpb246IFN1Z2FyCkJlZXRzL0NhbmUgKE1vbnRobHkpIDI0NjIg VVNEQSBTdXBwbHkvRGVtYW5kOiBVUyBTdWdhciAoTW9udGhseSkgMzY3OQpVU0RBIFVTIENy b3AgUHJvZ3Jlc3MvQ29uZGl0aW9uOiBTdWdhcmJlZXRzIChNb25kYXkpIDM4MjMgVVMgRHJv dWdodApNb25pdG9yIChXZWVrbHkpCgozNzMyIExpZmZlIFN1Z2FyIEZ1dHVyZXMgTWlkZGF5 IChEYWlseSkgMzc2MiBMaWZmZSBTdWdhciBGdXR1cmVzIFJldmlldwooRGFpbHkpIDM3MDUg TGlmZmUgV2hpdGUgU3VnYXIgQ2xvc2UgKERhaWx5KSAzNzAyIExvbmRvbiBTdWdhciBQcmlj ZXMKKERhaWx5KQoKNTA5OSBCcmF6aWwgQ2FzaCBTdWdhciBQcmVtaXVtcyAoV2Vla2x5KSAz NzQwIEJyYXppbCBFc2FscS9CTSZGIFN1Z2FyCkNhc2ggSW5kZXggKERhaWx5KSAzOTI1IENl bnRyYWwgQW1lcmljYSBSYXdzIC0gU3VnYXIgKERhaWx5KSAzOTI2IENlbnRyYWwKQW1lcmlj YSBXaGl0ZXMgLSBTdWdhciAoRGFpbHkpCgpQZXJ1IFN1Z2FyIE91dHB1dCAoUGVyaW9kaWMp Cgo1MTAwIENoaW5hIE1vbnRobHkgSW1wb3J0IEFuZCBFeHBvcnQgRGF0YSAtIENvdHRvbiBB bmQgU3VnYXIgKE1vbnRobHkpCjUxMDEgQ2hpbmEgTW9udGhseSBQcm9kdWN0aW9uIERhdGEg LSBTdWdhciAoTW9udGhseSkgMzkxMSBJbmRpYSBTdWdhcgpDb21tZW50cyAoV2Vla2x5KSAz OTE3IFNFIEFzaWEgU3VnYXIgQ29tbWVudHMgKDJYIEEgV2VlaykgMzk0MyBUaGFpbGFuZApT dWdhciBQcmVtaXVtcyAoV2Vla2x5KSA1ODU0IFRoYWlsYW5kIFN1Z2FyIFZlc3NlbCBNb3Zl bWVudCAoV2Vla2x5KSAzNTU0ClRoYWlsYW5kIFN1Z2FyIE91dHB1dCAoUGVyaW9kaWMpCgot LS0gT3N0ZXJEb3dKb25lcwoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYXNpYQogICAg YnJhemlsCiAgICBjZW50cmFsK2FtZXJpY2EKICAgIGNoaW5hCiAgICBjb2NvYQogICAgY29m ZmVlCiAgICBjb3R0yfGSPoz6DQDzAAAA8wAAAAACs50B5AAH6QoWXAgARQAA5VDzQAA/Buzh QXo9IkF6PSi4nAAU6bYvWrkZXD1QGGEInygAAG9uCiAgICBleHBvcnQKICAgIGZ1dHVyZXMK ICAgIGltcG9ydAogICAgaW5kZXgKICAgIGluZGlhCiAgICBsaWZmZQogICAgbG9uZG9uCiAg ICBwZXJ1CiAgICBwcmljZXMKICAgIHByb2R1Y3RzCiAgICBzdWdhcgogICAgdGhhaWxhbmQK ICAgIHVzZGEKICAgIEZPT0RPcmlnaW4gQXNzaWduZWRCeT0iT3N0ZXJEb3dKb25lcyIgLz4K Csnxkj6N+g0APAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChQ9EAAPwbtnUF6PSJBej0ouJwA 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 AD8G7Y5Bej0iQXo9KLidABTpz08hxnM0LnASYQg4hAAAAQEEAgIEBbTP8ZI+fR4BADYAAAA2 AAAAAAfpChZcAAKznQHkCABFAAAouiBAAH0GRnFBej0oQXo9IgAUuJ3GczQu6c9PIlAQ/VzI 8wAAz/GSPmMmAQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFD8QAA/BugxQXo9IkF6PSi4 nQAU6c9PIsZzNC5QEGEIvg8AAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc1MzAgTU49MzYy MDAwMjgub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IlBS IE5ld3N3aXJlIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIENpbmd1bGFyIFdp cmVsZXNzIEFwcG9pbnRzIFJvYiBGb3JzeXRoIGFzIE5ldyBWaWNlIFByZXNpZGVudCBhbmQg R2VuZXJhbApNYW5hZ2VyIGZvciBOb3J0aCBhbmQgU291dGggQ2Fyb2xpbmEKCi4uLiAgCSAK CkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIENIQVJMT1RURSwgIE4uQy4sIEFw ciA4LCAyMDAzIC9QUk5ld3N3aXJlIHZpYSBDT01URVgvIC0tCgoKCi4uLgoKQ29weXJpZ2h0 TGluZS4uLiAgQ29weXJpZ2h0IChDKSAyMDAzIFBSIE5ld3N3aXJlLiAgQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KCgouLi4KCgpQUiBOZXdzd2lyZQoKQ2luZ3VsYXIgV2lyZWxlc3MgYW5ub3Vu Y2VzIHRoZSBhcHBvaW50bWVudCBvZiBSb2IgRm9yc3l0aCBhcyB2aWNlCnByZXNpZGVudCBh bmQgZ2VuZXJhbCBtYW5hZ2VyIG9mIE5vcnRoIGFuZCBTb3V0aCBDYXJvbGluYS4gSW4gaGlz IG5ldwpyb2xlLCBGb3JzeXRoIHdpbGwgb3ZlcnNlZSBhbGwgd2lyZWxlc3Mgc2FsZXMgYW5k IG9wZXJhdGlvbnMgZm9yIHRoZQpDYXJvbGluYXMuIEZvcnN5dGggcmVsb2NhdGVkIHRvIE5v cnRoIENhcm9saW5hIGZyb20gU2FuIEFudG9uaW8sIFRleGFzCndoZXJlIGhlIHNlcnZlZCBh cyB2aWNlIHByZXNpZGVudCBhbmQgZ2VuZXJhbCBtYW5hZ2VyLgoKRm9yc3l0aCBoYXMgYWdn cmVzc2l2ZSBwbGFucyBmb3IgdGhlIENhcm9saW5hcyB0aGF0IHdpbGwgZW5hYmxlIGhpcyB0 ZWFtCnRvIHJlc3BvbmQgdG8gdGhlIGNoYW5naW5nIG5lZWRzIG9mIENpbmd1bGFyIGN1c3Rv bWVycyBpbiBOb3J0aCBhbmQgU291dGgKQ2Fyb2xpbmEuIFdpdGggYW4gZXh0ZW5zaXZlIEdT TSBuZXR3b3JrIGluIHRoZSB0d28gc3RhdGVzLCBDaW5ndWxhciB3aWxsCmNvbnRpbnVlIHRv IG9mZmVyIGV4Y2VsbGVudCBjdXN0b21lciBzZXJ2aWNlLCBjb21wZXRpdGl2ZSBwcmljZSBw bGFucyBhbmQKaGFuZHNldHMgdGhhdCAiZml0IHRoZSBjdXN0b21lciBiZXN0LiIKCiJXaXRo IFJvYidzIDE1IHllYXJzIG9mIHdpcmVsZXNzIGV4cGVyaWVuY2UsIGhlIGhhcyBwcm92ZW4g aGlzIGFiaWxpdHkgdG8KZHJpdmUgZ3Jvd3RoIGFuZCBtYXJrZXQgbGVhZGVyc2hpcCBpbiBt YW55IG9mIG91ciBtYXJrZXRzLCIgc3RhdGVzIFN0ZXZlClNpdHRvbiwgUHJlc2lkZW50IG9m IENpbmd1bGFyIFdpcmVsZXNzJyBFYXN0IFJlZ2lvbi4gIldlIGFyZSBleGNpdGVkIHRvCmhh dmUgUm9iJ3MgdmFsdWFibGUgZXhwZXJ0aXNlIGluIHRoZSBDYXJvbGluYXMgdG8gYs/xkj7l JgEAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxQ/UAAPwboMEF6PSJBej0ouJ0AFOnPVIbG czQuUBhhCI/rAAB1aWxkIHVwb24gb3VyIG1vbWVudHVtCmFuZCBleGVjdXRlIG91ciBsb2Nh bCBpbml0aWF0aXZlcy4iCgpGb3JzeXRoIGhhcyBtb3JlIHRoYW4gMTUgeWVhcnMgb2YgZXhw ZXJpZW5jZSBpbiB0aGUgd2lyZWxlc3MgaW5kdXN0cnkuCkZvcnN5dGggYmVnYW4gaGlzIHdp cmVsZXNzIGNhcmVlciB3aXRoIFNvdXRod2VzdGVybiBCZWxsIE1vYmlsZSBTeXN0ZW1zCmlu IDE5ODkuIEhlIGhlbGQgdmFyaW91cyBtYW5hZ2VtZW50IHBvc2l0aW9ucyBkdXJpbmcgaGlz IHRlbnVyZSBhdApTb3V0aHdlc3Rlcm4gQmVsbCBNb2JpbGUgU3lzdGVtcyBpbmNsdWRpbmc6 IGdlbmVyYWwgc2FsZXMgbWFuYWdlciBpbgpBcmthbnNhcyBhbmQgZ2VuZXJhbCBtYXJrZXRp bmcgbWFuYWdlciBpbiBPa2xhaG9tYS4gUHJpb3IgdG8gam9pbmluZwpDaW5ndWxhciBXaXJl bGVzcyBpbiAyMDAwLCBGb3JzeXRoIGhlbGQgZXhlY3V0aXZlIHBvc2l0aW9ucyBhdCBQYWNp ZmljCkJlbGwgV2lyZWxlc3MgaW4gVHVzdGluLCBDYWxpZm9ybmlhIHdoZXJlIGhlIHNlcnZl ZCBhcyBleGVjdXRpdmUgZGlyZWN0b3IKYW5kIHZpY2UgcHJlc2lkZW50IG9mIHNhbGVzLgoK Rm9yc3l0aCBpcyBsb2NhdGVkIGluIENpbmd1bGFyIFdpcmVsZXNzJyBDaGFybG90dGUgb2Zm aWNlIGF0IDI1NTAgV2VzdApUeXZvbGEgUm9hZC4KCkFCT1VUIENJTkdVTEFSIFdJUkVMRVNT CgpDaW5ndWxhciBXaXJlbGVzcywgYSBqb2ludCB2ZW50dXJlIGJldHdlZW4gU0JDIENvbW11 bmljYXRpb25zIChOWVNFOiBTQkMpCmFuZCBCZWxsU291dGggKE5ZU0U6IEJMUyksIHNlcnZl cyBtb3JlIHRoYW4gMjIgbWlsbGlvbiB2b2ljZSBhbmQgZGF0YQpjdXN0b21lcnMgYWNyb3Nz IHRoZSBVbml0ZWQgU3RhdGVzLiBBIGxlYWRlciBpbiBtb2JpbGUgdm9pY2UgYW5kIGRhdGEK Y29tbXVuaWNhdGlvbnMsIENpbmd1bGFyIGlzIHRoZSBvbmx5IFVTIHdpcmVsZXNzIGNhcnJp ZXIgdG8gb2ZmZXIKUm9sbG92ZXIsIHRoZSB3aXJlbGVzcyBwbGFuIHRoYXQgbGV0cyBjdXN0 b21lcnMga2VlcCB0aGVpciB1bnVzZWQgbW9udGhseQptaW51dGVzLiBDaW5ndWxhciBwcm92 aWRlcyBjZWxsdWxhci9QQ1Mgc2VydmljZSBpbiA0MyBvZiB0aGUgdG9wIDUwCm1hcmtldHMg bmF0aW9ud2lkZSwgYW5kIHByb3ZpZGVzIGNvcnBvcmF0ZSBlLW1haWwgYW5kIG90aGVyIGFk dmFuY2VkIGRhdGEKc2VydmljZXMgdGhyb3VnaCBpdHMgR1BSUyBhbmQgTW9iaXRleCBwYWNr ZXQgZGF0YSBuZXR3b3Jrcy4gRGV0YWlscyBvZgp0aGUgY29tcGFueSBhcmUgYXZhaWxhYmxl IGF0IHd3dy5jaW5ndWxhci5jb20gLgoKU09VUkNFIENpbmd1bGFyIFdpcmVsZXNzCgpEYXdu IEJlbnRvbiBvZiBDaW5ndWxhciBXaXJlbGVzcywgKzEtNDA0LTIzNi3P8ZI++iYBAKQBAACk AQAAAAKznQHkAAfpChZcCABFAAGWUP5AAD8G7CVBej0iQXo9KLidABTpz1nqxnM0LlAYYQj7 BQAANTMwNSwgb3IKZGF3bi5iZW50b25AY2luZ3VsYXIuY29tCgpodHRwOi8vd3d3LmNpbmd1 bGFyLmNvbQoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYXJrYW5zYXMKICAgIGNhbGlm b3JuaWEKICAgIGNhcmVlcgogICAgY2FycmllcgogICAgY2VsbHVsYXIKICAgIGNvbW11bmlj YXRpb25zCiAgICBjb3Jwb3JhdGUKICAgIGUtbWFpbAogICAgZXhlY3V0aXZlCiAgICBqb2lu dCt2ZW50dXJlCiAgICBsb2NhbAogICAgbWFya2V0CiAgICBtYXJrZXRpbmcKICAgIG5vcnRo K2Nhcm9saW5hCiAgICBueXNlCiAgICBva2xhaG9tYQogICAgcHJlc2lkZW50CiAgICBzYWxl cwogICAgc291dGgrY2Fyb2xpbmEKICAgIHRleGFzCiAgICB3aXJlbGVzcwoKz/GSPvsmAQA8 AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFD/QAA/Bu2SQXo9IkF6PSi4nQAU6c9bWMZzNC5Q EWEIWREAAAAAAAAAAM/xkj61oQEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6IUAAfQZG cEF6PShBej0iABS4ncZzNC7pz1nqUBD9XL4rAADP8ZI+bqUBADYAAAA2AAAAAAfpChZcAAKz nQHkCABFAAAouiJAAH0GRm9Bej0oQXo9IgAUuJ3GczQu6c9bWVAQ++6+KgAAz/GSPiW1AQA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLojQAB9BkZuQXo9KEF6PSIAFLidxnM0LunPW1lQ EfvuvikAAM/xkj5LtgEAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRAEAAPwbtkUF6PSJB ej0ouJ0AFOnPW1nGczQvUBBhCFkQAAAAAAAAAADP8ZI+QmMCADwAAAA8AAAAAAKznQHkAAfp ChZcCABFAAAoUQFAAD8G7ZBBej0iQXo9KLdtABXd+lLzucgx6FAQYQh9bAAAAAAAAAAAz/GS PvWbAgBOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLokQAB9BkZVQXo9KEF6PSIAFbdtucgx 6N36UvNQGPqgFL4AADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCs/xkj4ApQIAUAAAAFAAAAAA ArOdAeQAB+kKFlwIAEUAAEJRAkAAPwbtdUF6PSJBej0ot20AFd36UvO5yDIAUBhhCIRjAABE RUxFIDM2MjAwMDMwLm91dC4wMzA0MDgNCs/xkj6a4QIAfAAAAHwAAAAAB+kKFlwAArOdAeQI AEUAAG66JUAAfQZGJkF6PShBej0iABW3bbnIMgDd+lMNUBj6hmiyAAA1NTAgMzYyMDAwMzAu b3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQu IA0Kz/GSPk3tAgBRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1EDQAA/Bu1zQXo9IkF6PSi3 bQAV3fpTDbnIMkZQGGEIsjUAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxNTgNCs/xkj6lJwMA VAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa6JkAAfQZGTUF6PShBej0iABW3bbnIMkbd+lMo UBj6aiZpAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQrP8ZI+AisDAFAAAABQAAAA AAKznQHkAAfpChZcCABFAABCUQRAAD8G7XNBej0iQXo9KLdtABXd+lMoucgyZFAYYQhxrgAA U1RPUiAzNjIwMDAzMC5vdXQuMDMwNDA4DQrP8ZI+g2gDAHgAAAB4AAAAAAfpChZcAAKznQHk CABFAABquidAAH0GRihBej0oQXo9IgAVt225yDJk3fpTQlAY+lDydAAAMTUwIE9wZW5pbmcg QklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDAzMC5vdXQuMDMwNDA4Lg0K z/GSPoFpAwA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLooQAB9BkZhQXo9KEF6PSIAFLie 0hBajAAAAABwAvrwpfAAAAIEBWQBAQQCz/GSPkhrAwA+AAAAPgAAAAACs50B5AAH6QoWXAgA RQAAMFEFQAA/Bu2EQXo9IkF6PSi4ngAU6dJLcNIQWo1wEmEICjUAAAEBBAICBAW0z/GSPpaj AwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLopQAB9BkZoQXo9KEF6PSIAFLie0hBajenS S3FQEP1cmqQAAM/xkj5hqgMAQQMAAEEDAAAAArOdAeQAB+kKFlwIAEUAAzNRBkAAPwbqgEF6 PSJBej0ouJ4AFOnSS3HSEFqNUBhhCHKNAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3NTM1 IE1OPTM2MjAwMDMwLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIg UEZOPSJBRlggTmV3cyAtIEV1cm9wZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4u ICBWVydzIEJ1ZWNoZWxob2ZlciBzdGVwcyBkb3duIGR1ZSB0byAnZGlmZmVyZW5jZXMgYWJv dXQgZGlzdHJpYnV0aW9uIHBvbGljeScKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoK RGF0ZUxpbmUuLi4gIFdPTEZTQlVSRywgR2VybWFueSwgQXByIDA4LCAyMDAzIChBRlgtRXVy b3BlIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0 IDIwMDMuIEFGWCBOZXdzIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpBRlgg TmV3cyAtIEV1cm9wZQoKVm9sa3N3YWdlbiBBRyBzYWlkIHRoYXQgaXRzIG1hbmFnZW1lbnQg Ym9hcmQgbWVtYmVyIGZvciBkaXN0cmlidXRpb24gYW5kCm1hcmtldGluZyBSb2JlcnQgQnVl Y2hlbGhvZmVyIGlzIHN0ZXBwaW5nIGRvd24gZHVlIHRvICJkaWZmZXJpbmcgb3BpbmlvbnMK YWJvdXQgdGhlIGRpc3RyaWJ1dGlvbiBwb2xpY3kiIGF0IEV1cm9wZSdzIGxhcmdlc3QgY2Fy bWFrZXIuCgpUaGUgY2hhbmdlIGlzIGVmZmVjdGl2ZSBpbW1lZGlhdGVseSwgYW5kIG5vIHN1 Y2Nlc3NvciBoYXMgYmVlbiBuYW1lZCwgVlcKc2FpZC4KCnNjcy9qbHcKCi4uLiAgCSAKCktl eVdvcmRzLi4uICAKICAgIGV1cm9wZQogICAgbWFya2V0aW5nCiAgICBwb2xpY3kKCs/xkj5i qgMAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRB0AAPwbtikF6PSJBej0ouJ4AFOnSTnzS EFqNUBFhCDPtAAAAAAAAAADP8ZI+PPgDADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouipA AH0GRmdBej0oQXo9IgAUuJ7SEFqN6dJOfVAQ+lGaowAAz/GSPsQCBAA2AAAANgAAAAAH6QoW XAACs50B5AgARQAAKLorQAB9BkZmQXo9KEF6PSIAFLie0hBajenSTn1QEfpRmqIAAM/xkj45 BAQAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRCEAAPwbtiUF6PSJBej0ouJ4AFOnSTn3S EFqOUBBhCDPsAAAAAAAAAADP8ZI+XtQEADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUQlA AD8G7YhBej0iQXo9KLdtABXd+lNCucgyplAQYQh8XwAAAAAAAAAAz/GSPigNBQBOAAAATgAA AAAH6QoWXAACs50B5AgARQAAQLosQAB9BkZNQXo9KEF6PSIAFbdtucgypt36U0JQGPpQFAEA ADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCs/xkj7nFAUAUAAAAFAAAAAAArOdAeQAB+kKFlwI AEUAAEJRCkAAPwbtbUF6PSJBej0ot20AFd36U0K5yDK+UBhhCIJWAABERUxFIDM2MjAwMDMx Lm91dC4wMzA0MDgNCs/xkj50UQUAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG66LUAAfQZG HkF6PShBej0iABW3bbnIMr7d+lNcUBj6Nmf0AAA1NTAgMzYyMDAwMzEub3V0LjAzMDQwODog VGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0Kz/GSPqhdBQBR AAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1ELQAA/Bu1rQXo9IkF6PSi3bQAV3fpTXLnIMwRQ GGEIsCgAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxNTkNCs/xkj7dlwUAVAAAAFQAAAAAB+kK FlwAArOdAeQIAEUAAEa6LkAAfQZGRUF6PShBej0iABW3bbnIMwTd+lN3UBj6GiWsAAAyMDAg UE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQrP8ZI+HZsFAFAAAABQAAAAAAKznQHkAAfpChZc CABFAABCUQxAAD8G7WtBej0iQXo9KLdtABXd+lN3ucgzIlAYYQhvoQAAU1RPUiAzNjIwMDAz MS5vdXQuMDMwNDA4DQrP8ZI+gdgFAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqui9AAH0G RiBBej0oQXo9IgAVt225yDMi3fpTkVAY+gDxtgAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUg ZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDAzMS5vdXQuMDMwNDA4Lg0Kz/GSPm/ZBQA+AAAA PgAAAAAH6QoWXAACs50B5AgARQAAMLowQAB9BkZZQXo9KEF6PSIAFLiftFJVcgAAAABwAvrw yMcAAAIEBWQBAQQCz/GSPu/aBQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFENQAA/Bu18 QXo9IkF6PSi4nwAU6dVjBLRSVXNwEmEIFXUAAAEBBAICBAW0z/GSPscSBgA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLoxQAB9BkZgQXo9KEF6PSIAFLiftFJVc+nVYwVQEP1cpeQAAM/x kj4AGwYAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxRDkAAPwboH0F6PSJBej0ouJ8AFOnV YwW0UlVzUBBhCI7EAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3NTM3IE1OPTM2MjAwMDMx Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJPc3RlckRv d0pvbmVzIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIE9ESiBVU0RBIERlbG1h cnZhIEJyb2lsZXIvRnJ5ZXIgTWFya2V0IC0gQXByIDgKCi4uLiAgCSAKCkJ5TGluZS4uLiAg CgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoT0RKIHZpYSBDT01URVgpIC0t CgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDMgT3N0ZXJEb3dKb25l cyBDb21tb2RpdHkgTmV3cyAoT0RKKS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpP c3RlckRvd0pvbmVzCgpBSl9QWTAzOSAgICAgICAgICAgICAgICAgSW50ZXJuZXQ6ICBodHRw Oi8vd3d3LmFtcy51c2RhLmdvdi9tYXJrZXRuZXdzLmh0bQoKQVRMQU5UQSwgR0EgQVBSSUwg MDgsIDIwMDMKCkRFTE1BUlZBIEJST0lMRVIvRlJZRVIgTUFSS0VULiBGRURFUkFMLVNUQVRF CgpNb3ZlbWVudCBvZiByZWFkeS10by1jb29rIHdob2xlIGJpcmRzIHdhcyBzZWFzb25hbGx5 IGxpZ2h0IGFuZAoKdW5hZ2dyZXNzaXZlLiBTZWxsZXIgb2ZmZXJpbmdzIHZhcmllZCBmcm9t IHBsYW50IHRvIHBsYW50IGFuZCB3ZXJlIGZ1bGx5CgpzdWZmaWNpZW50IGZvciBjdXJyZW50 IGlucXVpcnkuIExpdmUgc3VwcGxpZXMgd2VyZSBtb2RlcmF0ZTsgd2VpZ2h0cyB3ZXJlCgpp biBhIGZ1bGwgcmFuZ2Ugb2YgbGlnaHQgdG8gaGVhdnkuIFByb2Nlc3Npbmcgc2NoZWR1bGVz IHdlcmUgbW9kZXJhdGUgdG8KbGlnaHQgYW5kIHNvbWUgb3BlcmF0aW9ucyB3ZXJlIHN1c3Bl bmRlZCBpbiBsaW5lIHdpdGggZWFybGllciBwbGFucy4gTGVzcwp0aGFuIHRydWNrbG90IGFz a2luZyBwcmljZXMgd2VyZSB1bmNoYW5nZWQgYXQgNTIgdG8gNjIgY2VudHMuIFRyYWRlCgpz ZW50aW1lbnQgd2FzIG1vc3RseSBzdGVhZHkuIEluIHRoZSBwYXJ0cyBjb21wbGV4LCBhbGwg aXRlbXMgd2VyZSBhdApsZWFzdAoKYWRlcXVhdGUgZm9yIHRoZSBnZW5lcmFsbHkgbGlnaHQg YW5kIHNlbGVjdGl2ZSBidXlpbmcgaW50ZXJlc3QuCgpFU1RJTUFURUQgU0xBVUdIVEVSIE9G IEJST0lMRVIvRlJZRVJTIElOIERFTE1BUlZBICgwMDApCgpFU1RJTUFURUQgICAgICAgQUNU VUFMICAgICAgICAgIEFWRy4gV0VJR0hUICAgIEFDVFVBTCAgICAgICAgICBBVkcuIFdFSUdI VAoKMDQvMDggICAgICAgICAgIDA0LzA0ICAgICAgICAgICAwNC8wNCAgICAgICAgICAwNC8w MSAgICAgICAgICAgMDMvMjgKCjIsMTU5ICAgICAgICAgICAyLDIwMSAgICAgICAgICAgNS4w NyAgICAgICAgICAgMiwyOTMgICAgICAgICAgIDUuMDIKCipCUk9JTEVSL0bP8ZI+RBsGAOgC AADoAgAAAAKznQHkAAfpChZcCABFAALaUQ9AAD8G6tBBej0iQXo9KLifABTp1WhptFJVc1AY YQizNAAAUllFUiBDVVJSRU5UIE5FR09USUFURUQgUFJJQ0VTIEZPUiBJTU1FRElBVEUgREVM SVZFUlkKCklOQ0xVREVTIE1PU1RMWSBNVUxUSVBMRS1EUk9QIFNISVBNRU5UUyBPRiBCUkFO REVEIEFORCBXSU5HCgpUQUdHRUQgVE8gTkVXIFlPUksgQ0lUWSBGUk9NIERFTE1BUlZBCgpC UkFOREVECgpVUyBHUkFERSBBCgpSQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDQ5LTY1CgpXRUlHSFRFRCBBVkVSQUdFICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDU0LjcwCgpOTyAgT0YgQk9YRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDgsODY2CgoqOCBvZiA4IHBsYW50cyByZXBvcnRpbmcuCgpTT1VSQ0U6IFVTREEvQU1T IFBPVUxUUlkgUFJPR1JBTVMsIE1BUktFVCBORVdTIEJSQU5DSAoKRk9SIEFERElUSU9OQUwg SU5GT1JNQVRJT04sIFBMRUFTRSBDQUxMICg0MDQpIDU2Mi01ODYxLgoKUFJFUEFSRUQ6IDA4 LUFQUi0wMyAxMTo1MyBBTSBFIFBTSgoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgZmVk ZXJhbAogICAgZ2VvcmdpYQogICAgaW50ZXJuZXQKICAgIG1hcmtldAogICAgbmV3X3lvcmsK ICAgIHBsYW50CiAgICBwb3VsdHJ5CiAgICBwcmljZXMKICAgIHRyYWRlCiAgICB1c2RhCiAg ICBNRUFUT3JpZ2luIEFzc2lnbmVkQnk9Ik9zdGVyRG93Sm9uZXMiIC8+VVNEQQoKz/GSPkYb BgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFEQQAA/Bu2BQXo9IkF6PSi4nwAU6dVrG7RS VXNQEWEIOiIAAAAAAAAAAM/xkj6/hQYANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6MkAA fQZGX0F6PShBej0iABS4n7RSVXPp1WscUBD9XJ3NAADP8ZI+i5IGADYAAAA2AAAAAAfpChZc AAKznQHkCABFAAAoujNAAH0GRl5Bej0oQXo9IgAUuJ+0UlVz6dVrHFAR/VydzAAAz/GSPqGT BgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFERQAA/Bu2AQXo9IkF6PSi4nwAU6dVrHLRS VXRQEGEIOiEAAAAAAAAAAM/xkj5MRQcAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChREkAA Pwbtf0F6PSJBej0ot20AFd36U5G5yDNkUBBhCHtSAAAAAAAAAADP8ZI+GH4HAE4AAABOAAAA AAfpChZcAAKznQHkCABFAABAujRAAH0GRkVBej0oQXo9IgAVt225yDNk3fpTkVAY+gATRAAA MjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0Kz/GSPlKFBwBQAAAAUAAAAAACs50B5AAH6QoWXAgA RQAAQlETQAA/Bu1kQXo9IkF6PSi3bQAV3fpTkbnIM3xQGGEIf0kAAERFTEUgMzYyMDAwMzMu b3V0LjAzMDQwOA0Kz/GSPsnCBwB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbro1QAB9BkYW QXo9KEF6PSIAFbdtucgzfN36U6tQGPnmZzUAADU1MCAzNjIwMDAzMy5vdXQuMDMwNDA4OiBU aGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQrP8ZI+sM4HAFEA AABRAAAAAAKznQHkAAfpChZcCABFAABDURRAAD8G7WJBej0iQXo9KLdtABXd+lOrucgzwlAY YQi4GgAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDE2MA0Kz/GSPuQICABUAAAAVAAAAAAH6QoW XAACs50B5AgARQAARro2QAB9BkY9QXo9KEF6PSIAFbdtucgzwt36U8ZQGPnKJO8AADIwMCBQ T1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCs/xkj4tDAgAUAAAAFAAAAAAArOdAeQAB+kKFlwI AEUAAEJRFUAAPwbtYkF6PSJBej0ot20AFd36U8a5yDPgUBhhCGyUAABTVE9SIDM2MjAwMDMz Lm91dC4wMzA0MDgNCs/xkj4VSggAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq6N0AAfQZG GEF6PShBej0iABW3bbnIM+Dd+lPgUBj5sPD3AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBk YXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDMzLm91dC4wMzA0MDguDQrP8ZI++UoIAD4AAAA+ AAAAAAfpChZcAAKznQHkCABFAAAwujhAAH0GRlFBej0oQXo9IgAUuKCLmutSAAAAAHAC+vBb ngAAAgQFZAEBBALP8ZI+ekwIAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwURZAAD8G7XNB ej0iQXo9KLigABTp1wvAi5rrU3ASYQj/jQAAAQEEAgIEBbTP8ZI+7oQIADYAAAA2AAAAAAfp ChZcAAKznQHkCABFAAAoujlAAH0GRlhBej0oQXo9IgAUuKCLmutT6dcLwVAQ/VyP/QAAz/GS PumLCABeBAAAXgQAAAACs50B5AAH6QoWXAgARQAEUFEXQAA/BulSQXo9IkF6PSi4oAAU6dcL wYua61NQGGEIP5kAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc1MzcgTU49MzYyMDAwMzMu b3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9w cyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBTTElERSwgRElSRUNUSU9OQUwK Ci4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAw MyAoRmVkQml6T3BwcyB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4g IENvcHlyaWdodCAoYykgMjAwMyBGZWRlcmFsIEluZm9ybWF0aW9uICYgTmV3cyBEaXNwYXRj aCwgSW5jLgoKCi4uLgoKCkZlZEJpek9wcwoKTk9USUNFIFRZUEU6IENPTlRSQUNUIEFXQVJE CgpTT1VSQ0U6IFB1Ymxpc2hlZCBpbiBGZWRCaXpPcHBzCgpEQVRFIFBPU1RFRDogMDctQVBS LTAzCgpPRkZJQ0UgQUREUkVTUzogREVGRU5TRSBHRU5FUkFMIFNVUFBMWSBDRU5URVIgODAw MCBKRUZGIERBVklTIEhXWQpSSUNITU9ORCwgVkEgMjMyOTctNTMgMTIKCkNMQVNTSUZJQ0FU SU9OIENPREU6IDE2IC0gQWlyY3JhZnQgY29tcG9uZW50cyAmIGFjY2Vzc29yaWVzCgpTVUJK RUNUOiBTTElERSwgRElSRUNUSU9OQUwKClNPTElDSVRBVElPTiBOVU1CRVI6IDAzVFAzMy02 Mi1QLTA0MDAKCkFXQVJEIE5VTUJFUjogU1AwNDQwLTAzLU0tVTY4OQoKQVdBUkQgQU1PVU5U OiAkNTUsOTMwCgpMSU5FIE5VTUJFUjogMDAwMQoKQVdBUkQgREFURTogMDQwNDAzCgpBV0FS REVEIFRPOiBBVklURUsgQUVST1NQQUNFIElORFVTVFJJRVMgSU5DIDczMjcgUyBIT1dFTEwg QVZFIE9BSyBDUkVFSwpXSSA1MzE1NAoKQVJDSElWRSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFD VDogTi9BCgpJTlRFUk5FVCBBRERSRVNTOgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9K My9EU0NSL0F3YXJkcy9TUDA0NDAtMDMtTS1VNjg5TG4wMDAxLmh0bWwKCi4uLiAgCSAKCktl eVdvcmRzLi4uICAKICAgIGFlcm9zcGFjZQogICAgYWlyY3JhZnQKICAgIGNvbnRyYWN0CiAg ICBkZWZlbnNlCiAgICBpbnRlcm5ldAogICAgdmlyZ2luaWEKICAgIHdpc2NvbnNpbgoKz/GS PuqLCAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFEYQAA/Bu15QXo9IkF6PSi4oAAU6dcP 6Yua61NQEWEIKCkAAAAAAAAAAM/xkj4T4QgANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6 OkAAfQZGV0F6PShBej0iABS4oIua61Pp1w/qUBD5NI/8AADP8ZI+XvAIADYAAAA2AAAAAAfp ChZcAAKznQHkCABFAAAoujtAAH0GRlZBej0oQXo9IgAUuKCLmutT6dcP6lAR+TSP+wAAz/GS Pp/xCAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFEZQAA/Bu14QXo9IkF6PSi4oAAU6dcP 6oua61RQEGEIKCgAAAAAAAAAAM/xkj7ttgkAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChR GkAAPwbtd0F6PSJBej0ot20AFd36U+C5yDQiUBBhCHpFAAAAAAAAAADP8ZI+Xe8JAE4AAABO AAAAAAfpChZcAAKznQHkCABFAABAujxAAH0GRj1Bej0oQXo9IgAVt225yDQi3fpT4FAY+bAS hwAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0Kz/GSPqf2CQBQAAAAUAAAAAACs50B5AAH6QoW XAgARQAAQlEbQAA/Bu1cQXo9IkF6PSi3bQAV3fpT4LnINDpQGGEIfTwAAERFTEUgMzYyMDAw MzQub3V0LjAzMDQwOA0Kz/GSPuEzCgB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbro9QAB9 BkYOQXo9KEF6PSIAFbdtucg0Ot36U/pQGPmWZncAADU1MCAzNjIwMDAzNC5vdXQuMDMwNDA4 OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQrP8ZI+lD8K AFEAAABRAAAAAAKznQHkAAfpChZcCABFAABDURxAAD8G7VpBej0iQXo9KLdtABXd+lP6ucg0 gFAYYQi2DQAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0LDE2MQ0Kz/GSPk16CgBUAAAAVAAAAAAH 6QoWXAACs50B5AgARQAARro+QAB9BkY1QXo9KEF6PSIAFbdtucg0gN36VBVQGPl6JDIAADIw MCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCs/xkj5LfQoAUAAAAFAAAAAAArOdAeQAB+kK FlwIAEUAAEJRHUAAPwbtWkF6PSJBej0ot20AFd36VBW5yDSeUBhhCGqHAABTVE9SIDM2MjAw MDM0Lm91dC4wMzA0MDgNCs/xkj7qugoAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq6P0AA fQZGEEF6PShBej0iABW3bbnINJ7d+lQvUBj5YPA5AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9k ZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDM0Lm91dC4wMzA0MDguDQrP8ZI+ASYLAD4A AAA+AAAAAAfpChZcAAKznQHkCABFAAAwukBAAH0GRklBej0oQXo9IgAUuKGfMmKAAAAAAHAC +vDQ1wAAAgQFZAEBBALP8ZI+jicLAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUR5AAD8G 7WtBej0iQXo9KLihABTp2Pd3nzJigXASYQiJDgAAAQEEAgIEBbTP8ZI+SF8LADYAAAA2AAAA AAfpChZcAAKznQHkCABFAAAoukFAAH0GRlBBej0oQXo9IgAUuKGfMmKB6dj3eFAQ/VwZfgAA z/GSPl5oCwAxAwAAMQMAAAACs50B5AAH6QoWXAgARQADI1EfQAA/Bup3QXo9IkF6PSi4oQAU 6dj3eJ8yYoFQGGEIm7QAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc1MzggTU49MzYyMDAw MzQub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkZUIElu Zm9ybWF0aW9uIChFVVIpIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIExlIEZp Z2FybzogQ3JlZGl0IE11dHVlbCBjb25jZXJuZWQgYWJvdXQgQWdyaWNvbGUtTHlvbm5haXMg bWVyZ2VyCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIg OCwgMjAwMywgKExlIEZpZ2FybyAvRlQgSW5mb3JtYXRpb24gdmlhIENPTVRFWCkgLS0KCgoK Li4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMzogRmluYW5jaWFsIFRpbWVz IEluZm9ybWF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkCgoKLi4uCgoKRlQgSW5mb3JtYXRp b24gKEVVUikKCkZyZW5jaCBiYW5rIENyZWRpdCBNdXR1ZWwgaXMgY29uY2VybmVkIGFib3V0 IHRoZSByZXBlcmN1c3Npb25zIHRoYXQgdGhlCm1lcmdlciBiZXR3ZWVuIEZyZW5jaCBiYW5r cyBDcmVkaXQgQWdyaWNvbGUgYW5kIENyZWRpdCBMeW9ubmFpcyB3aWxsIGhhdmUKb24gdGhl IGdyb3VwLgoKQ3JlZGl0IE11dHVlbCdzIGNoYWlybWFuIE1pY2hlbCBMdWNhcyBzYXlzIHRo YXQgdGhlIG1lcmdlciB3aWxsIHJldml2ZQp0aGUgZGViYXRlIG9uIHRoZSBzdGF0dXMgb2Yg bXV0dWFsIGJhbmtzLgoKQWJzdHJhY3RlZCBmcm9tIExlIEZpZ2FybwoKLi4uICAJIAoKS2V5 V29yZHMuLi4gIAogICAgbWVyZ2VyCgrP8ZI+YGgLADwAAAA8AAAAAAKznQHkAAfpChZcCABF AAAoUSBAAD8G7XFBej0iQXo9KLihABTp2PpznzJigVARYQiy1gAAAAAAAAAAz/GSPvy0CwA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLpCQAB9BkZPQXo9KEF6PSIAFLihnzJigenY+nRQ EPphGX0AAM/xkj4pxAsANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6Q0AAfQZGTkF6PShB ej0iABS4oZ8yYoHp2Pp0UBH6YRl8AADP8ZI+e8ULADwAAAA8AAAAAAKznQHkAAfpChZcCABF AAAoUSFAAD8G7XBBej0iQXo9KLihABTp2Pp0nzJiglAQYQiy1QAAAAAAAAAAz/GSPmknDAA8 AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFEiQAA/Bu1vQXo9IkF6PSi3bQAV3fpUL7nINOBQ EGEIeTgAAAAAAAAAAM/xkj5sXwwATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC6REAAfQZG NUF6PShBej0iABW3bbnINODd+lQvUBj5YBHKAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQrP 8ZI+OmcMAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUSNAAD8G7VRBej0iQXo9KLdtABXd +lQvucg0+FAYYQh5LwAAREVMRSAzNjIwMDAzNy5vdXQuMDMwNDA4DQrP8ZI+OqQMAHwAAAB8 AAAAAAfpChZcAAKznQHkCABFAABuukVAAH0GRgZBej0oQXo9IgAVt225yDT43fpUSVAY+UZl twAANTUwIDM2MjAwMDM3Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhl IGZpbGUgc3BlY2lmaWVkLiANCs/xkj7gsAwAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENR JEAAPwbtUkF6PSJBej0ot20AFd36VEm5yDU+UBhhCLQAAABQT1JUIDY1LDEyMiw2MSwzNCwx ODQsMTYyDQrP8ZI+NesMAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGukZAAH0GRi1Bej0o QXo9IgAVt225yDU+3fpUZFAY+SojdQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K z/GSPmjuDABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlElQAA/Bu1SQXo9IkF6PSi3bQAV 3fpUZLnINVxQGGEIZnoAAFNUT1IgMzYyMDAwMzcub3V0LjAzMDQwOA0Kz/GSPhvFDQB4AAAA eAAAAAAH6QoWXAACs50B5AgARQAAarpHQAB9BkYIQXo9KEF6PSIAFbdtucg1XN36VH5QGPkQ 73kAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAw Mzcub3V0LjAzMDQwOC4NCs/xkj6TPQ4APgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC6SEAA fQZGQUF6PShBej0iABS4otW0hLMAAAAAcAL68HghAAACBAVkAQEEAs/xkj4GPw4APgAAAD4A AAAAArOdAeQAB+kKFlwIAEUAADBRJkAAPwbtY0F6PSJBej0ouKIAFOncX3XVtIS0cBJhCMhW AAABAQQCAgQFtM/xkj7Edw4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6SUAAfQZGSEF6 PShBej0iABS4otW0hLTp3F92UBD9XFjGAADP8ZI+xn8OAJoFAACaBQAAAAKznQHkAAfpChZc CABFAAWMUSdAAD8G6AZBej0iQXo9KLiiABTp3F921bSEtFAQYQjaSAAAWFlaWlkuLi4gIFRD PTIgVE09MTA0OTgxNzUzOCBNTj0zNjIwMDAzNy5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRl eCIgUEZOPSJDb210ZXgiIFBGTj0iQnkgU3VsYSBQZXR0aWJvbiYjeEE7IiBQRk49IktuaWdo dC1SaWRkZXIgT3BlbiIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBGYW1pbHkg UHJvcHJpZXRvcnMgT3BlbiBSb2NrIEhpbGwsIFNDICAsIE91dGRvb3IgU3RvcmUKCi4uLiAg CSAKCkJ5TGluZS4uLiAgQnkgU3VsYSBQZXR0aWJvbgoKCi4uLiAgCgpEYXRlTGluZS4uLiAg QXByIDA1LCAyMDAzIChUaGUgSGVyYWxkIC0gS25pZ2h0IFJpZGRlci9UcmlidW5lIEJ1c2lu ZXNzIE5ld3MgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICAoYykg MjAwMywgVGhlIEhlcmFsZCwgUm9jayBIaWxsLCBTLkMuIERpc3RyaWJ1dGVkIGJ5IEtuaWdo dCBSaWRkZXIvVHJpYnVuZQoKCi4uLgoKCktuaWdodC1SaWRkZXIgT3BlbgoKUHJvcHJpZXRv cnMgb2YgdGhlIE9sZCBUb3duIE91dGZpdHRlcnMgY2FuJ3Qgb3BlbiB1bnRpbCBub29uIHRv ZGF5CmJlY2F1c2Ugb2YgaW1wb3J0YW50IGZhbWlseSBidXNpbmVzcy4KClRoZSB0aHJlZSBv d25lcnMsIERhdmlkIGFuZCBEZW5pY2UgU2hvb2sgYW5kIERhdmlkJ3Mgc2lzdGVyLCBCb25u YSBTaG9vaywKd2lsbCBiZSBjaGVlcmluZyBvbiBzZXZlbiBmYW1pbHkgbWVtYmVycyBpbiB0 aGlzIG1vcm5pbmcncyBDb21lLVNlZS1NZSA1SwpSb2FkIFJhY2UuCgpUaGUgbmV3IHNob3Ag aW4gdGhlIFBlb3BsZXMgQmFuayBCdWlsZGluZyBhdCAxMzMgRSBNYWluIFN0IHN0b2NrcyBj YW1waW5nCmVxdWlwbWVudCwgc3BvcnRzIGFwcGFyZWwgYW5kIGFjY2Vzc29yaWVzIGZvciBi YWNrcGFja2luZywgaGlraW5nLCByb2NrCmNsaW1iaW5nIGFuZCBrYXlha2luZy4KCk9uIFRo dXJzZGF5LCB0aGUgU2hvb2tzIHdlcmUgc2V0dGluZyB1cCB0aGUgc3RvcmUsIHdoaWNoIGZl YXR1cmVzIGEKYm91bGRlcmluZyB3YWxsLCAxMC1mZWV0IGhpZ2ggYW5kIDQ4LWZlZXQgbG9u ZyBmb3IgcGVvcGxlIHdobyB3YW50IHRvCnByYWN0aWNlIHRoZWlyIHJvY2sgY2xpbWJpbmcu IENvc3Qgd2lsbCBiZSAkNSBhIGRheTsgc3BlY2lhbCBjbGltYmluZwpzaG9lcyBhcmUgYXZh aWxhYmxlIGZvciAkMi4KClRoZXkgYWxzbyBoYXZlIHJ1bm5pbmcgc2FuZGFscywgaGlnaC10 ZWNoIHNwb3J0cyBjbG90aGluZyBhbmQgYSBsaW5lIG9mCmNhbXAgY2hhaXJzIG5hbWVkIGFm dGVyIGxpbmdlcmllIC0tIGxpa2UgdGhlIFRlZGR5LCBCb2R5d3JhcCBhbmQgRnJlbmNoCkN1 dC4KCkFuZCBmb3IgdGhlIHNlcmlvdXMgYmFja3BhY2tlciwgdGhlcmUncyBhbGwtbmF0dXJh bCwgMTAwIHBlcmNlbnQgb3Jnz/GSPimADgC4BAAAuAQAAAACs50B5AAH6QoWXAgARQAEqlEo QAA/BujnQXo9IkF6PSi4ogAU6dxk2tW0hLRQGGEIe5QAAGFuaWMKZGVoeWRyYXRlZCBmb29k LiAiSXQncyB2ZXJ5IGZsYXZvcmZ1bCwiIHNhaWQgQm9ubmEgU2hvb2ssIHdobyBxdWl0IGhl cgpqb2IgaW4gUGF3bGV5J3MgSXNsYW5kIHRvIGpvaW4gdGhlIGZhbWlseSB2ZW50dXJlLgoK U2hvZXMgYW5kIFQtc2hpcnRzIHdpbGwgYmUgZGlzcGxheWVkIG9uIGNodW5rcyBvZiBzeWNh bW9yZSBhbmQgcml2ZXIKYmlyY2ggdHJlZXMuIFRlbnRzIHdpbGwgYmUgZGlzcGxheWVkIGlu IHRoZSBiYWNrLgoKVGhlIHRocmVlIHBhcnRuZXJzIHdpbGwgc2VydmUgYXMgdGhlIG9ubHkg c3RhZmYgZm9yIG5vdy4gVGhleSdyZSBsZWFzaW5nCnRoZSBzcGFjZSBmcm9tIHRoZSBSb2Nr IEhpbGwgRWNvbm9taWMgRGV2ZWxvcG1lbnQgQ29ycCBhbmQgaG9wZSB0byBtb3ZlCmludG8g dGhlIG5lYXJieSBXb29sd29ydGggYnVpbGRpbmcgaW4gc2l4IG1vbnRocywgQm9ubmEgU2hv b2sgc2FpZC4KCkJlaW5nIGRvd250b3duIHdhcyBpbXBvcnRhbnQgdG8gdGhlIHBhcnRuZXJz LiBUaGUgU2hvb2tzIGxpdmUgb24gUGlja2VucwpTdHJlZXQgYW5kIGZhbWlseSBtZW1iZXJz IGFyZSBpbnZvbHZlZCBpbiBkb3dudG93biByZXZpdGFsaXphdGlvbi4KCiJXZSBsb3ZlIGJl aW5nIGRvd250b3duLCIgc2FpZCBCb25uYSBTaG9vay4gIkl0J3MgcGFydCBvZiB3aG8gd2Ug d2FudCB0bwpiZS4iCgpIb3VycyBhcmUgMTAgYW0gdG8gOCBwbSBUdWVzZGF5IHRocm91Z2gg U2F0dXJkYXkuIFRoZSBib3VsZGVyaW5nIHdhbGwKd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhv c2UgYWdlcyAxMiBhbmQgdXAgZHVyaW5nIHJlZ3VsYXIgaG91cnMgZXhjZXB0CmZyb20gOSBh Lm0uIHRvIDEgcG0gU2F0dXJkYXkgd2hlbiBpdCB3aWxsIGJlIG9wZW4gdG8gY2hpbGRyZW4g MTIgYW5kCnVuZGVyLgoKVGhlIHBob25lIG51bWJlciBpcyAzMjQtOTEzMy4KClRvIHNlZSBt b3JlIG9mIFRoZSBIZXJhbGQsIG9yIHRvIHN1YnNjcmliZSB0byB0aGUgbmV3c3BhcGVyLCBn byB0bwogaHR0cDovL3d3dy5oZXJhbGRvbmxpbmUuY29tCgouLi4gIAkgCgpLZXlXb3Jkcy4u LiAgCiAgICBhcHBhcmVsCiAgICBiYW5rCiAgICBidXNpbmVzcwogICAgY2hpbGRyZW4KICAg IGZhbWlseQogICAgZm9vZAogICAga2F5YWtpbmcKICAgIGxlYXNpbmcKICAgIHNwb3J0cwoK z/GSPiqADgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFEpQAA/Bu1oQXo9IkF6PSi4ogAU 6dxpXNW0hLRQEWEI6zMAAAAAAAAAAM/xkj6L5Q4AcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUA AGI8TUAAPwYCC0F6PSJBej0olQ8bWBiNKCp0egQggBgW0IFLAAABAQgKDURX3ABCIPU5MTd8 MTQ3MzE3OXwxMDQ5ODE3NTUzfDEuMHwxfDE3ODd8aGVsbG8gd29ybGQKz/GSPiT1DgA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLpKQAB9BkZHQXo9KEF6PSIAFLii1bSEtOncaV1QEP1c Tt8AAM/xkj4g/Q4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6S0AAfQZGRkF6PShBej0i ABS4otW0hLTp3GldUBH9XE7eAADP8ZI+Zv4OADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo USpAAD8G7WdBej0iQXo9KLiiABTp3Gld1bSEtVAQYQjrMgAAAAAAAAAAz/GSPqI0DwA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKFErQAA/Bu1mQXo9IkF6PSi3bQAV3fpUfrnINZ5QEGEI eCsAAAAAAAAAANDxkj4HKwAATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC6TEAAfQZGLUF6 PShBej0iABW3bbnINZ7d+lR+UBj5EBENAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQrQ8ZI+ 7DIAAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUSxAAD8G7UtBej0iQXo9KLdtABXd+lR+ ucg1tlAYYQh/IQAAREVMRSAzNjIwMDA0MC5vdXQuMDMwNDA4DQrQ8ZI+Qm8AAHwAAAB8AAAA AAfpChZcAAKznQHkCABFAABuuk1AAH0GRf5Bej0oQXo9IgAVt225yDW23fpUmFAY+PZkAQAA NTUwIDM2MjAwMDQwLm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZp bGUgc3BlY2lmaWVkLiANCtDxkj4jewAAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENRLUAA PwbtSUF6PSJBej0ot20AFd36VJi5yDX8UBhhCLHzAABQT1JUIDY1LDEyMiw2MSwzNCwxODQs MTYzDQrQ8ZI+37UAAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuk5AAH0GRiVBej0oQXo9 IgAVt225yDX83fpUs1AY+NoiuAAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K0PGS Puy4AABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlEuQAA/Bu1JQXo9IkF6PSi3bQAV3fpU s7nINhpQGGEIbGwAAFNUT1IgMzYyMDAwNDAub3V0LjAzMDQwOA0K0PGSPq/5AAB4AAAAeAAA AAAH6QoWXAACs50B5AgARQAAarpPQAB9BkYAQXo9KEF6PSIAFbdtucg2Gt36VM1QGPjA7cMA ADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwNDAu b3V0LjAzMDQwOC4NCtDxkj7a/AAAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC6UEAAfQZG OUF6PShBej0iABS4o233zD8AAAAAcAL68JhRAAACBAVkAQEEAtDxkj6j/gAAPgAAAD4AAAAA ArOdAeQAB+kKFlwIAEUAADBRL0AAPwbtWkF6PSJBej0ouKMAFOndsWdt98xAcBJhCJaTAAAB AQQCAgQFtNDxkj5KNgEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6UUAAfQZGQEF6PShB ej0iABS4o233zEDp3bFoUBD9XCcDAADQ8ZI+9jwBAPQCAAD0AgAAAAKznQHkAAfpChZcCABF AALmUTBAAD8G6qNBej0iQXo9KLijABTp3bFobffMQFAYYQgymAAAWFlaWlkuLi4gIFRDPTIg VE09MTA0OTgxNzUzOSBNTj0zNjIwMDA0MC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIg UEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRpb24gKEVVUikiIAoKLi4uICAKCgouLi4g CSAKCgpIZWFkTGluZS4uLiAgTGUgRmlnYXJvOiBWVSBtYXkgc2VsbCBWaXZlbnR1cmVzIFBh cnRuZXJzCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIg OCwgMjAwMywgKExlIEZpZ2FybyAvRlQgSW5mb3JtYXRpb24gdmlhIENPTVRFWCkgLS0KCgoK Li4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMzogRmluYW5jaWFsIFRpbWVz IEluZm9ybWF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkCgoKLi4uCgoKRlQgSW5mb3JtYXRp b24gKEVVUikKCkZyZW5jaCBtZWRpYSBncm91cCBWaXZlbmRpIFVuaXZlcnNhbCBpcyBzYWlk IHRvIGJlIGFib3V0IHRvIHNlbGwgaXRzCnZlbnR1cmUgY2FwaXRhbCBjb21wYW55IFZpdmVu dHVyZXMgUGFydG5lcnMgd2hpY2ggb3BlcmF0ZXMgaW52ZXN0bWVudApmdW5kcyBWaXZlbnR1 cmVzIEkgYW5kIElJLCB0byBVUyBmdW5kIEdsb2JhbCBBc3NldCBDYXBpdGFsIGZvciA5bSBl dXJvcy4KCkFic3RyYWN0ZWQgZnJvbSBMZSBGaWdhcm8KCi4uLiAgCSAKCktleVdvcmRzLi4u ICAKICAgIGludmVzdG1lbnQKICAgIHZlbnR1cmUrY2FwaXRhbAoK0PGSPvc8AQA8AAAAPAAA AAACs50B5AAH6QoWXAgARQAAKFExQAA/Bu1gQXo9IkF6PSi4owAU6d20Jm33zEBQEWEIwJgA AAAAAAAAANDxkj4wiAEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6UkAAfQZGP0F6PShB ej0iABS4o233zEDp3bQnUBD6nicCAADQ8ZI+R5cBADYAAAA2AAAAAAfpChZcAAKznQHkCABF AAAoulNAAH0GRj5Bej0oQXo9IgAUuKNt98xA6d20J1AR+p4nAQAA0PGSPnOYAQA8AAAAPAAA AAACs50B5AAH6QoWXAgARQAAKFEyQAA/Bu1fQXo9IkF6PSi4owAU6d20J233zEFQEGEIwJcA AAAAAAAAANDxkj5dYwIAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRM0AAPwbtXkF6PSJB ej0ot20AFd36VM25yDZcUBBhCHceAAAAAAAAAADQ8ZI+FZwCAE4AAABOAAAAAAfpChZcAAKz nQHkCABFAABAulRAAH0GRiVBej0oQXo9IgAVt225yDZc3fpUzVAY+MAQUAAAMjI2IFRyYW5z ZmVyIGNvbXBsZXRlLg0K0PGSPqekAgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlE0QAA/ Bu1DQXo9IkF6PSi3bQAV3fpUzbnINnRQGGEIexQAAERFTEUgMzYyMDAwNDMub3V0LjAzMDQw OA0K0PGSPpe7AgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJc8QAB9BmlJQXo9KEF6PSIb WJUPdHoEIBiNKFiAEHPVFTcAAAEBCAoAQiEpDURX3NDxkj4vvQIAKAEAACgBAAAAArOdAeQA B+kKFlwIAEUAARo8TkAAPwYBUkF6PSJBej0olQ8bWBiNKFh0egQggBgW0AikAAABAQgKDURX 8ABCISk5MTh8MTQ3MzE4MHwxMDQ5ODE3NTUzfDEuMHwxfDM1NzN8aGVsbG8gd29ybGQKOTE5 fDE0NzMxODF8MTA0OTgxNzU1M3wxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjkyMHwxNDczMTgy fDEwNDk4MTc1NTR8MS4wfDF8OTY2MnxoZWxsbyB3b3JsZAo5MjF8MTQ3MzE4M3wxMDQ5ODE3 NTU0fDEuMHwxfDI4NTh8aGVsbG8gd29ybGQKOTIyfDE0NzMxODR8MTA0OTgxNzU1NXwxLjB8 MXwxMzUzfGhlbGxvIHdvcmxkCtDxkj4Z4gIAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG66 VUAAfQZF9kF6PShBej0iABW3bbnINnTd+lTnUBj4pmNBAAA1NTAgMzYyMDAwNDMub3V0LjAz MDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K0PGS PkjuAgBRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1E1QAA/Bu1BQXo9IkF6PSi3bQAV3fpU 57nINrpQGGEIruYAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxNjUNCtDxkj4OKQMAVAAAAFQA AAAAB+kKFlwAArOdAeQIAEUAAEa6VkAAfQZGHUF6PShBej0iABW3bbnINrrd+lUCUBj4iiH7 AAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQrQ8ZI+fSwDAFAAAABQAAAAAAKznQHk AAfpChZcCABFAABCUTZAAD8G7UFBej0iQXo9KLdtABXd+lUCucg22FAYYQhoXwAAU1RPUiAz NjIwMDA0My5vdXQuMDMwNDA4DQrQ8ZI+k2kDAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABq uldAAH0GRfhBej0oQXo9IgAVt225yDbY3fpVHFAY+HDtAwAAMTUwIE9wZW5pbmcgQklOQVJZ IG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDA0My5vdXQuMDMwNDA4Lg0K0PGSPnlq AwA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLpYQAB9BkYxQXo9KEF6PSIAFLilvz6sDwAA AABwAvrwZzgAAAIEBWQBAQQC0PGSPkBsAwA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFE3 QAA/Bu1SQXo9IkF6PSi4pQAU6eOQor8+rBBwEmEIhjkAAAEBBAICBAW00PGSPo6kAwA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLpZQAB9BkY4QXo9KEF6PSIAFLilvz6sEOnjkKNQEP1c FqkAANDxkj5YrAMAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxROEAAPwbn9UF6PSJBej0o uKUAFOnjkKO/PqwQUBBhCJVfAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3NTM5IE1OPTM2 MjAwMDQzLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJC dXNpbmVzc1dpcmUiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgV2l0YnJvZHQg TmFtZWQgUHJlc2lkZW50LCBWYWxsaW5hClZpY2UgQ2hhaXJtYW4gb2YgQ2FzcyBCYW5rOyBC cnVubmdyYWJlciBFbGVjdGVkIHRvIEJvYXJkIG9mIENhc3MKSW5mb3JtYXRpb24gU3lzdGVt cwoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgU1QuIExPVUlT LCBBcHIgOCwgMjAwMyAoQlVTSU5FU1MgV0lSRSkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5l Li4uICBDb3B5cmlnaHQgKEMpIDIwMDMgQnVzaW5lc3MgV2lyZS4gIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCgoKLi4uCgoKQnVzaW5lc3NXaXJlCgpDYXNzIEluZm9ybWF0aW9uIFN5c3RlbXMs IEluYyAoTkFTREFROiBDQVNTKSwgYW5ub3VuY2VzIHRoZSBwcm9tb3Rpb24gb2YKdGhyZWUg Y29tcGFueSBleGVjdXRpdmVzOgoKS2VubmV0aCBBIFdpdGJyb2R0LCBKciB3YXMgbmFtZWQg cHJlc2lkZW50IG9mIENhc3MgQ29tbWVyY2lhbCBCYW5rLCB0aGUKYmFua2luZyBzdWJzaWRp YXJ5IG9mIENhc3MgSW5mb3JtYXRpb24gU3lzdGVtcy4gV2l0YnJvZHQgd2FzIHByZXZpb3Vz bHkKZXhlY3V0aXZlIHZpY2UgcHJlc2lkZW50LCByZXNwb25zaWJsZSBmb3IgY29tbWVyY2lh bCBsZW5kaW5nIGFuZApvcGVyYXRpb25zLCBmb3IgQ2FzcyBCYW5rLiBIZSBqb2luZWQgdGhl IGJhbmsgaW4gMTk5Ny4KCkpvaG4gSiBWYWxsaW5hIHdhcyBlbGVjdGVkIHZpY2UgY2hhaXJt YW4gb2YgdGhlIGJvYXJkIG9mIENhc3MgQ29tbWVyY2lhbApCYW5rIGFuZCBwZXJtYW5lbnQg c2VjcmV0YXJ5IHRvIHRoZSBib2FyZCBvZiBkaXJlY3RvcnMgb2YgQ2FzcwpJbmZvcm1hdGlv biBTeXN0ZW1zLiBQcmlvciB0byBoaXMgbmV3IHJvbGUsIFZhbGxpbmEgd2FzIHByZXNpZGVu dCBvZiBDYXNzCkJhbmsuIEhlIGhhcyBiZWVuIHdpdGggdGhlIGJhbmsgc2luY2UgMTk5Mi4K CkVyaWMgSCBCcnVubmdyYWJlciB3YXMgZWxlY3RlZCB0byB0aGUgQ2FzcyBJbmZvcm1hdGlv biBTeXN0ZW1zJyBib2FyZCBvZgpkaXJlY3RvcnMuIEJydW5uZ3JhYmVyIGhhcyBiZWVuIGNo aWVmIGZpbmFuY2lhbCBvZmZpY2VyIGZvciBDYXNzCkluZm9ybWF0aW9uIFN5c3RlbXMgc2lu Y2UgMTk5Ny4gSGUgam9pbmVkIHRoZSBjb21wYW55IGluIDE5NzkuCgpNYWtpbmcgdGhlIGFu bm91bmNlbWVudHMgd2FzIExhd3JlbmNlIEEgQ29sbGV0dCwgY2hpZWYgZXhlY3V0aXZlIG9m ZmljZXIKYW5kIGNoYWlybWFuIG9mIHRoZSBib2FyZCBvZiBDYXNzIEluZm9ybWF0aW/Q8ZI+ tawDACIEAAAiBAAAAAKznQHkAAfpChZcCABFAAQUUTlAAD8G6WxBej0iQXo9KLilABTp45YH vz6sEFAYYQgxqwAAbiBTeXN0ZW1zLgoKIlRoZXNlIGFwcG9pbnRtZW50cyBhdWdtZW50IGFu IGFscmVhZHkgc3Ryb25nIGJvYXJkIG9mIGRpcmVjdG9ycyBhbmQKZXhlY3V0aXZlIG1hbmFn ZW1lbnQgdGVhbSwiIENvbGxldHQgc2FpZC4KCkNhc3MgaGFzIGJlZW4gYSBsZWFkaW5nIHBy b3ZpZGVyIG9mIHBheWFibGVzIHNlcnZpY2VzIGFuZCBpbmZvcm1hdGlvbgpzdXBwb3J0IHN5 c3RlbXMgdG8gY29tcGFuaWVzIHRocm91Z2hvdXQgTm9ydGggQW1lcmljYSBzaW5jZSAxOTU2 LiBUaGUKY29tcGFueSBwYXlzIG1vcmUgdGhhbiAkMTAgYmlsbGlvbiBhbm51YWxseSBpbiBm cmVpZ2h0IGFuZCB1dGlsaXR5Cmludm9pY2VzIG9uIGJlaGFsZiBvZiBpdHMgY3VzdG9tZXJz IGZyb20gcHJvY2Vzc2luZyBjZW50ZXJzIGluIFN0IExvdWlzLApNby4sIENvbHVtYnVzLCBP aGlvIGFuZCBCb3N0b24sIE1hc3MuIFRoZSBzdXBwb3J0IG9mIENhc3MgQ29tbWVyY2lhbApC YW5rLCBmb3VuZGVkIGluIDE5MDYsIG1ha2VzIENhc3MgSW5mb3JtYXRpb24gU3lzdGVtcyB1 bmlxdWUgaW4gdGhlCmluZHVzdHJ5LgoKQ2FzcyBJbmZvcm1hdGlvbiBTeXN0ZW1zLCBJbmMg CkVyaWMgSCAgQnJ1bm5ncmFiZXIsIDMxNC81MDYtNTUwMgplcmljYnJ1bm5ncmFiZXJAY2Fz c2luZm8uY29tCnd3dy5jYXNzaW5mby5jb20Kb3IKQ2FzZXkgQ29tbXVuaWNhdGlvbnMsIElu YyAKS2VubiBFbnRyaW5nZXIsIDMxNC85NjItMDk0NAoKaHR0cDovL3d3dy5idXNpbmVzc3dp cmUuY29tCgpUb2RheSdzIE5ld3MgT24gVGhlIE5ldCAtIEJ1c2luZXNzIFdpcmUncyBmdWxs IGZpbGUgb24gdGhlIEludGVybmV0CndpdGggSHlwZXJsaW5rcyB0byB5b3VyIGhvbWUgcGFn ZS4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGJhbmsKICAgIGNlbwogICAgY29tbWVy Y2lhbAogICAgZXhlY3V0aXZlCiAgICBmcmVpZ2h0CiAgICBuYXNkYXEKICAgIG5vcnRoK2Ft ZXJpY2EKICAgIG9oaW8KICAgIHByZXNpZGVudAogICAgdXRpbGl0aWVzCgrQ8ZI+tqwDADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoUTpAAD8G7VdBej0iQXo9KLilABTp45nzvz6sEFAR YQiprAAAAAAAAAAA0PGSPlUeBAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLpaQAB9BkY3 QXo9KEF6PSIAFLilvz6sEOnjmfRQEP1cDVgAANDxkj5cJgQANgAAADYAAAAAB+kKFlwAArOd AeQIAEUAACi6W0AAfQZGNkF6PShBej0iABS4pb8+rBDp45n0UBH9XA1XAADQ8ZI+wicEADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoUTtAAD8G7VZBej0iQXo9KLilABTp45n0vz6sEVAQ YQipqwAAAAAAAAAA0PGSPmXUBAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFE8QAA/Bu1V QXo9IkF6PSi3bQAV3fpVHLnINxpQEGEIdhEAAAAAAAAAANDxkj5ADQUATgAAAE4AAAAAB+kK FlwAArOdAeQIAEUAAEC6XEAAfQZGHUF6PShBej0iABW3bbnINxrd+lUcUBj4cA+TAAAyMjYg VHJhbnNmZXIgY29tcGxldGUuDQrQ8ZI+tBQFAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABC UT1AAD8G7TpBej0iQXo9KLdtABXd+lUcucg3MlAYYQh5BwAAREVMRSAzNjIwMDA0NC5vdXQu MDMwNDA4DQrQ8ZI+boAFAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABuul1AAH0GRe5Bej0o QXo9IgAVt225yDcy3fpVNlAY+FZigwAANTUwIDM2MjAwMDQ0Lm91dC4wMzA0MDg6IFRoZSBz eXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCtDxkj4ojwUAUQAAAFEA AAAAArOdAeQAB+kKFlwIAEUAAENRPkAAPwbtOEF6PSJBej0ot20AFd36VTa5yDd4UBhhCKzZ AABQT1JUIDY1LDEyMiw2MSwzNCwxODQsMTY2DQrQ8ZI+TMkFAFQAAABUAAAAAAfpChZcAAKz nQHkCABFAABGul5AAH0GRhVBej0oQXo9IgAVt225yDd43fpVUVAY+DohPgAAMjAwIFBPUlQg Y29tbWFuZCBzdWNjZXNzZnVsLg0K0PGSPkzrBQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAA QlE/QAA/Bu04QXo9IkF6PSi3bQAV3fpVUbnIN5ZQGGEIZlIAAFNUT1IgMzYyMDAwNDQub3V0 LjAzMDQwOA0K0PGSPhASBgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJc9QAB9BmlIQXo9 KEF6PSIbWJUPdHoEIBiNKT6AEHLvFSEAAAEBCAoAQiErDURX8NDxkj4hngYAeAAAAHgAAAAA B+kKFlwAArOdAeQIAEUAAGq6X0AAfQZF8EF6PShBej0iABW3bbnIN5bd+lVrUBj4IOxFAAAx NTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDQ0Lm91 dC4wMzA0MDguDQrQ8ZI+EZ8GAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwumBAAH0GRilB ej0oQXo9IgAUuKaP7n1/AAAAAHAC+vDFFwAAAgQFZAEBBALQ8ZI+vaAGAD4AAAA+AAAAAAKz nQHkAAfpChZcCABFAAAwUUBAAD8G7UlBej0iQXo9KLimABTp5c57j+59gHASYQimPQAAAQEE AgIEBbTQ8ZI+fNgGADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoumFAAH0GRjBBej0oQXo9 IgAUuKaP7n2A6eXOfFAQ/Vw2rQAA0PGSPkXhBgBdBAAAXQQAAAACs50B5AAH6QoWXAgARQAE T1FBQAA/BukpQXo9IkF6PSi4pgAU6eXOfI/ufYBQGGEIlPAAAFhZWlpZLi4uICBUQz0yIFRN PTEwNDk4MTc1NDAgTU49MzYyMDAwNDQub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBG Tj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5l Li4uICBUUlVOTklPTiwgSFlEUkFVTElDLgoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAg CgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChGZWRCaXpPcHBzIHZpYSBDT01URVgpIC0t CgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IChjKSAyMDAzIEZlZGVyYWwg SW5mb3JtYXRpb24gJiBOZXdzIERpc3BhdGNoLCBJbmMuCgoKLi4uCgoKRmVkQml6T3BzCgpO T1RJQ0UgVFlQRTogQ09OVFJBQ1QgQVdBUkQKClNPVVJDRTogUHVibGlzaGVkIGluIEZlZEJp ek9wcHMKCkRBVEUgUE9TVEVEOiAwNy1BUFItMDMKCk9GRklDRSBBRERSRVNTOiBERUZFTlNF IEdFTkVSQUwgU1VQUExZIENFTlRFUiA4MDAwIEpFRkYgREFWSVMgSFdZClJJQ0hNT05ELCBW QSAyMzI5Ny01MyAxMgoKQ0xBU1NJRklDQVRJT04gQ09ERTogMTYgLSBBaXJjcmFmdCBjb21w b25lbnRzICYgYWNjZXNzb3JpZXMKClNVQkpFQ1Q6IFRSVU5OSU9OLCBIWURSQVVMSUMuCgpT T0xJQ0lUQVRJT04gTlVNQkVSOiBTUDA0NjAtMDMtUS1aMjMwCgpBV0FSRCBOVU1CRVI6IFNQ MDQ2MC0wMy1NLTE2ODIKCkFXQVJEIEFNT1VOVDogJDQyLDY4MwoKTElORSBOVU1CRVI6IDAw MDEgVEhST1VHSCAwMDAzCgpBV0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQgVE86IERVVENI IFZBTExFWSBTVVBQTFkgQ08gNzY2MSBIV1kgNyBMWUxFUyBUTiAzNzA5OAoKQVJDSElWRSBE QVRFOiAwNDE5MjAwMwoKQ09OVEFDVDogTi9BCgpJTlRFUk5FVCBBRERSRVNTOgpodHRwOi8v d3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJkcy9TUDA0NjAtMDMtTS0xNjgyTG4w MDAxX19fVEhST1VHSF9fMDAwMy5odG1sCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBh aXJjcmFmdAogICAgY29udHJhY3QKICAgIGRlZmVuc2UKICAgIGludGVybmV0CiAgICB0ZW5u ZXNzZWUKICAgIHZpcmdpbmlhCgrQ8ZI+RuEGADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo UUJAAD8G7U9Bej0iQXo9KLimABTp5dKjj+59gFARYQjO2QAAAAAAAAAA0PGSPq42BwA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLpiQAB9BkYvQXo9KEF6PSIAFLimj+59gOnl0qRQEPk1 NqwAANDxkj5MQgcANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6Y0AAfQZGLkF6PShBej0i ABS4po/ufYDp5dKkUBH5NTarAADQ8ZI+/0MHADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo UUNAAD8G7U5Bej0iQXo9KLimABTp5dKkj+59gVAQYQjO2AAAAAAAAAAA0PGSPmwwCAA8AAAA PAAAAAACs50B5AAH6QoWXAgARQAAKFFEQAA/Bu1NQXo9IkF6PSi3bQAV3fpVa7nIN9hQEGEI dQQAAAAAAAAAANDxkj7XaAgATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC6ZEAAfQZGFUF6 PShBej0iABW3bbnIN9jd+lVrUBj4IA7WAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQrQ8ZI+ mXYIAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUUVAAD8G7TJBej0iQXo9KLdtABXd+lVr ucg38FAYYQh2+gAAREVMRSAzNjIwMDA0NS5vdXQuMDMwNDA4DQrQ8ZI+YbQIAHwAAAB8AAAA AAfpChZcAAKznQHkCABFAABuumVAAH0GReZBej0oQXo9IgAVt225yDfw3fpVhVAY+AZhxQAA NTUwIDM2MjAwMDQ1Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZp bGUgc3BlY2lmaWVkLiANCtDxkj4OwggAUQAAAFEAAAAAArOdAeQAB+kKFlwIAEUAAENRRkAA PwbtMEF6PSJBej0ot20AFd36VYW5yDg2UBhhCKrMAABQT1JUIDY1LDEyMiw2MSwzNCwxODQs MTY3DQrQ8ZI+P/wIAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGumZAAH0GRg1Bej0oQXo9 IgAVt225yDg23fpVoFAY9+oggQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K0PGS PkL/CABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlFHQAA/Bu0wQXo9IkF6PSi3bQAV3fpV oLnIOFRQGGEIZEUAAFNUT1IgMzYyMDAwNDUub3V0LjAzMDQwOA0K0PGSPqs8CQB4AAAAeAAA AAAH6QoWXAACs50B5AgARQAAarpnQAB9BkXoQXo9KEF6PSIAFbdtucg4VN36VbpQGPfQ64cA ADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwNDUu b3V0LjAzMDQwOC4NCtDxkj5llQkAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC6aEAAfQZG IUF6PShBej0iABS4p3FvJfUAAAAAcAL68DsgAAACBAVkAQEEAtDxkj70lgkAPgAAAD4AAAAA ArOdAeQAB+kKFlwIAEUAADBRSEAAPwbtQUF6PSJBej0ouKcAFOnojC5xbyX2cBJhCF6QAAAB AQQCAgQFtNDxkj55zwkANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6aUAAfQZGKEF6PShB ej0iABS4p3FvJfbp6IwvUBD9XO7/AADQ8ZI+8dYJAJEFAACRBQAAAAKznQHkAAfpChZcCABF AAWDUUlAAD8G5+1Bej0iQXo9KLinABTp6IwvcW8l9lAYYQjqRAAAWFlaWlkuLi4gIFRDPTIg VE09MTA0OTgxNzU0MCBNTj0zNjIwMDA0NS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIg UEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRpb24gKEVVUikiIAoKLi4uICAKCgouLi4g CSAKCgpIZWFkTGluZS4uLiAgRXhwYW5zaW9uOiBDYXJyZWZvdXIncyBUYXJyYWdvbmEgc3Rv cmUgdG8gcGF5IDAuNW0gZXVyb3MgaW4gaHlwZXJtYXJrZXQgdGF4CgouLi4gIAkgCgpCeUxp bmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgNywgMjAwMywgKEV4cGFuc2lvbiAv RlQgSW5mb3JtYXRpb24gdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4u ICBDb3B5cmlnaHQgMjAwMzogRmluYW5jaWFsIFRpbWVzIEluZm9ybWF0aW9uLiBBbGwgcmln aHRzIHJlc2VydmVkCgoKLi4uCgoKRlQgSW5mb3JtYXRpb24gKEVVUikKClRoaXMgeWVhciB0 aGUgQ2F0YWxhbiBnb3Zlcm5tZW50IGluIFNwYWluIHdpbGwgaW1wb3NlIG9uIGEgZ3JvdXAg b2YgMTcKZGlzdHJpYnV0aW9uIGdyb3VwcyBhIG5ldyB0YXggb24gaHlwZXJtYXJrZXRzLCBp bnRlbmRpbmcgdG8gc3BlbmQgdGhlCm1vbmV5IG9uIG1vZGVybmlzaW5nIHNtYWxsIGNvbXBh bmllcyBsb2NhdGVkIGluIHRoZSByZWdpb24uIFRoZSB0YXgKYWZmZWN0cyBkaWZmZXJlbnQg c3RvcmVzIGluIGRpZmZlcmVudCB3YXlzLCBhcyBhIGZ1bmN0aW9uIG9mIHRoZWlyCmRpc3Rh bmNlIGZyb20gdG93bnMgYW5kIHRoZWlyICdob3Jpem9udGFsIGRlc2lnbicsIGJvdGggb2Yg d2hpY2ggbWVhbiBhCmhpZ2hlciBwYXltZW50LCBhbmQgdGhlaXIgdmVydGljYWwgZGVzaWdu IGFuZCBsb2NhdGlvbiBpbiBzdWJ1cmJzLCBib3RoCm9mIHdoaWNoIGxlYWQgdG8gYSBkaXNj b3VudC4KClRoZSBzdG9yZSBvd25lZCBieSBGcmVuY2ggZ2lhbnQgQ2FycmVmb3VyIGluIFRh cnJhZ29uYSB3aWxsIHBheSB0aGUgbW9zdApvdXQgb2YgYWxsIHRoZSA2NyBlc3RhYmxpc2ht ZW50cyBhZmZlY3RlZCBieSB0aGUgbGF3LCByZWNlaXZpbmcgYSBiaWxsCmZvciA1MzIsMDAw IGV1cm9zLiBPdGhlcnMsIHN1Y2ggYXMgdGhlIEVzY2xhdCBoeXBlcm1hcmtldCBpbiBWaW55 b2xzIGkKZWxzIEFyY3MsIHdpbGwgZW5kIHVwIHBheWluZyBsZXNzIHRoYW4gNTAwIGV1cm9z LiBTb21lIGV4cGVydHMgd2FybiwKaG93ZXZlciwgdGhhdCB0aGUgdGF4IHdpbGwgc2ltcGx5 IGZhdm91ciBzdXBlcm1hcmtldHMsIHdoaWNoIGFyZSB0aGUgcmVhbAplbmVteSBvZiB0aGUg c21hbGwgdHJhZGVycy4KCkFic3RyYWN0ZWQgZnJvbSBFeHBhbnNpb24KCi4uLiAgCSAKCktl eVdvcmRzLi4uICAKICAgIGV4cGFuc2lvbgogICAgZ292ZXJubWVudAogICAgc3BhaW4KICAg IHRheAoK0PGSPvLWCQA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFFKQAA/Bu1HQXo9IkF6 PSi4pwAU6eiRinFvJfZQEWEIhfgAAAAAAAAAANDxkj5ONAoANgAAADYAAAAAB+kKFlwAArOd AeQIAEUAACi6akAAfQZGJ0F6PShBej0iABS4p3FvJfbp6JGLUBD4Ae7+AADQ8ZI+9T8KADYA AAA2AAAAAAfpChZcAAKznQHkCABFAAAoumtAAH0GRiZBej0oQXo9IgAUuKdxbyX26eiRi1AR +AHu/QAA0PGSPlFBCgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFFLQAA/Bu1GQXo9IkF6 PSi4pwAU6eiRi3FvJfdQEGEIhfcAAAAAAAAAANDxkj61pQoAPAAAADwAAAAAArOdAeQAB+kK FlwIAEUAAChRTEAAPwbtRUF6PSJBej0ot20AFd36Vbq5yDiWUBBhCHP3AAAAAAAAAADQ8ZI+ vt0KAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAumxAAH0GRg1Bej0oQXo9IgAVt225yDiW 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 OC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iRlQgSW5m b3JtYXRpb24gKFVTKSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBXYWxsIFN0 cmVldCBKb3VybmFsOiBUb2RheSdzIE1hcmtldHM6IExhdGUgc2VsbGluZyBuZWdhdGVzIGEg c3VyZ2UgYnkgc3RvY2tzIG9uIElyYXEgd2FyCiBuZXdzCgouLi4gIAkgCgpCeUxpbmUuLi4g IAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgOCwgMjAwMywgKFdhbGwgU3RyZWV0IEpvdXJu YWwgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGlu ZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lhbCBUaW1lcyBJbmZvcm1hdGlvbi4gQWxs IHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIEluZm9ybWF0aW9uIChVUykKClRoZSBEb3cg Sm9uZXMgSW5kdXN0cmlhbCBBdmVyYWdlIHllc3RlcmRheSBjbGltYmVkIDIzLjI2IHBvaW50 cywgb3IgMC4zJSwKdG8gODMwMC40MS4gTGF0ZSBzZWxsaW5nIHJldmVyc2VkIGdhaW5zIGFz IGhpZ2ggYXMgMjQzLjA2IHBvaW50cyBlYXJsaWVyCmluIHRoZSBkYXksIGJyb3VnaHQgYWJv dXQgYnkgbmV3cyBvZiB0aGUgVVMgbWlsaXRhcnkncyBzdWNjZXNzZnVsCm9wZXJhdGlvbnMg aW4gQmFnaGRhZC4gVGhlIE5hc2RhcSBDb21wb3NpdGUgSW5kZXggd2VudCB1cCBieSBzaXgg cG9pbnRzLApvciAwLjQlLCB0byAxMzg5LjUxLiBUaGUgU3RhbmRhcmQgJiBQb29yJ3MgNTAw LXN0b2NrIGluZGV4IGluY3JlYXNlZCBieQoxLjA4IHBvaW50cywgb3IgMC4xJSwgdG8gODc5 LjkzLgoKQWJzdHJhY3RlZCBmcm9tOiBUaGUgV2FsbCBTdCBKb3VybmFsIChVUyBFZGl0aW9u KQoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgaW5kZXgKICAgIGluZHVzdHJpYWwKICAg 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 MDQ5ODE3NTY2fDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAo5Mzl8MTQ3MzIwMXwxMDQ5ODE3NTY2 fDEuMHwxfDY1MXxoZWxsbyB3b3JsZAo5NDB8MTQ3MzIwMnwxMDQ5ODE3NTY3fDEuMHwxfDMy N3xoZWxsbyB3b3JsZArc8ZI+vOQOAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l05AAH0G aTdBej0oQXo9IhtYlQ90egQgGI0scoAQb7sPuQAAAQEICgBCIakNRFza3PGSPtjlDgBwAAAA cAAAAAACs50B5AAH6QoWXAgARQAAYjxcQAA/BgH8QXo9IkF6PSiVDxtYGI0scnR6BCCAGBbQ hzkAAAEBCAoNRFzwAEIhqTk0MXwxNDczMjAzfDEwNDk4MTc1Njh8MS4wfDF8MzU3M3xoZWxs byB3b3JsZArd8ZI+/PgCAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l09AAH0GaTZBej0o QXo9IhtYlQ90egQgGI0soIAQb40PoQAAAQEICgBCIasNRFzw3fGSPqsoAwBwAAAAcAAAAAAC s50B5AAH6QoWXAgARQAAYjxdQAA/BgH7QXo9IkF6PSiVDxtYGI0soHR6BCCAGBbQiPcAAAEB CAoNRF0HAEIhqzk0MnwxNDczMjA0fDEwNDk4MTc1Njh8MS4wfDF8MzQyMHxoZWxsbyB3b3Js ZArd8ZI+aU8GAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l1BAAH0GaTVBej0oQXo9IhtY lQ90egQgGI0szoAQb18PiAAAAQEICgBCIa0NRF0H3fGSPmxQDABvAAAAbwAAAAACs50B5AAH 6QoWXAgARQAAYTxeQAA/BgH7QXo9IkF6PSiVDxtYGI0sznR6BCCAGBbQ8EwAAAEBCAoNRF1D AEIhrTk0M3wxNDczMjA1fDEwNDk4MTc1Njl8MS4wfDF8NDgyfGhlbGxvIHdvcmxkCt3xkj64 pw4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXUUAAfQZpNEF6PShBej0iG1iVD3R6BCAY jSz7gBBvMg9HAAABAQgKAEIhsg1EXUPe8ZI+0RsAAHAAAABwAAAAAAKznQHkAAfpChZcCABF AABiPF9AAD8GAflBej0iQXo9KJUPG1gYjSz7dHoEIIAYFtCDSAAAAQEICg1EXVcAQiGyOTQ0 fDE0NzMyMDZ8MTA0OTgxNzU2OXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCt7xkj78uwIAQgAA AEIAAAAAB+kKFlwAArOdAeQIAEUAADSXUkAAfQZpM0F6PShBej0iG1iVD3R6BCAYjS0pgBBv BA8wAAABAQgKAEIhtQ1EXVfe8ZI+SVEMAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPGBA AD8GAfhBej0iQXo9KJUPG1gYjS0pdHoEIIAYFtB/0AAAAQEICg1EXacAQiG1OTQ1fDE0NzMy MDd8MTA0OTgxNzU3MHwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCt7xkj6fag4AQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSXU0AAfQZpMkF6PShBej0iG1iVD3R6BCAYjS1XgBBu1g7ZAAAB AQgKAEIhvA1EXaff8ZI+PhwAAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPGFAAD8GAfdB ej0iQXo9KJUPG1gYjS1XdHoEIIAYFtB0fwAAAQEICg1EXbsAQiG8OTQ2fDE0NzMyMDh8MTA0 OTgxNzU3MHwxLjB8MXwxNzg3fGhlbGxvIHdvcmxkCt/xkj7qfgIAQgAAAEIAAAAAB+kKFlwA ArOdAeQIAEUAADSXVEAAfQZpMUF6PShBej0iG1iVD3R6BCAYjS2FgBBuqA7CAAABAQgKAEIh vw1EXbvf8ZI+JYACAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPGJAAD8GAfZBej0iQXo9 KJUPG1gYjS2FdHoEIIAYFtB8QwAAAQEICg1EXcoAQiG/OTQ3fDE0NzMyMDl8MTA0OTgxNzU3 MHwxLjB8MXwzNDIwfGhlbGxvIHdvcmxkCt/xkj5a1QUAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSXVUAAfQZpMEF6PShBej0iG1iVD3R6BCAYjS2zgBBueg6xAAABAQgKAEIhwQ1EXcrf 8ZI+B9gNAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhPGNAAD8GAfZBej0iQXo9KJUPG1gY jS2zdHoEIIAYFtDzhAAAAQEICg1EXhUAQiHBOTQ4fDE0NzMyMTB8MTA0OTgxNzU3MXwxLjB8 MXwzMjd8aGVsbG8gd29ybGQK4PGSPhaXAABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJdW QAB9BmkvQXo9KEF6PSIbWJUPdHoEIBiNLeCAEG5NDmAAAAEBCAoAQiHHDUReFeDxkj6dmAAA nAAAAJwAAAAAArOdAeQAB+kKFlwIAEUAAI48ZEAAPwYByEF6PSJBej0olQ8bWBiNLeB0egQg gBgW0JmpAAABAQgKDUReIgBCIcc5NDl8MTQ3MzIxMXwxMDQ5ODE3NTcxfDEuMHwxfDUyNHxo ZWxsbyB3b3JsZAo5NTB8MTQ3MzIxMnwxMDQ5ODE3NTcxfDEuMHwxfDY1NHxoZWxsbyB3b3Js ZArg8ZI+/ewDAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l1dAAH0GaS5Bej0oQXo9IhtY lQ90egQgGI0uOoAQbfMOUQAAAQEICgBCIckNRF4i4fGSPqYcAABvAAAAbwAAAAACs50B5AAH 6QoWXAgARQAAYTxlQAA/BgH0QXo9IkF6PSiVDxtYGI0uOnR6BCCAGBbQ740AAAEBCAoNRF6D AEIhyTk1MXwxNDczMjE5fDEwNDk4MTc1NzJ8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCuHxkj7i BAIAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXWEAAfQZpLUF6PShBej0iG1iVD3R6BCAY jS5ngBBtxg3nAAABAQgKAEIh0g1EXoPh8ZI+HQYCAMoAAADKAAAAAAKznQHkAAfpChZcCABF AAC8PGZAAD8GAZhBej0iQXo9KJUPG1gYjS5ndHoEIIAYFtC4ZAAAAQEICg1EXo8AQiHSOTUy fDE0NzMyMjB8MTA0OTgxNzU3MnwxLjB8MXw2NTR8aGVsbG8gd29ybGQKOTUzfDE0NzMyMjF8 MTA0OTgxNzU3MnwxLjB8MXwzMjd8aGVsbG8gd29ybGQKOTU0fDE0NzMyMjJ8MTA0OTgxNzU3 MnwxLjB8MXwzNDAzfGhlbGxvIHdvcmxkCuHxkj5IWwUAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSXWUAAfQZpLEF6PShBej0iG1iVD3R6BCAYjS7vgBBtPg3ZAAABAQgKAEIh1A1EXo/i 8ZI+OBwAAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhPGdAAD8GAfJBej0iQXo9KJUPG1gY jS7vdHoEIIAYFtDuXwAAAQEICg1EXucAQiHUOTU1fDE0NzMyMjN8MTA0OTgxNzU3M3wxLjB8 MXw2NTR8aGVsbG8gd29ybGQK4vGSPihzAwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJda QAB9BmkrQXo9KEF6PSIbWJUPdHoEIBiNLxyAEG0RDXgAAAEBCAoAQiHdDURe5+Lxkj6UdAMA ywAAAMsAAAAAArOdAeQAB+kKFlwIAEUAAL08aEAAPwYBlUF6PSJBej0olQ8bWBiNLxx0egQg gBgW0L7oAAABAQgKDURe/ABCId05NTZ8MTQ3MzIyNHwxMDQ5ODE3NTczfDEuMHwxfDUyNHxo ZWxsbyB3b3JsZAo5NTd8MTQ3MzIyNXwxMDQ5ODE3NTczfDEuMHwxfDMxMTZ8aGVsbG8gd29y bGQKOTU4fDE0NzMyMjZ8MTA0OTgxNzU3M3wxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCuLxkj6L yQYAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXW0AAfQZpKkF6PShBej0iG1iVD3R6BCAY jS+lgBBsiA1hAAABAQgKAEIh3w1EXvzj8ZI+yyoDAHAAAABwAAAAAAKznQHkAAfpChZcCABF AABiPGlAAD8GAe9Bej0iQXo9KJUPG1gYjS+ldHoEIIAYFtB7agAAAQEICg1EX18AQiHfOTU5 fDE0NzMyMjd8MTA0OTgxNzU3NHwxLjB8MXwyMDAxfGhlbGxvIHdvcmxkCuPxkj6LjAYAQgAA AEIAAAAAB+kKFlwAArOdAeQIAEUAADSXXEAAfQZpKUF6PShBej0iG1iVD3R6BCAYjS/TgBBs Wgz0AAABAQgKAEIh6Q1EX1/j8ZI+8I0GAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPGpA AD8GAe5Bej0iQXo9KJUPG1gYjS/TdHoEIIAYFtCAGgAAAQEICg1EX3UAQiHpOTYwfDE0NzMy Mjh8MTA0OTgxNzU3NHwxLjB8MXwzMzAxfGhlbGxvIHdvcmxkCuPxkj7k4gkAQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSXXUAAfQZpKEF6PShBej0iG1iVD3R6BCAYjTABgBBsLAzcAAAB AQgKAEIh6w1EX3Xk8ZI+J6QBAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPGtAAD8GAe1B ej0iQXo9KJUPG1gYjTABdHoEIIAYFtB0pwAAAQEICg1EX7kAQiHrOTYxfDE0NzMyMjl8MTA0 OTgxNzU3NXwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCuTxkj47pAQAQgAAAEIAAAAAB+kKFlwA ArOdAeQIAEUAADSXXkAAfQZpJ0F6PShBej0iG1iVD3R6BCAYjTAvgBBr/gyRAAABAQgKAEIh 8g1EX7nl8ZI+0isDAG8AAABvAAAAAAKznQHkAAfpChZcCABFAABhPGxAAD8GAe1Bej0iQXo9 KJUPG1gYjTAvdHoEIIAYFtDxvAAAAQEICg1EYCcAQiHyOTYyfDE0NzMyMzB8MTA0OTgxNzU3 NnwxLjB8MXw2NTR8aGVsbG8gd29ybGQK5fGSPoESBgBCAAAAQgAAAAAH6QoWXAACs50B5AgA RQAANJdfQAB9BmkmQXo9KEF6PSIbWJUPdHoEIBiNMFyAEGvRDBgAAAEBCAoAQiH9DURgJ+Xx kj4uFAYA+QAAAPkAAAAAArOdAeQAB+kKFlwIAEUAAOs8bUAAPwYBYkF6PSJBej0olQ8bWBiN MFx0egQggBgW0Js+AAABAQgKDURgOgBCIf05NjN8MTQ3MzIzMXwxMDQ5ODE3NTc2fDEuMHwx fDQ4MnxoZWxsbyB3b3JsZAo5NjR8MTQ3MzIzMnwxMDQ5ODE3NTc2fDEuMHwxfDMyMjV8aGVs bG8gd29ybGQKOTY1fDE0NzMyMzN8MTA0OTgxNzU3NnwxLjB8MXwzNDAzfGhlbGxvIHdvcmxk Cjk2NnwxNDczMjM0fDEwNDk4MTc1NzZ8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZArl8ZI+1WgJ AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l2BAAH0GaSVBej0oQXo9IhtYlQ90egQgGI0x E4AQaxoMAwAAAQEICgBCIf8NRGA65vGSPm4sAwBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAA YTxuQAA/BgHrQXo9IkF6PSiVDxtYGI0xE3R6BCCAGBbQ5mYAAAEBCAoNRGCLAEIh/zk2N3wx NDczMjM1fDEwNDk4MTc1Nzd8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCubxkj5v1QUAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSXYUAAfQZpJEF6PShBej0iG1iVD3R6BCAYjTFAgBBq7Quq AAABAQgKAEIiBw1EYIvm8ZI+cNcFAIEBAACBAQAAAAKznQHkAAfpChZcCABFAAFzPG9AAD8G ANhBej0iQXo9KJUPG1gYjTFAdHoEIIAYFtCOrAAAAQEICg1EYJwAQiIHOTY4fDE0NzMyMzZ8 MTA0OTgxNzU3N3wxLjB8MXw1MjR8aGVsbG8gd29ybGQKOTY5fDE0NzMyMzd8MTA0OTgxNzU3 N3wxLjB8MXwyMTN8aGVsbG8gd29ybGQKOTcwfDE0NzMyMzh8MTA0OTgxNzU3N3wxLjB8MXw0 ODJ8aGVsbG8gd29ybGQKOTcxfDE0NzMyMzl8MTA0OTgxNzU3N3wxLjB8MXwxMjAzfGhlbGxv IHdvcmxkCjk3MnwxNDczMjQwfDEwNDk4MTc1Nzd8MS4wfDF8MzU3M3xoZWxsbyB3b3JsZAo5 NzN8MTQ3MzI0MXwxMDQ5ODE3NTc3fDEuMHwxfDM1NzN8aGVsbG8gd29ybGQKOTc0fDE0NzMy NDJ8MTA0OTgxNzU3N3wxLjB8MXwyNjIzfGhlbGxvIHdvcmxkCubxkj7mKwkAQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSXYkAAfQZpI0F6PShBej0iG1iVD3R6BCAYjTJ/gBBprguXAAAB AQgKAEIiCQ1EYJzn8ZI+5rIEAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPHBAAD8GAehB ej0iQXo9KJUPG1gYjTJ/dHoEIIAYFtB6xQAAAQEICg1EYPkAQiIJOTc1fDE0NzMyNDN8MTA0 OTgxNzU3OHwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCufxkj6qQwcAQgAAAEIAAAAAB+kKFlwA ArOdAeQIAEUAADSXY0AAfQZpIkF6PShBej0iG1iVD3R6BCAYjTKtgBBpgAsxAAABAQgKAEIi Eg1EYPno8ZI+erMEAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPHFAAD8GAedBej0iQXo9 KJUPG1gYjTKtdHoEIIAYFtBwKQAAAQEICg1EYV0AQiISOTc2fDE0NzMyNDR8MTA0OTgxNzU3 OXwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCujxkj6jBgcAQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSXZEAAfQZpIUF6PShBej0iG1iVD3R6BCAYjTLbgBBpUgrEAAABAQgKAEIiGw1EYV3o 8ZI+/gcHAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPHJAAD8GAeZBej0iQXo9KJUPG1gY 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 AGI8ekAAPwYB3kF6PSJBej0olQ8bWBiNNHh0egQggBgW0HPuAAABAQgKDURiqQBCIjs5ODZ8 MTQ3MzI1NHwxMDQ5ODE3NTgyfDEuMHwxfDEyMDN8aGVsbG8gd29ybGQK6/GSPrcZCwBCAAAA QgAAAAACs50B5AAH6QoWXAgARQAANHncQAA/BsSpQXo9IkF6PSiSmxtYAtHcKTg0e3eAEBbQ kKwAAAEBCAoNRGKzAEIhL+vxkj5fUgsAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXbUAA fQZpGEF6PShBej0iG1iSmzg0e3cC0dwqgBAAAKZuAAABAQgKAEIiPA1EYrPr8ZI+gPwMAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0l25AAH0GaRdBej0oQXo9IhtYlQ90egQgGI00poAQ Z4cJVgAAAQEICgBCIj0NRGKp7PGSPsXBBwBvAAAAbwAAAAACs50B5AAH6QoWXAgARQAAYTx7 QAA/BgHeQXo9IkF6PSiVDxtYGI00pnR6BCCAGBbQ3x8AAAEBCAoNRGMBAEIiPTk4N3wxNDcz MjU1fDEwNDk4MTc1ODN8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCuzxkj5GFAsAQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSXb0AAfQZpFkF6PShBej0iG1iVD3R6BCAYjTTTgBBnWgj1AAAB AQgKAEIiRg1EYwHs8ZI+0RULAPkAAAD5AAAAAAKznQHkAAfpChZcCABFAADrPHxAAD8GAVNB ej0iQXo9KJUPG1gYjTTTdHoEIIAYFtCDjwAAAQEICg1EYxYAQiJGOTg4fDE0NzMyNTZ8MTA0 OTgxNzU4M3wxLjB8MXw3OTl8aGVsbG8gd29ybGQKOTg5fDE0NzMyNTd8MTA0OTgxNzU4M3wx LjB8MXwxMjAzfGhlbGxvIHdvcmxkCjk5MHwxNDczMjU4fDEwNDk4MTc1ODN8MS4wfDF8MjQ0 MHxoZWxsbyB3b3JsZAo5OTF8MTQ3MzI1OXwxMDQ5ODE3NTgzfDEuMHwxfDEyMDN8aGVsbG8g d29ybGQK7PGSPr5qDgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJdwQAB9BmkVQXo9KEF6 PSIbWJUPdHoEIBiNNYqAEGajCN4AAAEBCAoAQiJIDURjFu3xkj7+wQcAcAAAAHAAAAAAArOd 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 MCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCvPxkj5vRQ4AUAAAAFAAAAAAArOdAeQAB+kK FlwIAEUAAEJRWUAAPwbtHkF6PSJBej0ot20AFd36Vj65yDnQUBhhCGcqAABTVE9SIDM2MjAw MDUwLm91dC4wMzA0MDgNCvPxkj7mgg4AeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq6d0AA fQZF2EF6PShBej0iABW3bbnIOdDd+lZYUBj3MOkSAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9k ZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDUwLm91dC4wMzA0MDguDQrz8ZI+EYYOAD4A AAA+AAAAAAfpChZcAAKznQHkCABFAAAwunhAAH0GRhFBej0oQXo9IgAUuLOxSA1wAAAAAHAC +vATwAAAAgQFZAEBBALz8ZI+yYcOAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUVpAAD8G 7S9Bej0iQXo9KLizABTqqUgnsUgNcXASYQh6dgAAAQEEAgIEBbTz8ZI+M8AOADYAAAA2AAAA AAfpChZcAAKznQHkCABFAAAounlAAH0GRhhBej0oQXo9IgAUuLOxSA1x6qlIKFAQ/VwK5gAA 8/GSPiLIDgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFFbQAA/BufSQXo9IkF6PSi4swAU 6qlIKLFIDXFQEGEIH4sAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc1NzIgTU49MzYyMDAw NTAub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IlBSIE5l d3N3aXJlIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIEEgIFNjaHVsbWFuIEFu bm91bmNlcyBQbGFucyB0byBEaXNjb250aW51ZSBNYW51ZmFjdHVyaW5nIGF0IGl0cyBEaXNw ZXJzaW9uClBsYW50IGluIE9yYW5nZSwgVGV4YXMKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgou Li4gIAoKRGF0ZUxpbmUuLi4gIEFLUk9OLCAgT2hpbywgQXByIDgsIDIwMDMgL1BSTmV3c3dp cmUtRmlyc3RDYWxsIHZpYSBDT01URVgvIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAg Q29weXJpZ2h0IChDKSAyMDAzIFBSIE5ld3N3aXJlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4K CgouLi4KCgpQUiBOZXdzd2lyZQoKQSBTY2h1bG1hbiBJbmMgKE5hc2RhcTogU0hMTSkgdG9k YXkgYW5ub3VuY2VkIHRoYXQgaXQgd2lsbCBkaXNjb250aW51ZQptYW51ZmFjdHVyaW5nIG9w ZXJhdGlvbnMgYXQgaXRzIERpc3BlcnNpb24gcGxhbnQgaW4gT3JhbmdlLCBUZXhhcy4gVGhl CnNodXRkb3duIGlzIGV4cGVjdGVkIHRvIGJlIGNvbXBsZXRlZCBkdXJpbmcgdGhlIENvbXBh bnkncyBmaXNjYWwgMjAwMwpmb3VydGggcXVhcnRlciwgd2hpY2ggZW5kcyBBdWd1c3QgMzEs IDIwMDMuCgpBIFNjaHVsbWFuIGVzdGltYXRlcyB0aGF0IHRoZSBwbGFudCBjbG9zaW5nIHdp bGwgZ2VuZXJhdGUgYXBwcm94aW1hdGVseQokNSBtaWxsaW9uIGluIGFubnVhbCBzYXZpbmdz IGJlZ2lubmluZyBpbiBmaXNjYWwgMjAwNC4gVGhlIENvbXBhbnkgaXMKcHJlc2VudGx5IGZp bmFsaXppbmcgdGhlIGNvc3Qgb2YgdGhpcyBhY3Rpb24gYW5kIGFudGljaXBhdGVzIHRvdGFs CmNoYXJnZXMgb2YgYXBwcm94aW1hdGVseSAkNiB0byAkOCBtaWxsaW9uIGR1cmluZyBpdHMg ZmlzY2FsIDIwMDMgdGhpcmQKYW5kIGZvdXJ0aCBxdWFydGVycy4KClRoZSAxNDUsMDAwLXNx dWFyZS1mb290IHBsYW50LCB3aGljaCBBIFNjaHVsbWFuIGhhcyBvcGVyYXRlZCBzaW5jZSB0 aGUKbGF0ZSAxOTUwcywgaGFzIGFuIGFubnVhbCBwcm9kdWN0aW9uIGNhcGFjaXR5IG9mIGFw cHJveGltYXRlbHkgNjAgbWlsbGlvbgpwb3VuZHMuIFRoZSBwbGFudCdzIG1haW4gcHJvZHVj dHMgYXJlIGJsYWNrIGNvbmNlbnRyYXRlcyBhbmQKdGhlcm1vcGxhc3RpYyBvbGVmaW5zIG1h bnVmYWN0dXJlZCBwcmltYXJpbHkgZm9yIHRoZSBVUyBhdXRvIG1hcmtldC4gVGhlCnBsYW50 IGhhcyA2OCBlbXBsb3llZXMuCgpDbG9zaW5nIHRoZSBEaXNwZXJzaW9uIHBsYW50IHdpbGwg cmVkdWNlIHRoZSBDb21wYW55J3MgTm9ydGggQW1lcmljYW4KcHJvZHVjdGlvbvPxkj6ZyA4A mgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxRXEAAPwbn0UF6PSJBej0ouLMAFOqpTYyxSA1x UBhhCEmfAAAgY2FwYWNpdHkgYnkgcm91Z2hseSAxMiBwZXJjZW50LCBmcm9tIGFwcHJveGlt YXRlbHkgNTAwIG1pbGxpb24KcG91bmRzIHRvIDQ0MCBtaWxsaW9uIHBvdW5kcy4gVGhlIENv bXBhbnkgd2lsbCBzaGlmdCBtYW51ZmFjdHVyaW5nIG9mIHRoZQpwbGFudCdzIHByb2R1Y3Rz IHRvIG90aGVyIGZhY2lsaXRpZXMgaW4gTm9ydGggQW1lcmljYSwgd2hlcmUgcG9zc2libGUu ClRoaXMgd2lsbCBpbXByb3ZlIGNhcGFjaXR5IHV0aWxpemF0aW9uIGFuZCBjb3N0IGVmZmlj aWVuY3kgYXQgdGhvc2UKZmFjaWxpdGllcy4KCiJUaGUgZGVjaXNpb24gdG8gY2xvc2UgdGhp cyBwbGFudCB3YXMgbWFkZSBhZnRlciB2ZXJ5IGNhcmVmdWwgYW5hbHlzaXMsIgpzYWlkIFRl cnJ5IEwgSGFpbmVzLCBwcmVzaWRlbnQgYW5kIGNoaWVmIGV4ZWN1dGl2ZSBvZmZpY2VyLiAi VGhpcyB3YXMgYQpkaWZmaWN1bHQgZGVjaXNpb24gYnV0IGFic29sdXRlbHkgbmVjZXNzYXJ5 IHRvIGhlbHAgdXMgYWxpZ24gb3VyIE5vcnRoCkFtZXJpY2FuIHByb2R1Y3Rpb24gY2FwYWNp dHkgYW5kIGNvc3Qgc3RydWN0dXJlIHdpdGggdGhlIG1hcmtldApyZWFsaXRpZXMuIFdlIGlu dmVzdGVkIGluIHRoaXMgcGxhbnQgb3ZlciB0aGUgeWVhcnMsIGJ1dCBvbiBiYWxhbmNlLAp0 aGVyZSBpcyBzdWZmaWNpZW50IGNhcGFjaXR5IGF0IG91ciBvdGhlciBmYWNpbGl0aWVzLiIK ClRoZSBwbGFudCBjbG9zaW5nIGlzIHBhcnQgb2YgYSBjb3Jwb3JhdGUtd2lkZSBlZmZvcnQg dG8gYmFsYW5jZSB0aGUKcHJvZHVjdGlvbiBjYXBhY2l0eSBvZiBBIFNjaHVsbWFuIHdpdGgg bWFya2V0IGRlbWFuZCBpbiBOb3J0aCBBbWVyaWNhLgpUaGUgQ29tcGFueSdzIE5vcnRoIEFt ZXJpY2FuIGJ1c2luZXNzLCBwYXJ0aWN1bGFybHkgaXRzIFVTIG9wZXJhdGlvbnMsIGlzCmJl aW5nIGFmZmVjdGVkIGJ5IGhpZ2hlciByZXNpbiBwcmljZXMsIGNvbnRpbnVpbmcgY29tcGV0 aXRpdmUgcHJlc3N1cmUKYW5kIHdlYWsgZGVtYW5kIGZvciB2YWx1ZS1hZGRlZCBlbmdpbmVl cmVkIHByb2R1Y3RzLgoKVGhpcyBhY3Rpb24gYW5kIHRoZSBhbnRpY2lwYXRlZCBjb3N0IHNh dmluZ3MgYXJlIGluIGFkZGl0aW9uIHRvIHRoZQpDb21wYW55J3MgcmVjZW50bHkgYW5ub3Vu Y2VkIHByb2dyYW0gdG8gaW1wcm92ZSBjb3N0IGVmZmljaWVuY3kgYW5kCnByb2ZpdGFiaWxp dHkgdGhyb3VnaG91dCBpdHMgVVMgb3BlcmF0aW9ucy4gVGhlIHByaW1hcnkgZ29hbCBvZiB0 aGF0IDI2LQp3ZWVrIHByb2dyYW0gaXMgdG8gZ2VuZXJhdGUgYW5udWFsIG9wZXJhdGluZyBz YXZpbmdzIG9mICQ2IHRvICQ3IG1pbGxpb24Kc3RhcnRpbmcgd2l0aCB0aGUgQ29tcGFueSdz IDIwMDQgZmlzY2FsIHllYXIsIHdoaWNoIGJlZ2lucyBTZXB0ZW3z8ZI+DckOAJoFAACaBQAA AAKznQHkAAfpChZcCABFAAWMUV1AAD8G59BBej0iQXo9KLizABTqqVLwsUgNcVAYYQgGwQAA YmVyIDEsCjIwMDMuCgpBYm91dCBBIFNjaHVsbWFuIEluYwoKSGVhZHF1YXJ0ZXJlZCBpbiBB a3JvbiwgT2hpbywgQSBTY2h1bG1hbiBpcyBhIGxlYWRpbmcgaW50ZXJuYXRpb25hbApzdXBw bGllciBvZiBoaWdoLXBlcmZvcm1hbmNlIHBsYXN0aWMgY29tcG91bmRzIGFuZCByZXNpbnMu IFRoZXNlCm1hdGVyaWFscyBhcmUgdXNlZCBpbiBhIHZhcmlldHkgb2YgY29uc3VtZXIsIGlu ZHVzdHJpYWwsIGF1dG9tb3RpdmUgYW5kCnBhY2thZ2luZyBhcHBsaWNhdGlvbnMuIFRoZSBD b21wYW55IGVtcGxveXMgYWJvdXQgMiw0MDAgcGVvcGxlIGFuZCBoYXMgMTMKbWFudWZhY3R1 cmluZyBmYWNpbGl0aWVzIGluIE5vcnRoIEFtZXJpY2EsIEV1cm9wZSwgTWV4aWNvIGFuZCB0 aGUKQXNpYS1QYWNpZmljIHJlZ2lvbi4gUmV2ZW51ZXMgZm9yIHRoZSBmaXNjYWwgeWVhciBl bmRlZCBBdWd1c3QgMzEsIDIwMDIKd2VyZSBhcHByb3hpbWF0ZWx5ICQ5NjcgbWlsbGlvbi4g QWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBBIFNjaHVsbWFuCmNhbiBiZSBmb3VuZCBv biB0aGUgV29ybGQgV2lkZSBXZWIgYXQgd3d3LmFzY2h1bG1hbi5jb20gLgoKRm9yd2FyZC1M b29raW5nIFN0YXRlbWVudHMKClN0YXRlbWVudHMgaW4gdGhpcyByZWxlYXNlIHdoaWNoIGFy ZSBub3QgaGlzdG9yaWNhbCBmYWN0cyBhcmUgZm9yd2FyZC0KbG9va2luZyBzdGF0ZW1lbnRz IHdoaWNoIGludm9sdmUgcmlza3MgYW5kIHVuY2VydGFpbnRpZXMgYW5kIGFjdHVhbApldmVu dHMgb3IgcmVzdWx0cyBjb3VsZCBkaWZmZXIgbWF0ZXJpYWxseSBmcm9tIHRob3NlIGV4cHJl c3NlZCBvciBpbXBsaWVkCmluIHRoaXMgcmVsZWFzZS4gVGhlc2UgImZvcndhcmQtbG9va2lu ZyBzdGF0ZW1lbnRzIiBhcmUgYmFzZWQgb24KY3VycmVudGx5IGF2YWlsYWJsZSBpbmZvcm1h dGlvbi4gVGhleSBhcmUgYWxzbyBpbmhlcmVudGx5IHVuY2VydGFpbiwgYW5kCmludmVzdG9y cyBtdXN0IHJlY29nbml6ZSB0aGF0IGV2ZW50cyBjb3VsZCB0dXJuIG91dCB0byBiZSBzaWdu aWZpY2FudGx5CmRpZmZlcmVudCBmcm9tIHdoYXQgd2FzIGV4cGVjdGVkLiBFeGFtcGxlcyBv ZiBzdWNoIHVuY2VydGFpbnRpZXMgaW5jbHVkZSwKYnV0IGFyZSBub3QgbGltaXRlZCB0bywg dGhlIGZvbGxvd2luZzoKCiAgICAqIFdvcmxkd2lkZSBhbmQgcmVnaW9uYWwgZWNvbm9taWMs IGJ1c2luZXNzIGFuZCBwb2xpdGljYWwgY29uZGl0aW9ucwogICAgKiBGbHVjdHVhdGlvbnMg aW4gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW5jaWVzIGluIG1ham9yIGFyZWFzIHdoZXJlIHRo ZQogICAgICBDb21wYW55IG9wZXJhdGVzLCBpLmUuLCB0aGUgVVMgICBkb2xsYXIsIHRoZSBF dXJvLCBVSyAgIHBvdW5kIHN0ZXJsaW5nLAogICAg9PGSPjUBAAA2AAAANgAAAAAH6QoWXAAC s50B5AgARQAAKLp6QAB9BkYXQXo9KEF6PSIAFLizsUgNceqpUvBQEP1cAB4AAPTxkj5dBAAA 9gQAAPYEAAAAArOdAeQAB+kKFlwIAEUABOhRXkAAPwboc0F6PSJBej0ouLMAFOqpWFSxSA1x UBlhCFJxAAAgIENhbmFkaWFuIGRvbGxhciwgTWV4aWNhbiBwZXNvIGFuZCBJbmRvbmVzaWFu IHJ1cGlhaAogICAgKiBGbHVjdHVhdGlvbnMgaW4gdGhlIHByaWNlcyBvZiBwbGFzdGljIHJl c2lucyBhbmQgb3RoZXIgcmF3IG1hdGVyaWFscwogICAgKiBDaGFuZ2VzIGluIGN1c3RvbWVy IGRlbWFuZCBhbmQgcmVxdWlyZW1lbnRzCgpJbiBhZGRpdGlvbiwgdGhpcyByZWxlYXNlIGNv bnRhaW5zIHRpbWUtc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHRoYXQKcmVmbGVjdHMgbWFuYWdl bWVudCdzIGJlc3QgYW5hbHlzaXMgb25seSBhcyBvZiB0aGUgZGF0ZSBvZiB0aGlzIHJlbGVh c2UuCkEgU2NodWxtYW4gZG9lcyBub3QgdW5kZXJ0YWtlIGFueSBvYmxpZ2F0aW9uIHRvIHB1 YmxpY2x5IHVwZGF0ZSBvciByZXZpc2UKYW55IGZvcndhcmQtbG9va2luZyBzdGF0ZW1lbnRz IHRvIHJlZmxlY3QgZnV0dXJlIGV2ZW50cywgaW5mb3JtYXRpb24gb3IKY2lyY3Vtc3RhbmNl cyB0aGF0IGFyaXNlIGFmdGVyIHRoZSBkYXRlIG9mIHRoaXMgcmVsZWFzZS4gRnVydGhlcgpp bmZvcm1hdGlvbiBjb25jZXJuaW5nIGlzc3VlcyB0aGF0IGNvdWxkIG1hdGVyaWFsbHkgYWZm ZWN0IGZpbmFuY2lhbApwZXJmb3JtYW5jZSByZWxhdGVkIHRvIGZvcndhcmQtbG9va2luZyBz dGF0ZW1lbnRzIGNhbiBiZSBmb3VuZCBpbiBBClNjaHVsbWFuJ3MgcGVyaW9kaWMgZmlsaW5n cyB3aXRoIHRoZSBTZWN1cml0aWVzIGFuZCBFeGNoYW5nZSBDb21taXNzaW9uLgoKU09VUkNF IEEgU2NodWxtYW4gSW5jCgpSb2JlcnQgU3RlZmFua28sIENoYWlybWFuIGFuZCBDRk8gb2Yg QSAgU2NodWxtYW4gSW5jICwKKzEtMzMwLTY2OC03MjIzCihTSExNKQoKLi4uICAJIAoKS2V5 V29yZHMuLi4gIAogICAgYXV0b21vdGl2ZQogICAgYnVzaW5lc3MKICAgIGNhbmFkaWFuK2Rv bGxhcgogICAgY2VvCiAgICBjb25zdW1lcgogICAgY29ycG9yYXRlCiAgICBkb2xsYXIKICAg IGV1cm9wZQogICAgaW5kb25lc2lhCiAgICBpbmR1c3RyaWFsCiAgICBtYW51ZmFjdHVyaW5n CiAgICBtYXJrZXQKICAgIG1leGljbwogICAgbmFzZGFxCiAgICBub3J0aCthbWVyaWNhCiAg ICBvaGlvCiAgICBwYWNrYWdpbmcKICAgIHBlc28KICAgIHBsYW50CiAgICBwb2xpdGljcwog ICAgcG91bmQKICAgIHByZXNpZGVudAogICAgcHJpY2VzCiAgICBwcm9kdWN0cwogICAgcmVz aW4KICAgIHJ1cGlhaAogICAgc3RlcmxpbmcKICAgIHdlYgoK9PGSPiZeAAA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLp7QAB9BkYWQXo9KEF6PSIAFLizsUgNceqpXRVQEP1c9fgAAPTx kj7FqAAANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6fEAAfQZGFUF6PShBej0iABS4s7FI DXHqqV0VUBH9XPX3AAD08ZI+HqoAADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUV9AAD8G 7TJBej0iQXo9KLizABTqqV0VsUgNclAQYQiSTAAAAAAAAAAA9PGSPi+5AAA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKFFgQAA/Bu0xQXo9IkF6PSi3bQAV3fpWWLnIOhJQEGEIcd0AAAAA AAAAAPTxkj610wAAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXeUAAfQZpDEF6PShBej0i G1iVD3R6BCAYjTeCgBBkqwXHAAABAQgKAEIijw1EZeb08ZI+T9UAAHAAAABwAAAAAAKznQHk AAfpChZcCABFAABiPIVAAD8GAdNBej0iQXo9KJUPG1gYjTeCdHoEIIAYFtDJ9AAAAQEICg1E ZfMAQiKPMTAwM3wxNDczMjcxfDEwNDk4MTc1OTF8MS4wfDF8NjU0fGhlbGxvIHdvcmxkCvTx kj788QAATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC6fUAAfQZF/EF6PShBej0iABW3bbnI OhLd+lZYUBj3MAyfAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQr08ZI+CWcCADwAAAA8AAAA AAKznQHkAAfpChZcCABFAAAoUWFAAD8G7TBBej0iQXo9KLdtABXd+lZYucg6KlAQYQhxxQAA AAAAAAAA9PGSPj0qBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJd6QAB9BmkLQXo9KEF6 PSIbWJUPdHoEIBiNN7CAEGR9BbcAAAEBCAoAQiKSDURl8/Xxkj43SwAAcQAAAHEAAAAAArOd AeQAB+kKFlwIAEUAAGM8hkAAPwYB0UF6PSJBej0olQ8bWBiNN7B0egQggBgW0AXvAAABAQgK DURmVABCIpIxMDA0fDE0NzMyNzJ8MTA0OTgxNzU5MnwxLjB8MXwzNTczfGhlbGxvIHdvcmxk CvXxkj4gQgIAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXe0AAfQZpCkF6PShBej0iG1iV D3R6BCAYjTffgBBkTgVOAAABAQgKAEIimg1EZlT18ZI+XEMCAHEAAABxAAAAAAKznQHkAAfp ChZcCABFAABjPIdAAD8GAdBBej0iQXo9KJUPG1gYjTffdHoEIIAYFtAMowAAAQEICg1EZmEA QiKaMTAwNXwxNDczMjczfDEwNDk4MTc1OTJ8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAr18ZI+ d5gFAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l3xAAH0GaQlBej0oQXo9IhtYlQ90egQg GI04DoAQZB8FPgAAAQEICgBCIp0NRGZh+PGSPpz7AQBwAAAAcAAAAAACs50B5AAH6QoWXAgA RQAAYjyIQAA/BgHQQXo9IkF6PSiVDxtYGI04DnR6BCCAGBbQvrgAAAEBCAoNRGeLAEIinTEw MDZ8MTQ3MzI3NHwxMDQ5ODE3NTk0fDEuMHwxfDc5OXxoZWxsbyB3b3JsZAr48ZI+juEEAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0l31AAH0GaQhBej0oQXo9IhtYlQ90egQgGI04PIAQ Y/ED9wAAAQEICgBCIroNRGeL+PGSPnjjBAArAQAAKwEAAAACs50B5AAH6QoWXAgARQABHTyJ QAA/BgEUQXo9IkF6PSiVDxtYGI04PHR6BCCAGBbQ4wUAAAEBCAoNRGeeAEIiujEwMDd8MTQ3 MzI3NXwxMDQ5ODE3NTk0fDEuMHwxfDY1NHxoZWxsbyB3b3JsZAoxMDA4fDE0NzMyNzZ8MTA0 OTgxNzU5NHwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCjEwMDl8MTQ3MzI3N3wxMDQ5ODE3NTk0 fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKMTAxMHwxNDczMjc4fDEwNDk4MTc1OTR8MS4wfDF8 MTIwM3xoZWxsbyB3b3JsZAoxMDExfDE0NzMyNzl8MTA0OTgxNzU5NXwxLjB8MXwzMjd8aGVs bG8gd29ybGQK+PGSPhc4CABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJd+QAB9BmkHQXo9 KEF6PSIbWJUPdHoEIBiNOSWAEGMIA+IAAAEBCAoAQiK8DURnnvjxkj7PmgkAcQAAAHEAAAAA ArOdAeQAB+kKFlwIAEUAAGM8ikAAPwYBzUF6PSJBej0olQ8bWBiNOSV0egQggBgW0AXyAAAB AQgKDURnvQBCIrwxMDEyfDE0NzMyODB8MTA0OTgxNzU5NXwxLjB8MXwyMDAxfGhlbGxvIHdv cmxkCvjxkj5VjgsAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXf0AAfQZpBkF6PShBej0i G1iVD3R6BCAYjTlUgBBi2QPBAAABAQgKAEIivg1EZ7348ZI+KC8OAHAAAABwAAAAAAKznQHk AAfpChZcCABFAABiPItAAD8GAc1Bej0iQXo9KJUPG1gYjTlUdHoEIIAYFtDHDQAAAQEICg1E Z9sAQiK+MTAxM3wxNDczMjgxfDEwNDk4MTc1OTZ8MS4wfDF8MjMwfGhlbGxvIHdvcmxkCvnx kj505gAAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRYkAAPwbtFUF6PSJBej0ot20AFd36 Vli5yDoqUBhhCHfSAABERUxFIDM2MjAwMDUxLm91dC4wMzA0MDgNCvnxkj7KIwEAfAAAAHwA AAAAB+kKFlwAArOdAeQIAEUAAG66fkAAfQZFzUF6PShBej0iABW3bbnIOird+lZyUBj3Fl6S AAA1NTAgMzYyMDAwNTEub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUg ZmlsZSBzcGVjaWZpZWQuIA0K+fGSPhMyAQBRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1Fj QAA/Bu0TQXo9IkF6PSi3bQAV3fpWcrnIOnBQGGEIraMAAFBPUlQgNjUsMTIyLDYxLDM0LDE4 NCwxODENCvnxkj7jTQEAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXgEAAfQZpBUF6PShB ej0iG1iVD3R6BCAYjTmCgBBiqwOfAAABAQgKAEIiwg1EZ9v58ZI+jmwBAFQAAABUAAAAAAfp ChZcAAKznQHkCABFAABGun9AAH0GRfRBej0oQXo9IgAVt225yDpw3fpWjVAY9voeSgAAMjAw IFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K+fGSPtFvAQBQAAAAUAAAAAACs50B5AAH6QoW XAgARQAAQlFkQAA/Bu0TQXo9IkF6PSi3bQAV3fpWjbnIOo5QGGEIZR0AAFNUT1IgMzYyMDAw NTEub3V0LjAzMDQwOA0K+fGSPrLBAQB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarqAQAB9 BkXPQXo9KEF6PSIAFbdtucg6jt36VqdQGPbg6FQAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2Rl IGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwNTEub3V0LjAzMDQwOC4NCvnxkj56xwEAPgAA AD4AAAAAB+kKFlwAArOdAeQIAEUAADC6gUAAfQZGCEF6PShBej0iABS4taqLZ74AAAAAcAL6 8MAsAAACBAVkAQEEAvnxkj4eyQEAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBRZUAAPwbt JEF6PSJBej0ouLUAFOrA5mmqi2e/cBJhCIiJAAABAQQCAgQFtPnxkj7E+QEAcAAAAHAAAAAA ArOdAeQAB+kKFlwIAEUAAGI8jEAAPwYBzEF6PSJBej0olQ8bWBiNOYJ0egQggBgW0MLAAAAB AQgKDURn7wBCIsIxMDE0fDE0NzMyODJ8MTA0OTgxNzU5NnwxLjB8MXw0ODJ8aGVsbG8gd29y bGQK+fGSPgkBAgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLqCQAB9BkYPQXo9KEF6PSIA FLi1qotnv+rA5mpQEP1cGPkAAPnxkj63CAIAmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxR ZkAAPwbnx0F6PSJBej0ouLUAFOrA5mqqi2e/UBBhCHdBAABYWVpaWS4uLiAgVEM9MiBUTT0x MDQ5ODE3NTc0IE1OPTM2MjAwMDUxLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49 IkNvbXRleCIgUEZOPSJCeSBGcmVkIE8uIFdpbGxpYW1zJiN4QTsiIFBGTj0iS25pZ2h0LVJp ZGRlciBPcGVuIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIFBlbnNpb24gV29l cyBUYXJuaXNoIEdvbGRlbiBZZWFycyBvZiBSZXRpcmVtZW50IGZvciBTb21lIGluIFdlc3Rl cm4gTmV3IFlvcmsKCi4uLiAgCSAKCkJ5TGluZS4uLiAgQnkgRnJlZCBPLiBXaWxsaWFtcwoK Ci4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA3LCAyMDAzIChUaGUgQnVmZmFsbyBOZXdzIC0g S25pZ2h0IFJpZGRlci9UcmlidW5lIEJ1c2luZXNzIE5ld3MgdmlhIENPTVRFWCkgLS0KCgoK Li4uCgpDb3B5cmlnaHRMaW5lLi4uICAoYykgMjAwMywgVGhlIEJ1ZmZhbG8gTmV3cywgTi5Z LiBEaXN0cmlidXRlZCBieSBLbmlnaHQgUmlkZGVyL1RyaWJ1bmUgQnVzaW5lc3MKCgouLi4K CgpLbmlnaHQtUmlkZGVyIE9wZW4KClRoaXMgaXNuJ3QgdGhlIHJldGlyZW1lbnQgdGhhdCBM YXJyeSBBcm5vbGQgZHJlYW1lZCBvZi4KCkFmdGVyIHdvcmtpbmcgMzMgeWVhcnMgYXQgQmV0 aGxlaGVtIFN0ZWVsLCB0aGUgSGFtYnVyZyByZXNpZGVudCB3YXMKbG9va2luZyBmb3J3YXJk IHRvIHNub3dtb2JpbGluZyBpbiB0aGUgd2ludGVyIGFuZCB0YWtpbmcgbG9uZywgY2FyZWZy ZWUKdHJpcHMgd2l0aCBoaXMgd2lmZSBpbiB0aGVpciBtb3RvciBob21lLgoKIk15IHdob2xl IGlkZWEgd2FzIHRvIChyZXRpcmUpIHdoZW4gSSB3YXMgc3RpbGwgYWJsZSB0byBkbyBhbGwg dGhpcwpzdHVmZiwiIHNhaWQgQXJub2xkLCA1NC4KClRoZW4gQmV0aGxlaGVtJ3MgYmFua3J1 cHRjeSByZWR1Y2VkIGhpcyBwZW5zaW9uIGFuZCBjYW5jZWxlZCBoaXMgaGVhbHRoCmluc3Vy YW5jZS4gSXQgYWxzbyB3aXBlZCBvdXQgdGhlICQyMiwwMDAgb2YgY29tcGFueSBzdG9jayBo ZSdkIHRha2VuIGluCmxpZXUgb2Ygd2FnZXMuIEFuZCB0aGUgc3RvY2sgbWFya2V0J3MgcGx1 bmdlIGVyYXNlZCBvbmUtdGhpcmQgb2YgaGlzCnJldGlyZW1lbnQgc2F2aW5ncy4KCk5vdyBo ZSdzIG1ha2luZyB3aXRoZHJhd2FscyBmcm9tIHdoYXQncyBsZWZ0IG9mIGhpcyA0MDEoaykg YW5kCmNvbnRlbXBsYXRpbmcgZ29pbmcgYmFjayB0byB3b3JrLiBTdGlsbCwgQXJub2xkIGZp Z3VyZXMgaGUncyBsdWNraWVyIHRoYW4KbWFueSBvZiBoaXMgY28td29ya2VycyBmcm9tIHRo ZSBHYWx2YW5pemVkIFByb2R1Y3RzIHBsYW50IGluIExhY2thd2FubmEuCkF0IGxlYXN0IGhl IGNhbiBmYWxsIGJhY2sgb24gaGlzIHdpZmUncyBoZWFsdGggY292ZXJhZ2UgZnJvbSBoZXIg Zm9ybWVyCmVtcGz58ZI+LAkCAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUWdAAD8G58ZB ej0iQXo9KLi1ABTqwOvOqotnv1AYYQjokgAAb3llciwgVmVyaXpvbi4KCiJXaGVuIHdlIHJl dGlyZWQgZWFybHkgd2Uga25ldyB3ZSdkIGhhdmUgdG8gYmUgc2VsZWN0aXZlIiBhYm91dCBl eHBlbnNlcywKQW5uIE1hcmllIEFybm9sZCBzYWlkLiAiQnV0IHdlIG5ldmVyIGZlbHQgd2Ug d291bGQgaGF2ZSB0byB3b3JyeSB0aGF0CnRoZXJlIHdvdWxkbid0IGJlIGRpc3Bvc2FibGUg aW5jb21lLiIKClRoZSBnb2xkZW4geWVhcnMgb2YgcmV0aXJlbWVudCBhcmUgbG9zaW5nIHRo ZWlyIGdsb3cgaW4gV2VzdGVybiBOZXcgWW9yawphbmQgYXJvdW5kIHRoZSBjb3VudHJ5LCBh cyBjYXNoLXN0cmFwcGVkIGNvbXBhbmllcyBkcm9wIHRoZSBiZW5lZml0cyB0aGF0Cndvcmtl cnMgb25jZSB0aG91Z2h0IHdlcmUgc29saWQuCgpCZXRobGVoZW0ncyBiYW5rcnVwdGN5IGhh cyBzaGFrZW4gdGhlIHJlZ2lvbiwgYXMgMTIsMDAwIHJldGlyZWVzIGFuZApmYW1pbHkgbWVt YmVycyBmYWNlIHRoZSBsb3NzIG9mIGhlYWx0aCBiZW5lZml0cyB0aGF0IHdlcmUgY2FuY2Vs ZWQgTWFyY2gKMzEuIExhc3QgeWVhciwgYWJvdXQgMywwMDAgcmV0aXJlZXMgZnJvbSBSZXB1 YmxpYyBTdGVlbCBhbHNvIGxvc3QgdGhlaXIKYmVuZWZpdHMgd2hlbiBzdWNjZXNzb3IgY29t cGFueSBMVFYgd2VudCBiYW5rcnVwdC4KClBlb3BsZSB3aG8gYXJlIHdhdGNoaW5nIHRoZSBz dGVlbHdvcmtlcnMnIHRyb3VibGVzIGhhdmUgZ29vZCByZWFzb24gdG8gYmUKY29uY2VybmVk IGZvciB0aGVtc2VsdmVzLCBleHBlcnRzIHNheS4gRnV0dXJlIGhlYWx0aCBiZW5lZml0cyBh bmQgZXZlbgpwZW5zaW9ucyBhcmUgb24gaW5jcmVhc2luZ2x5IHNoYWt5IGdyb3VuZC4KCiJB IGxvdCBvZiBlbXBsb3llcnMsIGV2ZW4gaWYgdGhleSdyZSBub3QgZmFjaW5nIGJhbmtydXB0 Y3ksIGFyZSB0cnlpbmcgdG8KZmlndXJlIG91dCBob3cgdG8gcmVkdWNlIGNvc3QsIiBzYWlk IEplcnJ5IFNtb2xrYSwgc2VuaW9yIHBvbGljeSBhZHZpc2VyCmF0IEFBUlAuICJBcyB0aGUg ZWNvbm9teSBoYXMgZ290dGVuIHdvcnNlLCB3ZSd2ZSBhbGwgYmVlbiBhc2tlZCB0byBwb255 CnVwIGEgbGl0dGxlIGJpdCBtb3JlLiIKCkFib3V0IDI3IHBlcmNlbnQgb2YgQW1lcmljYW5z IG92ZXIgNjUsIHRoZSB0aHJlc2hvbGQgZm9yIE1lZGljYXJlCmNvdmVyYWdlLCBoYXZlIHN1 cHBsZW1lbnRhbCBjb3ZlcmFnZSBmcm9tIHRoZWlyIGVtcGxveWVyLCBhY2NvcmRpbmcgdG8g YQpzdHVkeSBieSB0aGUgRW1wbG95ZWUgQmVuZWZpdHMgUmVzZWFyY2ggSW5zdGl0dXRlIGlu IFdhc2hpbmd0b24gREMgT25seQp0aGUgbGFyZ2VzdCBlbXBsb3llcnMgb2ZmZXIgdGhlIGJl bmVmaXQsIGFuZCB0aGUgZnJhY3Rpb24gaXMgc2hyaW5raW5nCmZyb20gdGhlIGN1cnJlbnQg MTIg+fGSPrAJAgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFFoQAA/BufFQXo9IkF6PSi4 tQAU6sDxMqqLZ79QGGEIT3wAAHBlcmNlbnQgb2YgY29tcGFuaWVzLgoKIk1lZGljYWwgY2Fy ZSBpcyBnZXR0aW5nIG1vcmUgZXhwZW5zaXZlIGFuZCBlbXBsb3llcnMgYXJlIGdldHRpbmcg b3V0IG9mCnRoZSBidXNpbmVzcyBvZiBwcm92aWRpbmcgcmV0aXJlZSBoZWFsdGggYmVuZWZp dHMsIiBzYWlkIERhbGxhcwpTYWxpc2J1cnksIHByZXNpZGVudCBvZiB0aGUgRW1wbG95ZWUg QmVuZWZpdHMgUmVzZWFyY2ggSW5zdGl0dXRlLgoKQWxzbyB0cm91YmxpbmcgaXMgdGhlIHdv YmJsaW5lc3Mgb2YgY29ycG9yYXRlIEFtZXJpY2EncyBwZW5zaW9uIHBsYW5zLgpUcm91Ymxl ZCBhaXJsaW5lcyBhcmUgc3RhcnRpbmcgdG8gbGluZSB1cCBmb3IgZmVkZXJhbCBiYWlsb3V0 cyBvZiB0aGVpcgp1bmRlcmZ1bmRlZCBwZW5zaW9ucywgam9pbmluZyBoYXJkLXByZXNzZWQg bWFudWZhY3R1cmVycy4gVGhlIFVTIFBlbnNpb24KQmVuZWZpdCBHdWFyYW50eSBDb3JwIGJh Y2tzIHBlbnNpb25zIGZvciByZXRpcmVlcyBvZiBiYW5rcnVwdCBjb21wYW5pZXMsCmJ1dCBh dCByZWR1Y2VkIGxldmVscy4KCkxhc3QgeWVhciBhIHJ1biBvZiBjbGFpbXMgaGFuZGVkIHRo ZSBwZW5zaW9uIGFnZW5jeSBhIGxvc3Mgb2YgJDExCmJpbGxpb24sIGl0cyBsYXJnZXN0IGV2 ZXIuIE5vdyBpdHMgZGVmaWNpdCAtLSAkMy41IGJpbGxpb24gYW5kIHJpc2luZyAtLQpwcm9t cHRzIGNvbmNlcm5zIGFib3V0IHRoZSBmdXR1cmUgb2YgdGhlIGZlZGVyYWwgc2FmZXR5IG5l dC4gTGFzdCB3ZWVrCnRoZSBhZ2VuY3kgYmVjYW1lIHRydXN0ZWUgZm9yIHRoZSBVUyBBaXJ3 YXlzIHBlbnNpb24gcGxhbiwgd2hpY2ggZmFjZXMgYQokMi41IGJpbGxpb24gZGVmaWNpdC4K CkFnYWluc3QgdGhpcyBiYWNrZHJvcCwgd29ya2luZyBwZW9wbGUgYXJlIHJlZHVjaW5nIHRo ZWlyIGV4cGVjdGF0aW9ucyBmb3IKdGhlaXIgZ29sZGVuIHllYXJzLCBmaW5hbmNpYWwgcGxh bm5lcnMgc2FpZC4KCiJTb21lIGZvbGtzIHRvbGQgbWUgYSBmZXcgeWVhcnMgYWdvIHRoZXkg Z290IGEgam9iIHBhcnQtdGltZSBqdXN0IGZvciB0aGUKbWVkaWNhbCwiIHNhaWQgSm9zZXBo IEN1cmF0b2xvLCBwcmVzaWRlbnQgb2YgR2VvcmdldG93biBDYXBpdGFsIEdyb3VwIGluCldp bGxpYW1zdmlsbGUuCgpUaGUgZmlybSBjb3Vuc2VscyBwZW9wbGUgcGxhbm5pbmcgdGhlaXIg cmV0aXJlbWVudCwgbW9zdCBvZiB0aGVtIG92ZXIgYWdlCjU1LiBFdmVuIHRob3NlIGx1Y2t5 IGVub3VnaCB0byB3b3JrIGZvciBhIGNvbXBhbnkgdGhhdCBvZmZlcnMgcmV0aXJlZQpiZW5l Zml0cyBleHBlY3QgdG8gd2luZCB1cCBwYXlpbmcgbW9yZSBhbmQgbW9yZSBvZiB0aGUgY29z dCBmb3IgdGhlaXIKY292ZXJhZ2UsIGhlIHNhaWQuCgoiSXQgY29tZXMgdXAgaW4gZfnxkj5K gwIANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6g0AAfQZGDkF6PShBej0iABS4taqLZ7/q wPEyUBD9XA4xAAD58ZI+v4YCAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUWlAAD8G58RB ej0iQXo9KLi1ABTqwPaWqotnv1AQYQgX2AAAdmVyeSBjb252ZXJzYXRpb24sIGVzcGVjaWFs bHkgd2l0aCBCZXRobGVoZW0gU3RlZWwsClZlcml6b24sIEFUJlQsIEx1Y2VudCwiIEN1cmF0 b2xvIHNhaWQuICJUaGVyZSBpcyBubyB3YXkgdG8gc2FmZWd1YXJkIGl0LiIKCkZhc3Qtcmlz aW5nIGNvc3RzIGZvciBtZWRpY2FsIGNhcmUgY2FuIGJlIGRhdW50aW5nIGZvciByZXRpcmVl cywgZXZlbgp0aG9zZSB3aG8gaGF2ZSBjb21wYW55LWJhY2tlZCBpbnN1cmFuY2UuIEFjY29y ZGluZyB0byB0aGUgYmVuZWZpdHMKcmVzZWFyY2ggaW5zdGl0dXRlLCBhIG1hbiB3aG8gcmV0 aXJlcyBhdCA2NSBhbmQgbGl2ZXMgMTUgeWVhcnMgY2FuIGV4cGVjdAp0byBwYXkgJDQ3LDAw MCBmb3IgbWVkaWNhbCBjYXJlIHRoYXQncyBub3QgY292ZXJlZCBieSBNZWRpY2FyZSBvcgpl bXBsb3llciBpbnN1cmFuY2UuIFdpdGhvdXQgZW1wbG95ZXIgaW5zdXJhbmNlLCB0aGUgYmls bCByaXNlcyB0bwokMTE2LDAwMC4KCkZvciBzb21lIHdvcmtlcnMgd2hvIGFyZW4ndCBlbGln aWJsZSBmb3IgZW1wbG95ZXItYmFja2VkIGJlbmVmaXRzLApyZXRpcmVtZW50IGl0c2VsZiBp cyBhIGx1eHVyeS4KCldpZG93IEdlcnJpZSBLdXptYSB3ZW50IGJhY2sgdG8gd29yayBhdCBh Z2UgNjMgYXQgYSBXZWdtYW5zIHN1cGVybWFya2V0CmluIENoZWVrdG93YWdhLCBwYXJ0bHkg dG8gb2Zmc2V0IGhlciBoZWFsdGggaW5zdXJhbmNlIGNvc3RzLiBUaGUgZ3JvY2VyeQpjaGFp bidzIHByZXNjcmlwdGlvbiBkcnVnIGJlbmVmaXQgcGF5cyBtb3N0IG9mIHRoZSAkMTUwLWEt bW9udGggYmlsbCBmb3IKaGVyIGZvdXIgbWVkaWNpbmVzLgoKIkl0IHJlYWxseSBoZWxwcyAt LSB0aGF0J3Mgb25lIG9mIHRoZSByZWFzb25zIEkgd29yayBhdCBXZWdtYW5zLCIgc2hlCnNh aWQuIE5vdyA3MSwgc2hlIGRvZXNuJ3QgcGxhbiB0byByZXRpcmUuICJJJ20ganVzdCBnb2lu ZyB0byBnbyBhbmQgZ28KYW5kIGdvLCBsaWtlIHRoYXQgYmF0dGVyeSwiIHNoZSBzYWlkIHdp dGggYSBsYXVnaC4KCkhlciBjby13b3JrZXIgRWR3aW4gUyBZYW5paywgNjksIGNhbWUgb3V0 IG9mIHJldGlyZW1lbnQgaW4gMTk5NSBwYXJ0bHkgdG8KaGVscCBwYXkgaGlzIHdpZmUncyBp bnN1cmFuY2UgcHJlbWl1bXMuIEhpcyBvd24gaW5zdXJhbmNlIGNvbWVzIGZyb20gdGhlClZl dGVyYW5zIEFkbWluaXN0cmF0aW9uLgoKWWFuaWsgc2FpZCBoZSBkb2Vzbid0IGhhdmUgdG8g d29yayBhbmQgZW5qb3lzIGhpcyBtYWludGVuYW5jZSBqb2IgYXQgdGhlCnN1cGVybWFya2V0 IG9uIERpY2sgUm9hZC4gQnV0IHRoZSBwYXljaGVjayBkb2VzIGFsbG93IGhpbSB0byBnbyBv dXQgdG8KZGlubmVyIG9yIGEgc2hvdyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSBleHBl bnNl+fGSPjeHAgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFFqQAA/BufDQXo9IkF6PSi4 tQAU6sD7+qqLZ79QEGEIMu0AAC4KCiJXaGF0IEkgbWFrZSBzdWJzaWRpemVzIG15IHdpZmUn cyAoaGVhbHRoIGNhcmUpLCBzbyBJIGRvbid0IGhhdmUgdG8gZ28KaW50byBteSBzYXZpbmdz LCIgdGhlIENoZWVrdG93YWdhIHJlc2lkZW50IHNhaWQuCgpHb2luZyBiYWNrIHRvIHdvcmsg aXMgc3RpbGwgYSBsYXN0IHJlc29ydCBmb3IgbW9zdCByZXRpcmVlcywgam9iCnBsYWNlbWVu dCBleHBlcnRzIHNheS4gQXQgS2V5IFJlc291cmNlIEdyb3VwLCBhIHBsYWNlbWVudCBhZ2Vu Y3kgaW4KQW1oZXJzdCwgZmV3ZXIgdGhhbiA1IHBlcmNlbnQgb2YgY2xpZW50cyBhcmUgZXgt cmV0aXJlZXMgZ29pbmcgYmFjayB0bwp3b3JrLCBjby1vd25lciBKYXJpIEtpbmcgc2FpZC4K Ck1vcmUgY29tbW9uIGFyZSBwZW9wbGUgd2hvIHN0YXkgYXQgdGhlaXIgam9iIGxvbmcgcGFz dCB0cmFkaXRpb25hbApyZXRpcmVtZW50IGFnZSBvZiA2MiB0byA2NSwgdG8ga2VlcCB0aGVp ciBoZWFsdGggY292ZXJhZ2UuICJQZW9wbGUgYXJlCmhhbmdpbmcgb250byB0aGVpciBqb2Jz IGxvbmdlciAtLSB0aGV5J3JlIG5vdCBhcyB3aWxsaW5nIHRvIHJldGlyZSwiIHNoZQpzYWlk LgoKQSBzdXJ2ZXkgYnkgQUFSUCBmb3VuZCBhIHNpbWlsYXIgcmVzdWx0LCBzYWlkIFNtb2xr YSBvZiBBQVJQLiBBIGdyb3dpbmcKcG9ydGlvbiBvZiBwZW9wbGUgb3ZlciA2MCB3aG8gY29u dGludWUgd29ya2luZyBzYXkgdGhhdCB0aGVpcgplbXBsb3llci1iYWNrZWQgaGVhbHRoIGJl bmVmaXRzIGFyZSBhIG1ham9yIHJlYXNvbiwgdGhlIHN1cnZleSBmb3VuZC4KCkZvciB0aGUg QXJub2xkcywgdGhlaXIgc2F2aW5ncyBhbmQgcGVuc2lvbiBpbmNvbWUgYXJlIHN1ZmZpY2ll bnQgdG8gbWFrZQpnb2luZyBiYWNrIHRvIHdvcmsgYW4gb3B0aW9uLCBub3QgYSBuZWNlc3Np dHkuIFRoZXJlJ3MgZXZlbiByb29tIGluIHRoZQpidWRnZXQgdG8gdGFrZSB0aGVpciBjYW1w ZXIgdG8gRmxvcmlkYSBmb3IgYSBmZXcgd2Vla3MgdGhpcyBzcHJpbmcuCgpXaGV0aGVyIHRo ZWlyIGZpbmFuY2lhbCBwaWN0dXJlIHdpbGwgc3RhYmlsaXplIG9yIGRldGVyaW9yYXRlIGZ1 cnRoZXIgaXMKdGhlIHF1ZXN0aW9uLiBIYXZpbmcgc2VlbiBCZXRobGVoZW0ncyBiZW5lZml0 IHBhY2thZ2UgY29sbGFwc2UsIEFubiBNYXJpZQpBcm5vbGQgaXMgY29uY2VybmVkIGFib3V0 IGhlciBleC1lbXBsb3llciwgVmVyaXpvbi4gVGhlIHRlbGVwaG9uZSBjb21wYW55CmlzIGV4 cGVjdGVkIHRvIGJhdHRsZSB1bmlvbnMgb3ZlciBoZWFsdGggYmVuZWZpdHMgdGhpcyBzdW1t ZXIsIGFuZApyZXRpcmVlcyBjb3VsZCBiZSBhbW9uZyB0aGUgY2FzdWFsdGllcy4KCiJBIGxv dCBvZiBwZW9wbGUgc2F5LCAnT2gsIHlvdSdyZSBzbyBsdWNreSB0byBiZSByZXRpcvnxkj5Y hwIA3AEAANwBAAAAArOdAeQAB+kKFlwIAEUAAc5Ra0AAPwbrgEF6PSJBej0ouLUAFOrBAV6q i2e/UBFhCMvPAABlZCwiIHNoZSBzYWlkLiAiSQpzYXksIGJlIGNhcmVmdWwgd2hhdCB5b3Ug d2lzaCBmb3IuIgoKVG8gc2VlIG1vcmUgb2YgVGhlIEJ1ZmZhbG8gTmV3cywgTlkgICwgb3Ig dG8gc3Vic2NyaWJlIHRvIHRoZSBuZXdzcGFwZXIsIGdvIHRvCiBodHRwOi8vd3d3LmJ1ZmZh bG9uZXdzLmNvbS4KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIDQwMWsKICAgIGJhbmty dXB0Y3kKICAgIGNvcnBvcmF0ZQogICAgZGVmaWNpdAogICAgZmFtaWx5CiAgICBmZWRlcmFs CiAgICBmbG9yaWRhCiAgICBoZWFsdGgKICAgIGluc3VyYW5jZQogICAgbWFya2V0CiAgICBt ZWRpY2FsCiAgICBwbGFudAogICAgcHJlc2lkZW50CiAgICBwcm9kdWN0cwogICAgcmVzZWFy Y2gKICAgIHJldGlyZW1lbnQKICAgIHN0ZWVsCiAgICB1bmlvbnMKICAgIHdhc2hpbmd0b24K Cvnxkj4T5QIANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6hEAAfQZGDUF6PShBej0iABS4 taqLZ7/qwPv6UBD9XANpAAD58ZI+KQcDADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouoVA AH0GRgxBej0oQXo9IgAUuLWqi2e/6sEDBVAQ/Vz8XQAA+fGSPtUSAwA2AAAANgAAAAAH6QoW XAACs50B5AgARQAAKLqGQAB9BkYLQXo9KEF6PSIAFLi1qotnv+rBAwVQEf1c/FwAAPnxkj7N EwMAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRbEAAPwbtJUF6PSJBej0ouLUAFOrBAwWq i2fAUBBhCJixAAAAAAAAAAD58ZI+tioDADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUW1A AD8G7SRBej0iQXo9KLdtABXd+lanucg60FAQYQhw0AAAAAAAAAAA+fGSPs9iAwBOAAAATgAA AAAH6QoWXAACs50B5AgARQAAQLqHQAB9BkXyQXo9KEF6PSIAFbdtucg60N36VqdQGPbgC+IA ADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCvnxkj6YagMAUAAAAFAAAAAAArOdAeQAB+kKFlwI AEUAAEJRbkAAPwbtCUF6PSJBej0ot20AFd36Vqe5yDroUBhhCHTFAABERUxFIDM2MjAwMDUz Lm91dC4wMzA0MDgNCvnxkj4bpwMAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG66iEAAfQZF w0F6PShBej0iABW3bbnIOujd+lbBUBj2xl3TAAA1NTAgMzYyMDAwNTMub3V0LjAzMDQwODog VGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K+fGSPtCyAwBR AAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1FvQAA/Bu0HQXo9IkF6PSi3bQAV3fpWwbnIOy5Q GGEIq5YAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxODINCvnxkj6G7AMAVAAAAFQAAAAAB+kK FlwAArOdAeQIAEUAAEa6iUAAfQZF6kF6PShBej0iABW3bbnIOy7d+lbcUBj2qh2NAAAyMDAg UE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQr58ZI+wvYDAFAAAABQAAAAAAKznQHkAAfpChZc CABFAABCUXBAAD8G7QdBej0iQXo9KLdtABXd+lbcucg7TFAYYQhiEAAAU1RPUiAzNjIwMDA1 My5vdXQuMDMwNDA4DQr58ZI+JjQEAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABquopAAH0G RcVBej0oQXo9IgAVt225yDtM3fpW9lAY9pDnlQAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUg ZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDA1My5vdXQuMDMwNDA4Lg0K+fGSPho1BAA+AAAA PgAAAAAH6QoWXAACs50B5AgARQAAMLqLQAB9BkX+QXo9KEF6PSIAFLi2pjINWwAAAABwAvrw HugAAAIEBWQBAQQC+fGSPqE2BAA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFFxQAA/Bu0Y QXo9IkF6PSi4tgAU6sIU5qYyDVxwEmEIuMYAAAEBBAICBAW0+fGSPlxuBAA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLqMQAB9BkYFQXo9KEF6PSIAFLi2pjINXOrCFOdQEP1cSTYAAPnx kj6sdQQAVQQAAFUEAAAAArOdAeQAB+kKFlwIAEUABEdRckAAPwbpAEF6PSJBej0ouLYAFOrC FOemMg1cUBhhCEbbAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3NTc2IE1OPTM2MjAwMDUz Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJGZWRCaXpP cHMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgQURBUFRFUiBBU1NFTUJMWSwg VkFMVkUKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciAw OCwgMjAwMyAoRmVkQml6T3BwcyB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExp bmUuLi4gIENvcHlyaWdodCAoYykgMjAwMyBGZWRlcmFsIEluZm9ybWF0aW9uICYgTmV3cyBE aXNwYXRjaCwgSW5jLgoKCi4uLgoKCkZlZEJpek9wcwoKTk9USUNFIFRZUEU6IENPTlRSQUNU IEFXQVJECgpTT1VSQ0U6IFB1Ymxpc2hlZCBpbiBGZWRCaXpPcHBzCgpEQVRFIFBPU1RFRDog MDctQVBSLTAzCgpPRkZJQ0UgQUREUkVTUzogREVGRU5TRSBHRU5FUkFMIFNVUFBMWSBDRU5U RVIgODAwMCBKRUZGIERBVklTIEhXWQpSSUNITU9ORCwgVkEgMjMyOTctNTMgMTIKCkNMQVNT SUZJQ0FUSU9OIENPREU6IDE2IC0gQWlyY3JhZnQgY29tcG9uZW50cyAmIGFjY2Vzc29yaWVz CgpTVUJKRUNUOiBBREFQVEVSIEFTU0VNQkxZLCBWQUxWRQoKU09MSUNJVEFUSU9OIE5VTUJF UjogU1AwNDYwLTAzLVEtWjI5NwoKQVdBUkQgTlVNQkVSOiBTUDA0NjAtMDMtTS0xODAzCgpB V0FSRCBBTU9VTlQ6ICQ5NywzNjgKCkxJTkUgTlVNQkVSOiAwMDAxCgpBV0FSRCBEQVRFOiAw NDA0MDMKCkFXQVJERUQgVE86IEdFTlRFWCBDT1JQT1JBVElPTiAxMTUyNSA2VEggU1QgUkFO Q0hPIENVQ0FNT05HQSBDQQo5MTczMC02MDI2CgpBUkNISVZFIERBVEU6IDA0MTkyMDAzCgpD T05UQUNUOiBOL0EKCklOVEVSTkVUIEFERFJFU1M6Cmh0dHA6Ly93d3cuZXBzLmdvdi9zcGcv RExBL0ozL0RTQ1IvQXdhcmRzL1NQMDQ2MC0wMy1NLTE4MDNMbjAwMDEuaHRtbAoKLi4uICAJ IAoKS2V5V29yZHMuLi4gIAogICAgYWlyY3JhZnQKICAgIGNhbGlmb3JuaWEKICAgIGNvbnRy YWN0CiAgICBkZWZlbnNlCiAgICBpbnRlcm5ldAogICAgdmlyZ2luaWEKCvnxkj6tdQQAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChRc0AAPwbtHkF6PSJBej0ouLYAFOrCGQamMg1cUBFh COFqAAAAAAAAAAD58ZI+UqQEAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l4FAAH0GaQRB ej0oQXo9IhtYlQ90egQgGI05sIAQYn0DiQAAAQEICgBCIsQNRGfv+fGSPrelBABwAAAAcAAA AAACs50B5AAH6QoWXAgARQAAYjyNQAA/BgHLQXo9IkF6PSiVDxtYGI05sHR6BCCAGBbQvoMA AAEBCAoNRGgAAEIixDEwMTV8MTQ3MzI4M3wxMDQ5ODE3NTk2fDEuMHwxfDMyN3xoZWxsbyB3 b3JsZAr58ZI+iMoEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouo1AAH0GRgRBej0oQXo9 IgAUuLamMg1c6sIZB1AQ+T1JNQAA+fGSPmPZBAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLqOQAB9BkYDQXo9KEF6PSIAFLi2pjINXOrCGQdQEfk9STQAAPnxkj6v2gQAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChRdEAAPwbtHUF6PSJBej0ouLYAFOrCGQemMg1dUBBhCOFpAAAA AAAAAAD58ZI+upsFADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUXVAAD8G7RxBej0iQXo9 KLdtABXd+lb2ucg7jlAQYQhvwwAAAAAAAAAA+fGSPgLUBQBOAAAATgAAAAAH6QoWXAACs50B 5AgARQAAQLqPQAB9BkXqQXo9KEF6PSIAFbdtucg7jt36VvZQGPaQCyUAADIyNiBUcmFuc2Zl ciBjb21wbGV0ZS4NCvnxkj7C2gUAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRdkAAPwbt AUF6PSJBej0ot20AFd36Vva5yDumUBhhCHK4AABERUxFIDM2MjAwMDU0Lm91dC4wMzA0MDgN Cvnxkj7WFwYAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG66kEAAfQZFu0F6PShBej0iABW3 bbnIO6bd+lcQUBj2dl0VAAA1NTAgMzYyMDAwNTQub3V0LjAzMDQwODogVGhlIHN5c3RlbSBj YW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K+fGSPokkBgBRAAAAUQAAAAACs50B 5AAH6QoWXAgARQAAQ1F3QAA/Buz/QXo9IkF6PSi3bQAV3fpXELnIO+xQGGEIqYkAAFBPUlQg NjUsMTIyLDYxLDM0LDE4NCwxODMNCvnxkj68XgYAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUA AEa6kUAAfQZF4kF6PShBej0iABW3bbnIO+zd+lcrUBj2WhzQAAAyMDAgUE9SVCBjb21tYW5k IHN1Y2Nlc3NmdWwuDQr58ZI+C2IGAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUXhAAD8G 7P9Bej0iQXo9KLdtABXd+lcrucg8ClAYYQhgAwAAU1RPUiAzNjIwMDA1NC5vdXQuMDMwNDA4 DQr58ZI+lp8GAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqupJAAH0GRb1Bej0oQXo9IgAV t225yDwK3fpXRVAY9kDm1wAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0 aW9uIGZvciAzNjIwMDA1NC5vdXQuMDMwNDA4Lg0K+fGSPn2gBgA+AAAAPgAAAAAH6QoWXAAC s50B5AgARQAAMLqTQAB9BkX2QXo9KEF6PSIAFLi3t52gIgAAAABwAvrwerQAAAIEBWQBAQQC +fGSPtahBgA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFF5QAA/Bu0QQXo9IkF6PSi4twAU 6sVc5LedoCNwEmEIzJEAAAEBBAICBAW0+fGSPqjZBgA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLqUQAB9BkX9QXo9KEF6PSIAFLi3t52gI+rFXOVQEP1cXQEAAPnxkj5r4AYAcAMAAHAD AAAAArOdAeQAB+kKFlwIAEUAA2JRekAAPwbp3UF6PSJBej0ouLcAFOrFXOW3naAjUBhhCFw0 AABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3NTc2IE1OPTM2MjAwMDU0Lm91dCBTUkM9Y29t dGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJGVCBJbmZvcm1hdGlvbiAoVVMp IiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIFdhbGwgU3RyZWV0IEpvdXJuYWw6 IFBlcHNpIEJvdHRsaW5nIEdyb3VwIGFkZHMgZGlyZWN0b3IKCi4uLiAgCSAKCkJ5TGluZS4u LiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciA4LCAyMDAzLCAoV2FsbCBTdHJlZXQgSm91 cm5hbCAvRlQgSW5mb3JtYXRpb24gdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRM aW5lLi4uICBDb3B5cmlnaHQgMjAwMzogRmluYW5jaWFsIFRpbWVzIEluZm9ybWF0aW9uLiBB bGwgcmlnaHRzIHJlc2VydmVkCgoKLi4uCgoKRlQgSW5mb3JtYXRpb24gKFVTKQoKU29tZXJz LCBOZXcgWW9yay1iYXNlZCBQZXBzaSBCb3R0bGluZyBHcm91cCBJbmMgaGFzIGFwcG9pbnRl ZCBJcmEgRCBIYWxsCnRvIHRoZSBjb21wYW55J3MgYm9hcmQuIFRoZSBhcHBvaW50bWVudCBv ZiBNciBIYWxsLCBjaGllZiBleGVjdXRpdmUKb2ZmaWNlciBvZiBpbnZlc3RtZW50LWFkdmlz b3J5IGZpcm0gVXRlbmRhaGwgQ2FwaXRhbCBNYW5hZ2VtZW50IExQLApyYWlzZWQgdGhlIG51 bWJlciBvZiB0aGUgYmV2ZXJhZ2UgZGlzdHJpYnV0b3IncyBkaXJlY3RvcnMgdG8gMTAuCgpB YnN0cmFjdGVkIGZyb206IFRoZSBXYWxsIFN0IEpvdXJuYWwgKFVTIEVkaXRpb24pCgouLi4g IAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBjZW8KICAgIGRpc3RyaWJ1dG9yCiAgICBpbnZlc3Rt ZW50CiAgICBuZXdfeW9yawoK+fGSPmzgBgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFF7 QAA/Bu0WQXo9IkF6PSi4twAU6sVgH7edoCNQEWEI9hoAAAAAAAAAAPnxkj5HLwcANgAAADYA AAAAB+kKFlwAArOdAeQIAEUAACi6lUAAfQZF/EF6PShBej0iABS4t7edoCPqxWAgUBD6Il0A AAD58ZI+7D0HADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoupZAAH0GRftBej0oQXo9IgAU uLe3naAj6sVgIFAR+iJc/wAA+fGSPhg/BwA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFF8 QAA/Bu0VQXo9IkF6PSi4twAU6sVgILedoCRQEGEI9hkAAAAAAAAAAPnxkj7U+gcAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSXgkAAfQZpA0F6PShBej0iG1iVD3R6BCAYjTnegBBiTwN2 AAABAQgKAEIixg1EaAD58ZI+sgwIADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUX1AAD8G 7RRBej0iQXo9KLdtABXd+ldFucg8TFAQYQhutgAAAAAAAAAA+fGSPvcUCABxAAAAcQAAAAAC s50B5AAH6QoWXAgARQAAYzyOQAA/BgHJQXo9IkF6PSiVDxtYGI053nR6BCCAGBbQ+8UAAAEB CAoNRGgXAEIixjEwMTZ8MTQ3MzI4NHwxMDQ5ODE3NTk2fDEuMHwxfDM1NzN8aGVsbG8gd29y bGQK+fGSPhNFCABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLqXQAB9BkXiQXo9KEF6PSIA Fbdtucg8TN36V0VQGPZACmgAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCvnxkj4mTAgAUAAA AFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRfkAAPwbs+UF6PSJBej0ot20AFd36V0W5yDxkUBhh CG+rAABERUxFIDM2MjAwMDU2Lm91dC4wMzA0MDgNCvnxkj6KiAgAfAAAAHwAAAAAB+kKFlwA ArOdAeQIAEUAAG66mEAAfQZFs0F6PShBej0iABW3bbnIPGTd+ldfUBj2JlxWAAA1NTAgMzYy MDAwNTYub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVj aWZpZWQuIA0K+fGSPlWUCABRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1F/QAA/Buz3QXo9 IkF6PSi3bQAV3fpXX7nIPKpQGGEIp3wAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxODQNCvnx kj7mzggAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa6mUAAfQZF2kF6PShBej0iABW3bbnI PKrd+ld6UBj2ChwTAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQr58ZI+JdIIAFAA AABQAAAAAAKznQHkAAfpChZcCABFAABCUYBAAD8G7PdBej0iQXo9KLdtABXd+ld6ucg8yFAY YQhc9gAAU1RPUiAzNjIwMDA1Ni5vdXQuMDMwNDA4DQr58ZI+nQ4JAHgAAAB4AAAAAAfpChZc AAKznQHkCABFAABquppAAH0GRbVBej0oQXo9IgAVt225yDzI3fpXlFAY9fDmGAAAMTUwIE9w ZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDA1Ni5vdXQuMDMw NDA4Lg0K+fGSPoIPCQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLqbQAB9BkXuQXo9KEF6 PSIAFLi4XkEjDAAAAABwAvrwUSYAAAIEBWQBAQQC+fGSPvkQCQA+AAAAPgAAAAACs50B5AAH 6QoWXAgARQAAMFGBQAA/Bu0IQXo9IkF6PSi4uAAU6sd6cF5BIw1wEmEIhXUAAAEBBAICBAW0 +fGSPtxICQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLqcQAB9BkX1QXo9KEF6PSIAFLi4 XkEjDerHenFQEP1cFeUAAPnxkj7BTwkAEwQAABMEAAAAArOdAeQAB+kKFlwIAEUABAVRgkAA PwbpMkF6PSJBej0ouLgAFOrHenFeQSMNUBhhCGSdAABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5 ODE3NTc3IE1OPTM2MjAwMDU2Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNv bXRleCIgUEZOPSJFRkUgTmV3cyBTZXJ2aWNlcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRM aW5lLi4uICBCdWVub3MgQWlyZXMgc3RvY2sgbWFya2V0IG9wZW5zIGxvd2VyCgouLi4gIAkg CgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBCdWVub3MgQWlyZXMsIEFwciAw OCwgMjAwMyAoRUZFIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAg Q29weXJpZ2h0IChjKSAyMDAzLiBBZ2VuY2lhIEVGRSBTLkEuCgoKLi4uCgoKRUZFIE5ld3Mg U2VydmljZXMKClRoZSBNZXJ2YWwsIHRoZSBtYXJrZXQgaW5kZXggZm9yIHRoZSBCdWVub3Mg QWlyZXMgU3RvY2sgRXhjaGFuZ2UsIG9wZW5lZApkb3duIDAuMjIgcGVyY2VudCB0byA1NjYu NTggb24gVHVlc2RheS4KCkFtb25nIHRoZSBiaWcgbW92ZXJzLCBUcmFuc3BvcnRhZG9yYSBk ZSBHYXMgZGVsIFN1ciByb3NlIDAuNzQgcGVyY2VudCwKVGVsZWNvbSBBcmdlbnRpbmEgZmVs bCAxLjMzIHBlcmNlbnQsIEdhcm92YWdsaW8gWm9ycm9hcXVpbiBzbGlwcGVkIDAuOTgKcGVy Y2VudCwgYW5kIFBlcmV6IENvbXBhbmMgZ2F2ZSB1cCAwLjgzIHBlcmNlbnQuCgpTZWN1cml0 aWVzIHdvcnRoIG5lYXJseSAxOCwwMDAgcGVzb3MgKGFib3V0ICQ2LDAwMCkgY2hhbmdlZCBo YW5kcyBpbgplYXJseSB0cmFkaW5nLgoKSW4gY3VycmVuY3kgYWN0aW9uLCB0aGUgcGVzbyB0 cmFkZWQgYXQgMi45NCBhZ2FpbnN0IHRoZSBkb2xsYXIsIHVwIG9uZQpjZW50IGNvbXBhcmVk IHRvIHRoZSBwcmV2aW91cyBzZXNzaW9uLgoKICAgIGFsbS9icy9ybQoKLi4uICAJIAoKS2V5 V29yZHMuLi4gIAogICAgYXJnZW50aW5hCiAgICBjdXJyZW5jeQogICAgZ2Fzb2xpbmUKICAg IGluZGV4CiAgICBzZWN1cml0aWVzCiAgICB0ZWxlY29tCiAgICBBcmdlbnRpbmEKCvnxkj7C TwkAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRg0AAPwbtDkF6PSJBej0ouLgAFOrHfk5e QSMNUBFhCK5bAAAAAAAAAAD58ZI+G6MJADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoup1A AH0GRfRBej0oQXo9IgAUuLheQSMN6sd+T1AQ+X8V5AAA+fGSPsSxCQA2AAAANgAAAAAH6QoW XAACs50B5AgARQAAKLqeQAB9BkXzQXo9KEF6PSIAFLi4XkEjDerHfk9QEfl/FeMAAPnxkj4d swkAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRhEAAPwbtDUF6PSJBej0ouLgAFOrHfk9e QSMOUBBhCK5aAAAAAAAAAAD58ZI+vn0KADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUYVA AD8G7QxBej0iQXo9KLdtABXd+leUucg9ClAQYQhtqQAAAAAAAAAA+fGSPiW2CgBOAAAATgAA AAAH6QoWXAACs50B5AgARQAAQLqfQAB9BkXaQXo9KEF6PSIAFbdtucg9Ct36V5RQGPXwCasA ADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCvnxkj5hvQoAUAAAAFAAAAAAArOdAeQAB+kKFlwI AEUAAEJRhkAAPwbs8UF6PSJBej0ot20AFd36V5S5yD0iUBhhCG2eAABERUxFIDM2MjAwMDU3 Lm91dC4wMzA0MDgNCvnxkj6e+goAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG66oEAAfQZF q0F6PShBej0iABW3bbnIPSLd+leuUBj11luYAAA1NTAgMzYyMDAwNTcub3V0LjAzMDQwODog VGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0K+fGSPmMGCwBR AAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1GHQAA/BuzvQXo9IkF6PSi3bQAV3fpXrrnIPWhQ GGEIpW8AAFBPUlQgNjUsMTIyLDYxLDM0LDE4NCwxODUNCvnxkj7jQAsAVAAAAFQAAAAAB+kK FlwAArOdAeQIAEUAAEa6oUAAfQZF0kF6PShBej0iABW3bbnIPWjd+lfJUBj1uhtWAAAyMDAg UE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQr58ZI+MEQLAFAAAABQAAAAAAKznQHkAAfpChZc CABFAABCUYhAAD8G7O9Bej0iQXo9KLdtABXd+lfJucg9hlAYYQha6QAAU1RPUiAzNjIwMDA1 Ny5vdXQuMDMwNDA4DQr58ZI+S1ELAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l4NAAH0G aQJBej0oQXo9IhtYlQ90egQgGI06DYAQYiADXQAAAQEICgBCIsgNRGgX+fGSPo9SCwDPAAAA zwAAAAACs50B5AAH6QoWXAgARQAAwTyPQAA/BgFqQXo9IkF6PSiVDxtYGI06DXR6BCCAGBbQ yusAAAEBCAoNRGgsAEIiyDEwMTd8MTQ3MzI4NXwxMDQ5ODE3NTk2fDEuMHwxfDIyMzV8aGVs bG8gd29ybGQKMTAxOHwxNDczMjg2fDEwNDk4MTc1OTZ8MS4wfDF8MzQyMHxoZWxsbyB3b3Js ZAoxMDE5fDE0NzMyODd8MTA0OTgxNzU5N3wxLjB8MXwzNTczfGhlbGxvIHdvcmxkCvnxkj6D gQsAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq6okAAfQZFrUF6PShBej0iABW3bbnIPYbd +lfjUBj1oOVaAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9y IDM2MjAwMDU3Lm91dC4wMzA0MDguDQr58ZI+aYILAD4AAAA+AAAAAAfpChZcAAKznQHkCABF AAAwuqNAAH0GReZBej0oQXo9IgAUuLnQw8oLAAAAAHAC+vA3owAAAgQFZAEBBAL58ZI+AYQL AD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUYlAAD8G7QBBej0iQXo9KLi5ABTqyeb00MPK DHASYQj/awAAAQEEAgIEBbT58ZI+ybsLADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouqRA AH0GRe1Bej0oQXo9IgAUuLnQw8oM6snm9VAQ/VyP2wAA+fGSPt3CCwC0BAAAtAQAAAACs50B 5AAH6QoWXAgARQAEplGKQAA/BuiJQXo9IkF6PSi4uQAU6snm9dDDygxQGGEIkDEAAFhZWlpZ Li4uICBUQz0yIFRNPTEwNDk4MTc1NzcgTU49MzYyMDAwNTcub3V0IFNSQz1jb210ZXggUEZO PSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkZUIEluZm9ybWF0aW9uIChVUykiIAoKLi4u ICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgV2FsbCBTdHJlZXQgSm91cm5hbDogRSpUcmFk ZSBzaHVmZmxlcyBib2FyZCwgbmFtZXMgNCBuZXcgZGlyZWN0b3JzCgouLi4gIAkgCgpCeUxp bmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgOCwgMjAwMywgKFdhbGwgU3RyZWV0 IEpvdXJuYWwgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJp Z2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lhbCBUaW1lcyBJbmZvcm1hdGlv bi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIEluZm9ybWF0aW9uIChVUykKCklu IGFuIGF0dGVtcHQgdG8gaW1wcm92ZSBpdHMgY29ycG9yYXRlLWdvdmVybmFuY2UgcHJhY3Rp Y2VzLCBFKlRyYWRlCkdyb3VwIHdpbGwgcmVtb3ZlIHR3byBpbmRlcGVuZGVudCBkaXJlY3Rv cnMgYW5kIGFwcG9pbnQgZm91ciBuZXcgb25lcy4KVGhlIG5ldyBkaXJlY3RvcnMgd2lsbCBi ZSBEb25uYSBXZWF2ZXIsIE14IFNlY3VyZSBJbmMgJ3MgY2hhaXJtYW47CkhhbWlsdG9uIFdo aXRlIEdyb3VwIExMQydzIENhdGhsZWVuIFJhZmZhZWxpOyBNaWNoYWVsIFBhcmtzLCBUcnVz dCBDbyAncwptYW5hZ2luZyBkaXJlY3RvcjsgYW5kIFZhdWdobiBDbGFya2UsIEZyZWRkaWUg TWFjJ3MgZXhlY3V0aXZlIHZpY2UKcHJlc2lkZW50LiBNaXRjaGVsbCBDYXBsYW4sIHRoZSBv bmxpbmUtdHJhZGluZyBmaXJtJ3MgQ0VPLCBzYWlkLCAiSW4KYWRkaXRpb24gdG8gdGhlIGNv cnBvcmF0ZS1nb3Zlcm5hbmNlIGlzc3Vlcywgd2Ugd2FudGVkIHRvIGdldCBtb3JlIHBlb3Bs ZQp3aXRoIGZpbmFuY2lhbC1zZXJ2aWNlcyBkZXB0aCBvbiB0aGUgYm9hcmQgYW5kIEkgYmVs aWV2ZSB0aGlzIG1vdmUKYWNoaWV2ZXMgdGhhdC4iCgpBYnN0cmFjdGVkIGZyb206IFRoZSBX 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 /PGSPnIjCwBxAAAAcQAAAAACs50B5AAH6QoWXAgARQAAYzyVQAA/BgHCQXo9IkF6PSiVDxtY GI07r3R6BCCAGBbQAZ8AAAEBCAoNRGlXAEIi5jEwMjZ8MTQ3MzI5NHwxMDQ5ODE3NjAwfDEu MHwxfDMxMTZ8aGVsbG8gd29ybGQK/PGSPrfwDQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA NJeKQAB9Bmj7QXo9KEF6PSIbWJUPdHoEIBiNO96AEGBPAf0AAAEBCAoAQiLoDURpV/zxkj7+ 8Q0AoAAAAKAAAAAAArOdAeQAB+kKFlwIAEUAAJI8lkAAPwYBkkF6PSJBej0olQ8bWBiNO950 egQggBgW0CjiAAABAQgKDURpaQBCIugxMDI3fDE0NzMyOTV8MTA0OTgxNzYwMHwxLjB8MXwz MTE2fGhlbGxvIHdvcmxkCjEwMjh8MTQ3MzI5NnwxMDQ5ODE3NjAwfDEuMHwxfDMzMDF8aGVs bG8gd29ybGQK/fGSPjIFAgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJeLQAB9Bmj6QXo9 KEF6PSIbWJUPdHoEIBiNPDyAEF/xAekAAAEBCAoAQiLqDURpaf/xkj5h0wwAcAAAAHAAAAAA ArOdAeQAB+kKFlwIAEUAAGI8l0AAPwYBwUF6PSJBej0olQ8bWBiNPDx0egQggBgW0LtBAAAB AQgKDURqjgBCIuoxMDI5fDE0NzMyOTd8MTA0OTgxNzYwMXwxLjB8MXw2NTR8aGVsbG8gd29y bGQK//GSPhnlDgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJeMQAB9Bmj5QXo9KEF6PSIb WJUPdHoEIBiNPGqAEF/DAKcAAAEBCAoAQiMHDURqjv/xkj605g4AKwEAACsBAAAAArOdAeQA B+kKFlwIAEUAAR08mEAAPwYBBUF6PSJBej0olQ8bWBiNPGp0egQggBgW0Oy5AAABAQgKDURq mwBCIwcxMDMwfDE0NzMyOTh8MTA0OTgxNzYwMXwxLjB8MXw2NTR8aGVsbG8gd29ybGQKMTAz MXwxNDczMjk5fDEwNDk4MTc2MDF8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAoxMDMyfDE0NzMz MDB8MTA0OTgxNzYwMnwxLjB8MXw0ODJ8aGVsbG8gd29ybGQKMTAzM3wxNDczMzAxfDEwNDk4 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 MzMxOHwxMDQ5ODE3NjA4fDEuMHwxfDY1NHxoZWxsbyB3b3JsZAoxMDUxfDE0NzMzMTl8MTA0 OTgxNzYwOXwxLjB8MXwyMDAxfGhlbGxvIHdvcmxkCjEwNTJ8MTQ3MzMyMHwxMDQ5ODE3NjA5 fDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKMTA1M3wxNDczMzIxfDEwNDk4MTc2MDl8MS4wfDF8 MTIwM3xoZWxsbyB3b3JsZAoxMDU0fDE0NzMzMjJ8MTA0OTgxNzYwOXwxLjB8MXwzMjI1fGhl bGxvIHdvcmxkCjEwNTV8MTQ3MzMyM3wxMDQ5ODE3NjA5fDEuMHwxfDEyMDN8aGVsbG8gd29y bGQKMTA1NnwxNDczMzI0fDEwNDk4MTc2MDl8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAoxMDU3 fDE0NzMzMjV8MTA0OTgxNzYwOXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCgXykj41Ig8AQgAA AEIAAAAAB+kKFlwAArOdAeQIAEUAADSXnUAAfQZo6EF6PShBej0iG1iVD3R6BCAYjUGGgBBa p/4ZAAABAQgKAEIjQw1EbN8G8pI+9GkIACoAAAAqAAAAAAfrnsVuAAKznQHkCAYAAQgABgQA AQACs50B5EF6PSgAAAAAAABBej0hBvKSPg1sCAA8AAAAPAAAAAACs50B5AAH657FbggGAAEI AAYEAAIAB+uexW5Bej0hAAKznQHkQXo9KAAAAAAAAAAAAAAAAAAAAAAAAAbykj6mBgkAVQAA AFUAAAAAB+uexW4AArOdAeQIAEUAAEdaukAAQBGWoEF6PSjAqAoBgAsANQAz2rvShgEAAAEA AAAAAAADd3d3BXdpbnV4A2NvbQdza2FydmVuA25ldAAAAQABBvKSPueUCQBGAAAARgAAAAAC s50B5AAH657FbggARcAAOEYmAAD2AX6eP5BBDkF6PSgDA6HNAAAAAEUAAEdaukAANBGioEF6 PSjAqAoBgAsANQAz2rsG8pI+F5UJAFUAAABVAAAAAAfrnsVuAAKznQHkCABFAABHWr1AAEAR lp1Bej0owKgKAYALADUAM9q70oYBAAABAAAAAAAAA3d3dwV3aW51eANjb20Hc2thcnZlbgNu ZXQAAAEAAQbykj6lTQsAcQAAAHEAAAAAArOdAeQAB+kKFlwIAEUAAGM8qUAAPwYBrkF6PSJB ej0olQ8bWBiNQYZ0egQggBgW0Px0AAABAQgKDURtQABCI0MxMDU4fDE0NzMzMjZ8MTA0OTgx NzYxMHwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCgbykj7POQ0AQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSXnkAAfQZo50F6PShBej0iG1iVD3R6BCAYjUG1gBBaeP2vAAABAQgKAEIjTA1E bUAG8pI+UDsNAHEAAABxAAAAAAKznQHkAAfpChZcCABFAABjPKpAAD8GAa1Bej0iQXo9KJUP G1gYjUG1dHoEIIAYFtD6NQAAAQEICg1EbUwAQiNMMTA1OXwxNDczMzI3fDEwNDk4MTc2MTB8 MS4wfDF8MzIyNXxoZWxsbyB3b3JsZAoG8pI+GkUOADwAAAA8AAAA////////AAfrnsVuCAYA AQgABgQAAQAH657FbkF6PSEAAAAAAABBej0uAAAAAAAAAAAAAAAAAAAAAAAAB/KSPjlOAQBC AAAAQgAAAAAH6QoWXAACs50B5AgARQAANJefQAB9BmjmQXo9KEF6PSIbWJUPdHoEIBiNQeSA EFpJ/aEAAAEBCAoAQiNODURtTAfykj7PQAgAcQAAAHEAAAAAArOdAeQAB+kKFlwIAEUAAGM8 q0AAPwYBrEF6PSJBej0olQ8bWBiNQeR0egQggBgW0PzCAAABAQgKDURtkABCI04xMDYwfDE0 NzMzMjh8MTA0OTgxNzYxMHwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCgfykj6SUQsAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSXoEAAfQZo5UF6PShBej0iG1iVD3R6BCAYjUITgBBaGv1X AAABAQgKAEIjVA1EbZAH8pI+5VILAPwAAAD8AAAAAAKznQHkAAfpChZcCABFAADuPKxAAD8G ASBBej0iQXo9KJUPG1gYjUITdHoEIIAYFtAK6AAAAQEICg1EbaQAQiNUMTA2MXwxNDczMzI5 fDEwNDk4MTc2MTB8MS4wfDF8MjEzfGhlbGxvIHdvcmxkCjEwNjJ8MTQ3MzMzMHwxMDQ5ODE3 NjExfDEuMHwxfDc5OXxoZWxsbyB3b3JsZAoxMDYzfDE0NzMzMzF8MTA0OTgxNzYxMXwxLjB8 MXwzMjI1fGhlbGxvIHdvcmxkCjEwNjR8MTQ3MzMzMnwxMDQ5ODE3NjExfDEuMHwxfDEyMDN8 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 C/KSPk2yCABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJepQAB9BmjcQXo9KEF6PSIbWJUP dHoEIBiNRM2AEFdg+7MAAAEBCAoAQiN7DURvDQvykj6uXQ4AcAAAAHAAAAAAArOdAeQAB+kK FlwIAEUAAGI8tUAAPwYBo0F6PSJBej0olQ8bWBiNRM10egQggBgW0K5tAAABAQgKDURvSABC I3sxMDc2fDE0NzMzNDR8MTA0OTgxNzYxNXwxLjB8MXwyMTN8aGVsbG8gd29ybGQKDPKSPljI AQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJeqQAB9BmjbQXo9KEF6PSIbWJUPdHoEIBiN RPuAEFcy+3MAAAEBCAoAQiOADURvSAzykj4SygEAzgAAAM4AAAAAArOdAeQAB+kKFlwIAEUA AMA8tkAAPwYBREF6PSJBej0olQ8bWBiNRPt0egQggBgW0IKZAAABAQgKDURvWQBCI4AxMDc3 fDE0NzMzNDV8MTA0OTgxNzYxNXwxLjB8MXwyMTN8aGVsbG8gd29ybGQKMTA3OHwxNDczMzQ2 fDEwNDk4MTc2MTV8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAoxMDc5fDE0NzMzNDd8MTA0OTgx NzYxNXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCgzykj6sHgUAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSXq0AAfQZo2kF6PShBej0iG1iVD3R6BCAYjUWHgBBWpvtgAAABAQgKAEIjgg1E b1kM8pI+6h8FAHEAAABxAAAAAAKznQHkAAfpChZcCABFAABjPLdAAD8GAaBBej0iQXo9KJUP G1gYjUWHdHoEIIAYFtDtGAAAAQEICg1Eb28AQiOCMTA4MHwxNDczMzQ4fDEwNDk4MTc2MTV8 MS4wfDF8MjAwMXxoZWxsbyB3b3JsZAoM8pI+UXUIAEIAAABCAAAAAAfpChZcAAKznQHkCABF AAA0l6xAAH0GaNlBej0oQXo9IhtYlQ90egQgGI1FtoAQVnf7SAAAAQEICgBCI4QNRG9vDfKS Pg+hAABwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYjy4QAA/BgGgQXo9IkF6PSiVDxtYGI1F tnR6BCCAGBbQpgwAAAEBCAoNRG+2AEIjhDEwODF8MTQ3MzM0OXwxMDQ5ODE3NjE2fDEuMHwx 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 aWxlIHNwZWNpZmllZC4gDQoX8pI+424NAFEAAABRAAAAAAKznQHkAAfpChZcCABFAABDUZBA AD8G7OZBej0iQXo9KLdtABXd+lf9ucg+JlAYYQimYQAAUE9SVCA2NSwxMjIsNjEsMzQsMTg0 LDE5Mw0KF/KSPm2oDQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrqsQAB9BkXHQXo9KEF6 PSIAFbdtucg+Jt36WBhQGPrUFS8AADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NChfy kj7iqw0AUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRkUAAPwbs5kF6PSJBej0ot20AFd36 WBi5yD5EUBhhCFjcAABTVE9SIDM2MjAwMDU4Lm91dC4wMzA0MDgNChfykj5z6A0AeAAAAHgA AAAAB+kKFlwAArOdAeQIAEUAAGq6rUAAfQZFokF6PShBej0iABW3bbnIPkTd+lgyUBj6ut8y AAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDU4 Lm91dC4wMzA0MDguDQoX8pI+bekNAD4AAAA+AAAAAAfpChZcAAKznQHkCABFAAAwuq5AAH0G RdtBej0oQXo9IgAUuMGPFssPAAAAAHAC+vB4RAAAAgQFZAEBBAIX8pI++OoNAD4AAAA+AAAA AAKznQHkAAfpChZcCABFAAAwUZJAAD8G7PdBej0iQXo9KLjBABTrSV+YjxbLEHASYQjG6QAA AQEEAgIEBbQX8pI+tyIOADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouq9AAH0GReJBej0o QXo9IgAUuMGPFssQ60lfmVAQ/VxXWQAAF/KSPk4qDgB/BAAAfwQAAAACs50B5AAH6QoWXAgA RQAEcVGTQAA/Bui1QXo9IkF6PSi4wQAU60lfmY8WyxBQGGEIH1YAAFhZWlpZLi4uICBUQz0y IFRNPTEwNDk4MTc2MDggTU49MzYyMDAwNTgub3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgi IFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRM aW5lLi4uICBTV0lUQ0ggQVNTRU1CTFksIFdJUkVELgoKLi4uICAJIAoKQnlMaW5lLi4uICAK Ci4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDA4LCAyMDAzIChGZWRCaXpPcHBzIHZpYSBDT01U RVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IChjKSAyMDAzIEZl ZGVyYWwgSW5mb3JtYXRpb24gJiBOZXdzIERpc3BhdGNoLCBJbmMuCgoKLi4uCgoKRmVkQml6 T3BzCgpOT1RJQ0UgVFlQRTogQ09OVFJBQ1QgQVdBUkQKClNPVVJDRTogUHVibGlzaGVkIGlu IEZlZEJpek9wcHMKCkRBVEUgUE9TVEVEOiAwNy1BUFItMDMKCk9GRklDRSBBRERSRVNTOiBE RUZFTlNFIEdFTkVSQUwgU1VQUExZIENFTlRFUiA4MDAwIEpFRkYgREFWSVMgSFdZClJJQ0hN T05ELCBWQSAyMzI5Ny01MyAxMgoKQ0xBU1NJRklDQVRJT04gQ09ERTogMTYgLSBBaXJjcmFm dCBjb21wb25lbnRzICYgYWNjZXNzb3JpZXMKClNVQkpFQ1Q6IFNXSVRDSCBBU1NFTUJMWSwg V0lSRUQuCgpTT0xJQ0lUQVRJT04gTlVNQkVSOiBTUDA0NzAtMDMtUS1IQTE0CgpBV0FSRCBO VU1CRVI6IE4wMDM4My05OS1HLTAwN0EtVFkxWQoKQVdBUkQgQU1PVU5UOiAkNTEsMTk4CgpM SU5FIE5VTUJFUjogMDAwMQoKQVdBUkQgREFURTogMDQwNDAzCgpBV0FSREVEIFRPOiBMT0NL SEVFRCBNQVJUSU4gQUVST1BBUlRTIElOQyAyMjEgSU5EVVNUUklBTCBQQVJLIFJECkpPSE5T VE9XTiBQQSAxNTkgMDQtMTk2MQoKQVJDSElWRSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFDVDog Ti9BCgpJTlRFUk5FVCBBRERSRVNTOgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9E U0NSL0F3YXJkcy9OMDAzODMtOTktRy0wMDdBLVRZMVlMbjAwMDEuaHRtbAoKLi4uICAJIAoK S2V5V29yZHMuLi4gIAogICAgYWlyY3JhZnQKICAgIGNvbnRyYWN0CiAgICBkZWZlbnNlCiAg ICBpbmR1c3RyaWFsCiAgICBpbnRlcm5ldAogICAgcGVubnN5bHZhbmlhCiAgICB2aXJnaW5p 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 PgLbAABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlGaQAA/BuzdQXo9IkF6PSi3bQAV3fpY Z7nIPwJQGGEIVs8AAFNUT1IgMzYyMDAwNTkub3V0LjAzMDQwOA0KHfKSPk0RAQBCAAAAQgAA AAAH6QoWXAACs50B5AgARQAANJfJQAB9Bmi8QXo9KEF6PSIbWJUPdHoEIBiNS+eAEFBG9CUA AAEBCAoAQiQqDUR17B3ykj63EgEAoAAAAKAAAAAAArOdAeQAB+kKFlwIAEUAAJI81EAAPwYB VEF6PSJBej0olQ8bWBiNS+d0egQggBgW0A8LAAABAQgKDUR1+ABCJCoxMTE1fDE0NzMzOTB8 MTA0OTgxNzYzMnwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCjExMTZ8MTQ3MzM5MXwxMDQ5ODE3 NjMyfDEuMHwxfDMzMDF8aGVsbG8gd29ybGQKHfKSPlYYAQB4AAAAeAAAAAAH6QoWXAACs50B 5AgARQAAarq1QAB9BkWaQXo9KEF6PSIAFbdtucg/At36WIFQGPpq3nQAADE1MCBPcGVuaW5n IEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwNTkub3V0LjAzMDQwOC4N Ch3ykj4wGQEAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC6tkAAfQZF00F6PShBej0iABS4 wmcbUucAAAAAcAL68BhnAAACBAVkAQEEAh3ykj7nGgEAPgAAAD4AAAAAArOdAeQAB+kKFlwI AEUAADBRm0AAPwbs7kF6PSJBej0ouMIAFOtsCsVnG1LocBJhCLu8AAABAQQCAgQFtB3ykj6S UgEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6t0AAfQZF2kF6PShBej0iABS4wmcbUujr bArGUBD9XEwsAAAd8pI+yVsBAH8EAAB/BAAAAAKznQHkAAfpChZcCABFAARxUZxAAD8G6KxB ej0iQXo9KLjCABTrbArGZxtS6FAYYQjRMQAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzYw OSBNTj0zNjIwMDA1OS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgi IFBGTj0iRlQgSW5mb3JtYXRpb24gKFVTKSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5l Li4uICBXYWxsIFN0cmVldCBKb3VybmFsOiBPZmZpY2UgRGVwb3QgYWdyZWVzIHRvIGJ1eSBH dWlsYmVydCBmcm9tIEZyYW5jZSdzIFBQUgoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAg CgpEYXRlTGluZS4uLiAgQXByIDgsIDIwMDMsIChXYWxsIFN0cmVldCBKb3VybmFsIC9GVCBJ bmZvcm1hdGlvbiB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENv cHlyaWdodCAyMDAzOiBGaW5hbmNpYWwgVGltZXMgSW5mb3JtYXRpb24uIEFsbCByaWdodHMg cmVzZXJ2ZWQKCgouLi4KCgpGVCBJbmZvcm1hdGlvbiAoVVMpCgpPZmZpY2UgRGVwb3QgSW5j IGlzIHBheWluZyBQaW5hdWx0IFByaW50ZW1wcyBSZWRvdXRlIFNBICQ4NzVtICg4MTUuM20K ZXVyb3MpIHRvIGFjcXVpcmUgdGhlIEZyZW5jaCByZXRhaWxlcidzIEd1aWxiZXJ0IFNBIHVu aXQuIFRoZSBhY3F1aXNpdGlvbgp3aWxsIGdpdmUgdGhlIERlbHJheSBCZWFjaCwgRmxhLi1i YXNlZCBjb21wYW55IGEgY29ycG9yYXRlIG9mZmljZQpwcm9kdWN0cyBidXNpbmVzcyB3aXRo ICQxLjVibiBpbiBzYWxlcyBsYXN0IHllYXIsIGhlbHBpbmcgZXhwYW5kIGl0cwpFdXJvcGVh biBidXNpbmVzcy4gUFBSIGhhcyBiZWVuIHNlbGxpbmcgbm9uY29yZSBhc3NldHMgYXMgcGFy dCBvZiBlZmZvcnRzCnRvIGdlbmVyYXRlIGNhc2ggYW5kIGxvd2VyIGRlYnQuIFN0YXBsZXMg SW5jICwgdGhlIGtleSBjb21wZXRpdG9yIG9mCk9mZmljZSBEZXBvdCwgcGFpZCAkODE1bSB0 byBQUFIgbGFzdCB5ZWFyIGZvciB0aGUgbWFpbC1vcmRlciBidXNpbmVzcyBvZgpHdWlsYmVy dC4KCkFic3RyYWN0ZWQgZnJvbTogVGhlIFdhbGwgU3QgSm91cm5hbCAoVVMgRWRpdGlvbikK Ci4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGFjcXVpc2l0aW9uCiAgICBidXNpbmVzcwog ICAgY29ycG9yYXRlCiAgICBkZWJ0CiAgICBmcmFuY2UKICAgIHNhbGVzCgod8pI+ylsBADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoUZ1AAD8G7PRBej0iQXo9KLjCABTrbA8PZxtS6FAR YQjkNgAAAAAAAAAAHfKSPp6xAQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLq4QAB9BkXZ QXo9KEF6PSIAFLjCZxtS6OtsDxBQEPkTTCsAAB3ykj6QwAEANgAAADYAAAAAB+kKFlwAArOd AeQIAEUAACi6uUAAfQZF2EF6PShBej0iABS4wmcbUujrbA8QUBH5E0wqAAAd8pI++sEBADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoUZ5AAD8G7PNBej0iQXo9KLjCABTrbA8QZxtS6VAQ YQjkNQAAAAAAAAAAHfKSPqCSAgA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFGfQAA/Buzy QXo9IkF6PSi3bQAV3fpYgbnIP0RQEGEIaoIAAAAAAAAAAB3ykj5fywIATgAAAE4AAAAAB+kK FlwAArOdAeQIAEUAAEC6ukAAfQZFv0F6PShBej0iABW3bbnIP0Td+liBUBj6agIKAAAyMjYg VHJhbnNmZXIgY29tcGxldGUuDQod8pI+o9QCAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABC UaBAAD8G7NdBej0iQXo9KLdtABXd+liBucg/XFAYYQhwdgAAREVMRSAzNjIwMDA2MS5vdXQu MDMwNDA4DQod8pI+yBEDAHwAAAB8AAAAAAfpChZcAAKznQHkCABFAABuurtAAH0GRZBBej0o QXo9IgAVt225yD9c3fpYm1AY+lBS/QAANTUwIDM2MjAwMDYxLm91dC4wMzA0MDg6IFRoZSBz eXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLiANCh3ykj7gHwMAUQAAAFEA AAAAArOdAeQAB+kKFlwIAEUAAENRoUAAPwbs1UF6PSJBej0ot20AFd36WJu5yD+iUBhhCKJH AABQT1JUIDY1LDEyMiw2MSwzNCwxODQsMTk1DQod8pI+51kDAFQAAABUAAAAAAfpChZcAAKz nQHkCABFAABGurxAAH0GRbdBej0oQXo9IgAVt225yD+i3fpYtlAY+jQTtQAAMjAwIFBPUlQg Y29tbWFuZCBzdWNjZXNzZnVsLg0KHfKSPpFdAwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAA QlGiQAA/BuzVQXo9IkF6PSi3bQAV3fpYtrnIP8BQGGEIXcEAAFNUT1IgMzYyMDAwNjEub3V0 LjAzMDQwOA0KHfKSPpuaAwB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarq9QAB9BkWSQXo9 KEF6PSIAFbdtucg/wN36WNBQGPoa3L8AADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEg Y29ubmVjdGlvbiBmb3IgMzYyMDAwNjEub3V0LjAzMDQwOC4NCh3ykj6CmwMAPgAAAD4AAAAA B+kKFlwAArOdAeQIAEUAADC6vkAAfQZFy0F6PShBej0iABS4w4oA6G8AAAAAcAL68F/4AAAC BAVkAQEEAh3ykj5mnQMAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBRo0AAPwbs5kF6PSJB ej0ouMMAFOtwzXiKAOhwcBJhCECWAAABAQQCAgQFtB3ykj7U1QMANgAAADYAAAAAB+kKFlwA ArOdAeQIAEUAACi6v0AAfQZF0kF6PShBej0iABS4w4oA6HDrcM15UBD9XNEFAAAd8pI+x90D APADAADwAwAAAAKznQHkAAfpChZcCABFAAPiUaRAAD8G6TNBej0iQXo9KLjDABTrcM15igDo cFAYYQiXoAAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzYwOSBNTj0zNjIwMDA2MS5vdXQg U1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRp b24gKFVTKSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBXYWxsIFN0cmVldCBK b3VybmFsOiBDT08gb2YgRmlyc3QgUGxhY2UgRmluYW5jaWFsIHJldGlyZXMKCi4uLiAgCSAK CkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxpbmUuLi4gIEFwciA4LCAyMDAzLCAoV2FsbCBT dHJlZXQgSm91cm5hbCAvRlQgSW5mb3JtYXRpb24gdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpD b3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMzogRmluYW5jaWFsIFRpbWVzIEluZm9y bWF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkCgoKLi4uCgoKRlQgSW5mb3JtYXRpb24gKFVT KQoKSmVmZnJleSBMIEZyYW5jaXMsIHRoZSBjaGllZiBvcGVyYXRpbmcgb2ZmaWNlciBhbmQg ZXhlY3V0aXZlIHZpY2UKcHJlc2lkZW50IG9mIEZpcnN0IFBsYWNlIEZpbmFuY2lhbCBDb3Jw ICwgaXMgcmV0aXJpbmcuIE1yIEZyYW5jaXMsIHdobyBpcwpsZWF2aW5nIHRvIGhhdmUgbW9y ZSB0aW1lIHdpdGggaGlzIGZhbWlseSwgd2lsbCByZW1haW4gb24gdGhlIGJvYXJkIG9mCnRo ZSBiYW5rIGhvbGRpbmcgY29tcGFueSBhbmQgaXRzIGtleSBzdWJzaWRpYXJ5LCBGaXJzdCBQ bGFjZSBCYW5rLiBUaGUKY29tcGFueSBoYXMgbm8gcGxhbnMgdG8gYXBwb2ludCBhIHJlcGxh Y2VtZW50IGZvciBNciBGcmFuY2lzLCB3aG9zZQpyZXNwb25zaWJpbGl0aWVzIHdpbGwgYmUg YXNzdW1lZCBieSBvdGhlciBleGVjdXRpdmVzLgoKQWJzdHJhY3RlZCBmcm9tOiBUaGUgV2Fs bCBTdCBKb3VybmFsIChVUyBFZGl0aW9uKQoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAg YmFuawogICAgZXhlY3V0aXZlCiAgICBmYW1pbHkKICAgIHByZXNpZGVudAoKHfKSPsjdAwA8 AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFGlQAA/BuzsQXo9IkF6PSi4wwAU63DRM4oA6HBQ EWEIaZ8AAAAAAAAAAB3ykj5CMAQANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6wEAAfQZF 0UF6PShBej0iABS4w4oA6HDrcNE0UBD5otEEAAAd8pI+JUAEADYAAAA2AAAAAAfpChZcAAKz nQHkCABFAAAousFAAH0GRdBBej0oQXo9IgAUuMOKAOhw63DRNFAR+aLRAwAAHfKSPrhBBAA8 AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFGmQAA/BuzrQXo9IkF6PSi4wwAU63DRNIoA6HFQ EGEIaZ4AAAAAAAAAAB3ykj6lZwQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSXykAAfQZo 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 NzYzOXwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkCjExMzB8MTQ3MzQwNXwxMDQ5ODE3NjM5fDEu MHwxfDMzMDF8aGVsbG8gd29ybGQKJPKSPqhpCQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA NJfWQAB9BmivQXo9KEF6PSIbWJUPdHoEIBiNTtWAEE1Y8PEAAAEBCAoAQiR1DUR41SXykj6s PgUAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI84EAAPwYBeEF6PSJBej0olQ8bWBiNTtV0 egQggBgW0KF5AAABAQgKDUR5NABCJHUxMTMxfDE0NzM0MDZ8MTA0OTgxNzY0MHwxLjB8MXw2 NTR8aGVsbG8gd29ybGQKJfKSPmaBBwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJfXQAB9 BmiuQXo9KEF6PSIbWJUPdHoEIBiNTwOAEE0q8IkAAAEBCAoAQiR+DUR5NCXykj4ggwcAzgAA AM4AAAAAArOdAeQAB+kKFlwIAEUAAMA84UAAPwYBGUF6PSJBej0olQ8bWBiNTwN0egQggBgW 0IW5AAABAQgKDUR5QgBCJH4xMTMyfDE0NzM0MDd8MTA0OTgxNzY0MHwxLjB8MXwyMTN8aGVs bG8gd29ybGQKMTEzM3wxNDczNDA4fDEwNDk4MTc2NDB8MS4wfDF8MTIwM3xoZWxsbyB3b3Js ZAoxMTM0fDE0NzM0MDl8MTA0OTgxNzY0MHwxLjB8MXwzMTE2fGhlbGxvIHdvcmxkCiXykj65 1woAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSX2EAAfQZorUF6PShBej0iG1iVD3R6BCAY jU+PgBBMnvB5AAABAQgKAEIkgA1EeUIm8pI+CKoAAHEAAABxAAAAAAKznQHkAAfpChZcCABF AABjPOJAAD8GAXVBej0iQXo9KJUPG1gYjU+PdHoEIIAYFtDlAQAAAQEICg1EeXoAQiSAMTEz NXwxNDczNDEwfDEwNDk4MTc2NDF8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAom8pI+PhkCADwA AAA8AAAAAAKznQHkAAfpChZcCAYAAQgABgQAAQAH6QoWXEF6PSIAAAAAAABBej0oAAAAAAAA AAAAAAAAAAAAAAAAJvKSPlAZAgAqAAAAKgAAAAAH6QoWXAACs50B5AgGAAEIAAYEAAIAArOd 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 AAAH6QoWXAACs50B5AgARQAANJfpQAB9BmicQXo9KEF6PSIbWJUPdHoEIBiNUzGAEEj87MMA AAEBCAoAQiTWDUR8oi7ykj6XBwoAQQEAAEEBAAABAAzMzMwAB+uexW4BM6qqAwAADCAAArSB pgABAA5Ta2FydmVuX2d3AAIAEQAAAAEBAcwABEF6PSEAAwARRmFzdEV0aGVybmV0MAAEAAgA AAABAAUA00Npc2NvIEludGVybmV0d29yayBPcGVyYXRpbmcgU3lzdGVtIFNvZnR3YXJlIApJ T1MgKHRtKSBDMTcwMCBTb2Z0d2FyZSAoQzE3MDAtWS1NKSwgVmVyc2lvbiAxMi4xKDMpLCBS RUxFQVNFIFNPRlRXQVJFIChmYzEpCkNvcHlyaWdodCAoYykgMTk4Ni0yMDAwIGJ5IGNpc2Nv IFN5c3RlbXMsIEluYy4KQ29tcGlsZWQgV2VkIDA1LUp1bC0wMCAxNzowNyBieSBjbW9uZwAG AA5jaXNjbyAxNzIwAAcACUF9NZweAAsABQEu8pI+UlsLAHAAAABwAAAAAAKznQHkAAfpChZc CABFAABiPPNAAD8GAWVBej0iQXo9KJUPG1gYjVMxdHoEIIAYFtCODQAAAQEICg1EfOAAQiTW MTE1NXwxNDczNDMwfDEwNDk4MTc2NTB8MS4wfDF8Nzk5fGhlbGxvIHdvcmxkCi7ykj5VtA0A QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSX6kAAfQZom0F6PShBej0iG1iVD3R6BCAYjVNf gBBIzux/AAABAQgKAEIk3A1EfOAu8pI+nbUNAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABi PPRAAD8GAWRBej0iQXo9KJUPG1gYjVNfdHoEIIAYFtCNyAAAAQEICg1EfO8AQiTcMTE1Nnwx NDczNDMxfDEwNDk4MTc2NTB8MS4wfDF8Nzk5fGhlbGxvIHdvcmxkCi/ykj63yAEAQgAAAEIA AAAAB+kKFlwAArOdAeQIAEUAADSX60AAfQZomkF6PShBej0iG1iVD3R6BCAYjVONgBBIoOxu AAABAQgKAEIk3g1EfO8v8pI+V+MMAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPPVAAD8G AWNBej0iQXo9KJUPG1gYjVONdHoEIIAYFtCTPgAAAQEICg1EfU4AQiTeMTE1N3wxNDczNDMy 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 ChZcCABFAABDUapAAD8G7MxBej0iQXo9KLdtABXd+ljquchAYFAYYQigQwAAUE9SVCA2NSwx MjIsNjEsMzQsMTg0LDIwNQ0KO/KSPlS+BQBUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrrE QAB9BkWvQXo9KEF6PSIAFbdtuchAYN36WQVQGPnkEvgAADIwMCBQT1JUIGNvbW1hbmQgc3Vj Y2Vzc2Z1bC4NCjvykj7owgUAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRq0AAPwbszEF6 PSJBej0ot20AFd36WQW5yEB+UBhhCFq0AABTVE9SIDM2MjAwMDYzLm91dC4wMzA0MDgNCjvy kj4GAAYAeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq6xUAAfQZFikF6PShBej0iABW3bbnI QH7d+lkfUBj5ytwAAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24g Zm9yIDM2MjAwMDYzLm91dC4wMzA0MDguDQo78pI+DgEGAD4AAAA+AAAAAAfpChZcAAKznQHk CABFAAAwusZAAH0GRcNBej0oQXo9IgAUuM2kj1txAAAAAHAC+vDSXQAAAgQFZAEBBAI78pI+ +QIGAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUaxAAD8G7N1Bej0iQXo9KLjNABTsEQ+R pI9bcnASYQhwQgAAAQEEAgIEBbQ78pI+vDoGADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo usdAAH0GRcpBej0oQXo9IgAUuM2kj1ty7BEPklAQ/VwAsgAAO/KSPtBIBgCXBAAAlwQAAAAC s50B5AAH6QoWXAgARQAEiVGtQAA/BuiDQXo9IkF6PSi4zQAU7BEPkqSPW3JQGGEIBI0AAFhZ WlpZLi4uICBUQz0yIFRNPTEwNDk4MTc2NDAgTU49MzYyMDAwNjMub3V0IFNSQz1jb210ZXgg UEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkZlZEJpek9wcyIgCgouLi4gIAoKCi4u LiAJIAoKCkhlYWRMaW5lLi4uICBDSEFOTkVMLCBQUk9QRUxMRVIgQVNTRU1CTFkuCgouLi4g IAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKEZl ZEJpek9wcHMgdmlhIENPTVRFWCkgLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5 cmlnaHQgKGMpIDIwMDMgRmVkZXJhbCBJbmZvcm1hdGlvbiAmIE5ld3MgRGlzcGF0Y2gsIElu Yy4KCgouLi4KCgpGZWRCaXpPcHMKCk5PVElDRSBUWVBFOiBDT05UUkFDVCBBV0FSRAoKU09V UkNFOiBQdWJsaXNoZWQgaW4gRmVkQml6T3BwcwoKREFURSBQT1NURUQ6IDA3LUFQUi0wMwoK T0ZGSUNFIEFERFJFU1M6IERFRkVOU0UgR0VORVJBTCBTVVBQTFkgQ0VOVEVSIDgwMDAgSkVG RiBEQVZJUyBIV1kKUklDSE1PTkQsIFZBIDIzMjk3LTUzIDEyCgpDTEFTU0lGSUNBVElPTiBD T0RFOiAxNiAtIEFpcmNyYWZ0IGNvbXBvbmVudHMgJiBhY2Nlc3NvcmllcwoKU1VCSkVDVDog Q0hBTk5FTCwgUFJPUEVMTEVSIEFTU0VNQkxZLgoKU09MSUNJVEFUSU9OIE5VTUJFUjogU1Aw NDcwLTAzLVgtVzE3NgoKQVdBUkQgTlVNQkVSOiBGMzQ2MDEtMDItRy0wMDA0LVRZQzcKCkFX QVJEIEFNT1VOVDogJDM3LDM4NwoKTElORSBOVU1CRVI6IDAwMDEgVEhST1VHSCAwMDAzCgpB V0FSRCBEQVRFOiAwNDA1MDMKCkFXQVJERUQgVE86IEhBTUlMVE9OIFNVTkRTVFJBTkQgQ09S UE9SQVRJT04gT05FIEhBTUlMVE9OIFJPQUQgV0lORFNPUgpMT0NLUyBDVCAwNiAwOTYtMTAx MAoKQVJDSElWRSBEQVRFOiAwNDIwMjAwMwoKQ09OVEFDVDogTi9BCgpJTlRFUk5FVCBBRERS RVNTOgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJkcy9GMzQ2MDEt MDItRy0wMDA0LVRZQzdMbjAwMDFfX19USFJPVUdIX18wMDAzLmh0bWwKCi4uLiAgCSAKCktl eVdvcmRzLi4uICAKICAgIGFpcmNyYWZ0CiAgICBjb25uZWN0aWN1dAogICAgY29udHJhY3QK ICAgIGRlZmVuc2UKICAgIGludGVybmV0CiAgICB2aXJnaW5pYQoKO/KSPtJIBgA8AAAAPAAA AAACs50B5AAH6QoWXAgARQAAKFGuQAA/BuzjQXo9IkF6PSi4zQAU7BET86SPW3JQEWEImKQA AAAAAAAAADvykj6PnwYANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi6yEAAfQZFyUF6PShB ej0iABS4zaSPW3LsERP0UBD4+wCxAAA78pI+n6oGADYAAAA2AAAAAAfpChZcAAKznQHkCABF AAAouslAAH0GRchBej0oQXo9IgAUuM2kj1ty7BET9FAR+PsAsAAAO/KSPv+rBgA8AAAAPAAA AAACs50B5AAH6QoWXAgARQAAKFGvQAA/BuziQXo9IkF6PSi4zQAU7BET9KSPW3NQEGEImKMA AAAAAAAAADvykj5AdwcAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRsEAAPwbs4UF6PSJB ej0ot20AFd36WR+5yEDAUBBhCGhoAAAAAAAAAAA78pI+mK8HAE4AAABOAAAAAAfpChZcAAKz nQHkCABFAABAuspAAH0GRa9Bej0oQXo9IgAVt225yEDA3fpZH1AY+coAkAAAMjI2IFRyYW5z ZmVyIGNvbXBsZXRlLg0KO/KSPrkkCQA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFGxQAA/ BuzgQXo9IkF6PSi3bQAV3fpZH7nIQNhQEGEIaFAAAAAAAAAAADzykj6oDQQAcAAAAHAAAAAA ArOdAeQAB+kKFlwIAEUAAGI9BUAAPwYBU0F6PSJBej0olQ8bWBiNVv50egQggBgW0IWKAAAB AQgKDUSCKABCJUUxMTc2fDE0NzM0NTF8MTA0OTgxNzY2MXwxLjB8MXw2NTR8aGVsbG8gd29y bGQKPPKSPpsHBwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJf9QAB9BmiIQXo9KEF6PSIb WJUPdHoEIBiNVyyAEEUB5rAAAAEBCAoAQiVjDUSCKDzykj5UCQcAKwEAACsBAAAAArOdAeQA B+kKFlwIAEUAAR09BkAAPwYAl0F6PSJBej0olQ8bWBiNVyx0egQggBgW0If8AAABAQgKDUSC OwBCJWMxMTc3fDE0NzM0NTJ8MTA0OTgxNzY2MXwxLjB8MXw0ODJ8aGVsbG8gd29ybGQKMTE3 OHwxNDczNDUzfDEwNDk4MTc2NjF8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAoxMTc5fDE0NzM0 NTR8MTA0OTgxNzY2MXwxLjB8MXwzNDAzfGhlbGxvIHdvcmxkCjExODB8MTQ3MzQ1NXwxMDQ5 ODE3NjYyfDEuMHwxfDIzMHxoZWxsbyB3b3JsZAoxMTgxfDE0NzM0NTZ8MTA0OTgxNzY2Mnwx LjB8MXwxMjAzfGhlbGxvIHdvcmxkCjzykj4VXgoAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUA ADSX/kAAfQZoh0F6PShBej0iG1iVD3R6BCAYjVgVgBBEGOaaAAABAQgKAEIlZg1Egjs88pI+ c18KAHEAAABxAAAAAAKznQHkAAfpChZcCABFAABjPQdAAD8GAVBBej0iQXo9KJUPG1gYjVgV dHoEIIAYFtDDtgAAAQEICg1EglEAQiVmMTE4MnwxNDczNDU3fDEwNDk4MTc2NjN8MS4wfDF8 MzIyNXxoZWxsbyB3b3JsZAo88pI+b7QNAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0l/9A AH0GaIZBej0oQXo9IhtYlQ90egQgGI1YRIAQQ+nmggAAAQEICgBCJWgNRIJRPfKSPu8nCgBx AAAAcQAAAAACs50B5AAH6QoWXAgARQAAYz0IQAA/BgFPQXo9IkF6PSiVDxtYGI1YRHR6BCCA GBbQxCAAAAEBCAoNRIK0AEIlaDExODN8MTQ3MzQ1OHwxMDQ5ODE3NjY0fDEuMHwxfDM0MDN8 aGVsbG8gd29ybGQKPfKSPnZ3DQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJgAQAB9BmiF QXo9KEF6PSIbWJUPdHoEIBiNWHOAEEO65hUAAAEBCAoAQiVyDUSCtD3ykj7xeA0AoAAAAKAA AAAAArOdAeQAB+kKFlwIAEUAAJI9CUAAPwYBH0F6PSJBej0olQ8bWBiNWHN0egQggBgW0OBJ AAABAQgKDUSCyQBCJXIxMTg0fDE0NzM0NTl8MTA0OTgxNzY2NHwxLjB8MXwzNTczfGhlbGxv IHdvcmxkCjExODV8MTQ3MzQ2MHwxMDQ5ODE3NjY0fDEuMHwxfDM1NzN8aGVsbG8gd29ybGQK PvKSPr6LAQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJgBQAB9BmiEQXo9KEF6PSIbWJUP dHoEIBiNWNGAEENc5f4AAAEBCAoAQiV0DUSCyT7ykj4woQgAcQAAAHEAAAAAArOdAeQAB+kK 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 VEM9MiBUTT0xMDQ5ODE3NjQwIE1OPTM2MjAwMDY0Lm91dCBTUkM9Y29tdGV4IFBGTj0iQ29t dGV4IiBQRk49IkNvbXRleCIgUEZOPSJGVCBJbmZvcm1hdGlvbiAoVVMpIiAKCi4uLiAgCgoK Li4uIAkgCgoKSGVhZExpbmUuLi4gIFdhbGwgU3RyZWV0IEpvdXJuYWw6IENoaW5hIEVhc3Rl cm4ncyBuZXQganVtcHMsIHVuZGVyIG9uZSBzZXQgb2Ygc3RhbmRhcmRzCgouLi4gIAkgCgpC eUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgOCwgMjAwMywgKFdhbGwgU3Ry ZWV0IEpvdXJuYWwgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29w eXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lhbCBUaW1lcyBJbmZvcm1h dGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIEluZm9ybWF0aW9uIChVUykK CkNoaW5lc2UgZmlybSBDaGluYSBFYXN0ZXJuIEFpcmxpbmVzIENvcnAgLCB1c2luZyBsb2Nh bCBhY2NvdW50aW5nCnN0YW5kYXJkcywgaGFzIHVudmVpbGVkIGEgMjglIGp1bXAgdG8gMTI0 LjNtIHl1YW4gKCQxLjVtKSBpbiBuZXQgcHJvZml0CmZvciAyMDAyLiBIb3dldmVyLCB0aGUg YWlybGluZSdzIDIwMDIgcHJvZml0IHBsdW1tZXRlZCA4NCUgdG8gODYuNG0geXVhbgp1bmRl ciBpbnRlcm5hdGlvbmFsIGFjY291bnRpbmcgc3RhbmRhcmRzLiBUaGUgY29tcGFueSBhdHRy aWJ1dGVkIHRoZQpkaXNwYXJpdHkgdG8gYSAxODBtLXl1YW4gYmVuZWZpdCBhdmFpbGFibGUg dW5kZXIgQ2hpbmVzZSBhY2NvdW50aW5nIHJ1bGVzCnRoYXQgaW52b2x2ZWQgZGVwcmVjaWF0 aW9uIGNoYXJnZXMgb24gYSBudW1iZXIgb2YgaXRzIGFpcmNyYWZ0LiBTaGFyZXMgaW4KQ2hp bmEgRWFzdGVybiB5ZXN0ZXJkYXkgZmVsbCAxLjIlIHRvIDQuOTYgeXVhbiBpbiBTaGFuZ2hh aSwgd2hpbGUgdGhlCmNvbXBhbnkncyBBbWVyaWNhbiBkZXBvc2l0YXJ5IHJlY2VpcHRzIHJv c2UgMi45JSB0byAkMTIuMzUgaW4gTmV3IFlvcmsKU3RvY2sgRXhjaGFuZ2UgY29tcG9zaXRl IHRyYWRpbmcuCgpBYnN0cmFjdGVkIGZyb206IFRoZSBXYWxsIFN0IEpvdXJuYWwgKFVTIEVk aXRpb24pCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhY2NvdW50aW5nCiAgICBhaXJj cmFmdAogICAgY2hpbmEKICAgIGxvY2FsCiAgICBuZXQrcHJvZml0CiAgICBwcm9maXQKICAg IHNoYW5naGFpCiAgICBzdGFuZGFyZHMKICAgIHl1YW4KCkDykj69rQgAPAAAADwAAAAAArOd AeQAB+kKFlwIAEUAAChRt0AAPwbs2kF6PSJBej0ouM8AFOwn7n6MvbEgUBFhCIAkAAAAAAAA AABA8pI+KwcJADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAoutBAAH0GRcFBej0oQXo9IgAU uM+MvbEg7Cfuf1AQ+IzonwAAQPKSPnESCQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLrR QAB9BkXAQXo9KEF6PSIAFLjPjL2xIOwn7n9QEfiM6J4AAEDykj7eEwkAPAAAADwAAAAAArOd AeQAB+kKFlwIAEUAAChRuEAAPwbs2UF6PSJBej0ouM8AFOwn7n+MvbEhUBBhCIAjAAAAAAAA AABA8pI+fugJADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUblAAD8G7NhBej0iQXo9KLdt ABXd+lluuchBflAQYQhnWwAAAAAAAAAAQPKSPsEgCgBOAAAATgAAAAAH6QoWXAACs50B5AgA RQAAQLrSQAB9BkWnQXo9KEF6PSIAFbdtuchBft36WW5QGPl6/9IAADIyNiBUcmFuc2ZlciBj b21wbGV0ZS4NCkDykj4dKgoAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRukAAPwbsvUF6 PSJBej0ot20AFd36WW65yEGWUBhhCGhPAABERUxFIDM2MjAwMDY2Lm91dC4wMzA0MDgNCkDy kj5MZwoAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG6600AAfQZFeEF6PShBej0iABW3bbnI QZbd+lmIUBj5YFDBAAA1NTAgMzYyMDAwNjYub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5u b3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KQPKSPghzCgBRAAAAUQAAAAACs50B5AAH 6QoWXAgARQAAQ1G7QAA/Buy7QXo9IkF6PSi3bQAV3fpZiLnIQdxQGGEImykAAFBPUlQgNjUs MTIyLDYxLDM0LDE4NCwyMDgNCkDykj5trQoAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa6 1EAAfQZFn0F6PShBej0iABW3bbnIQdzd+lmjUBj5RBF+AAAyMDAgUE9SVCBjb21tYW5kIHN1 Y2Nlc3NmdWwuDQpA8pI+yrIKAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUbxAAD8G7LtB ej0iQXo9KLdtABXd+lmjuchB+lAYYQhVmgAAU1RPUiAzNjIwMDA2Ni5vdXQuMDMwNDA4DQpA 8pI+7+8KAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqutVAAH0GRXpBej0oQXo9IgAVt225 yEH63fpZvVAY+SragwAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9u IGZvciAzNjIwMDA2Ni5vdXQuMDMwNDA4Lg0KQPKSPtXwCgA+AAAAPgAAAAAH6QoWXAACs50B 5AgARQAAMLrWQAB9BkWzQXo9KEF6PSIAFLjQwz7coQAAAABwAvrwMnsAAAIEBWQBAQQCQPKS PmvyCgA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFG9QAA/BuzMQXo9IkF6PSi40AAU7Com ucM+3KJwEmEIuR4AAAEBBAICBAW0QPKSPjYqCwA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLrXQAB9BkW6QXo9KEF6PSIAFLjQwz7couwqJrpQEP1cSY4AAEDykj6HMQsArAQAAKwEAAAA ArOdAeQAB+kKFlwIAEUABJ5RvkAAPwboXUF6PSJBej0ouNAAFOwqJrrDPtyiUBhhCObVAABY WVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3NjQyIE1OPTM2MjAwMDY2Lm91dCBTUkM9Y29tdGV4 IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJGVCBJbmZvcm1hdGlvbiAoVVMpIiAK Ci4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIFdhbGwgU3RyZWV0IEpvdXJuYWw6IEVs ZWN0cm9uaWMgZmlybXMnIG91dGxvb2tzIGRpbSBhcyBzaGFyZWhvbGRpbmcgdmFsdWVzCiBk ZWNsaW5lCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIg OCwgMjAwMywgKFdhbGwgU3RyZWV0IEpvdXJuYWwgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01U RVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFu Y2lhbCBUaW1lcyBJbmZvcm1hdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZU IEluZm9ybWF0aW9uIChVUykKClNvbWUgb2YgSmFwYW4ncyBtYWpvciBlbGVjdHJvbmljcyBm aXJtcyBhcmUgZXhwZWN0ZWQgdG8gcG9zdCBzaWduaWZpY2FudApsb3NzZXMgZm9yIHRoZSBw YXN0IGZpc2NhbCB5ZWFyIG93aW5nIHRvIGFuIGVyb3Npb24gaW4gdGhlIHZhbHVlIG9mIHRo ZWlyCnNoYXJlaG9sZGluZ3MuIEZvciBpbnN0YW5jZSwgTWF0c3VzaGl0YSBFbGVjdHJpYyBJ bmR1c3RyaWFsIENvIGlzCmV4cGVjdGluZyBhIDIzLjUgYmlsbGlvbiB5ZW4gbG9zcyAoJDE5 Nm0pIGZvciB0aGUgeWVhciBlbmRpbmcgTWFyY2ggMzEKZHVlIHRvIGludmVzdG1lbnQgbG9z c2VzIHdvcnRoIDM3IGJpbGxpb24geWVuLiBWYWx1YXRpb24gbG9zc2VzIHRvdGFsaW5nCjUz IGJpbGxpb24geWVuIHdpbGwgYWxzbyBiZSBwb3N0ZWQgYnkgSGl0YWNoaSBMdGQgYmVjYXVz ZSBvZiBhIGRyb3AgaW4KdGhlIHZhbHVlIG9mIHRoZSBzaGFyZXMgaXQgaG9sZHMuIEphcGFu ZXNlIGNvbXBhbmllcyBhcmUgcGFydGljdWxhcmx5CnZ1bG5lcmFibGUgdG8gYSBkZWNsaW5l IGluIHN0b2NrIHByaWNlcyBhcyBtYW55IG9mIHRoZW0gb3duIHN0YWtlcyBpbgpvdGhlciBm aXJtcy4KCkFic3RyYWN0ZWQgZnJvbTogVGhlIFdhbGwgU3QgSm91cm5hbCAoVVMgRWRpdGlv bikKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAgIGludmVzdG1lbnQKICAgIGphcGFuCiAg ICB5ZW4KCkDykj6IMQsAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRv0AAPwbs0kF6PSJB ej0ouNAAFOwqKzDDPtyiUBFhCOFrAAAAAAAAAABA8pI+aokLADYAAAA2AAAAAAfpChZcAAKz nQHkCABFAAAouthAAH0GRblBej0oQXo9IgAUuNDDPtyi7CorMVAQ+OZJjQAAQPKSPsOUCwA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLrZQAB9BkW4QXo9KEF6PSIAFLjQwz7couwqKzFQ EfjmSYwAAEDykj47lgsAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChRwEAAPwbs0UF6PSJB ej0ouNAAFOwqKzHDPtyjUBBhCOFqAAAAAAAAAABA8pI+Sq8LAHEAAABxAAAAAAKznQHkAAfp ChZcCABFAABjPQ5AAD8GAUlBej0iQXo9KJUPG1gYjVm8dHoEIIAYFtC2UgAAAQEICg1Eg+oA QiWIMTE5MXwxNDczNDY2fDEwNDk4MTc2Njh8MS4wfDF8MjU2NnxoZWxsbyB3b3JsZApA8pI+ hVkMADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUcFAAD8G7NBBej0iQXo9KLdtABXd+lm9 uchCPFAQYQhmTgAAAAAAAAAAQPKSPt6RDABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLra QAB9BkWfQXo9KEF6PSIAFbdtuchCPN36Wb1QGPkq/xUAADIyNiBUcmFuc2ZlciBjb21wbGV0 ZS4NCkDykj6VmgwAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRwkAAPwbstUF6PSJBej0o t20AFd36Wb25yEJUUBhhCG1BAABERUxFIDM2MjAwMDcwLm91dC4wMzA0MDgNCkDykj5G1wwA fAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG6620AAfQZFcEF6PShBej0iABW3bbnIQlTd+lnX UBj5EE8KAAA1NTAgMzYyMDAwNzAub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmlu ZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KQPKSPh3jDABRAAAAUQAAAAACs50B5AAH6QoWXAgA RQAAQ1HDQAA/BuyzQXo9IkF6PSi3bQAV3fpZ17nIQppQGGEImRwAAFBPUlQgNjUsMTIyLDYx LDM0LDE4NCwyMDkNCkDykj6FHQ0AVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa63EAAfQZF l0F6PShBej0iABW3bbnIQprd+lnyUBj49BDBAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3Nm dWwuDQpA8pI+vSANAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUcRAAD8G7LNBej0iQXo9 KLdtABXd+lnyuchCuFAYYQhajAAAU1RPUiAzNjIwMDA3MC5vdXQuMDMwNDA4DQpA8pI+MV0N AHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqut1AAH0GRXJBej0oQXo9IgAVt225yEK43fpa DFAY+NrYzAAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAz NjIwMDA3MC5vdXQuMDMwNDA4Lg0KQPKSPjdeDQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAA MLreQAB9BkWrQXo9KEF6PSIAFLjRcRWJzgAAAABwAvrw13YAAAIEBWQBAQQCQPKSPptfDQA+ AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFHFQAA/BuzEQXo9IkF6PSi40QAU7Czgd3EVic9w EmEIpFkAAAEBBAICBAW0QPKSPmiXDQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLrfQAB9 BkWyQXo9KEF6PSIAFLjRcRWJz+ws4HhQEP1cNMkAAEDykj5Vnw0AmgUAAJoFAAAAArOdAeQA B+kKFlwIAEUABYxRxkAAPwbnZ0F6PSJBej0ouNEAFOws4HhxFYnPUBBhCNw+AABYWVpaWS4u LiAgVEM9MiBUTT0xMDQ5ODE3NjQyIE1OPTM2MjAwMDcwLm91dCBTUkM9Y29tdGV4IFBGTj0i Q29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJQUiBOZXdzd2lyZSIgCgouLi4gIAoKCi4uLiAJ IAoKCkhlYWRMaW5lLi4uICBIRUFMVEhTT1VUSCBBZG9wdHMgTmV3IENvcnBvcmF0ZSBHb3Zl cm5hbmNlIEd1aWRlbGluZXMKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoKRGF0ZUxp bmUuLi4gIEJJUk1JTkdIQU0sICBBbGEuLCBBcHIgOCwgMjAwMyAvUFJOZXdzd2lyZS1GaXJz dENhbGwgdmlhIENPTVRFWC8gLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmln aHQgKEMpIDIwMDMgUFIgTmV3c3dpcmUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoK ClBSIE5ld3N3aXJlCgpIRUFMVEhTT1VUSCBDb3Jwb3JhdGlvbiAoT1RDIFBpbmsgU2hlZXRz OiBITFNIKSB0b2RheSBhbm5vdW5jZWQgdGhhdCBpdHMKQm9hcmQgb2YgRGlyZWN0b3JzIGhh cyBhZG9wdGVkIG5ldyBjb3Jwb3JhdGUgZ292ZXJuYW5jZSBndWlkZWxpbmVzLiBUaGUKY29t cGFueSdzIHBvbGljaWVzIGhhdmUgYmVlbiBkZXZlbG9wZWQgdGFraW5nIGludG8gYWNjb3Vu dCBub3Qgb25seSBsZWdhbAphbmQgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgYnV0IGFsc28g Y3VycmVudCBjb3Jwb3JhdGUgZ292ZXJuYW5jZSBiZXN0CnByYWN0aWNlcy4KCiAgICBUaGUg Z3VpZGVsaW5lcyBpbmNsdWRlOgoKICAgICogIFdpdGhpbiBhIHJlYXNvbmFibGUgdGltZSBh ZnRlciB0aGUgZWZmZWN0aXZlIGRhdGUgb2YgdGhlIGdvdmVybmFuY2UKICAgICAgIGd1aWRl bGluZXMsIG9yIHdpdGhpbiBzdWNoIG90aGVyIHRpbWUgYXMgbWF5IGJlIHJlcXVpcmVkIGJ5 IGxhdyBvciB0aGUKICAgICAgIGxpc3Rpbmcgc3RhbmRhcmRzIG9mIHRoZSBOWVNFLCBhIG1h am9yaXR5IG9mIHRoZSBtZW1iZXJzIG9mIHRoZSBCb2FyZAogICAgICAgb2YgRGlyZWN0b3Jz IG11c3QgYmUgaW5kZXBlbmRlbnQgZnJvbSBtYW5hZ2VtZW50LCBhcyBkZXRlcm1pbmVkIGJ5 IHRoZQogICAgICAgQm9hcmQgb2YgRGlyZWN0b3JzLCB3aGljaCB3aWxsIGJlIGd1aWRlZCBi eSB0aGUgcHJvcG9zZWQgbGlzdGluZwogICAgICAgc3RhbmRhcmRzIG9mIHRoZSBOWVNFLgoK ICAgICogIE5vbi1tYW5hZ2VtZW50IGRpcmVjdG9ycyBtdXN0IG1lZXQgd2l0aG91dCBtYW5h Z2VtZW50IGRpcmVjdG9ycyBhdAogICAgICAgbGVhc3QgdHdpY2UgZWFjaCBjYWxlbmRhciB5 ZWFyLgoKICAgICogIFRoZSBub24tbWFuYWdlbWVudCBkaXJlY3RvcnMgbXVzdCBkZXNpZ25h dGUgYSBQcmVzaWRpbmcgRGlyZWN0b3IsIHdobwogICAgICAgbXVzdCBiZSBhbiBpbmRlcGVu ZGVudCBkaXJlY3RvciwgdG8gbGVhZCBA8pI+1J8NAJoFAACaBQAAAAKznQHkAAfpChZcCABF AAWMUcdAAD8G52ZBej0iQXo9KLjRABTsLOXccRWJz1AYYQjJRQAAZXhlY3V0aXZlIHNlc3Np b25zIG9mIHRoZSBub24tCiAgICAgICBtYW5hZ2VtZW50IGRpcmVjdG9ycy4KCiAgICAqICBU aGUgQm9hcmQgb2YgRGlyZWN0b3JzIGhhcyBlc3RhYmxpc2hlZCBmb3VyIHN0YW5kaW5nIGNv bW1pdHRlZXMgLQogICAgICAgQXVkaXQsIENvbXBlbnNhdGlvbiwgQ29ycG9yYXRlIENvbXBs aWFuY2UgYW5kIE5vbWluYXRpbmcvQ29ycG9yYXRlCiAgICAgICBHb3Zlcm5hbmNlLiAgRWFj aCBjb21taXR0ZWUgaXMgYXV0aG9yaXplZCB0byBlbmdhZ2UgaXRzIG93biBhZHZpc29ycwog ICAgICAgYW5kIGNvdW5zZWwsIHN1YmplY3QgdG8gdGhlIGFwcHJvdmFsIG9mIHRoZSBCb2Fy ZCBvZiBEaXJlY3RvcnMuCgogICAgKiAgVGhlIEJvYXJkIGhhcyBlc3RhYmxpc2hlZCBhbiBh bm51YWwgcmV2aWV3IHByb2Nlc3MgZm9yIGl0c2VsZiBhbmQgaXRzCiAgICAgICBjb21taXR0 ZWVzIHRvIHByb3ZpZGUgaW5kaXZpZHVhbCBtZW1iZXJzIHdpdGggYW4gYXNzZXNzbWVudCBv ZiBjdXJyZW50CiAgICAgICBwZXJmb3JtYW5jZSBhbmQgYXJlYXMgZm9yIHBvdGVudGlhbCBp bXByb3ZlbWVudC4KCiAgICAqICBBbnkgQm9hcmQgbWVtYmVyJ3Mgc2VydmljZSB0byBvdGhl ciBlbnRpdGllcyBvciBvcmdhbml6YXRpb25zIG11c3QgYmUKICAgICAgIGNvbnNpc3RlbnQg d2l0aCBIRUFMVEhTT1VUSCdzIGNvbmZsaWN0IG9mIGludGVyZXN0IHBvbGljaWVzLCBhcyB3 ZWxsIGFzCiAgICAgICB0aGUgcnVsZXMgYW5kIHJlZ3VsYXRpb25zIGFwcGxpY2FibGUgdG8g dGhlIGNvbXBhbnksIGluY2x1ZGluZyB0aG9zZSBvZgogICAgICAgdGhlIE5ZU0UgYW5kIHRo ZSBTRUMuCgogICAgKiAgVGhlIGNvbXBhbnkgaGFzIGFkb3B0ZWQgbWluaW11bSBzdG9jayBv d25lcnNoaXAgcmVxdWlyZW1lbnRzIGZvcgogICAgICAgZGlyZWN0b3JzLiAgSW4gZ2VuZXJh bCwgaXQgaXMgZXhwZWN0ZWQgdGhhdCB3aXRoaW4gdGhyZWUgeWVhcnMgYWZ0ZXIKICAgICAg IHRoZSBlZmZlY3RpdmUgZGF0ZSBvZiB0aGUgZ292ZXJuYW5jZSBndWlkZWxpbmVzLCBvciB3 aXRoaW4gdGhyZWUgeWVhcnMKICAgICAgIGFmdGVyIGluaXRpYWwgZWxlY3Rpb24gdG8gdGhl IEJvYXJkIG9mIERpcmVjdG9ycywgZWFjaCBkaXJlY3RvciBzaG91bGQKICAgICAgIGludmVz dCBhIG1pbmltdW0gb2YgJDEwMCwwMDAgaW4gY29tbW9uIHN0b2NrIG9mIHRoZSBjb21wYW55 LgoKICAgICogIFRoZSBIRUFMVEhTT1VUSCBCb2FyZCB1bmRlcnNjb3JlZCBpdHMgY29tbWl0 bWVudCB0byB0aGUgY29tcGFueSdzCiAgICAgICBTdGFuZGFyZHMgb2YgQnVzaW5lc3MgQ29u ZHVjdCwgd2hpY2ggcHJvbW90ZSB0aGUgaGlnaGVzdCBsZXZlbCBvZgogICAgICAgZXRoaWNh bCBjb25kdWN0IGFuZCBjQPKSPkegDQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFHIQAA/ BudlQXo9IkF6PSi40QAU7CzrQHEVic9QGGEIxoYAAG9ycG9yYXRlIGNpdGl6ZW5zaGlwIGZy b20gYWxsIGVtcGxveWVlcy4gIFRoZXNlCiAgICAgICBzdGFuZGFyZHMgYWRkcmVzczogY29u ZmxpY3Qgb2YgaW50ZXJlc3Q7IGNvcnBvcmF0ZSBvcHBvcnR1bml0aWVzOwogICAgICAgY29u ZmlkZW50aWFsaXR5OyBmYWlyIGRlYWxpbmc7IHByb3RlY3Rpb24gYW5kIHByb3BlciB1c2Ug b2YgQ29tcGFueQogICAgICAgYXNzZXRzOyBjb21wbGlhbmNlIHdpdGggbGF3cywgcnVsZXMg YW5kIHJlZ3VsYXRpb25zIChpbmNsdWRpbmcgaW5zaWRlcgogICAgICAgdHJhZGluZyBsYXdz KTsgYW5kIGVuY291cmFnaW5nIHRoZSByZXBvcnRpbmcgb2YgYW55IGlsbGVnYWwgb3IKICAg ICAgIHVuZXRoaWNhbCBiZWhhdmlvci4gIFRoZSBCb2FyZCBvZiBEaXJlY3RvcnMsIHdpdGgg YWR2aWNlIGFuZAogICAgICAgcmVjb21tZW5kYXRpb25zIGZyb20gdGhlIENvcnBvcmF0ZSBD b21wbGlhbmNlIENvbW1pdHRlZSwgd2lsbAogICAgICAgcGVyaW9kaWNhbGx5IHJldmlldyBh bmQgZXZhbHVhdGUgdGhlIFN0YW5kYXJkcyBvZiBCdXNpbmVzcyBDb25kdWN0IGFuZAogICAg ICAgbWFrZSBjaGFuZ2VzIGFzIG5lY2Vzc2FyeSBvciBhcHByb3ByaWF0ZS4KCkhFQUxUSFNP VVRIJ3MgbmV3IENvcnBvcmF0ZSBHb3Zlcm5hbmNlIHdpbGwgYmUgcHVibGlzaGVkIG9uIHRo ZSBDb21wYW55J3MKV2Vic2l0ZSBhdCB3d3cuSEVBTFRIU09VVEguY29tIC4KCkhFQUxUSFNP VVRIIGlzIHRoZSBuYXRpb24ncyBsYXJnZXN0IHByb3ZpZGVyIG9mIG91dHBhdGllbnQgc3Vy Z2VyeSwKZGlhZ25vc3RpYyBpbWFnaW5nIGFuZCByZWhhYmlsaXRhdGl2ZSBoZWFsdGhjYXJl IHNlcnZpY2VzLCB3aXRoIG5lYXJseQoxLDcwMCBsb2NhdGlvbnMgaW4gYWxsIDUwIHN0YXRl cywgdGhlIFVuaXRlZCBLaW5nZG9tLCBBdXN0cmFsaWEsIFB1ZXJ0bwpSaWNvLCBTYXVkaSBB cmFiaWEgYW5kIENhbmFkYS4gSEVBTFRIU09VVEggY2FuIGJlIGZvdW5kIG9uIHRoZSBXZWIg YXQKd3d3LkhFQUxUSFNPVVRILmNvbSAuCgpTdGF0ZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlz IHByZXNzIHJlbGVhc2Ugd2hpY2ggYXJlIG5vdCBoaXN0b3JpY2FsIGZhY3RzCmFyZSBmb3J3 YXJkLWxvb2tpbmcgc3RhdGVtZW50cy4gSW4gYWRkaXRpb24sIEhFQUxUSFNPVVRILCB0aHJv dWdoIGl0cwpzZW5pb3IgbWFuYWdlbWVudCwgbWF5IGZyb20gdGltZSB0byB0aW1lIG1ha2Ug Zm9yd2FyZC1sb29raW5nIHB1YmxpYwpzdGF0ZW1lbnRzIGNvbmNlcm5pbmcgdGhlIG1hdHRl cnMgZGVzY3JpYmVkIGhlcmVpbi4gU3VjaCBmb3J3YXJkLWxvb2tpbmcKc3RhdGVtZW50cyBh cmUgbmVjZXNzYXJpbHkgZXN0aW1hdGVzIGJhc2VkIHVwb24gY3VycmVudCBpbmZvcm1hdGlv biwKaW52b0Dykj6qGg4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi64EAAfQZFsUF6PShB ej0iABS40XEVic/sLOtAUBD9XCoBAABA8pI+QR4OAGUFAABlBQAAAAKznQHkAAfpChZcCABF AAVXUclAAD8G55lBej0iQXo9KLjRABTsLPCkcRWJz1AZYQjqygAAbHZlIGEgbnVtYmVyIG9m IHJpc2tzIGFuZCB1bmNlcnRhaW50aWVzIGFuZCBhcmUgbWFkZSBwdXJzdWFudCB0byB0aGUK InNhZmUgaGFyYm9yIiBwcm92aXNpb25zIG9mIHRoZSBQcml2YXRlIFNlY3VyaXRpZXMgTGl0 aWdhdGlvbiBSZWZvcm0gQWN0Cm9mIDE5OTUuIEhFQUxUSFNPVVRIJ3MgYWN0dWFsIHJlc3Vs dHMgbWF5IGRpZmZlciBtYXRlcmlhbGx5IGZyb20gdGhlCnJlc3VsdHMgYW50aWNpcGF0ZWQg aW4gdGhlc2UgZm9yd2FyZC0gbG9va2luZyBzdGF0ZW1lbnRzIGFzIGEgcmVzdWx0IG9mIGEK dmFyaWV0eSBvZiBmYWN0b3JzLCBpbmNsdWRpbmcgdGhvc2UgaWRlbnRpZmllZCBpbiB0aGlz IHByZXNzIHJlbGVhc2UgYW5kCmluIHRoZSBwdWJsaWMgZmlsaW5ncyBtYWRlIGJ5IEhFQUxU SFNPVVRIIHdpdGggdGhlIFNlY3VyaXRpZXMgYW5kCkV4Y2hhbmdlIENvbW1pc3Npb24sIGlu Y2x1ZGluZyBIRUFMVEhTT1VUSCdzIEFubnVhbCBSZXBvcnQgb24gRm9ybSAxMC1LCmZvciB0 aGUgeWVhciBlbmRlZCBEZWNlbWJlciAzMSwgMjAwMSBhbmQgaXRzIFF1YXJ0ZXJseSBSZXBv cnRzIG9uIEZvcm0KMTAtUSwgYW5kIGZvcndhcmQtbG9va2luZyBzdGF0ZW1lbnRzIGNvbnRh aW5lZCBpbiB0aGlzIHByZXNzIHJlbGVhc2Ugb3IKaW4gb3RoZXIgcHVibGljIHN0YXRlbWVu dHMgb2YgSEVBTFRIU09VVEggb3IgaXRzIHNlbmlvciBtYW5hZ2VtZW50IHNob3VsZApiZSBj b25zaWRlcmVkIGluIGxpZ2h0IG9mIHRob3NlIGZhY3RvcnMuIFRoZXJlIGNhbiBiZSBubyBh c3N1cmFuY2UgdGhhdApzdWNoIGZhY3RvcnMgb3Igb3RoZXIgZmFjdG9ycyB3aWxsIG5vdCBh ZmZlY3QgdGhlIGFjY3VyYWN5IG9mIHN1Y2gKZm9yd2FyZC1sb29raW5nIHN0YXRlbWVudHMu CgogICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNvbnRhY3Q6CiAgICBBbmR5IEJyaW1tZXIs IDIwNS00MTAtMjc3NwoKU09VUkNFIEhFQUxUSFNPVVRIIENvcnBvcmF0aW9uCgpBbmR5IEJy aW1tZXIgZm9yIEhFQUxUSFNPVVRILCArMS0yMDUtNDEwLTI3NzcKCmh0dHA6Ly93d3cuaGVh bHRoc291dGguY29tCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBhbm51YWwrcmVwb3J0 CiAgICBhdXN0cmFsaWEKICAgIGJ1c2luZXNzCiAgICBjYW5hZGEKICAgIGNvcnBvcmF0ZQog ICAgZWxlY3Rpb24KICAgIGV4ZWN1dGl2ZQogICAgaGVhbHRoY2FyZQogICAgaW5zaWRlcit0 cmFkaW5nCiAgICBsYXcKICAgIGxlZ2FsCiAgICBvdGMKICAgIHB1ZXJ0bytyaWNvCiAgICBy ZWd1bGF0aW9ucwogICAgc2F1ZGkrYXJhYmlhCiAgICBzZWN1cml0aWVzCiAgICBzdGFuZGFy ZHMKICAgIHN1cmdlcnkKCkDykj6Maw4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYBkAA fQZof0F6PShBej0iG1iVD3R6BCAYjVnrgBBCQuTBAAABAQgKAEIlkA1Eg+pA8pI+l3oOADYA AAA2AAAAAAfpChZcAAKznQHkCABFAAAouuFAAH0GRbBBej0oQXo9IgAUuNFxFYnP7Cz11FAQ /VwfbQAAQPKSPj2MDgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLriQAB9BkWvQXo9KEF6 PSIAFLjRcRWJz+ws9dRQEf1cH2wAAEDykj5JjQ4APAAAADwAAAAAArOdAeQAB+kKFlwIAEUA AChRykAAPwbsx0F6PSJBej0ouNEAFOws9dRxFYnQUBBhCLvAAAAAAAAAAABA8pI+dsoOADwA AAA8AAAAAAKznQHkAAfpChZcCABFAAAoUctAAD8G7MZBej0iQXo9KLdtABXd+loMuchC+lAQ YQhlQQAAAAAAAAAAQPKSPuMCDwBOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLrjQAB9BkWW QXo9KEF6PSIAFbdtuchC+t36WgxQGPja/lgAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCkDy kj77Cg8AUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJRzEAAPwbsq0F6PSJBej0ot20AFd36 Wgy5yEMSUBhhCGs0AABERUxFIDM2MjAwMDcxLm91dC4wMzA0MDgNCkHykj5BBQAAfAAAAHwA AAAAB+kKFlwAArOdAeQIAEUAAG665EAAfQZFZ0F6PShBej0iABW3bbnIQxLd+lomUBj4wE5M AAA1NTAgMzYyMDAwNzEub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUg ZmlsZSBzcGVjaWZpZWQuIA0KQfKSPvMQAABRAAAAUQAAAAACs50B5AAH6QoWXAgARQAAQ1HN QAA/BuypQXo9IkF6PSi3bQAV3fpaJrnIQ1hQGGEIoQ4AAFBPUlQgNjUsMTIyLDYxLDM0LDE4 NCwyMTANCkHykj5sSwAAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa65UAAfQZFjkF6PShB ej0iABW3bbnIQ1jd+lpBUBj4pBAEAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQpB 8pI+5U4AAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUc5AAD8G7KlBej0iQXo9KLdtABXd +lpBuchDdlAYYQhYfwAAU1RPUiAzNjIwMDA3MS5vdXQuMDMwNDA4DQpB8pI+04sAAHgAAAB4 AAAAAAfpChZcAAKznQHkCABFAABquuZAAH0GRWlBej0oQXo9IgAVt225yEN23fpaW1AY+IrY DgAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDA3 MS5vdXQuMDMwNDA4Lg0KQfKSPruMAAA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLrnQAB9 BkWiQXo9KEF6PSIAFLjSov6WbgAAAABwAvrwmOwAAAIEBWQBAQQCQfKSPniOAAA+AAAAPgAA AAACs50B5AAH6QoWXAgARQAAMFHPQAA/Buy6QXo9IkF6PSi40gAU7C/ahqL+lm9wEmEIa70A AAEBBAICBAW0QfKSPmLGAAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLroQAB9BkWpQXo9 KEF6PSIAFLjSov6Wb+wv2odQEP1c/CwAAEHykj4mzgAAmgUAAJoFAAAAArOdAeQAB+kKFlwI AEUABYxR0EAAPwbnXUF6PSJBej0ouNIAFOwv2oei/pZvUBBhCBLnAABYWVpaWS4uLiAgVEM9 MiBUTT0xMDQ5ODE3NjQzIE1OPTM2MjAwMDcxLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4 IiBQRk49IkNvbXRleCIgUEZOPSJQUiBOZXdzd2lyZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhl YWRMaW5lLi4uICBJbnN0YW50IE1lc3NhZ2luZyBMZWFkZXIgRmFjZVRpbWUgQ29tbXVuaWNh dGlvbnMgdG8gUHJlc2VudCBhdCBJbnRlcm5ldCBXb3JsZApFc3NlbnRpYWxzIFNwcmluZyBD b25mZXJlbmNlCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBG T1NURVIgQ0lUWSwgIENhbGlmLiwgQXByIDgsIDIwMDMgL1BSTmV3c3dpcmUgdmlhIENPTVRF WC8gLS0KCgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgKEMpIDIwMDMgUFIg TmV3c3dpcmUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKClBSIE5ld3N3aXJlCgpG dXJ0aGVyaW5nIGl0cyBlc3RhYmxpc2hlZCBsZWFkZXJzaGlwIGFzIHRoZSBwcmVtaWVyIHBy b3ZpZGVyIG9mIHNlY3VyaXR5CmFuZCBtYW5hZ2VtZW50IHNvbHV0aW9ucyBmb3IgaW5zdGFu dCBtZXNzYWdpbmcgKElNKSBpbiB0aGUgZW50ZXJwcmlzZSwKRmFjZVRpbWUgQ29tbXVuaWNh dGlvbnMgdG9kYXkgYW5ub3VuY2VkIGl0IGhhcyBiZWVuIHNlbGVjdGVkIHRvIHByZXNlbnQK YXQgdGhlIEludGVybmV0IFdvcmxkIEVzc2VudGlhbHMgU3ByaW5nIENvbmZlcmVuY2UgYmVp bmcgaGVsZCBBcHJpbCAxNCB0bwoxNywgMjAwMyBhdCB0aGUgU2FuIEpvc2UgQ29udmVudGlv biBDZW50ZXIgaW4gU2FuIEpvc2UsIENhbGlmb3JuaWEuCgpGYWNlVGltZSBGb3VuZGVyIGFu ZCBDVE8sIE1laGRpIE1hZ2hzb29kbmlhLCB3aWxsIHByZXNlbnQgIkluc3RhbnQKTWVzc2Fn aW5nOiBGcm9tIENoYXQgVG95IHRvIEJ1c2luZXNzLUNyaXRpY2FsIiBvbiBUaHVyc2RheSwg QXByaWwgMTcgYXQKMTA6MDAgYW0gTXIgTWFnaHNvb2RuaWEgd2lsbCBleHBsb3JlIGJvdGgg dGhlIGJlbmVmaXRzIGFuZCByaXNrcyBwb3NlZCBieQpJTSBhcyB3ZWxsIGFzIGRpc2N1c3Mg c3RyYXRlZ2llcyBhbmQgdGVjaG5vbG9naWVzIHRoYXQgbWF5IGJlIGltcGxlbWVudGVkCnRv IGVuc3VyZSB0aGUgc2FmZSBkZXBsb3ltZW50IG9mIElNIGluIHRoZSBlbnRlcnByaXNlLgoK QWJvdXQgRmFjZVRpbWUgQ29tbXVuaWNhdGlvbnMKCkZhY2VUaW1lIENvbW11bmljYXRpb25z IGlzIHRoZSBsZWFkaW5nIHByb3ZpZGVyIG9mIGVudGVycHJpc2Ugc29mdHdhcmUKc29sdXRp b25zIHRoYXQgZW5hYmxlIGN1c3RvbWVycyB0byBzYWZlbHkgZGVwbG95IGFuZCBjZW50cmFs bHkgbWFuYWdlCnJlYWwtdGltZSBidXNpbmVzcyBjb21tdW5pY2F0aW9ucy4gVGhlIENvbXBh bnkgcHJvdmlkZXMgYXdhcmRB8pI+os4AAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUdFA AD8G51xBej0iQXo9KLjSABTsL9/rov6Wb1AYYQgoTQAALXdpbm5pbmcsCnNlcnZlci1iYXNl ZCBzb2Z0d2FyZSBzb2x1dGlvbnMgdGhhdCBoZWxwIG9yZ2FuaXphdGlvbnMgbWFuYWdlIHVz ZXIKcG9saWN5IHN0YW5kYXJkcyBhY3Jvc3MgYWxsIHJlYWwtdGltZSBjb21tdW5pY2F0aW9u cyB2ZWhpY2xlcyB3aGlsZQptaXRpZ2F0aW5nIGluZm9ybWF0aW9uIHNlY3VyaXR5IHJpc2tz LiBGYWNlVGltZSBvZmZlcnMgY3VzdG9tZXJzIGEKY29tcHJlaGVuc2l2ZSBhcHByb2FjaCB0 byB0aGUgY2VudHJhbGl6ZWQgY29udHJvbCBhbmQgbWFuYWdlbWVudCBvZgpyZWFsLXRpbWUg Y29tbXVuaWNhdGlvbnMgc3VjaCBhcyBpbnN0YW50IG1lc3NhZ2luZyBhbmQgSW50ZXJuZXQg Y2hhdCBpbgp0aGUgYXJlYXMgb2YgcmlzayBhbmQgc2VjdXJpdHkgbWFuYWdlbWVudCwgY3Vz dG9tZXIgc2VydmljZSBtYW5hZ2VtZW50CmFuZCBnYXRld2F5IHNlcnZpY2VzIG1hbmFnZW1l bnQuIFRocm91Z2ggaXRzIHN0cmF0ZWdpYyBwYXJ0bmVyc2hpcHMsCkZhY2VUaW1lIHByb3Zp ZGVzIGF1dGhvcml6ZWQgYWNjZXNzIHRvIG11bHRpcGxlIG5ldHdvcmsgcHJvdmlkZXJzIHN1 Y2ggYXMKQU9MLCBNaWNyb3NvZnQsIGFuZCBZYWhvbyE7IGFuZCBwcml2YXRlIElNIG5ldHdv cmtzOiBDb21tdW5pY2F0b3IgSHViIElNLApJQk0gTG90dXMgU2FtZXRpbWUgYW5kIFJldXRl cnMgTWVzc2FnaW5nLiBHbG9iYWwgMjAwMCBjb21wYW5pZXMgc3VjaCBhcwpBbGFza2EgQWly bGluZXMsIEFtaWNhIEluc3VyYW5jZSwgQmFua09uZSwgRG9taW5pb24gRW5lcmd5LApIZXds ZXR0LVBhY2thcmQsIEplZmZlcmllcyAmIENvLCBTb3VuZHZpZXcgVGVjaG5vbG9naWVzLCBU aG9tYXMgV2Vpc2VsClBhcnRuZXJzLCBXYWNob3ZpYSBTZWN1cml0aWVzIGFuZCBXZXN0ZXJu IFVuaW9uIHJlbHkgb24gRmFjZVRpbWUgdG8gaGVscAphZG1pbmlzdGVyLCBjb250cm9sIGFu ZCByZXBvcnQgb24gcmVhbC10aW1lLCBidXNpbmVzcy1jcml0aWNhbCBJUApjb21tdW5pY2F0 aW9ucy4gSGVhZHF1YXJ0ZXJlZCBpbiBGb3N0ZXIgQ2l0eSwgQ2FsaWZvcm5pYSwgRmFjZVRp bWUgY2FuIGJlCnJlYWNoZWQgYXQgd3d3LmZhY2V0aW1lLmNvbSBvciB2aWEgSU0gc2NyZWVu IG5hbWUgRmFjZVRpbWVMaXZlLgoKTk9URTogT3RoZXIgcHJvZHVjdCBvciBzZXJ2aWNlIG5h bWVzIG1lbnRpb25lZCBoZXJlaW4gYXJlIHRoZSB0cmFkZW1hcmtzCm9mIHRoZWlyIHJlc3Bl Y3RpdmUgb3duZXJzLgoKQ09OVEFDVDogQ2hyaXMgQmxha2UsIGNocmlzQG1zcmNvbW11bmlj YXRpb25zLCBvciBNaWNoZWxlIEJhcm51bSwKbWljaGVsZUBtc3Jjb21tdW5pY2F0aW9ucy5j b20sICsxLTQxNS00NDctNjExNSwgYm90aCBvZiBNU1IKQ29tbXVuaWNhdGlvbnMuCgpTT1VS Q0UgRmFjZVRpQfKSPsLOAACvAQAArwEAAAACs50B5AAH6QoWXAgARQABoVHSQAA/ButGQXo9 IkF6PSi40gAU7C/lT6L+lm9QGGEIiCUAAG1lIENvbW11bmljYXRpb25zCgpDaHJpcyBCbGFr ZSwgY2hyaXNAbXNyY29tbXVuaWNhdGlvbnMsIG9yIE1pY2hlbGUgQmFybnVtLAptaWNoZWxl QG1zcmNvbW11bmljYXRpb25zLmNvbSwgKzEtNDE1LTQ0Ny02MTE1LCBib3RoIG9mIE1TUiBD b21tdW5pY2F0aW9ucwoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYWxhc2thCiAgICBi dXNpbmVzcwogICAgY2FsaWZvcm5pYQogICAgY29tbXVuaWNhdGlvbnMKICAgIGNvbmZlcmVu Y2UKICAgIGVuZXJneQogICAgaW5zdXJhbmNlCiAgICBpbnRlcm5ldAogICAgbm90ZQogICAg cG9saWN5CiAgICBzZWN1cml0aWVzCiAgICBzZWN1cml0eQogICAgc29mdHdhcmUKICAgIHN0 YW5kYXJkcwogICAgdGVjaG5vbG9neQoKQfKSPsPOAAA8AAAAPAAAAAACs50B5AAH6QoWXAgA RQAAKFHTQAA/Buy+QXo9IkF6PSi40gAU7C/myKL+lm9QEWEIjD8AAAAAAAAAAEHykj6gSQEA NgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi66UAAfQZFqEF6PShBej0iABS40qL+lm/sL+VP UBD9XPFkAABB8pI+QE4BADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouupAAH0GRadBej0o QXo9IgAUuNKi/pZv7C/myVAQ++PxYwAAQfKSPlNdAQA2AAAANgAAAAAH6QoWXAACs50B5AgA RQAAKLrrQAB9BkWmQXo9KEF6PSIAFLjSov6Wb+wv5slQEfvj8WIAAEHykj5zXgEAPAAAADwA AAAAArOdAeQAB+kKFlwIAEUAAChR1EAAPwbsvUF6PSJBej0ouNIAFOwv5smi/pZwUBBhCIw+ AAAAAAAAAABB8pI+RPkBADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUdVAAD8G7LxBej0i QXo9KLdtABXd+lpbuchDuFAQYQhkNAAAAAAAAAAAQfKSPtQxAgBOAAAATgAAAAAH6QoWXAAC s50B5AgARQAAQLrsQAB9BkWNQXo9KEF6PSIAFbdtuchDuN36WltQGPiK/ZsAADIyNiBUcmFu c2ZlciBjb21wbGV0ZS4NCkHykj4VpwMAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChR1kAA Pwbsu0F6PSJBej0ot20AFd36Wlu5yEPQUBBhCGQcAAAAAAAAAABB8pI+5a8LAHEAAABxAAAA AAKznQHkAAfpChZcCABFAABjPQ9AAD8GAUhBej0iQXo9KJUPG1gYjVnrdHoEIIAYFtC6vwAA AQEICg1EhE4AQiWQMTE5MnwxNDczNDY3fDEwNDk4MTc2Njl8MS4wfDF8MjAwMXxoZWxsbyB3 b3JsZApB8pI+qS4OAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mAdAAH0GaH5Bej0oQXo9 IhtYlQ90egQgGI1aGoAQQhPkUwAAAQEICgBCJZoNRIRORPKSPj5fDQBxAAAAcQAAAAACs50B 5AAH6QoWXAgARQAAYz0QQAA/BgFHQXo9IkF6PSiVDxtYGI1aGnR6BCCAGBbQwkgAAAEBCAoN RIWFAEIlmjExOTN8MTQ3MzQ2OHwxMDQ5ODE3NjcxfDEuMHwxfDEyMDN8aGVsbG8gd29ybGQK RfKSPuOLAQBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJgIQAB9Bmh9QXo9KEF6PSIbWJUP dHoEIBiNWkmAEEHk4vwAAAEBCAoAQiW6DUSFhUXykj6DjQEAcQAAAHEAAAAAArOdAeQAB+kK FlwIAEUAAGM9EUAAPwYBRkF6PSJBej0olQ8bWBiNWkl0egQggBgW0L7iAAABAQgKDUSFmwBC JboxMTk0fDE0NzM0Njl8MTA0OTgxNzY3MXwxLjB8MXwzMTEzfGhlbGxvIHdvcmxkCkXykj5t 4gQAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYCUAAfQZofEF6PShBej0iG1iVD3R6BCAY jVp4gBBBteLkAAABAQgKAEIlvA1EhZtH8pI+nA0PAHEAAABxAAAAAAKznQHkAAfpChZcCABF AABjPRJAAD8GAUVBej0iQXo9KJUPG1gYjVp4dHoEIIAYFtC8mwAAAQEICg1EhrwAQiW8MTE5 NXwxNDczNDcwfDEwNDk4MTc2NzN8MS4wfDF8MjAwMXxoZWxsbyB3b3JsZApI8pI+IoACAEIA AABCAAAAAAfpChZcAAKznQHkCABFAAA0mApAAH0GaHtBej0oQXo9IhtYlQ90egQgGI1ap4AQ QYbhpgAAAQEICgBCJdkNRIa8SPKSPqTYAgBwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYj0T QAA/BgFFQXo9IkF6PSiVDxtYGI1ap3R6BCCAGBbQdacAAAEBCAoNRIbQAEIl2TExOTZ8MTQ3 MzQ3MXwxMDQ5ODE3Njc1fDEuMHwxfDUyNHxoZWxsbyB3b3JsZApI8pI+ktYFAEIAAABCAAAA AAfpChZcAAKznQHkCABFAAA0mAtAAH0GaHpBej0oQXo9IhtYlQ90egQgGI1a1YAQQVjhkAAA AQEICgBCJdsNRIbQSPKSPs3XBQBxAAAAcQAAAAACs50B5AAH6QoWXAgARQAAYz0UQAA/BgFD QXo9IkF6PSiVDxtYGI1a1XR6BCCAGBbQtOUAAAEBCAoNRIbjAEIl2zExOTd8MTQ3MzQ3Mnwx MDQ5ODE3Njc1fDEuMHwxfDI4NTh8aGVsbG8gd29ybGQKSPKSPg0tCQBCAAAAQgAAAAAH6QoW XAACs50B5AgARQAANJgMQAB9Bmh5QXo9KEF6PSIbWJUPdHoEIBiNWwSAEEEp4XsAAAEBCAoA QiXdDUSG40jykj7lAAwAcQAAAHEAAAAAArOdAeQAB+kKFlwIAEUAAGM9FUAAPwYBQkF6PSJB ej0olQ8bWBiNWwR0egQggBgW0KuRAAABAQgKDUSHDABCJd0xMTk4fDE0NzM0NzN8MTA0OTgx NzY3NnwxLjB8MXw5NjYyfGhlbGxvIHdvcmxkCkjykj7FLg4AQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSYDUAAfQZoeEF6PShBej0iG1iVD3R6BCAYjVszgBBA+uFPAAABAQgKAEIl4A1E hwxJ8pI+PtgCAHEAAABxAAAAAAKznQHkAAfpChZcCABFAABjPRZAAD8GAUFBej0iQXo9KJUP G1gYjVszdHoEIIAYFtC3LwAAAQEICg1EhzQAQiXgMTE5OXwxNDczNDc0fDEwNDk4MTc2NzZ8 MS4wfDF8MjkxNXxoZWxsbyB3b3JsZApJ8pI+i5kFAEIAAABCAAAAAAfpChZcAAKznQHkCABF AAA0mA5AAH0GaHdBej0oQXo9IhtYlQ90egQgGI1bYoAQQMvhIgAAAQEICgBCJeUNRIc0SfKS PtOaBQBxAAAAcQAAAAACs50B5AAH6QoWXAgARQAAYz0XQAA/BgFAQXo9IkF6PSiVDxtYGI1b YnR6BCCAGBbQvfcAAAEBCAoNRIdGAEIl5TEyMDB8MTQ3MzQ3NXwxMDQ5ODE3Njc2fDEuMHwx fDMyMjV8aGVsbG8gd29ybGQKSfKSPgXwCABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJgP QAB9Bmh2QXo9KEF6PSIbWJUPdHoEIBiNW5GAEECc4Q4AAAEBCAoAQiXnDUSHRkrykj6JXwQA cQAAAHEAAAAAArOdAeQAB+kKFlwIAEUAAGM9GEAAPwYBP0F6PSJBej0olQ8bWBiNW5F0egQg gBgW0L1mAAABAQgKDUSHogBCJecxMjAxfDE0NzM0NzZ8MTA0OTgxNzY3N3wxLjB8MXwyNjIz fGhlbGxvIHdvcmxkCkrykj6tBwcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYEEAAfQZo dUF6PShBej0iG1iVD3R6BCAYjVvAgBBAbeCqAAABAQgKAEIl7w1Eh6JK8pI+SgkHAHEAAABx AAAAAAKznQHkAAfpChZcCABFAABjPRlAAD8GAT5Bej0iQXo9KJUPG1gYjVvAdHoEIIAYFtC7 IQAAAQEICg1Eh7MAQiXvMTIwMnwxNDczNDc3fDEwNDk4MTc2Nzd8MS4wfDF8MjQ0MHxoZWxs byB3b3JsZApK8pI+WF4KAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mBFAAH0GaHRBej0o QXo9IhtYlQ90egQgGI1b74AQQD7glgAAAQEICgBCJfINRIezS/KSPoFfBABxAAAAcQAAAAAC s50B5AAH6QoWXAgARQAAYz0aQAA/BgE9QXo9IkF6PSiVDxtYGI1b73R6BCCAGBbQuI4AAAEB CAoNRIgGAEIl8jEyMDN8MTQ3MzQ3OHwxMDQ5ODE3Njc4fDEuMHwxfDI4NTh8aGVsbG8gd29y bGQKS/KSPuPKBgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJgSQAB9BmhzQXo9KEF6PSIb WJUPdHoEIBiNXB6AEEAP4DwAAAEBCAoAQiX5DUSIBkzykj4o5wUAcQAAAHEAAAAAArOdAeQA B+kKFlwIAEUAAGM9G0AAPwYBPEF6PSJBej0olQ8bWBiNXB50egQggBgW0Lf0AAABAQgKDUSI dABCJfkxMjA0fDE0NzM0Nzl8MTA0OTgxNzY3OXwxLjB8MXwyNDQwfGhlbGxvIHdvcmxkCkzy kj4cOQgAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYE0AAfQZockF6PShBej0iG1iVD3R6 BCAYjVxNgBA/4N/DAAABAQgKAEImBA1EiHRP8pI+j5YHAHEAAABxAAAAAAKznQHkAAfpChZc CABFAABjPRxAAD8GATtBej0iQXo9KJUPG1gYjVxNdHoEIIAYFtDBgAAAAQEICg1EiasAQiYE MTIwNXwxNDczNDgwfDEwNDk4MTc2ODB8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZApP8pI+ZdgK AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mBRAAH0GaHFBej0oQXo9IhtYlQ90egQgGI1c fIAQP7HebAAAAQEICgBCJiQNRImrT/KSPqHZCgBxAAAAcQAAAAACs50B5AAH6QoWXAgARQAA Yz0dQAA/BgE6QXo9IkF6PSiVDxtYGI1cfHR6BCCAGBbQuxgAAAEBCAoNRInAAEImJDEyMDZ8 MTQ3MzQ4MXwxMDQ5ODE3NjgyfDEuMHwxfDI4NTh8aGVsbG8gd29ybGQKT/KSPtEuDgBCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJgVQAB9BmhwQXo9KEF6PSIbWJUPdHoEIBiNXKuAED+C 3lUAAAEBCAoAQiYmDUSJwFLykj5JRQkAcQAAAHEAAAAAArOdAeQAB+kKFlwIAEUAAGM9HkAA PwYBOUF6PSJBej0olQ8bWBiNXKt0egQggBgW0LvFAAABAQgKDUSK4gBCJiYxMjA3fDE0NzM0 ODJ8MTA0OTgxNzY4NHwxLjB8MXwyOTE1fGhlbGxvIHdvcmxkClLykj52zAsAQgAAAEIAAAAA B+kKFlwAArOdAeQIAEUAADSYFkAAfQZob0F6PShBej0iG1iVD3R6BCAYjVzagBA/U90WAAAB AQgKAEImQw1EiuJS8pI+C84LAKAAAACgAAAAAAKznQHkAAfpChZcCABFAACSPR9AAD8GAQlB ej0iQXo9KJUPG1gYjVzadHoEIIAYFtDK6AAAAQEICg1EivIAQiZDMTIwOHwxNDczNDgzfDEw NDk4MTc2ODV8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAoxMjA5fDE0NzM0ODR8MTA0OTgxNzY4 NnwxLjB8MXwyODU4fGhlbGxvIHdvcmxkClLykj4LIw8AQgAAAEIAAAAAB+kKFlwAArOdAeQI AEUAADSYF0AAfQZobkF6PShBej0iG1iVD3R6BCAYjV04gBA+9d0EAAABAQgKAEImRQ1EivJV 8pI+AnwMAHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPSBAAD8GAThBej0iQXo9KJUPG1gY jV04dHoEIIAYFtBwVAAAAQEICg1EjCMAQiZFMTIxMHwxNDczNDg1fDEwNDk4MTc2ODh8MS4w fDF8NjU0fGhlbGxvIHdvcmxkClXykj7qaw4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSY GEAAfQZobUF6PShBej0iG1iVD3R6BCAYjV1mgBA+x9u2AAABAQgKAEImYg1EjCNV8pI+0G0O AIkBAACJAQAAAAKznQHkAAfpChZcCABFAAF7PSFAAD8GAB5Bej0iQXo9KJUPG1gYjV1mdHoE IIAYFtBB/gAAAQEICg1EjC8AQiZiMTIxMXwxNDczNDg2fDEwNDk4MTc2ODh8MS4wfDF8NDgy fGhlbGxvIHdvcmxkCjEyMTJ8MTQ3MzQ4N3wxMDQ5ODE3Njg4fDEuMHwxfDI5MTV8aGVsbG8g d29ybGQKMTIxM3wxNDczNDg4fDEwNDk4MTc2ODh8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAox MjE0fDE0NzM0ODl8MTA0OTgxNzY4OXwxLjB8MXwxMzEwfGhlbGxvIHdvcmxkCjEyMTV8MTQ3 MzQ5MHwxMDQ5ODE3Njg5fDEuMHwxfDIzMHxoZWxsbyB3b3JsZAoxMjE2fDE0NzM0OTF8MTA0 OTgxNzY4OXwxLjB8MXwyODU4fGhlbGxvIHdvcmxkCjEyMTd8MTQ3MzQ5MnwxMDQ5ODE3Njg5 fDEuMHwxfDI2MjN8aGVsbG8gd29ybGQKVvKSPnKAAgBCAAAAQgAAAAAH6QoWXAACs50B5AgA RQAANJgZQAB9BmhsQXo9KEF6PSIbWJUPdHoEIBiNXq2AED2A26cAAAEBCAoAQiZlDUSML1by kj5ezgwAcQAAAHEAAAAAArOdAeQAB+kKFlwIAEUAAGM9IkAAPwYBNUF6PSJBej0olQ8bWBiN Xq10egQggBgW0LnhAAABAQgKDUSMiQBCJmUxMjE4fDE0NzM0OTN8MTA0OTgxNzY5MHwxLjB8 MXwzNDAzfGhlbGxvIHdvcmxkClfykj7wlwAAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSY GkAAfQZoa0F6PShBej0iG1iVD3R6BCAYjV7cgBA9UdtFAAABAQgKAEImbQ1EjIlX8pI+W5kA AM8AAADPAAAAAAKznQHkAAfpChZcCABFAADBPSNAAD8GANZBej0iQXo9KJUPG1gYjV7cdHoE IIAYFtCQDgAAAQEICg1EjJ0AQiZtMTIxOXwxNDczNDk0fDEwNDk4MTc2OTB8MS4wfDF8MjIz NXxoZWxsbyB3b3JsZAoxMjIwfDE0NzM0OTV8MTA0OTgxNzY5MHwxLjB8MXwxMjAzfGhlbGxv IHdvcmxkCjEyMjF8MTQ3MzQ5NnwxMDQ5ODE3NjkwfDEuMHwxfDMxMTZ8aGVsbG8gd29ybGQK V/KSPnTuAwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJgbQAB9BmhqQXo9KEF6PSIbWJUP dHoEIBiNX2mAEDzE2y8AAAEBCAoAQiZvDUSMnVfykj5AewwAcQAAAHEAAAAAArOdAeQAB+kK FlwIAEUAAGM9JEAAPwYBM0F6PSJBej0olQ8bWBiNX2l0egQggBgW0Li1AAABAQgKDUSM6wBC Jm8xMjIyfDE0NzM0OTd8MTA0OTgxNzY5MXwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCljykj7x WgAAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYHEAAfQZoaUF6PShBej0iG1iVD3R6BCAY jV+YgBA8ldrZAAABAQgKAEImdw1EjOtY8pI+eFwAALcBAAC3AQAAAAKznQHkAAfpChZcCABF AAGpPSVAAD8G/+tBej0iQXo9KJUPG1gYjV+YdHoEIIAYFtDaiwAAAQEICg1EjP8AQiZ3MTIy M3wxNDczNDk4fDEwNDk4MTc2OTF8MS4wfDF8NDgyfGhlbGxvIHdvcmxkCjEyMjR8MTQ3MzQ5 OXwxMDQ5ODE3NjkxfDEuMHwxfDMyN3xoZWxsbyB3b3JsZAoxMjI1fDE0NzM1MDB8MTA0OTgx NzY5MXwxLjB8MXwyMTN8aGVsbG8gd29ybGQKMTIyNnwxNDczNTAxfDEwNDk4MTc2OTF8MS4w fDF8MjYyM3xoZWxsbyB3b3JsZAoxMjI3fDE0NzM1MDJ8MTA0OTgxNzY5MXwxLjB8MXwzMjI1 fGhlbGxvIHdvcmxkCjEyMjh8MTQ3MzUwM3wxMDQ5ODE3NjkxfDEuMHwxfDEyMDN8aGVsbG8g d29ybGQKMTIyOXwxNDczNTA0fDEwNDk4MTc2OTF8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAox MjMwfDE0NzM1MDV8MTA0OTgxNzY5MXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCljykj5wsQMA QgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYHUAAfQZoaEF6PShBej0iG1iVD3R6BCAYjWEN gBA7INrDAAABAQgKAEImeQ1EjP9Y8pI+VlQOAHEAAABxAAAAAAKznQHkAAfpChZcCABFAABj PSZAAD8GATFBej0iQXo9KJUPG1gYjWENdHoEIIAYFtC9oAAAAQEICg1EjVsAQiZ5MTIzMXwx NDczNTA2fDEwNDk4MTc2OTJ8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZApZ8pI+F8kBAEIAAABC AAAAAAfpChZcAAKznQHkCABFAAA0mB5AAH0GaGdBej0oQXo9IhtYlQ90egQgGI1hPIAQOvHa XgAAAQEICgBCJoINRI1bWfKSPp3KAQCeAAAAngAAAAACs50B5AAH6QoWXAgARQAAkD0nQAA/ BgEDQXo9IkF6PSiVDxtYGI1hPHR6BCCAGBbQ8x4AAAEBCAoNRI1tAEImgjEyMzJ8MTQ3MzUw N3wxMDQ5ODE3NjkyfDEuMHwxfDMyN3xoZWxsbyB3b3JsZAoxMjMzfDE0NzM1MDh8MTA0OTgx NzY5MnwxLjB8MXw0ODJ8aGVsbG8gd29ybGQKWfKSPqYfBQBCAAAAQgAAAAAH6QoWXAACs50B 5AgARQAANJgfQAB9BmhmQXo9KEF6PSIbWJUPdHoEIBiNYZiAEDqV2koAAAEBCAoAQiaEDUSN bVrykj5RzgEAcAAAAHAAAAAAArOdAeQAB+kKFlwIAEUAAGI9KEAAPwYBMEF6PSJBej0olQ8b WBiNYZh0egQggBgW0HUAAAABAQgKDUSN0QBCJoQxMjM0fDE0NzM1MDl8MTA0OTgxNzY5M3wx LjB8MXwzMjd8aGVsbG8gd29ybGQKWvKSPqriBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAA NJggQAB9BmhlQXo9KEF6PSIbWJUPdHoEIBiNYcaAEDpn2dwAAAEBCAoAQiaODUSN0Vrykj4f 5AQAnwAAAJ8AAAAAArOdAeQAB+kKFlwIAEUAAJE9KUAAPwYBAEF6PSJBej0olQ8bWBiNYcZ0 egQggBgW0DCqAAABAQgKDUSN5QBCJo4xMjM1fDE0NzM1MTB8MTA0OTgxNzY5M3wxLjB8MXw2 NTR8aGVsbG8gd29ybGQKMTIzNnwxNDczNTExfDEwNDk4MTc2OTN8MS4wfDF8MTIwM3xoZWxs byB3b3JsZApa8pI+BzkIAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mCFAAH0GaGRBej0o QXo9IhtYlQ90egQgGI1iI4AQOgrZxgAAAQEICgBCJpANRI3lW/KSPuhGAABxAAAAcQAAAAAC s50B5AAH6QoWXAgARQAAYz0qQAA/BgEtQXo9IkF6PSiVDxtYGI1iI3R6BCCAGBbQuJ4AAAEB CAoNRI4rAEImkDEyMzd8MTQ3MzUxNXwxMDQ5ODE3Njk0fDEuMHwxfDEyMDN8aGVsbG8gd29y bGQKW/KSPlv6AgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJgiQAB9BmhjQXo9KEF6PSIb WJUPdHoEIBiNYlKAEDnb2XkAAAEBCAoAQiaXDUSOK17ykj7dcAAAcQAAAHEAAAAAArOdAeQA B+kKFlwIAEUAAGM9K0AAPwYBLEF6PSJBej0olQ8bWBiNYlJ0egQggBgW0LY5AAABAQgKDUSP WABCJpcxMjM4fDE0NzM1MTZ8MTA0OTgxNzY5NXwxLjB8MXwxMjAzfGhlbGxvIHdvcmxkCl7y kj6G7gMAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYI0AAfQZoYkF6PShBej0iG1iVD3R6 BCAYjWKBgBA5rNguAAABAQgKAEImtQ1Ej1he8pI+N/ADAC0BAAAtAQAAAAKznQHkAAfpChZc CABFAAEfPSxAAD8GAG9Bej0iQXo9KJUPG1gYjWKBdHoEIIAYFtBaxwAAAQEICg1Ej28AQia1 MTIzOXwxNDczNTE3fDEwNDk4MTc2OTV8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAoxMjQwfDE0 NzM1MTh8MTA0OTgxNzY5NnwxLjB8MXwxNTA4fGhlbGxvIHdvcmxkCjEyNDF8MTQ3MzUxOXwx MDQ5ODE3Njk2fDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKMTI0MnwxNDczNTIwfDEwNDk4MTc2 OTZ8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAoxMjQzfDE0NzM1MjF8MTA0OTgxNzY5N3wxLjB8 MXwzNDAzfGhlbGxvIHdvcmxkCl7ykj4GRQcAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSY JEAAfQZoYUF6PShBej0iG1iVD3R6BCAYjWNsgBA4wdgUAAABAQgKAEImuA1Ej29e8pI+qg8I AHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPS1AAD8GAStBej0iQXo9KJUPG1gYjWNsdHoE IIAYFtBqQwAAAQEICg1Ej4oAQia4MTI0NHwxNDczNTIyfDEwNDk4MTc2OTd8MS4wfDF8NjU0 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 cQAAAHEAAAAAArOdAeQAB+kKFlwIAEUAAGM9M0AAPwYBJEF6PSJBej0olQ8bWBiNZOF0egQg gBgW0K3IAAABAQgKDUSSCwBCJt0xMjUyfDE0NzM1MzB8MTA0OTgxNzcwMnwxLjB8MXwxMzEw fGhlbGxvIHdvcmxkCmXykj5WQwIAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYK0AAfQZo WkF6PShBej0iG1iVD3R6BCAYjWUQgBA3HdU2AAABAQgKAEIm+g1Ekgtl8pI+9kQCAM4AAADO AAAAAAKznQHkAAfpChZcCABFAADAPTRAAD8GAMZBej0iQXo9KJUPG1gYjWUQdHoEIIAYFtBC TQAAAQEICg1EkiAAQib6MTI1M3wxNDczNTMxfDEwNDk4MTc3MDN8MS4wfDF8NjUxfGhlbGxv IHdvcmxkCjEyNTR8MTQ3MzUzMnwxMDQ5ODE3NzAzfDEuMHwxfDM0MjB8aGVsbG8gd29ybGQK MTI1NXwxNDczNTMzfDEwNDk4MTc3MDR8MS4wfDF8MzU3M3xoZWxsbyB3b3JsZApl8pI+2pkF AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mCxAAH0GaFlBej0oQXo9IhtYlQ90egQgGI1l nIAQNpHVHgAAAQEICgBCJv0NRJIgZfKSPkbNDABxAAAAcQAAAAACs50B5AAH6QoWXAgARQAA Yz01QAA/BgEiQXo9IkF6PSiVDxtYGI1lnHR6BCCAGBbQqoEAAAEBCAoNRJJlAEIm/TEyNTZ8 MTQ3MzUzNHwxMDQ5ODE3NzA1fDEuMHwxfDE1MDh8aGVsbG8gd29ybGQKZvKSPvRaAABCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJgtQAB9BmhYQXo9KEF6PSIbWJUPdHoEIBiNZcuAEDZi 1NMAAAEBCAoAQicDDUSSZWbykj57XAAAngAAAJ4AAAAAArOdAeQAB+kKFlwIAEUAAJA9NkAA PwYA9EF6PSJBej0olQ8bWBiNZct0egQggBgW0NwRAAABAQgKDUSSdwBCJwMxMjU3fDE0NzM1 MzV8MTA0OTgxNzcwNXwxLjB8MXwyMTN8aGVsbG8gd29ybGQKMTI1OHwxNDczNTM2fDEwNDk4 MTc3MDV8MS4wfDF8NDgyfGhlbGxvIHdvcmxkCmbykj6jsQMAQgAAAEIAAAAAB+kKFlwAArOd AeQIAEUAADSYLkAAfQZoV0F6PShBej0iG1iVD3R6BCAYjWYngBA2BtS/AAABAQgKAEInBQ1E kndp8pI+3sEAAHEAAABxAAAAAAKznQHkAAfpChZcCABFAABjPTdAAD8GASBBej0iQXo9KJUP G1gYjWYndHoEIIAYFtCnrwAAAQEICg1Ek6YAQicFMTI1OXwxNDczNTM3fDEwNDk4MTc3MDZ8 MS4wfDF8MTIwM3xoZWxsbyB3b3JsZApp8pI+mPoCAEIAAABCAAAAAAfpChZcAAKznQHkCABF AAA0mC9AAH0GaFZBej0oQXo9IhtYlQ90egQgGI1mVoAQNdfTcgAAAQEICgBCJyMNRJOmafKS PsH7AgCgAAAAoAAAAAACs50B5AAH6QoWXAgARQAAkj04QAA/BgDwQXo9IkF6PSiVDxtYGI1m VnR6BCCAGBbQv9UAAAEBCAoNRJO0AEInIzEyNjB8MTQ3MzUzOHwxMDQ5ODE3NzA3fDEuMHwx fDI5MTV8aGVsbG8gd29ybGQKMTI2MXwxNDczNTM5fDEwNDk4MTc3MDd8MS4wfDF8MjkxNXxo ZWxsbyB3b3JsZApp8pI+/VAGAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mDBAAH0GaFVB ej0oQXo9IhtYlQ90egQgGI1mtIAQNXnTYgAAAQEICgBCJyUNRJO0avKSPuYoAgAqAAAAKgAA AAAH6QoWXAACs50B5AgGAAEIAAYEAAEAArOdAeRBej0oAAAAAAAAQXo9Imrykj7iKQIAPAAA ADwAAAAAArOdAeQAB+kKFlwIBgABCAAGBAACAAfpChZcQXo9IgACs50B5EF6PSgAAAAAAAAA AAAAAAAAAAAAAABq8pI+HVIFAEIAAABCAAAAAAKznQHkAAfpChZcCABFAAA0mVdAAD8GpS5B ej0iQXo9KJMoG1iNitlBLdEkcIAQFtA29AAAAQEICg1ElCgAQiJ+avKSPvOKBQBCAAAAQgAA AAAH6QoWXAACs50B5AgARQAANJgxQAB9BmhUQXo9KEF6PSIbWJMoLdEkcI2K2UKAEAAASRMA AAEBCAoAQicuDUSUKGrykj6QNwoAQQEAAEEBAAABAAzMzMwAB+uexW4BM6qqAwAADCAAArSB pgABAA5Ta2FydmVuX2d3AAIAEQAAAAEBAcwABEF6PSEAAwARRmFzdEV0aGVybmV0MAAEAAgA AAABAAUA00Npc2NvIEludGVybmV0d29yayBPcGVyYXRpbmcgU3lzdGVtIFNvZnR3YXJlIApJ T1MgKHRtKSBDMTcwMCBTb2Z0d2FyZSAoQzE3MDAtWS1NKSwgVmVyc2lvbiAxMi4xKDMpLCBS RUxFQVNFIFNPRlRXQVJFIChmYzEpCkNvcHlyaWdodCAoYykgMTk4Ni0yMDAwIGJ5IGNpc2Nv IFN5c3RlbXMsIEluYy4KQ29tcGlsZWQgV2VkIDA1LUp1bC0wMCAxNzowNyBieSBjbW9uZwAG AA5jaXNjbyAxNzIwAAcACUF9NZweAAsABQFs8pI+xm8CAHEAAABxAAAAAAKznQHkAAfpChZc CABFAABjPTlAAD8GAR5Bej0iQXo9KJUPG1gYjWa0dHoEIIAYFtCp2AAAAQEICg1ElN0AQicl MTI2MnwxNDczNTQwfDEwNDk4MTc3MTB8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAps8pI+6ZkF AEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mDJAAH0GaFNBej0oQXo9IhtYlQ90egQgGI1m 44AQNUrSGwAAAQEICgBCJ0MNRJTdb/KSPqOYAgBxAAAAcQAAAAACs50B5AAH6QoWXAgARQAA Yz06QAA/BgEdQXo9IkF6PSiVDxtYGI1m43R6BCCAGBbQoV0AAAEBCAoNRJYKAEInQzEyNjN8 MTQ3MzU0MXwxMDQ5ODE3NzEyfDEuMHwxfDI0NDB8aGVsbG8gd29ybGQKb/KSPtriBABCAAAA QgAAAAAH6QoWXAACs50B5AgARQAANJgzQAB9BmhSQXo9KEF6PSIbWJUPdHoEIBiNZxKAEDUb 0NEAAAEBCAoAQidgDUSWCm/ykj6I5AQAKgEAACoBAAAAArOdAeQAB+kKFlwIAEUAARw9O0AA PwYAY0F6PSJBej0olQ8bWBiNZxJ0egQggBgW0CKDAAABAQgKDUSWGQBCJ2AxMjY0fDE0NzM1 NDJ8MTA0OTgxNzcxM3wxLjB8MXw2NTR8aGVsbG8gd29ybGQKMTI2NXwxNDczNTQzfDEwNDk4 MTc3MTN8MS4wfDF8MzI3fGhlbGxvIHdvcmxkCjEyNjZ8MTQ3MzU0NHwxMDQ5ODE3NzE0fDEu MHwxfDI4NTh8aGVsbG8gd29ybGQKMTI2N3wxNDczNTQ1fDEwNDk4MTc3MTR8MS4wfDF8NjU0 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 ffKSPraQCwBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJhLQAB9Bmg6QXo9KEF6PSIbWJUP dHoEIBiNbOiAEC9FyqAAAAEBCAoAQifwDUSbq33ykj5QkgsAcAAAAHAAAAAAArOdAeQAB+kK FlwIAEUAAGI9U0AAPwYBBUF6PSJBej0olQ8bWBiNbOh0egQggBgW0E9iAAABAQgKDUSbvABC J/AxMjk2fDE0NzM1NzR8MTA0OTgxNzcyOHwxLjB8MXwyMzB8aGVsbG8gd29ybGQKffKSPiWZ CwCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFHmQAA/BudHQXo9IkF6PSi5AAAU7XrB9KVD PKdQEGEIAgMAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc2NzQgTU49MzYyMDAwNzIub3V0 IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkJ1c2luZXNzV2ly ZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBDeWJlclRyYWRlciBVbnZlaWxz IEVuaGFuY2VkIFF1b3RlIERlbGl2ZXJ5IGZvcgpBY3RpdmUgVHJhZGVycyBBdCBDeWJlclRy YWRlciBhbmQgQ2hhcmxlcyBTY2h3YWIKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgouLi4gIAoK RGF0ZUxpbmUuLi4gIEFVU1RJTiwgVGV4YXMsIEFwciA4LCAyMDAzIChCVVNJTkVTUyBXSVJF KSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAoQykgMjAwMyBCdXNp bmVzcyBXaXJlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpCdXNpbmVzc1dpcmUK CkN5YmVyVHJhZGVyIEluYywgdGhlIGRpcmVjdCBhY2Nlc3MgYnJva2VyYWdlIHN1YnNpZGlh cnkgb2YgVGhlIENoYXJsZXMKU2Nod2FiIENvcnBvcmF0aW9uIChOWVNFOlNDSCksIGFubm91 bmNlZCB0b2RheSBhIG5ldyBkaXJlY3Qgc3RyZWFtaW5nCnJlYWwtdGltZSBxdW90YXRpb24g c2VydmljZSBmb3IgYWN0aXZlIHRyYWRlciBjbGllbnRzIGF0IGJvdGggQ3liZXJUcmFkZXIK YW5kIFNjaHdhYi4KClRoZSBuZXcgdGlja2VyIHBsYW50IHF1b3RlIHN5c3RlbSBpcyBkZXNp Z25lZCB0byBzdXBwbHkgY2xpZW50cyB3aXRoCmZhc3RlciBxdW90ZXMgYnkgcHJvdmlkaW5n IGEgZGlyZWN0IGNvbm5lY3Rpb24gZnJvbSB0aGUgbWFya2V0IHRvIHRoZQp0cmFkZXIncyB3 b3Jrc3RhdGlvbi4gVGhlIGNlbnRyYWwgcXVvdGUgcHJvY2Vzc2luZyBzeXN0ZW0gYWdncmVn YXRlcyBhbmQKZGlzdHJpYnV0ZXMgbGl2ZSBxdW90ZSBmZWVkcyBmcm9tIG1vc3QgVVMgZXhj aGFuZ2VzLCBFQ05zIGFuZCBvdGhlcgptYXJrZXQgY2VudGVycywgYXMgd2VsbCBhcyB1cC10 by10aGUtbWludXRlIG5ld3MgaXRlbXMgZnJvbSBEb3cgSm9uZXMgYW5kCkNvbXRleCBOZXdz LCB0byBDeWJlclRyYWRlciBhbmQgU2Nod2FiIGN1c3RvbWVycy4KCiJUaGUgcmFwaWQgZGVs aXZlcnkgb2YgbWFya2V0IHF1b3RlcyBpcyBjcml0aWNhbCB0byBhY3RpdmUgdHJhZGVycywi IHNhaWQKVmluY2VudCBQaGlsbGlwcywgc2VuaW9yIHZpY2UgcHJlc2lkZW50IGZvciBQcm9k dWN0cyBhbmQgVGVjaG5vbG9neSBhdApDeWJlclRyYWRlci4gIlRoZSB0aWNrZXIgcGxhbnQg Z2l2ZXMgQ3liZXJUcmFkZXIgZ3JlYXRlciBjb250cm9sLCBzcGVlZAphbmQgZmxleGliaWxp dHkgaW4gZGVsaXZlcmluZyBxdW90ZXMgdG8gY2xpZW50cyB3aG8gdXNlIHRoZSBkYXRhIGZv cgpyYXBpZCBkZWNpc2lvbi1tYWtpbmcuIiBQcmV2aW91c2x5LCBxdX3ykj6gmQsAmgUAAJoF AAAAArOdAeQAB+kKFlwIAEUABYxR50AAPwbnRkF6PSJBej0ouQAAFO16x1ilQzynUBhhCOKm AABvdGVzIHdlcmUgZGlzdHJpYnV0ZWQgYnkgbWFya2V0CmRhdGEgdmVuZG9ycyB3aG8gY29u dHJhY3RlZCB3aXRoIHRoZSBleGNoYW5nZXMuCgpEZXZlbG9wZWQgYnkgQ3liZXJUcmFkZXIn cyBvd24gdGVjaG5vbG9neSB0ZWFtLCB0aGUgdGlja2VyIHBsYW50IGRlbGl2ZXJzCmFuIGVz dGltYXRlZCAyMCBiaWxsaW9uIHN0b2NrIG1hcmtldCBxdW90ZXMgcGVyIGRheSB0byB0cmFk ZXJzIHVzaW5nCkN5YmVyVHJhZGVyJ3MgMyB0cmFkaW5nIHBsYXRmb3JtcyBhcyB3ZWxsIGFz IFNjaHdhYidzIFN0cmVldFNtYXJ0IFBybyBhbmQKVmVsb2NpdHkgdHJhZGluZyBwbGF0Zm9y bXMuIFRoZSBxdW90ZXMsIGNhcHR1cmVkIGRpcmVjdGx5IGZyb20gdGhlIG1hcmtldApzb3Vy Y2VzIChpLmUuOiBOZXcgWW9yayBTdG9jayBFeGNoYW5nZSwgTmFzZGFxLCBFQ05zKSwgYXJl IGZvcm1hdHRlZCBmb3IKY3VzdG9taXplZCB1c2UgYnkgdGhlIHRpY2tlciBwbGFudCBhbmQg cm91dGVkIGRpcmVjdGx5IHRvIGN1c3RvbWVycyBhdApDeWJlclRyYWRlciBhbmQgU2Nod2Fi LgoKIk91ciB0aWNrZXIgcGxhbnQncyBhcmNoaXRlY3R1cmUgaXMgc2NhbGFibGUgaW4gb3Jk ZXIgdG8gaGFuZGxlIGFuCmluY3JlYXNpbmcgY2xpZW50IGJhc2UgYW5kIGFkYXB0YWJsZSBl bm91Z2ggZm9yIGFuIGV2ZW4gZ3JlYXRlciBicmVhZHRoCmFuZCBkZXB0aCBvZiBjcml0aWNh bCBtYXJrZXQgaW5mb3JtYXRpb24gaW4gdGhlIGZ1dHVyZSwiIGFkZGVkIFBoaWxsaXBzLgoK Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ3liZXJUcmFkZXIsIEluYyBwbGVhc2Ugdmlz aXQKd3d3LmN5YmVydHJhZGVyLmNvbSBvciBjYWxsIDEtODg4LTc2LUNZQkVSLgoKQWJvdXQg Q3liZXJUcmFkZXI6CgpDeWJlclRyYWRlciwgYmFzZWQgaW4gQXVzdGluLCBUZXhhcywgaXMg YSBEaXJlY3QgQWNjZXNzIEJyb2tlcgpzcGVjaWFsaXppbmcgaW4gZWxlY3Ryb25pYyB0cmFk aW5nIGFuZCBicm9rZXJhZ2Ugc2VydmljZXMuIEN5YmVyVHJhZGVyCnByb3ZpZGVzIGN1c3Rv bWVycyB3aXRoIHJlYWwtdGltZSBzdHJlYW1pbmcgZGF0YSBhcyB3ZWxsIGFzIGRpcmVjdApj b25uZWN0aW9ucyB0byB0aGUgbWFya2V0cyB2aWEgRUNOcywgYWxsIDUgb3B0aW9ucyBleGNo YW5nZXMgYW5kIG92ZXIgNDUwCm1hcmtldCBtYWtlcnMuIEN5YmVyVHJhZGVyIG9mZmVycyBp dHMgY3VzdG9tZXJzIHR3byBzb2Z0d2FyZS1iYXNlZAp0cmFkaW5nIHBsYXRmb3JtcyAtLSBD eWJlclgyIGFuZCBDeWJlclRyYWRlciBQcm8gLS0gYXMgd2VsbCBhcyB3ZWIgYW5kCndpcmVs ZXNzIGFjY2Vzcy4gSW4gTWFyY2ggMjAwMCwgQ3liZXJUcmFkZXIgd2FzIGFjcXVpcmVkIGJ5 IENoYXJsZXMKU2Nod2FiIGFuZCBpcyBhIHdob2xseSB98pI+75kLAPMCAADzAgAAAAKznQHk AAfpChZcCABFAALlUehAAD8G6exBej0iQXo9KLkAABTtesy8pUM8p1AYYQg2sQAAb3duZWQg c3Vic2lkaWFyeSBvZiBUaGUgQ2hhcmxlcyBTY2h3YWIKQ29ycG9yYXRpb24uIEN5YmVyVHJh ZGVyIGN1c3RvbWVycyBhcmUgYWJsZSB0byBtYWludGFpbiBhY2NvdW50cyB3aXRoCmJvdGgg Q2hhcmxlcyBTY2h3YWIgYW5kIEN5YmVyVHJhZGVyIGFuZCBjYW4gdHJhbnNmZXIgZnVuZHMg c2VhbWxlc3NseQpiZXR3ZWVuIHRoZSB0d28uCgpDeWJlclRyYWRlciwgSW5jIApUcmV5IFJv Ymluc29uLCA1MTIvNjgyLTc2MTkKdHJvYmluc29uQGN5YmVydHJhZGVyLmNvbQpvcgpJbnRl cm1hcmtldCBDb21tdW5pY2F0aW9ucwpNaWtlIEJvY2NpbywgMjEyLzg4OC02MTE1Cm1pa2VA aW50ZXJtYXJrZXQuY29tCgpodHRwOi8vd3d3LmJ1c2luZXNzd2lyZS5jb20KClRvZGF5J3Mg TmV3cyBPbiBUaGUgTmV0IC0gQnVzaW5lc3MgV2lyZSdzIGZ1bGwgZmlsZSBvbiB0aGUgSW50 ZXJuZXQKd2l0aCBIeXBlcmxpbmtzIHRvIHlvdXIgaG9tZSBwYWdlLgoKLi4uICAJIAoKS2V5 V29yZHMuLi4gIAogICAgYXJjaGl0ZWN0dXJlCiAgICBicm9rZXIKICAgIGRvdytqb25lcwog ICAgbWFya2V0CiAgICBuYXNkYXEKICAgIE5ldytZb3JrK1N0b2NrK0V4Y2hhbmdlCiAgICBu eXNlCiAgICBwbGFudAogICAgcHJlc2lkZW50CiAgICBwcm9kdWN0cwogICAgc29mdHdhcmUK ICAgIHRlY2hub2xvZ3kKICAgIHRleGFzCiAgICB3ZWIKICAgIHdpcmVsZXNzCgp98pI+8JkL ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUelAAD8G7KhBej0iQXo9KLkAABTtes95pUM8 p1ARYQj5mAAAAAAAAAAAffKSPq8TDAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLr/QAB9 BkWSQXo9KEF6PSIAFLkApUM8p+16zLxQEP1cYAIAAH3ykj7OIAwANgAAADYAAAAAB+kKFlwA ArOdAeQIAEUAACi7AEAAfQZFkUF6PShBej0iABS5AKVDPKftes96UBD6n2ABAAB98pI+0ikM ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouwFAAH0GRZBBej0oQXo9IgAUuQClQzyn7XrP elAR+p9gAAAAffKSPuIqDAA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAAKFHqQAA/BuynQXo9 IkF6PSi5AAAU7XrPeqVDPKhQEGEI+ZcAAAAAAAAAAH3ykj6r1AwAPAAAADwAAAAAArOdAeQA B+kKFlwIAEUAAChR60AAPwbspkF6PSJBej0ouP8AFe120PpjCx7kUBBhCFgYAAAAAAAAAAB9 8pI++gwNAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAuwJAAH0GRXdBej0oQXo9IgAVuP9j Cx7k7XbQ+lAY+l7vqwAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KffKSPmaCDgA8AAAAPAAA AAACs50B5AAH6QoWXAgARQAAKFHsQAA/BuylQXo9IkF6PSi4/wAV7XbQ+mMLHvxQEGEIWAAA AAAAAAAAAH3ykj5B5g4AQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYTEAAfQZoOUF6PShB ej0iG1iVD3R6BCAYjW0WgBAvF8qMAAABAQgKAEIn8w1Em7x+8pI+/mQKAHAAAABwAAAAAAKz nQHkAAfpChZcCABFAABiPVRAAD8GAQRBej0iQXo9KJUPG1gYjW0WdHoEIIAYFtBOzwAAAQEI Cg1EnBkAQifzMTI5N3wxNDczNTc1fDEwNDk4MTc3MzB8MS4wfDF8NjU0fGhlbGxvIHdvcmxk Cn7ykj4g/gwAQgAAAEIAAAAAB+kKFlwAArOdAeQIAEUAADSYTUAAfQZoOEF6PShBej0iG1iV D3R6BCAYjW1EgBAu6conAAABAQgKAEIn+w1EnBl/8pI+z+wLAHEAAABxAAAAAAKznQHkAAfp ChZcCABFAABjPVVAAD8GAQJBej0iQXo9KJUPG1gYjW1EdHoEIIAYFtCRsQAAAQEICg1EnIcA Qif7MTI5OHwxNDczNTc2fDEwNDk4MTc3MzF8MS4wfDF8MjkxNXxoZWxsbyB3b3JsZAp/8pI+ bWwOAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mE5AAH0GaDdBej0oQXo9IhtYlQ90egQg GI1tc4AQLrrJrgAAAQEICgBCKAYNRJyHf/KSPtltDgCgAAAAoAAAAAACs50B5AAH6QoWXAgA RQAAkj1WQAA/BgDSQXo9IkF6PSiVDxtYGI1tc3R6BCCAGBbQs/EAAAEBCAoNRJyXAEIoBjEy OTl8MTQ3MzU3N3wxMDQ5ODE3NzMxfDEuMHwxfDEyMDN8aGVsbG8gd29ybGQKMTMwMHwxNDcz NTc4fDEwNDk4MTc3MzF8MS4wfDF8MzU3M3xoZWxsbyB3b3JsZAqA8pI+gIACAEIAAABCAAAA AAfpChZcAAKznQHkCABFAAA0mE9AAH0GaDZBej0oQXo9IhtYlQ90egQgGI1t0YAQLlzJmwAA AQEICgBCKAkNRJyXgPKSPvzfCABwAAAAcAAAAAACs50B5AAH6QoWXAgARQAAYj1XQAA/BgEB QXo9IkF6PSiVDxtYGI1t0XR6BCCAGBbQWT4AAAEBCAoNRJzXAEIoCTEzMDF8MTQ3MzU3OXwx MDQ5ODE3NzMxfDEuMHwxfDQ4MnxoZWxsbyB3b3JsZAqA8pI+2dgKAEIAAABCAAAAAAfpChZc AAKznQHkCABFAAA0mFBAAH0GaDVBej0oQXo9IhtYlQ90egQgGI1t/4AQLi7JVgAAAQEICgBC KA4NRJzXgPKSPqxADABxAAAAcQAAAAACs50B5AAH6QoWXAgARQAAYz1YQAA/BgD/QXo9IkF6 PSiVDxtYGI1t/3R6BCCAGBbQlZIAAAEBCAoNRJztAEIoDjEzMDJ8MTQ3MzU4MHwxMDQ5ODE3 NzMyfDEuMHwxfDM0MjB8aGVsbG8gd29ybGQKgPKSPjIvDgBCAAAAQgAAAAAH6QoWXAACs50B 5AgARQAANJhRQAB9Bmg0QXo9KEF6PSIbWJUPdHoEIBiNbi6AEC3/yT4AAAEBCAoAQigQDUSc 7YDykj7qMA4AzwAAAM8AAAAAArOdAeQAB+kKFlwIAEUAAME9WUAAPwYAoEF6PSJBej0olQ8b WBiNbi50egQggBgW0HDQAAABAQgKDUSc+QBCKBAxMzAzfDE0NzM1ODF8MTA0OTgxNzczMnwx LjB8MXwxMjAzfGhlbGxvIHdvcmxkCjEzMDR8MTQ3MzU4MnwxMDQ5ODE3NzMyfDEuMHwxfDM0 MDN8aGVsbG8gd29ybGQKMTMwNXwxNDczNTgzfDEwNDk4MTc3MzJ8MS4wfDF8MjQ0MHxoZWxs byB3b3JsZAqB8pI+kUMCAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mFJAAH0GaDNBej0o QXo9IhtYlQ90egQgGI1uu4AQLXLJMAAAAQEICgBCKBINRJz5gvKSPjgDDQBQAAAAUAAAAAAC s50B5AAH6QoWXAgARQAAQlHtQAA/BuyKQXo9IkF6PSi4/wAV7XbQ+mMLHvxQGGEIXAsAAERF TEUgMzYyMDAwNzMub3V0LjAzMDQwOA0KgvKSPptADQB8AAAAfAAAAAAH6QoWXAACs50B5AgA RQAAbrsDQAB9BkVIQXo9KEF6PSIAFbj/Ywse/O120RRQGPpEP50AADU1MCAzNjIwMDA3My5v dXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4g DQqC8pI+PU4NAE8AAABPAAAAAAKznQHkAAfpChZcCABFAABBUe5AAD8G7IpBej0iQXo9KLj/ ABXtdtEUYwsfQlAYYQjEGAAAUE9SVCA2NSwxMjIsNjEsMzQsMTg1LDENCoLykj48iA0AVAAA AFQAAAAAB+kKFlwAArOdAeQIAEUAAEa7BEAAfQZFb0F6PShBej0iABW4/2MLH0LtdtEtUBj6 KgFXAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3NmdWwuDQqC8pI+oYsNAFAAAABQAAAAAAKz nQHkAAfpChZcCABFAABCUe9AAD8G7IhBej0iQXo9KLj/ABXtdtEtYwsfYFAYYQhJWAAAU1RP UiAzNjIwMDA3My5vdXQuMDMwNDA4DQqC8pI+w8cNAHgAAAB4AAAAAAfpChZcAAKznQHkCABF AABquwVAAH0GRUpBej0oQXo9IgAVuP9jCx9g7XbRR1AY+hDJXwAAMTUwIE9wZW5pbmcgQklO QVJZIG1vZGUgZGF0YSBjb25uZWN0aW9uIGZvciAzNjIwMDA3My5vdXQuMDMwNDA4Lg0KgvKS PsvIDQA+AAAAPgAAAAAH6QoWXAACs50B5AgARQAAMLsGQAB9BkWDQXo9KEF6PSIAFLkByyT0 nAAAAABwAvrwEmkAAAIEBWQBAQQCgvKSPnDKDQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAA MFHwQAA/BuyZQXo9IkF6PSi5AQAU7Zcgrssk9J1wEmEInaoAAAEBBAICBAW0gvKSPpECDgA2 AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLsHQAB9BkWKQXo9KEF6PSIAFLkByyT0ne2XIK9Q EP1cLhoAAILykj79CQ4AmgUAAJoFAAAAArOdAeQAB+kKFlwIAEUABYxR8UAAPwbnPEF6PSJB ej0ouQEAFO2XIK/LJPSdUBBhCO76AABYWVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3Njc0IE1O PTM2MjAwMDczLm91dCBTUkM9Y29tdGV4IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZO PSJQUiBOZXdzd2lyZSIgCgouLi4gIAoKCi4uLiAJIAoKCkhlYWRMaW5lLi4uICBLaW5nc3Rv biBBbm5vdW5jZXMgVmFsaWRhdGVkIFNPRElNTSBNZW1vcnkgTW9kdWxlcyBmb3IKSW50ZWwo UikgQ2VudHJpbm8oVE0pIE1vYmlsZSBUZWNobm9sb2d5IFBsYXRmb3JtCgouLi4gIAkgCgpC eUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBGT1VOVEFJTiBWQUxMRVksICBDYWxp Zi4sIEFwciA4LCAyMDAzIC9QUk5ld3N3aXJlIHZpYSBDT01URVgvIC0tCgoKCi4uLgoKQ29w eXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IChDKSAyMDAzIFBSIE5ld3N3aXJlLiAgQWxsIHJp Z2h0cyByZXNlcnZlZC4KCgouLi4KCgpQUiBOZXdzd2lyZQoKS2luZ3N0b24oUikgVGVjaG5v bG9neSBDb21wYW55LCBJbmMgLCB0aGUgd29ybGR3aWRlIGluZGVwZW5kZW50IGxlYWRlciBp bgptZW1vcnkgcHJvZHVjdHMgYW5ub3VuY2VkIHRvZGF5IGltbWVkaWF0ZSBhdmFpbGFiaWxp dHkgb2YgRERSIFNPRElNTQptb2R1bGVzIHRvIHN1cHBvcnQgdGhlIEludGVsKFIpIENlbnRy aW5vKFRNKSBNb2JpbGUgVGVjaG5vbG9neSBQbGF0Zm9ybS4KVGhlIHBsYXRmb3JtIHdpbGwg dXRpbGl6ZSBTT0RJTU0gbW9kdWxlcyBvcGVyYXRpbmcgYXQgc3BlZWRzIG9mIDI2Nk1Iegp3 aXRoIG1lbW9yeSBleHBhbnNpb24gdXAgdG8gMkdCKDEpLgoKKFBob3RvOiBodHRwOi8vd3d3 Lm5ld3Njb20uY29tL2NnaS1iaW4vcHJuaC8xOTk5MTAxMS9LSU5HU1RPTiApCgpJbnRlbCdz IENlbnRyaW5vIG1vYmlsZSB0ZWNobm9sb2d5IGRlbGl2ZXJzIGN1dHRpbmctZWRnZSBzeXN0 ZW0KcGVyZm9ybWFuY2UgYW5kIGxvdyBwb3dlciBlbmhhbmNlbWVudHMgdG8gZW5hYmxlIGV4 dGVuZGVkIGJhdHRlcnkgbGlmZSBpbgpub3RlYm9vayBQQ3MsIGNvbWJpbmVkIHdpdGggaW50 ZWdyYXRlZCB3aXJlbGVzcyBjb25uZWN0aXZpdHkgYW5kCnN0YW5kYXJkcy0gYmFzZWQgc2Vj dXJpdHkgc3VwcG9ydC4gSW50ZWwgQ2VudHJpbm8gbW9iaWxlIHRlY2hub2xvZ3kKaW5jbHVk ZXMgYSBuZXcgbW9iaWxlIHByb2Nlc3NvciwgcmVsYXRlZCBjaGlwc2V0cyBhbmQgODAyLjEx IHdpcmVsZXNzCm5ldHdvcmtpbmcgY2FwYWJpbGl0aWVzIHRoYXQgaGF2ZSBiZWVuIGRlc2ln bmVkIGFuZCB0ZXN0ZWQgdG8gd29yawp0b2dldGhlci4KCiJLaW5nc3RvbiBoYXMgYmVlbiB3 b3JraW5nIHdpdGggaW5kdXN0cnkgcGFydG5lcnMgc3VjaCBhcyBBU1VTVGVLCkNvbXB1dGVy IEluYyAsIGFuZCBGaXJzdCBJbnRlcm5hdGlvbmFsIENvbXB1dGVyLCBJbmMgKEZJQykgdG+C 8pI+dAoOAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUfJAAD8G5ztBej0iQXo9KLkBABTt lyYTyyT0nVAYYQiWlwAAIGVuc3VyZSB0aGF0CmxlYWRpbmcgUEMgT0VNcywgc3lzdGVtIGlu dGVncmF0b3JzLCB0aGUgZGlzdHJpYnV0aW9uIGNoYW5uZWwgYW5kCmNvcnBvcmF0ZSBjdXN0 b21lcnMgY2FuIGRlcGVuZCBvbiBLaW5nc3RvbiBmb3IgcHJlbWl1bSBtZW1vcnksIiBzdGF0 ZWQKTWlrZSBTYWdlciwgc2VuaW9yIHZpY2UgcHJlc2lkZW50LCBzYWxlcyBhbmQgbWFya2V0 aW5nLCBLaW5nc3Rvbi4KIktpbmdzdG9uIGlzIHJlYWR5IHRvIHN1cHBvcnQgb3VyIGluZHVz dHJ5IHBhcnRuZXJzIGFuZCB3aWxsIGVuc3VyZSBvdXIKY3VzdG9tZXJzIGhhdmUgcXVhbGl0 eSBQQzIxMDAgU09ESU1NcyB0byBkZWxpdmVyIENlbnRyaW5vIGJhc2VkIHN5c3RlbXMKd29y bGR3aWRlLCIgYWRkZWQgU2FnZXIuCgoiQVNVUyhSKSBpcyBmdWxseSBwcmVwYXJlZCB0byBz dXBwb3J0IEludGVsJ3MgQ2VudHJpbm8gbW9iaWxlIHRlY2hub2xvZ3kKcGxhdGZvcm0gd2l0 aCB0aGUgbGF1bmNoIG9mIG91ciBNM04sIE0yTiBhbmQgUzFOIHdoaXRlYm9va3MsIiBzdGF0 ZWQKUmF5bW9uZCBDaGVuLCB2aWNlIHByZXNpZGVudCBvZiBBU1VTIENvbXB1dGVyIEludGVy bmF0aW9uYWwsIHRoZSBVUwpicmFuY2ggb2ZmaWNlIG9mIEFTVVNUZUsgQ29tcHV0ZXIuICJB U1VTIGhhcyB2YWxpZGF0ZWQgS2luZ3N0b24ncyBtb2R1bGVzCmZvciB0aGUgQ2VudHJpbm8g cGxhdGZvcm0gYW5kIGFyZSB2ZXJ5IHBsZWFzZWQgd2l0aCB0aGUgb3ZlcmFsbApwZXJmb3Jt YW5jZS4gV2UgZmVlbCB0aGF0IG91ciBjdXN0b21lcnMgd2lsbCBiZSBncmVhdGx5IHBsZWFz ZWQuIgoKIkZJQyBoYXMgYmVlbiB3b3JraW5nIGNsb3NlbHkgd2l0aCBwYXJ0bmVycyBzdWNo IGFzIEtpbmdzdG9uIHRvIGVuc3VyZQp0aGF0IG91ciBjdXN0b21lcnMgd2lsbCByZWNlaXZl IGEgcHJlbWllcmUgY29tcHV0aW5nIHNvbHV0aW9uIGZvciB0aGVpcgpDZW50cmlubyByZWxh dGVkIHBsYXRmb3JtcywiIHN0YXRlZCBBbGV4IE1laSwgVVMgTWFya2V0aW5nIE1hbmFnZXIs IEZJQy4KIkZJQyBoYXMgdmFsaWRhdGVkIEtpbmdzdG9uJ3MgU09ESU1NIG1vZHVsZXMgb24g b3VyIE1CMDIgc2VyaWVzIG9mCkNlbnRyaW5vIGJhc2VkIG5vdGVib29rcywgYW5kIHdlIGFy ZSBkZWxpZ2h0ZWQgdG8gcHJvdmlkZSBjdXN0b21lcnMgd2l0aAp0aGUgTUIwMiwgZ2l2aW5n IHRoZW0gdGhlIGFiaWxpdHkgdG8gZXh0ZW5kIHByb2R1Y3Rpdml0eSBhd2F5IGZyb20gdGhl CmRlc2sgYnkgY29ubmVjdGluZyB3aGVuZXZlciBhbmQgd2hlcmV2ZXIgdGhleSB3YW50LiIK CkltbWVkaWF0ZWx5IGF2YWlsYWJsZSBhcmUgbWVtb3J5IHVwZ3JhZGVzIGluIGNhcGFjaXRp ZXMgb2YgMTI4TUIsIDI1Nk1CLAo1MTJNQiwgYW5kIDFHQiBTT0RJTU0gbW9kgvKSPucKDgCa BQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFHzQAA/Buc6QXo9IkF6PSi5AQAU7Zcrd8sk9J1Q GGEI8pAAAHVsZXMgdG8gc3VwcG9ydCBwb3J0YWJsZSBjb21wdXRpbmcgc3lzdGVtcyBiYXNl ZApvbiB0aGUgQ2VudHJpbm8gbW9iaWxlIHRlY2hub2xvZ3kgZnJvbSBJbnRlbC4gQWxsIG9m IEtpbmdzdG9uJ3MgbWVtb3J5Cm1vZHVsZXMgYXJlIDEwMCBwZXJjZW50IHRlc3RlZCBhbmQg Y29tZSB3aXRoIGEgbGlmZXRpbWUgd2FycmFudHkuIEZvcgptb3JlIGluZm9ybWF0aW9uIG9u IEtpbmdzdG9uJ3MgZXhwYW5zaXZlIGxpbmUgb2YgbWVtb3J5IHByb2R1Y3RzLCBwbGVhc2UK Y29udGFjdCBLaW5nc3RvbiBhdCAoODAwKSAzMzctODQxMCBvciBieSB2aXNpdGluZyBLaW5n c3RvbidzIHdlYnNpdGUgYXQKd3d3LmtpbmdzdG9uLmNvbS4KCkFib3V0IEtpbmdzdG9uIFRl Y2hub2xvZ3kgQ29tcGFueSwgSW5jCgpLaW5nc3RvbiBUZWNobm9sb2d5IENvbXBhbnksIElu YyBpcyB0aGUgd29ybGQncyBsYXJnZXN0IGluZGVwZW5kZW50Cm1hbnVmYWN0dXJlciBvZiBt ZW1vcnkgcHJvZHVjdHMuIEtpbmdzdG9uIG9wZXJhdGVzIG1hbnVmYWN0dXJpbmcKZmFjaWxp dGllcyBpbiBNYWxheXNpYSwgVGFpd2FuLCBDaGluYSwgYW5kIEZvdW50YWluIFZhbGxleSwg Q2FsaWYuLAppbmNsdWRpbmcgUGF5dG9uIFRlY2hub2xvZ3kgQ29ycCAsIEtpbmdzdG9uJ3Mg YmFjay1lbmQgcHJvY2Vzc2luZwpmYWNpbGl0eSBzdXBwb3J0aW5nIG1lbW9yeSBwYWNrYWdp bmcsIHRlc3QgYW5kIGxvZ2lzdGljcy4gV2l0aCB0aGUgYWR2ZW50Cm9mIFBheXRvbiwgS2lu Z3N0b24gc3VwcG9ydHMgYWxsIG1lbW9yeSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBmcm9tIHJl Y2VpcHQKb2Ygd2FmZXIgdG8gY29tcGxldGVkIG1vZHVsZS4gS2luZ3N0b24gc2VydmVzIGEg bmV0d29yayBvZiBkaXN0cmlidXRvcnMsCk9FTXMsIGFuZCByZXRhaWwgY3VzdG9tZXJzIGlu IG1vcmUgdGhhbiAzLDAwMCBsb2NhdGlvbnMgd29ybGR3aWRlLiBGb3IKbW9yZSBpbmZvcm1h dGlvbiBvbiBLaW5nc3RvbiwgY2FsbCAoODAwKSAzMzctODQxMCwgb3IgZ28gdG8Kd3d3Lmtp bmdzdG9uLmNvbS4KCiAgICAoMSkgMkdCIG1heGltdW0gYmFzZWQgb24gY2hpcHNldCBzcGVj aWZpY2F0aW9ucy4gSW5kaXZpZHVhbCBzeXN0ZW0KICAgICAgICBzcGVjaWZpY2F0aW9ucyBt YXkgdmFyeS4KClNPVVJDRSBLaW5nc3RvbiBUZWNobm9sb2d5IENvbXBhbnksIEluYwoKRWRp dG9yaWFsLCBIZWF0aGVyIEphcmRpbSwgKzEtNzE0LTQzOC0xODE3LApoZWF0aGVyX2phcmRp bUBraW5nc3Rvbi5jb20sIG9yIEphamEgTGluLCArMS03MTQtNDQ1LTM0MzEsCmphamFfbGlu QGtpbmdzdG9uLmNvbSwgYm90aCBvZiBLaW5nc3RvbiBUZWNobm9sb2d5IENvICwgSW5jIAov UGhvdG86ICBOZXdzQ29tOiAgaHR0cDovL3d3dy5uZXdzY29tLoLykj7ChA4ANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi7CEAAfQZFiUF6PShBej0iABS5Acsk9J3tlyt3UBD9XCNSAACC 8pI+6IYOAAYCAAAGAgAAAAKznQHkAAfpChZcCABFAAH4UfRAAD8G6s1Bej0iQXo9KLkBABTt lzDbyyT0nVAZYQhAhQAAY29tL2NnaS1iaW4vcHJuaC8xOTk5MTAxMS9LSU5HU1RPTgpBUCBB cmNoaXZlOiAgaHR0cDovL3Bob3RvYXJjaGl2ZS5hcC5vcmcKUFJOIFBob3RvIERlc2ssICsx LTg4OC03NzYtNjU1NSBvciArMS0yMTItNzgyLTI4NDAKCmh0dHA6Ly93d3cua2luZ3N0b24u Y29tCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBjYWxpZm9ybmlhCiAgICBjaGluYQog ICAgY29tcHV0ZXIKICAgIGNvcnBvcmF0ZQogICAgZXhwYW5zaW9uCiAgICBtYWxheXNpYQog ICAgbWFudWZhY3R1cmVyCiAgICBtYW51ZmFjdHVyaW5nCiAgICBtYXJrZXRpbmcKICAgIG5l dHdvcmtpbmcKICAgIHBhY2thZ2luZwogICAgcHJlc2lkZW50CiAgICBwcm9kdWN0aXZpdHkK ICAgIHByb2R1Y3RzCiAgICByZXRhaWwKICAgIHNhbGVzCiAgICBzZWN1cml0eQogICAgc3Rh bmRhcmRzCiAgICB0YWl3YW4KICAgIHRlY2hub2xvZ3kKICAgIHdpcmVsZXNzCgqC8pI+38sO ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouwlAAH0GRYhBej0oQXo9IgAUuQHLJPSd7Zcy rFAQ/VwcHQAAgvKSPt/XDgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLsKQAB9BkWHQXo9 KEF6PSIAFLkByyT0ne2XMqxQEf1cHBwAAILykj7U2A4APAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChR9UAAPwbsnEF6PSJBej0ouQEAFO2XMqzLJPSeUBBhCLhwAAAAAAAAAACD8pI+4QMA ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUfZAAD8G7JtBej0iQXo9KLj/ABXtdtFHYwsf olAQYQhXDQAAAAAAAAAAg/KSPt07AABOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLsLQAB9 BkVuQXo9KEF6PSIAFbj/Ywsfou120UdQGPoQ7u4AADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4N CoPykj4iRAAAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJR90AAPwbsgEF6PSJBej0ouP8A Fe120UdjCx+6UBhhCFoAAABERUxFIDM2MjAwMDc0Lm91dC4wMzA0MDgNCoPykj4XgQAAfAAA AHwAAAAAB+kKFlwAArOdAeQIAEUAAG67DEAAfQZFP0F6PShBej0iABW4/2MLH7rtdtFhUBj5 9j7fAAA1NTAgMzYyMDAwNzQub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0 aGUgZmlsZSBzcGVjaWZpZWQuIA0Kg/KSPoONAABPAAAATwAAAAACs50B5AAH6QoWXAgARQAA QVH4QAA/BuyAQXo9IkF6PSi4/wAV7XbRYWMLIABQGGEIwg0AAFBPUlQgNjUsMTIyLDYxLDM0 LDE4NSwyDQqD8pI+k8cAAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuw1AAH0GRWZBej0o QXo9IgAVuP9jCyAA7XbRelAY+dwAmgAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K g/KSPovKAABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlH5QAA/Bux+QXo9IkF6PSi4/wAV 7XbRemMLIB5QGGEIR00AAFNUT1IgMzYyMDAwNzQub3V0LjAzMDQwOA0Kg/KSPkYHAQB4AAAA eAAAAAAH6QoWXAACs50B5AgARQAAarsOQAB9BkVBQXo9KEF6PSIAFbj/YwsgHu120ZRQGPnC yKEAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAw NzQub3V0LjAzMDQwOC4NCoPykj4xCAEAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC7D0AA fQZFekF6PShBej0iABS5AoyYQsoAAAAAcAL68ALHAAACBAVkAQEEAoPykj7RCQEAPgAAAD4A AAAAArOdAeQAB+kKFlwIAEUAADBR+kAAPwbsj0F6PSJBej0ouQIAFO2ZnhWMmELLcBJhCBCf AAABAQQCAgQFtIPykj52QQEANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi7EEAAfQZFgUF6 PShBej0iABS5AoyYQsvtmZ4WUBD9XKEOAACD8pI+Q0gBAJMEAACTBAAAAAKznQHkAAfpChZc CABFAASFUftAAD8G6DlBej0iQXo9KLkCABTtmZ4WjJhCy1AYYQgzwwAAWFlaWlkuLi4gIFRD PTIgVE09MTA0OTgxNzY3NSBNTj0zNjIwMDA3NC5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRl eCIgUEZOPSJDb210ZXgiIFBGTj0iRmVkQml6T3BzIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVh ZExpbmUuLi4gIFNDUkVXSkFDSyBBU1NZLEFDVFUKCi4uLiAgCSAKCkJ5TGluZS4uLiAgCgou Li4gIAoKRGF0ZUxpbmUuLi4gIEFwciAwOCwgMjAwMyAoRmVkQml6T3BwcyB2aWEgQ09NVEVY KSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAoYykgMjAwMyBGZWRl cmFsIEluZm9ybWF0aW9uICYgTmV3cyBEaXNwYXRjaCwgSW5jLgoKCi4uLgoKCkZlZEJpek9w cwoKTk9USUNFIFRZUEU6IENPTlRSQUNUIEFXQVJECgpTT1VSQ0U6IFB1Ymxpc2hlZCBpbiBG ZWRCaXpPcHBzCgpEQVRFIFBPU1RFRDogMDctQVBSLTAzCgpPRkZJQ0UgQUREUkVTUzogREVG RU5TRSBHRU5FUkFMIFNVUFBMWSBDRU5URVIgODAwMCBKRUZGIERBVklTIEhXWQpSSUNITU9O RCwgVkEgMjMyOTctNTMgMTIKCkNMQVNTSUZJQ0FUSU9OIENPREU6IDE2IC0gQWlyY3JhZnQg Y29tcG9uZW50cyAmIGFjY2Vzc29yaWVzCgpTVUJKRUNUOiBTQ1JFV0pBQ0sgQVNTWSxBQ1RV CgpTT0xJQ0lUQVRJT04gTlVNQkVSOiBTUDA0NzUtMDMtUS0xMjQwCgpBV0FSRCBOVU1CRVI6 IFNQMDQ3NS0wMy1NLVVENjgKCkFXQVJEIEFNT1VOVDogJDEyNyw1MjkKCkxJTkUgTlVNQkVS OiAwMDAxCgpBV0FSRCBEQVRFOiAwNDA0MDMKCkFXQVJERUQgVE86IFNNSVRIUyBJTkRVU1RS SUVTIEFFUk9TUEFDRSBERUZFTlNFIFNZU1RFTVMgSU5DIERCQSBDVVNUT01FUgpTRVJWSUNF Uy1XIEhJUFBBTlkgRElWIENVU1RPTUVSIFNFUlZJQ0VTIERJVklTSU9OIDExMCBBTEdPTlFV SU4gUEFSS1dBWQoKQVJDSElWRSBEQVRFOiAwNDE5MjAwMwoKQ09OVEFDVDogTi9BCgpJTlRF Uk5FVCBBRERSRVNTOgpodHRwOi8vd3d3LmVwcy5nb3Yvc3BnL0RMQS9KMy9EU0NSL0F3YXJk cy9TUDA0NzUtMDMtTS1VRDY4TG4wMDAxLmh0bWwKCi4uLiAgCSAKCktleVdvcmRzLi4uICAK ICAgIGFlcm9zcGFjZQogICAgYWlyY3JhZnQKICAgIGNvbnRyYWN0CiAgICBkZWZlbnNlCiAg ICBpbnRlcm5ldAogICAgdmlyZ2luaWEKCoPykj5ESAEAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChR/EAAPwbslUF6PSJBej0ouQIAFO2ZonOMmELLUBFhCDkFAAAAAAAAAACD8pI+np4B ADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouxFAAH0GRYBBej0oQXo9IgAUuQKMmELL7Zmi dFAQ+P+hDQAAg/KSPr2tAQA2AAAANgAAAAAH6QoWXAACs50B5AgARQAAKLsSQAB9BkV/QXo9 KEF6PSIAFLkCjJhCy+2ZonRQEfj/oQwAAIPykj7orgEAPAAAADwAAAAAArOdAeQAB+kKFlwI AEUAAChR/UAAPwbslEF6PSJBej0ouQIAFO2ZonSMmELMUBBhCDkEAAAAAAAAAACD8pI+63QC ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUf5AAD8G7JNBej0iQXo9KLj/ABXtdtGUYwsg YFAQYQhWAgAAAAAAAAAAg/KSPvKsAgBOAAAATgAAAAAH6QoWXAACs50B5AgARQAAQLsTQAB9 BkVmQXo9KEF6PSIAFbj/YwsgYO120ZRQGPnC7jEAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4N CoPykj7ZtQIAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJR/0AAPwbseEF6PSJBej0ouP8A Fe120ZRjCyB4UBhhCFf1AABERUxFIDM2MjAwMDc1Lm91dC4wMzA0MDgNCoPykj418gIAfAAA AHwAAAAAB+kKFlwAArOdAeQIAEUAAG67FEAAfQZFN0F6PShBej0iABW4/2MLIHjtdtGuUBj5 qD4hAAA1NTAgMzYyMDAwNzUub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0 aGUgZmlsZSBzcGVjaWZpZWQuIA0Kg/KSPhz+AgBPAAAATwAAAAACs50B5AAH6QoWXAgARQAA QVIAQAA/Bux4QXo9IkF6PSi4/wAV7XbRrmMLIL5QGGEIwAIAAFBPUlQgNjUsMTIyLDYxLDM0 LDE4NSwzDQqD8pI+QTgDAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGuxVAAH0GRV5Bej0o QXo9IgAVuP9jCyC+7XbRx1AY+Y7/3AAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0K g/KSPjg+AwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlIBQAA/Bux2QXo9IkF6PSi4/wAV 7XbRx2MLINxQGGEIRUIAAFNUT1IgMzYyMDAwNzUub3V0LjAzMDQwOA0Kg/KSPvd6AwB4AAAA eAAAAAAH6QoWXAACs50B5AgARQAAarsWQAB9BkU5QXo9KEF6PSIAFbj/Ywsg3O120eFQGPl0 x+MAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAw NzUub3V0LjAzMDQwOC4NCoPykj7sewMAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC7F0AA fQZFckF6PShBej0iABS5A2ioIpcAAAAAcAL68EbpAAACBAVkAQEEAoPykj5tfQMAPgAAAD4A AAAAArOdAeQAB+kKFlwIAEUAADBSAkAAPwbsh0F6PSJBej0ouQMAFO2cYsJoqCKYcBJhCJAR AAABAQQCAgQFtIPykj5StQMANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi7GEAAfQZFeUF6 PShBej0iABS5A2ioIpjtnGLDUBD9XCCBAACD8pI+Gb0DAJoFAACaBQAAAAKznQHkAAfpChZc CABFAAWMUgNAAD8G5ypBej0iQXo9KLkDABTtnGLDaKgimFAQYQhnTAAAWFlaWlkuLi4gIFRD PTIgVE09MTA0OTgxNzY3NiBNTj0zNjIwMDA3NS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRl eCIgUEZOPSJDb210ZXgiIFBGTj0iTTIiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4u LiAgUmVuc3NlbGFlciBQb2x5dGVjaG5pYyBJbnN0aXR1dGU6IEFyZWEgbWlkZGxlIHNjaG9v bGVycyBhbmQgUmVuc3NlbGFlciBzdHVkZW50cyBwYXJ0bmVyIHRvIGRldmVsb3AgcHVibGlj IHNrYXRlcGFyawoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAg VFJPWSwgTi5ZLiwgQXByIDA4LCAyMDAzIChNMiBQUkVTU1dJUkUgdmlhIENPTVRFWCkgLS0K CgoKLi4uCgpDb3B5cmlnaHRMaW5lLi4uICAoQykxOTk0LTIwMDMgTTIgQ09NTVVOSUNBVElP TlMgTFRECgoKLi4uCgoKTTIKClJlbnNzZWxhZXIgc3R1ZGVudHMgZW5yb2xsZWQgaW4gYSBj b3Vyc2UgY2FsbGVkIENvbW11bml0eSBQbGFubmluZwpXb3Jrc2hvcCB3aWxsIGhvbGQgYW4g b3BlbiBwdWJsaWMgZm9ydW0gb24gQXByaWwgOCBmcm9tIDM6MTUgdG8gNjoxNSBwbQphdCB0 aGUgRG95bGUgTWlkZGxlIFNjaG9vbCBmb3IgbG9jYWwgdGVlbnMgdG8gZGlzY3VzcyB0aGUg ZGV2ZWxvcG1lbnQgb2YKYW4gYXJlYSBza2F0ZXBhcmsuCgpSZW5zc2VsYWVyIHN0dWRlbnRz IGhhdmUgam9pbmVkIGZvcmNlcyB3aXRoIHRoZSBSZW5zc2VsYWVyIENvdW50eQpTa2F0ZXBh cmsgQ29tbXVuaXR5IFBhcnRuZXJzaGlwIChSQ1NDUCkgdG8gY29sbGFib3JhdGUgb24gdGhl IHBsYW5uaW5nIG9mCnRoZSBjb3VudHktd2lkZSBmYWNpbGl0eSBmb3IgbG9jYWwgeW91dGgu CgpUaGUgd29ya3Nob3Agd2lsbCBnaXZlIGFyZWEgc2thdGVib2FyZGVycyBhbiBvcHBvcnR1 bml0eSB0byBoYXZlIGEgaGFuZAppbiB0aGUgZGVzaWduLCBjb25zdHJ1Y3Rpb24sIGFuZCBt YW5hZ2VtZW50IG9mIHRoZSBza2F0ZXBhcmsuIEEgc2Vjb25kCnB1YmxpYyBmb3J1bSBpcyBz Y2hlZHVsZSBmb3IgQXByaWwgMTUgYXQgdGhlIEVhc3QgR3JlZW5idXNoIFlNQ0EuCgpUaGUg c2thdGVwYXJrIHByb2plY3QgYmVnYW4gYXMgYW4gYXNzaWdubWVudCBmb3Igc3R1ZGVudHMg aW4gdGhlCkNvbW11bml0eSBQbGFubmluZyBXb3Jrc2hvcCBjbGFzcy4gVG8gZnVsZmlsbCB0 aGVpciBjb2xsZWN0aXZlIGdvYWwgdG8KaW1wbGVtZW50IGltcHJvdmVtZW50cyB0byB0aGUg bmVpZ2hib3Job29kcyBzdXJyb3VuZGluZyB0aGUgdW5pdmVyc2l0eSwKdGhlIHN0dWRlbnRz IHdlcmUgdG9sZCB0byB3b3JrIG9uIHRoZSBkZXNpZ24sIHNpdGUgZmVhc2liaWxpdHksCm1h cmtldGluZywgZnVuZHJhaXNpbmcvc3BvbnNvcnNoaXAsIGFtZW5pdGllcywgcHJvZ3JhbW1p bmcsIGFuZCBzYWZldHkKcGxhg/KSPo69AwCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFIE QAA/BucpQXo9IkF6PSi5AwAU7ZxoJ2ioIphQGGEI3YUAAG5zIGZvciBhIGZyZWUgc2thdGVw YXJrIGZvciBhcmVhIGNvbW11bml0aWVzLiBUaGUgUkNTQ1AsIHdoaWNoIHdhcwpkZXZlbG9w aW5nIGEgc2thdGVwYXJrIGluZGVwZW5kZW50bHkgb2YgUmVuc3NlbGFlciwgcGFydG5lcmVk IHdpdGggdGhlCmdyb3VwIG9mIGNvbGxlZ2Ugc3R1ZGVudHMgYXMgYSB3YXkgdG8gY29udGlu dWUgb24gd2l0aCB0aGUgcHJvamVjdCBhbmQKcHV0IGl0IGluIHRoZSBoYW5kcyBvZiBsb2Nh bCB5b3V0aCBvbmNlIHRoZSBzZW1lc3RlciBlbmRzLgoKIldlIGhhdmUgZG9uZSBjb25zaWRl cmFibGUgcmVzZWFyY2gsIGFuZCBhcmUgYXR0ZW1wdGluZyB0byBkZXZlbG9wCmZlYXNpYmxl IHNpdGVzIGFuZCBjcmVhdGUgc3VydmV5cyB0byBkZXRlcm1pbmUgd2hhdCB5b3V0aCB3YW50 IGluIHRoZWlyCmxvY2FsIHNrYXRlcGFyaywiIHNhaWQgUmVuc3NlbGFlciBjaXZpbCBlbmdp bmVlcmluZyBzdHVkZW50IE1pY2hhZWwKQm9uZ2lvcm5pLiAiV2UndmUgYWxzbyBsb29rZWQg aW50byBob3cgb3RoZXIgc2thdGVwYXJrcyBhY3Jvc3MgdGhlCmNvdW50cnkgaGF2ZSBvcGVy YXRlZCB3aXRoIHJlZ2FyZCB0byByZXZlbnVlcywgc3Vic2lkaWVzLCBncmFudHMsCnByb2Js ZW1zLCBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHdoYXQncyB3b3JrZWQgZm9yIHRoZW0uIgoK IldoYXQgaXMgdW5pcXVlIGFib3V0IHRoaXMgZW50ZXJwcmlzZSBpcyB0aGF0IGl0IGVuY291 cmFnZXMgdGVlbmFnZXJzIHRvCmJlIGEgcGFydCBvZiBlYWNoIGFzcGVjdCBvZiB0aGUgcGFy aydzIGRldmVsb3BtZW50LCIgc2FpZCBBbmdlbGEKTWNOZXJuZXksIHdobyBhbG9uZyB3aXRo IGhlciAxMy15ZWFyLW9sZCBzb24gU2hhbmUsIGhlYWRzIHRoZSBSQ1NDUAppbml0aWF0aXZl LiAiVGhpcyBza2F0ZXBhcmsgd2lsbCBlbXBvd2VyIGtpZHMgdG8gbWFrZSBzb21ldGhpbmcg aGFwcGVuIGluCnRoZWlyIGNvbW11bml0eSB3aXRoIHRoZWlyIG93biBoYW5kcy4gQXQgYW4g YWdlIHdoZXJlIG1vc3Qga2lkcyBmZWVsCnBvd2VybGVzcyBvdmVyIHdoYXQgdGhleSBjYW4g YW5kIGNhbm5vdCBkbyBldmVyeWRheSwgdGhpcyBnaXZlcyB0aGVtCnNvbWV0aGluZyB0YW5n aWJsZSB0byBkby4iCgpGb3IgbW9yZSBpbmZvcm1hdGlvbiBvciB0byB0cmFjayB0aGUgcGFy aydzIGRldmVsb3BtZW50LCBnbyB0byB0aGUKcHJvamVjdCdzIFdlYiBzaXRlIGF0IGh0dHA6 Ly90aW1lc3VuaW9uLmNvbS9jb21tdW5pdGllcy9za2F0ZXBhcmsvLgoKQ09OVEFDVDogQ2Fy b2xpbmUgSmVua2lucyBUZWw6ICsxIDUxOCAyNzYgNjU0MiBlLW1haWw6IGplbmtpY0BycGku ZWR1CgpNMiBDb21tdW5pY2F0aW9ucyBMdGQgZGlzY2xhaW1zIGFsbCBsaWFiaWxpdHkgZm9y IGluZm9ybWF0aYPykj6uvQMA4AEAAOABAAAAArOdAeQAB+kKFlwIAEUAAdJSBUAAPwbq4kF6 PSJBej0ouQMAFO2cbYtoqCKYUBhhCOpOAABvbiBwcm92aWRlZAp3aXRoaW4gTTIgUHJlc3NX SVJFLiBEYXRhIHN1cHBsaWVkIGJ5IG5hbWVkIHBhcnR5L3BhcnRpZXMuIEZ1cnRoZXIKaW5m b3JtYXRpb24gb24gTTIgUHJlc3NXSVJFIGNhbiBiZSBvYnRhaW5lZCBhdCBodHRwOi8vd3d3 LnByZXNzd2lyZS5uZXQKb24gdGhlIHdvcmxkIHdpZGUgd2ViLiBJbnF1aXJpZXMgdG8gaW5m b0BtMi5jb20uCgouLi4gIAkgCgpLZXlXb3Jkcy4uLiAgCiAgICBjaXZpbCtlbmdpbmVlcmlu ZwogICAgY29sbGVnZQogICAgY29tbXVuaXR5CiAgICBjb25zdHJ1Y3Rpb24KICAgIGUtbWFp bAogICAgZ3JhbnRzCiAgICBsb2NhbAogICAgbWFya2V0aW5nCiAgICBwYXJ0bmVyc2hpcAog ICAgcHJvZ3JhbW1pbmcKICAgIHJlc2VhcmNoCiAgICBzY2hlZHVsZQogICAgdGVlbmFnZXJz CiAgICB0cmFjawogICAgd2ViCgqD8pI+r70DADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo UgZAAD8G7ItBej0iQXo9KLkDABTtnG81aKgimFARYQiwYgAAAAAAAAAAg/KSPsU3BAA2AAAA NgAAAAAH6QoWXAACs50B5AgARQAAKLsZQAB9BkV4QXo9KEF6PSIAFLkDaKgimO2cbYtQEP1c FbkAAIPykj4tPgQANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi7GkAAfQZFd0F6PShBej0i ABS5A2ioIpjtnG82UBD7shW4AACD8pI+EEcEADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo uxtAAH0GRXZBej0oQXo9IgAUuQNoqCKY7ZxvNlAR+7IVtwAAg/KSPodIBAA8AAAAPAAAAAAC s50B5AAH6QoWXAgARQAAKFIHQAA/BuyKQXo9IkF6PSi5AwAU7ZxvNmioIplQEGEIsGEAAAAA AAAAAIPykj4W5gQAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChSCEAAPwbsiUF6PSJBej0o uP8AFe120eFjCyEeUBBhCFT3AAAAAAAAAACD8pI+JR4FAE4AAABOAAAAAAfpChZcAAKznQHk CABFAABAuxxAAH0GRV1Bej0oQXo9IgAVuP9jCyEe7XbR4VAY+XTtdAAAMjI2IFRyYW5zZmVy IGNvbXBsZXRlLg0Kg/KSPqAmBQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlIJQAA/Buxu QXo9IkF6PSi4/wAV7XbR4WMLITZQGGEIVeoAAERFTEUgMzYyMDAwNzYub3V0LjAzMDQwOA0K g/KSPop2BQB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrsdQAB9BkUuQXo9KEF6PSIAFbj/ YwshNu120ftQGPlaPWMAADU1MCAzNjIwMDA3Ni5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNh bm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQqD8pI+HYMFAE8AAABPAAAAAAKznQHk AAfpChZcCABFAABBUgpAAD8G7G5Bej0iQXo9KLj/ABXtdtH7YwshfFAYYQi99wAAUE9SVCA2 NSwxMjIsNjEsMzQsMTg1LDQNCoPykj6svAUAVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa7 HkAAfQZFVUF6PShBej0iABW4/2MLIXztdtIUUBj5QP8fAAAyMDAgUE9SVCBjb21tYW5kIHN1 Y2Nlc3NmdWwuDQqD8pI+uL8FAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUgtAAD8G7GxB ej0iQXo9KLj/ABXtdtIUYwshmlAYYQhDNwAAU1RPUiAzNjIwMDA3Ni5vdXQuMDMwNDA4DQqD 8pI+tvwFAHgAAAB4AAAAAAfpChZcAAKznQHkCABFAABqux9AAH0GRTBBej0oQXo9IgAVuP9j CyGa7XbSLlAY+SbHJQAAMTUwIE9wZW5pbmcgQklOQVJZIG1vZGUgZGF0YSBjb25uZWN0aW9u IGZvciAzNjIwMDA3Ni5vdXQuMDMwNDA4Lg0Kg/KSPpf9BQA+AAAAPgAAAAAH6QoWXAACs50B 5AgARQAAMLsgQAB9BkVpQXo9KEF6PSIAFLkEch4anAAAAABwAvrwRW0AAAIEBWQBAQQCg/KS Ph7/BQA+AAAAPgAAAAACs50B5AAH6QoWXAgARQAAMFIMQAA/Bux9QXo9IkF6PSi5BAAU7Z3C z3IeGp1wEmEILocAAAEBBAICBAW0g/KSPq82BgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLshQAB9BkVwQXo9KEF6PSIAFLkEch4ane2dwtBQEP1cvvYAAIPykj5uPQYA8gMAAPIDAAAA ArOdAeQAB+kKFlwIAEUAA+RSDUAAPwboyEF6PSJBej0ouQQAFO2dwtByHhqdUBhhCJzUAABY WVpaWS4uLiAgVEM9MiBUTT0xMDQ5ODE3Njc2IE1OPTM2MjAwMDc2Lm91dCBTUkM9Y29tdGV4 IFBGTj0iQ29tdGV4IiBQRk49IkNvbXRleCIgUEZOPSJGVCBJbmZvcm1hdGlvbiAoVVMpIiAK Ci4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIFdhbGwgU3RyZWV0IEpvdXJuYWw6IEJh cm5lcyAmIE5vYmxlIHdpbGwgcHVibGlzaCBuZXcgbGluZSBvZiBsaXRlcmFyeSBjbGFzc2lj cwoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgQXByIDgsIDIw MDMsIChXYWxsIFN0cmVldCBKb3VybmFsIC9GVCBJbmZvcm1hdGlvbiB2aWEgQ09NVEVYKSAt LQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIENvcHlyaWdodCAyMDAzOiBGaW5hbmNpYWwg VGltZXMgSW5mb3JtYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQKCgouLi4KCgpGVCBJbmZv cm1hdGlvbiAoVVMpCgpBIG5ldyBsaW5lIG9mIGxpdGVyYXJ5IGNsYXNzaWNzIHdpbGwgYmUg cHVibGlzaGVkIGJ5IEJhcm5lcyAmIE5vYmxlIEluYwpUaGUgbW92ZSBjaGFsbGVuZ2VzIFJh bmRvbSBIb3VzZSBhbmQgUGVuZ3VpbiBHcm91cCAoVVNBKSwgd2hpY2ggYXJlIGtub3duCmZv ciBzdWNoIHRpdGxlcy4gQ29tbWVudGluZyBvbiB0aGUgZGV2ZWxvcG1lbnQsIEJhcm5lcyAm IE5vYmxlIGNoaWVmCmV4ZWN1dGl2ZSBvZmZpY2VyIFN0ZXZlIFJpZ2dpbyBzYWlkOiAiSXQn cyBhYm91dCBhZGRpbmcsIGFuZCBnZXR0aW5nIG91cgpjdXN0b21lcnMgaW50ZXJlc3RlZCBp biB0aGUgY2xhc3NpY3MuIiBUaGUgaW50cm9kdWN0aW9uIG9mIGl0cyBvd24KbGl0ZXJhcnkg Y2xhc3NpY3MgbGluZSBpcyBwYXJ0IG9mIHRoZSBib29rIHJldGFpbGVyJ3MgYmlkIHRvIGlt cHJvdmUKcHJvZml0cy4KCkFic3RyYWN0ZWQgZnJvbTogVGhlIFdhbGwgU3QgSm91cm5hbCAo VVMgRWRpdGlvbikKCi4uLiAgCSAKCktleVdvcmRzLi4uICAKCoPykj5vPQYAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChSDkAAPwbsg0F6PSJBej0ouQQAFO2dxoxyHhqdUBFhCFeOAAAA AAAAAACD8pI+TpAGADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouyJAAH0GRW9Bej0oQXo9 IgAUuQRyHhqd7Z3GjVAQ+aC+9QAAg/KSPiegBgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLsjQAB9BkVuQXo9KEF6PSIAFLkEch4ane2dxo1QEfmgvvQAAIPykj40oQYAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChSD0AAPwbsgkF6PSJBej0ouQQAFO2dxo1yHhqeUBBhCFeNAAAA AAAAAACD8pI+JH4HADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUhBAAD8G7IFBej0iQXo9 KLj/ABXtdtIuYwsh3FAQYQhT7AAAAAAAAAAAg/KSPgq3BwBOAAAATgAAAAAH6QoWXAACs50B 5AgARQAAQLskQAB9BkVVQXo9KEF6PSIAFbj/Ywsh3O120i5QGPkm7LcAADIyNiBUcmFuc2Zl ciBjb21wbGV0ZS4NCoPykj6PvwcAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJSEUAAPwbs ZkF6PSJBej0ouP8AFe120i5jCyH0UBhhCFPfAABERUxFIDM2MjAwMDc3Lm91dC4wMzA0MDgN CoPykj7c/AcAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG67JUAAfQZFJkF6PShBej0iABW4 /2MLIfTtdtJIUBj5DDylAAA1NTAgMzYyMDAwNzcub3V0LjAzMDQwODogVGhlIHN5c3RlbSBj YW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0Kg/KSPpgICABPAAAATwAAAAACs50B 5AAH6QoWXAgARQAAQVISQAA/BuxmQXo9IkF6PSi4/wAV7XbSSGMLIjpQGGEIu+wAAFBPUlQg NjUsMTIyLDYxLDM0LDE4NSw1DQqD8pI+6EIIAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABG uyZAAH0GRU1Bej0oQXo9IgAVuP9jCyI67XbSYVAY+PL+YgAAMjAwIFBPUlQgY29tbWFuZCBz dWNjZXNzZnVsLg0Kg/KSPk1GCABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlITQAA/Buxk QXo9IkF6PSi4/wAV7XbSYWMLIlhQGGEIQSwAAFNUT1IgMzYyMDAwNzcub3V0LjAzMDQwOA0K g/KSPpS+CAB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarsnQAB9BkUoQXo9KEF6PSIAFbj/ YwsiWO120ntQGPjYxmcAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlv biBmb3IgMzYyMDAwNzcub3V0LjAzMDQwOC4NCoPykj7nNgkAPgAAAD4AAAAAB+kKFlwAArOd AeQIAEUAADC7KEAAfQZFYUF6PShBej0iABS5BZA/hRoAAAAAcAL68LzMAAACBAVkAQEEAoPy kj7AOAkAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBSFEAAPwbsdUF6PSJBej0ouQUAFO2h TqqQP4UbcBJhCBoIAAABAQQCAgQFtIPykj4zcQkANgAAADYAAAAAB+kKFlwAArOdAeQIAEUA ACi7KUAAfQZFaEF6PShBej0iABS5BZA/hRvtoU6rUBD9XKp3AACD8pI+cHgJAJoFAACaBQAA AAKznQHkAAfpChZcCABFAAWMUhVAAD8G5xhBej0iQXo9KLkFABTtoU6rkD+FG1AQYQjYCAAA WFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzY3NyBNTj0zNjIwMDA3Ny5vdXQgU1JDPWNvbXRl eCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iQUZYIE5ld3MgLSBBc2lhIiAKCi4u LiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIExvbmRvbiBzaGFyZXMgY2xvc2UgbmVhciBz ZXNzaW9uIGxvd3MgYXMgZm9jdXMgc2hpZnRzIHRvIGRpcmUgZWNvbm9taWMgb3V0bG9vawoK Li4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4uLiAgTE9ORE9OLCBBcHIg MDgsIDIwMDMgKEFGWC1Bc2lhIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJpZ2h0TGlu ZS4uLiAgQ29weXJpZ2h0IDIwMDMuIEFGWCBOZXdzIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZl ZC4KCgouLi4KCgpBRlggTmV3cyAtIEFzaWEKCkxlYWRpbmcgc2hhcmVzIGNsb3NlZCBuZWFy IHNlc3Npb24gbG93cywgc25hcHBpbmcgYSBmaXZlLWRheSB3aW5uaW5nCnN0cmVhaywgYXMg aW52ZXN0b3JzJyBhdHRlbnRpb24gc2hpZnRlZCB0byB0aGUgZnJhZ2lsZSBjb25kaXRpb24g b2YgdGhlCmdsb2JhbCBlY29ub215LCBkZWFsZXJzIHNhaWQuCgpXaXRoIHRoZSB3YXIgYWdh aW5zdCBJcmFxIGFwcHJvYWNoaW5nIGEgZGVub3VlbWVudCwgdGhlcmUgc2VlbXMgdG8gYmUg YQpncm93aW5nIHJlYWxpc2F0aW9uIHRoYXQgdGhlIGVjb25vbWljIG91dGxvb2sgZm9yIHRo ZSBVSyBhbmQgb3RoZXIgRzcKY291bnRyaWVzIGlzIGZhciBmcm9tIGluc3BpcmluZy4KClRo ZSBGVFNFIDEwMCBpbmRleCBjbG9zZWQgNjcuMCBwb2ludHMgbG93ZXIgYXQgMyw4NjguOCwg anVzdCAwLjMgcG9pbnRzCm9mZiBpdHMgaW50cmFkYXkgbG93LCB3aXRoIGFsbCB0aGUgd2lk ZXIgaW5kaWNlcyBhbHNvIHBvc3Rpbmcgc3RlZXAKbG9zc2VzLgoKVm9sdW1lIHdhcyBubyBt b3JlIHRoYW4gYXZlcmFnZSB3aXRoIDEuMTIwIGJsbiBzaGFyZXMgY2hhbmdpbmcgaGFuZHMg aW4KMTg3LDczNCBkZWFscy4KCkF0IHRoZSBjbG9zZSBoZXJlLCB0aGUgREpJQSB3YXMgZG93 biA3LjIzIHBvaW50cyB0byA4LDI5My4xOCwgaGF2aW5nIGJlZW4KZXhwZWN0ZWQgdG8gb3Bl biBtb2Rlc3RseSBoaWdoZXIuIFRoZSBOYXNkYXEgY29tcG9zaXRlIHdhcyBkb3duIDYuMTUK cG9pbnRzIGF0IDEsMzgzLjM2LgoKRWNvbm9taWNhbGx5IHNlbnNpdGl2ZSBtZWRpYSBzdG9j a3Mgd2VyZSB0aGUgbWFpbiB2aWN0aW1zIG9mIHRoZSBzZWxsCm9mZiwgd2hpbGUgYSBkb3du YmVhdCB0cmFkaW5nIHN0YXRlbWVudCBmcm9tIE1hcmtzICYgU3BlbmNlciBrZXB0IHRoZQpy ZXRhaWwgc2VjdG9yIHVuZGVyIGludGVuc2UgcHJlc3N1cmUgdGhyb3VnaG91dCB0aGUgc2Vz c2lvbi4KCnNkL2pjCgouLi4gIAkgCgpLZXlXb3Jkg/KSPnF4CQByAAAAcgAAAAACs50B5AAH 6QoWXAgARQAAZFIWQAA/Buw/QXo9IkF6PSi5BQAU7aFUD5A/hRtQGGEI+w4AAHMuLi4gIAog ICAgZWNvbm9teQogICAgaW5kZXgKICAgIGlyYXEKICAgIGxvbmRvbgogICAgbWVkaWEKCoPy kj5yeAkAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChSF0AAPwbsekF6PSJBej0ouQUAFO2h VEuQP4UbUBFhCEErAAAAAAAAAACD8pI+WtcJADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAo uypAAH0GRWdBej0oQXo9IgAUuQWQP4Ub7aFUTFAQ/Vyk1gAAg/KSPr/xCQA2AAAANgAAAAAH 6QoWXAACs50B5AgARQAAKLsrQAB9BkVmQXo9KEF6PSIAFLkFkD+FG+2hVExQEf1cpNUAAIPy kj7E8gkAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChSGEAAPwbseUF6PSJBej0ouQUAFO2h VEyQP4UcUBBhCEEqAAAAAAAAAACD8pI+Jj0KADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAo UhlAAD8G7HhBej0iQXo9KLj/ABXtdtJ7YwsimlAQYQhS4QAAAAAAAAAAg/KSPg12CgBOAAAA TgAAAAAH6QoWXAACs50B5AgARQAAQLssQAB9BkVNQXo9KEF6PSIAFbj/Ywsimu120ntQGPjY 6/oAADIyNiBUcmFuc2ZlciBjb21wbGV0ZS4NCoPykj5ufgoAUAAAAFAAAAAAArOdAeQAB+kK FlwIAEUAAEJSGkAAPwbsXUF6PSJBej0ouP8AFe120ntjCyKyUBhhCFDUAABERUxFIDM2MjAw MDc5Lm91dC4wMzA0MDgNCoPykj45uwoAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG67LUAA fQZFHkF6PShBej0iABW4/2MLIrLtdtKVUBj4vjvmAAA1NTAgMzYyMDAwNzkub3V0LjAzMDQw ODogVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0Kg/KSPq3G CgBPAAAATwAAAAACs50B5AAH6QoWXAgARQAAQVIbQAA/BuxdQXo9IkF6PSi4/wAV7XbSlWML IvhQGGEIueEAAFBPUlQgNjUsMTIyLDYxLDM0LDE4NSw2DQqD8pI+7gALAFQAAABUAAAAAAfp ChZcAAKznQHkCABFAABGuy5AAH0GRUVBej0oQXo9IgAVuP9jCyL47XbSrlAY+KT9pQAAMjAw IFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0Kg/KSPvIDCwBQAAAAUAAAAAACs50B5AAH6QoW XAgARQAAQlIcQAA/BuxbQXo9IkF6PSi4/wAV7XbSrmMLIxZQGGEIPiEAAFNUT1IgMzYyMDAw Nzkub3V0LjAzMDQwOA0Kg/KSPrVACwB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAarsvQAB9 BkUgQXo9KEF6PSIAFbj/YwsjFu120shQGPiKxagAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2Rl IGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwNzkub3V0LjAzMDQwOC4NCoPykj6lQQsAPgAA AD4AAAAAB+kKFlwAArOdAeQIAEUAADC7MEAAfQZFWUF6PShBej0iABS5BsyXHHwAAAAAcAL6 8OkRAAACBAVkAQEEAoPykj5JQwsAPgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBSHUAAPwbs bEF6PSJBej0ouQYAFO2jVtDMlxx9cBJhCD4lAAABAQQCAgQFtIPykj61ewsANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi7MUAAfQZFYEF6PShBej0iABS5BsyXHH3to1bRUBD9XM6UAACD 8pI+KIMLAJoFAACaBQAAAAKznQHkAAfpChZcCABFAAWMUh5AAD8G5w9Bej0iQXo9KLkGABTt o1bRzJccfVAQYQgWuwAAWFlaWlkuLi4gIFRDPTIgVE09MTA0OTgxNzY3NyBNTj0zNjIwMDA3 OS5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iUFIgTmV3 c3dpcmUiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgTm9uLVByb2ZpdCBPcmdh bml6YXRpb24gVXNlcyBUZWNobm9sb2d5IHRvIEhlbHAgQW1lcmljYW5zIFN1cHBvcnQgVHJv b3BzCk92ZXJzZWFzCgouLi4gIAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4u ICBDT0xVTUJVUywgIE9oaW8sIEFwciA4LCAyMDAzIC9QUk5ld3N3aXJlIHZpYSBDT01URVgv IC0tCgoKCi4uLgoKQ29weXJpZ2h0TGluZS4uLiAgQ29weXJpZ2h0IChDKSAyMDAzIFBSIE5l d3N3aXJlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgouLi4KCgpQUiBOZXdzd2lyZQoKV2hl dGhlciBwcm8td2FyIG9yIGFudGktd2FyLCBtb3N0IEFtZXJpY2FucyBzdXBwb3J0IHRoZSB0 cm9vcHMsIGFuZCBtYW55Cm9mIHRoZW0gYXJlIGxvb2tpbmcgZm9yIHdheXMgdG8gc2hvdyB0 aGF0IHN1cHBvcnQuIFRoYXQgaXMgd2h5IEFzc2lzdC5jb20KaXMgcHJvdWQgdG8gYW5ub3Vu Y2UgdHdvIG5ldyBwcm9ncmFtcyB0byBoZWxwIGZhbWlseSBhbmQgZnJpZW5kcyBvZgptaWxp dGFyeSBwZXJzb25uZWwsIGFzIHdlbGwgYXMgcmVndWxhciBwZW9wbGUgd2hvIHdhbnQgdG8g c2hvdyB0aGVpcgpzdXBwb3J0LCBkbyBqdXN0IHRoYXQuCgpNYW55IG9mIHRoZSB0cm9vcHMg b3ZlcnNlYXMgaGF2ZSBubyBhY2Nlc3MgdG8gYSBjb21wdXRlciB3aXRoIGFuIEludGVybmV0 CmNvbm5lY3Rpb24uIEluIHRoZSBmaXJzdCBvZiBBc3Npc3QuY29tJ3MgbmV3IHByb2dyYW1z LCB0aGV5IHdpbGwgcHV0Cm1lc3NhZ2VzIG9uIENEcyBhbmQgc2hpcCB0aGVtIGFsb25nIGlu IGEgY2FyZSBwYWNrYWdlIHRvIHRyb29wcyB3aG8gY2FuJ3QKcmVjZWl2ZSBlbWFpbC4KCkFz c2lzdC5jb20gd2lsbCBhbHNvIHNvb24gYmUgc2hpcHBpbmcgdGhlaXIgIlRyaWJ1dGUgdG8g T3VyIFRyb29wcyIgQ0QsIGEKY29sbGVjdGlvbiBvZiBzb25ncyBhbmQgdHJpYnV0ZXMgcmVj b3JkZWQgYnkgc2Nob29sIG11c2ljIGNsYXNzZXMsCmNvbGxlZ2Ugc3R1ZGVudHMsIGNodXJj aCBjaG9pcnMsIGFtYXRldXIgcmVjb3JkaW5nIGFydGlzdHMsIGFuZAppbmRpdmlkdWFsIHNv bG8gYXJ0aXN0cy4gVGhpcyBDRCBpcyB0aGUgZmlyc3QgaW4gYSBzZXJpZXMgb2YgQ0RzIHRo YXQKQXNzaXN0LmNvbSB3aWxsIHNlbmQgdG8gc2VydmljZSBtZW4gYW5kIHdvbWVuIGZyZWUg b2YgY2hhcmdlLgoKVGhlIHNlY29uZCBuZXcgcHJvZ3JhbSBBc3Npc3QuY29tIHdvdWxkIGxp a2UgdG8gYW5ub3VuY2UgaXMgYW4gZW1haWwKZm9yd2FyZGluZyBzZXJ2aWNlg/KSPqCDCwCa BQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFIfQAA/BucOQXo9IkF6PSi5BgAU7aNcNcyXHH1Q GGEIN1oAACB0aGF0IGdldHMgZW1haWwgdG8gdGhlIHRyb29wcyBzcGFtLWZyZWUuIFRob3Vn aCB0aGUgVVMKbWlsaXRhcnkgc2V0IHVwIGVtYWlsIGFkZHJlc3NlcyBmb3IgdGhlIHRyb29w cyBvdmVyc2VhcywgdGhlc2UgYWNjb3VudHMKcmVjZWl2ZSBzbyBtdWNoIG1haWwgKGEgbGFy Z2UgcGVyY2VudGFnZSBvZiBpdCBzcGFtIG1haWwpIHRoYXQgaXQgaXMKZGlmZmljdWx0IGZv ciBmYW1pbHkgYW5kIGZyaWVuZHMgdG8gcmVsaWFibHkgc2VuZCBlbWFpbCB0byB0aGVzZSBz ZXJ2aWNlCnBlcnNvbm5lbC4gVGhlaXIgSW50ZXJuZXQgY29ubmVjdGlvbnMgYXJlIHVzdWFs bHkgcXVpdGUgc2xvdyBhbmQgbm90CnN1aXRhYmxlIHRvIHJlY2VpdmUgbGFyZ2Ugdm9sdW1l cyBvZiB0cmFmZmljIG9yIG11bHRpLW1lZGlhIGF0dGFjaGVkCmZpbGVzLgoKQnV0IG91ciB0 cm9vcHMgbmVlZCBncmVldGluZ3MsIGpva2VzLCBjYXJ0b29ucywgcGljdHVyZXMsIGFuZCBt ZXNzYWdlcwpmcm9tIHRoZWlyIGZyaWVuZHMgYW5kIGZhbWlseSBiYWNrIGhvbWUgdG8gYnJp Z2h0ZW4gdGhlaXIgZGF5LiBXaXRoCkFzc2lzdC5jb20ncyBlbWFpbCBmb3J3YXJkaW5nIHNl cnZpY2UsIGVtYWlsIG1lc3NhZ2VzIGNhbiBiZSBzZW50IHRvCnRoZXNlIHNlcnZpY2UgcGVy c29ubmVsIHdpdGhvdXQgcGlsaW5nIHRoZWlyIGFjY291bnRzIHdpdGggc3BhbSBtYWlsLgoK QXNzaXN0LmNvbSBhbHNvIHByb3ZpZGVzIGFuIGVsZWN0cm9uaWMgZm9ydW0gZm9yIHNwb3Vz ZXMsIHBhcmVudHMsIGZhbWlseQphbmQgZnJpZW5kcyB0byBzdXBwb3J0IGVhY2ggYW5vdGhl ciBhbmQgb3VyIHRyb29wcy4gTmV3IG1lbWJlcnMgY2FuCnNpZ24tdXAgb24gdGhlIHdlYiBz aXRlLiBUaGUgc2l0ZSBhbHNvIGZlYXR1cmVzIGFuIGVtYWlsIG5ld3NsZXR0ZXIuCgpGb3Ig bW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWFueSBzZXJ2aWNlcyBvZmZlcmVkIGJ5IEFz c2lzdC5jb20sCmNvbnRhY3QgQnJpYW4gTG9ja3JleSBieSBwaG9uZSBhdCA2MTQtODQ2LTkw MDAgb3IgZW1haWwgdG8Kb3VydHJvb3BzQGFzc2lzdC5jb20uIFZpc2l0IHRoZSBzaXRlIGF0 IGh0dHA6Ly93d3cuYXNzaXN0LmNvbSAuCgpTT1VSQ0UgQXNzaXN0LmNvbQoKQnJpYW4gTG9j a3JleSBvZiBBc3Npc3QuY29tLCArMS02MTQtODQ2LTkwMDAsCm91cnRyb29wc0Bhc3Npc3Qu Y29tCgpodHRwOi8vd3d3LmFzc2lzdC5jb20KCi4uLiAgCSAKCktleVdvcmRzLi4uICAKICAg IGNvbGxlZ2UKICAgIGNvbXB1dGVyCiAgICBlbWFpbAogICAgZmFtaWx5CiAgICBpbnRlcm5l dAogICAgbWVkaWEKICAgIG1lbgogICAgbWlsaXRhcnkKICAgIG11c2ljCiAgICBwcm9maXQK ICAgIHNoaXAKICAgIHNoaXBwaW5nCiAgICB0ZWNobm9sb2d5CoPykj6hgwsAVQAAAFUAAAAA ArOdAeQAB+kKFlwIAEUAAEdSIEAAPwbsUkF6PSJBej0ouQYAFO2jYZnMlxx9UBhhCLmhAAAg ICAgdHJhZmZpYwogICAgd2FyCiAgICB3b21lbgoKg/KSPqKDCwA8AAAAPAAAAAACs50B5AAH 6QoWXAgARQAAKFIhQAA/BuxwQXo9IkF6PSi5BgAU7aNhuMyXHH1QEWEIYAEAAAAAAAAAAIPy kj4a/gsANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi7MkAAfQZFX0F6PShBej0iABS5BsyX HH3to2G5UBD9XMOsAACD8pI+sQYMADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAouzNAAH0G RV5Bej0oQXo9IgAUuQbMlxx97aNhuVAR/VzDqwAAg/KSPhoIDAA8AAAAPAAAAAACs50B5AAH 6QoWXAgARQAAKFIiQAA/BuxvQXo9IkF6PSi5BgAU7aNhucyXHH5QEGEIYAAAAAAAAAAAAIPy kj4rrgwAPAAAADwAAAAAArOdAeQAB+kKFlwIAEUAAChSI0AAPwbsbkF6PSJBej0ouP8AFe12 0shjCyNYUBBhCFHWAAAAAAAAAACD8pI+G+YMAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABA uzRAAH0GRUVBej0oQXo9IgAVuP9jCyNY7XbSyFAY+IrrPQAAMjI2IFRyYW5zZmVyIGNvbXBs ZXRlLg0Kg/KSPs7uDABQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlIkQAA/BuxTQXo9IkF6 PSi4/wAV7XbSyGMLI3BQGGEIVsgAAERFTEUgMzYyMDAwODIub3V0LjAzMDQwOA0Kg/KSPo0r DQB8AAAAfAAAAAAH6QoWXAACs50B5AgARQAAbrs1QAB9BkUWQXo9KEF6PSIAFbj/YwsjcO12 0uJQGPhwOjAAADU1MCAzNjIwMDA4Mi5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBm aW5kIHRoZSBmaWxlIHNwZWNpZmllZC4gDQqD8pI+IDcNAE8AAABPAAAAAAKznQHkAAfpChZc CABFAABBUiVAAD8G7FNBej0iQXo9KLj/ABXtdtLiYwsjtlAYYQi31gAAUE9SVCA2NSwxMjIs NjEsMzQsMTg1LDcNCoPykj7hcA0AVAAAAFQAAAAAB+kKFlwAArOdAeQIAEUAAEa7NkAAfQZF PUF6PShBej0iABW4/2MLI7btdtL7UBj4VvzoAAAyMDAgUE9SVCBjb21tYW5kIHN1Y2Nlc3Nm dWwuDQqD8pI+H3QNAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUiZAAD8G7FFBej0iQXo9 KLj/ABXtdtL7Ywsj1FAYYQhEFQAAU1RPUiAzNjIwMDA4Mi5vdXQuMDMwNDA4DQqD8pI+YJwN AHAAAABwAAAAAAKznQHkAAfpChZcCABFAABiPVpAAD8GAP5Bej0iQXo9KJUPG1gYjW67dHoE IIAYFtBQBgAAAQEICg1EniIAQigSMTMwNnwxNDczNTg0fDEwNDk4MTc3MzR8MS4wfDF8NTI0 fGhlbGxvIHdvcmxkCoPykj7zvw0AeAAAAHgAAAAAB+kKFlwAArOdAeQIAEUAAGq7N0AAfQZF GEF6PShBej0iABW4/2MLI9TtdtMVUBj4PMPyAAAxNTAgT3BlbmluZyBCSU5BUlkgbW9kZSBk YXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDgyLm91dC4wMzA0MDguDQqD8pI+seYNAD4AAAA+ AAAAAAfpChZcAAKznQHkCABFAAAwuzhAAH0GRVFBej0oQXo9IgAUuQeoampmAAAAAHAC+vC/ UwAAAgQFZAEBBAKD8pI+NOgNAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUidAAD8G7GJB ej0iQXo9KLkHABTtpoSfqGpqZ3ASYQjmlAAAAQEEAgIEBbSD8pI+LyAOADYAAAA2AAAAAAfp ChZcAAKznQHkCABFAAAouzlAAH0GRVhBej0oQXo9IgAUuQeoampn7aaEoFAQ/Vx3BAAAg/KS PmAnDgCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFIoQAA/BucFQXo9IkF6PSi5BwAU7aaE oKhqamdQEGEIWoYAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc2NzggTU49MzYyMDAwODIu b3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49IkFGWCBOZXdz IC0gRXVyb3BlIiAKCi4uLiAgCgoKLi4uIAkgCgoKSGVhZExpbmUuLi4gIExvbmRvbiBzaGFy ZXMgY2xvc2UgbmVhciBzZXNzaW9uIGxvd3MgYXMgZm9jdXMgc2hpZnRzIHRvIGRpcmUgZWNv bm9taWMgb3V0bG9vawoKLi4uICAJIAoKQnlMaW5lLi4uICAKCi4uLiAgCgpEYXRlTGluZS4u LiAgTE9ORE9OLCBBcHIgMDgsIDIwMDMgKEFGWC1FdXJvcGUgdmlhIENPTVRFWCkgLS0KCgoK Li4uCgpDb3B5cmlnaHRMaW5lLi4uICBDb3B5cmlnaHQgMjAwMy4gQUZYIE5ld3MgTHRkLiBB bGwgcmlnaHRzIHJlc2VydmVkLgoKCi4uLgoKCkFGWCBOZXdzIC0gRXVyb3BlCgpMZWFkaW5n IHNoYXJlcyBjbG9zZWQgbmVhciBzZXNzaW9uIGxvd3MsIHNuYXBwaW5nIGEgZml2ZS1kYXkg d2lubmluZwpzdHJlYWssIGFzIGludmVzdG9ycycgYXR0ZW50aW9uIHNoaWZ0ZWQgdG8gdGhl IGZyYWdpbGUgY29uZGl0aW9uIG9mIHRoZQpnbG9iYWwgZWNvbm9teSwgZGVhbGVycyBzYWlk LgoKV2l0aCB0aGUgd2FyIGFnYWluc3QgSXJhcSBhcHByb2FjaGluZyBhIGRlbm91ZW1lbnQs IHRoZXJlIHNlZW1zIHRvIGJlIGEKZ3Jvd2luZyByZWFsaXNhdGlvbiB0aGF0IHRoZSBlY29u b21pYyBvdXRsb29rIGZvciB0aGUgVUsgYW5kIG90aGVyIEc3CmNvdW50cmllcyBpcyBmYXIg ZnJvbSBpbnNwaXJpbmcuCgpUaGUgRlRTRSAxMDAgaW5kZXggY2xvc2VkIDY3LjAgcG9pbnRz IGxvd2VyIGF0IDMsODY4LjgsIGp1c3QgMC4zIHBvaW50cwpvZmYgaXRzIGludHJhZGF5IGxv dywgd2l0aCBhbGwgdGhlIHdpZGVyIGluZGljZXMgYWxzbyBwb3N0aW5nIHN0ZWVwCmxvc3Nl cy4KClZvbHVtZSB3YXMgbm8gbW9yZSB0aGFuIGF2ZXJhZ2Ugd2l0aCAxLjEyMCBibG4gc2hh cmVzIGNoYW5naW5nIGhhbmRzIGluCjE4Nyw3MzQgZGVhbHMuCgpBdCB0aGUgY2xvc2UgaGVy ZSwgdGhlIERKSUEgd2FzIGRvd24gNy4yMyBwb2ludHMgdG8gOCwyOTMuMTgsIGhhdmluZyBi ZWVuCmV4cGVjdGVkIHRvIG9wZW4gbW9kZXN0bHkgaGlnaGVyLiBUaGUgTmFzZGFxIGNvbXBv c2l0ZSB3YXMgZG93biA2LjE1CnBvaW50cyBhdCAxLDM4My4zNi4KCkVjb25vbWljYWxseSBz ZW5zaXRpdmUgbWVkaWEgc3RvY2tzIHdlcmUgdGhlIG1haW4gdmljdGltcyBvZiB0aGUgc2Vs bApvZmYsIHdoaWxlIGEgZG93bmJlYXQgdHJhZGluZyBzdGF0ZW1lbnQgZnJvbSBNYXJrcyAm IFNwZW5jZXIga2VwdCB0aGUKcmV0YWlsIHNlY3RvciB1bmRlciBpbnRlbnNlIHByZXNzdXJl IHRocm91Z2hvdXQgdGhlIHNlc3Npb24uCgpzZC9qYwoKLi4uICAJIAoKS4Pykj5hJw4AeAAA AHgAAAAAArOdAeQAB+kKFlwIAEUAAGpSKUAAPwbsJkF6PSJBej0ouQcAFO2migSoampnUBhh CJhIAABleVdvcmRzLi4uICAKICAgIGVjb25vbXkKICAgIGluZGV4CiAgICBpcmFxCiAgICBs b25kb24KICAgIG1lZGlhCgqD8pI+YScOADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUipA AD8G7GdBej0iQXo9KLkHABTtpopGqGpqZ1ARYQgNsgAAAAAAAAAAg/KSPu2FDgA2AAAANgAA AAAH6QoWXAACs50B5AgARQAAKLs6QAB9BkVXQXo9KEF6PSIAFLkHqGpqZ+2mikdQEP1ccV0A AIPykj5nkQ4ANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi7O0AAfQZFVkF6PShBej0iABS5 B6hqamftpopHUBH9XHFcAACD8pI+kZIOADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUitA AD8G7GZBej0iQXo9KLkHABTtpopHqGpqaFAQYQgNsQAAAAAAAAAAhPKSPv4DAAA8AAAAPAAA AAACs50B5AAH6QoWXAgARQAAKFIsQAA/BuxlQXo9IkF6PSi4/wAV7XbTFWMLJBZQEGEIUMsA AAAAAAAAAITykj7uPAAATgAAAE4AAAAAB+kKFlwAArOdAeQIAEUAAEC7PEAAfQZFPUF6PShB ej0iABW4/2MLJBbtdtMVUBj4POqAAAAyMjYgVHJhbnNmZXIgY29tcGxldGUuDQqE8pI+fEUA AFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUi1AAD8G7EpBej0iQXo9KLj/ABXtdtMVYwsk LlAYYQhTvQAAREVMRSAzNjIwMDA4NC5vdXQuMDMwNDA4DQqE8pI+p4IAAHwAAAB8AAAAAAfp ChZcAAKznQHkCABFAABuuz1AAH0GRQ5Bej0oQXo9IgAVuP9jCyQu7XbTL1AY+CI5cQAANTUw IDM2MjAwMDg0Lm91dC4wMzA0MDg6IFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUg c3BlY2lmaWVkLiANCoTykj4ljgAATwAAAE8AAAAAArOdAeQAB+kKFlwIAEUAAEFSLkAAPwbs SkF6PSJBej0ouP8AFe120y9jCyR0UBhhCLXLAABQT1JUIDY1LDEyMiw2MSwzNCwxODUsOA0K hPKSPrjIAABUAAAAVAAAAAAH6QoWXAACs50B5AgARQAARrs+QAB9BkU1QXo9KEF6PSIAFbj/ YwskdO1200hQGPgI/CsAADIwMCBQT1JUIGNvbW1hbmQgc3VjY2Vzc2Z1bC4NCoTykj7vywAA UAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJSL0AAPwbsSEF6PSJBej0ouP8AFe1200hjCySS UBhhCEEKAABTVE9SIDM2MjAwMDg0Lm91dC4wMzA0MDgNCoTykj54HQEAeAAAAHgAAAAAB+kK FlwAArOdAeQIAEUAAGq7P0AAfQZFEEF6PShBej0iABW4/2MLJJLtdtNiUBj37sMzAAAxNTAg T3BlbmluZyBCSU5BUlkgbW9kZSBkYXRhIGNvbm5lY3Rpb24gZm9yIDM2MjAwMDg0Lm91dC4w MzA0MDguDQqE8pI+YYwBAEIAAABCAAAAAAfpChZcAAKznQHkCABFAAA0mFNAAH0GaDJBej0o QXo9IhtYlQ90egQgGI1u6YAQLUTH6QAAAQEICgBCKDANRJ4ihPKSPt+NAQDNAAAAzQAAAAAC s50B5AAH6QoWXAgARQAAvz1bQAA/BgCgQXo9IkF6PSiVDxtYGI1u6XR6BCCAGBbQc+0AAAEB CAoNRJ43AEIoMDEzMDd8MTQ3MzU4NXwxMDQ5ODE3NzM1fDEuMHwxfDY1NHxoZWxsbyB3b3Js ZAoxMzA4fDE0NzM1ODZ8MTA0OTgxNzczNXwxLjB8MXw1MjR8aGVsbG8gd29ybGQKMTMwOXwx NDczNTg3fDEwNDk4MTc3MzV8MS4wfDF8MTIwM3xoZWxsbyB3b3JsZAqE8pI+pJYBAD4AAAA+ AAAAAAfpChZcAAKznQHkCABFAAAwu0BAAH0GRUlBej0oQXo9IgAUuQiTD4RzAAAAAHAC+vC6 oAAAAgQFZAEBBAKE8pI+WZgBAD4AAAA+AAAAAAKznQHkAAfpChZcCABFAAAwUjBAAD8G7FlB ej0iQXo9KLkIABTtqa64kw+EdHASYQi3xQAAAQEEAgIEBbSE8pI+ENABADYAAAA2AAAAAAfp ChZcAAKznQHkCABFAAAou0FAAH0GRVBBej0oQXo9IgAUuQiTD4R07amuuVAQ/VxINQAAhPKS PjfXAQCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFIxQAA/Bub8QXo9IkF6PSi5CAAU7amu uZMPhHRQEGEIlxsAAFhZWlpZLi4uICBUQz0yIFRNPTEwNDk4MTc2NzggTU49MzYyMDAwODQu b3V0IFNSQz1jb210ZXggUEZOPSJDb210ZXgiIFBGTj0iQ29tdGV4IiBQRk49Ik9zdGVyRG93 Sm9uZXMiIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgT0RKIFVTREEgTmF0bCBE YWlseSBCb3hlZCBCZWVmIEN1dG91dC9DdXRzIE5lZyBTYWxlcy1BTSAtIEFwciA4CgouLi4g IAkgCgpCeUxpbmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgMDgsIDIwMDMgKE9E SiB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHlyaWdodExpbmUuLi4gIChDKSBDb3B5cmln aHQgMjAwMyBPREoKCgouLi4KCgpPc3RlckRvd0pvbmVzCgpMTV9YQjQwMgpEZXMgTW9pbmVz LCBJQSAgICAgICAgICAgICAgICAgVHVlLCBBcHIgMDgsIDIwMDMgICAgICAgICAgICAgICBV U0RBIE1hcmtldCBOZXdzCgpOQVRJT05BTCBEQUlMWSBCT1hFRCBCRUVGIENVVE9VVCBBTkQg Qk9YRUQgQkVFRiBDVVRTIC0gTmVnb3RpYXRlZCBTYWxlcyAtCk1vcm5pbmcKClVTREEgRVNU SU1BVEVEIEJPWEVEIEJFRUYgQ1VULU9VVCBWQUxVRVMgLSBhcyBvZiA5OjMwYW0KCkJhc2Vk IG9uIG5lZ290aWF0ZWQgcHJpY2VzIGFuZCB2b2x1bWUgb2YgYm94ZWQgYmVlZiBjdXRzIGRl bGl2ZXJlZCB3aXRoaW4KMC0yMSBkYXlzIGFuZCBvbiBhdmVyYWdlIGluZHVzdHJ5IGN1dHRp bmcgeWllbGRzLiBWYWx1ZXMgcmVmbGVjdCBVUwpkb2xsYXJzIHBlciAxMDAgcG91bmRzLgoK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSE9JQ0UgICAgICAg ICAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2 MDAtNzUwIyAgICAgNzUwLTkwMCMgICAgIDYwMC03NTAjCjc1MC05MDAjCi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KCkN1cnJlbnQgQ3V0b3V0IFZhbHVlczogICAgICAgICAgICAkMTMy Ljk3ICAgICAgJDEzMi40NyAgICAgICQxMjIuNzEKJDEyMy4wMwpDaGFuZ2UgZnJvbSBwcmlv ciBkYXk6ICAgICAgICAgICAgICAkMS4zMCAgICAgICAgJDEuMjcgICAgICAgICQxLjAyCiQw LjYyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkNPTVBPU0lURSBQUklNQUwgVkFMVUVT CgpQcmltYWwgUmliICAgICAgICAgICAgICAgICAgICAgICAgJDIxNS45NCAgICAgICQyMTUu MDQgICAgICAkMTk0LjE2CiQxOTQuNTMKUHJpbWFsIENodWNrICAgICAgICAgICAgICAgICAg ICAgICAkOTkuMTYgICAgICAgJDk1LjA3ICAgICAgICQ5Ny4xNQokOTUuNITykj601wEAmgUA AJoFAAAAArOdAeQAB+kKFlwIAEUABYxSMkAAPwbm+0F6PSJBej0ouQgAFO2ptB2TD4R0UBhh CPJbAAAwClByaW1hbCBSb3VuZCAgICAgICAgICAgICAgICAgICAgICAkMTAxLjI5ICAgICAg JDEwMS4xOSAgICAgICAkOTcuODAKJDk3Ljg1ClByaW1hbCBMb2luICAgICAgICAgICAgICAg ICAgICAgICAkMjA4LjM0ICAgICAgJDIxMi4yNCAgICAgICQxNzguNjEKJDE4Mi4zMApQcmlt YWwgQnJpc2tldCAgICAgICAgICAgICAgICAgICAgICQ3Mi4wNiAgICAgICAkNzIuMDYgICAg ICAgJDY4LjExCiQ2OC4xMQpQcmltYWwgU2hvcnQgUGxhdGUgICAgICAgICAgICAgICAgICQ4 OS4yMiAgICAgICAkODkuMjIgICAgICAgJDg5LjI3CiQ4OS4yNwpQcmltYWwgRmxhbmsgICAg ICAgICAgICAgICAgICAgICAgICQ4My41OSAgICAgICAkODMuNTkgICAgICAgJDgzLjk0CiQ4 My45NAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpMT0FEIENPVU5UIEFORCBDVVRPVVQg VkFMVUUgU1VNTUFSWSBGT1IgUFJJT1IgNSBEQVlTCgpEYXRlICBDaG9pY2UgU2VsZWN0IFRy aW0gR3JpbmRzICAgICAgICAgIENIT0lDRSAgICAgICAgICAgICAgICAgICAgU0VMRUNUCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwMC03NTAjICAgICA3NTAtOTAwIyAg ICAgNjAwLTc1MCMKNzUwLTkwMCMKMDQvMDcgICAgIDk0ICAgIDg3ICAgIDE0ICAgIDk1ICAg ICQxMzEuNjcgICAgICAkMTMxLjIwICAgICAgJDEyMS42OQokMTIyLjQxCjA0LzA0ICAgIDEy MyAgIDEyNCAgICAgMiAgICA0MyAgICAkMTI5LjkwICAgICAgJDEzMC4xNyAgICAgICQxMjAu NzcKJDEyMC43OQowNC8wMyAgICAxMDEgICAxMTIgICAgMjcgICAgNzQgICAgJDEyOS4yMCAg ICAgICQxMjkuNzkgICAgICAkMTIxLjA0CiQxMjAuMjYKMDQvMDIgICAgMTg4ICAgMTE1ICAg IDM2ICAgIDY1ICAgICQxMjguNjAgICAgICAkMTI4LjkwICAgICAgJDEyMC43MgokMTE5Ljk1 CjA0LzAxICAgIDEzNyAgIDEzMCAgICAyMiAgIDEwMyAgICAkMTI3LjI0ICAgICAgJDEyNy43 NCAgICAgICQxMjAuNDgKJDExOS44NwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpDdXJy ZW50IDUgRGF5IFNpbXBsZSBBdmVyYWdlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJDEyOS4zMiAgICAgICQxMjkuNTYgICAgICAkMTIwLjk0CiQxMjAuNjYKLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQoKTkFUSU9OQUwgQk9YRUQgQkVFRiBDVVRTIC0gTkVHT1RJ QVRFRCBTQUxFUyBGT0IgUGxhbnQgYmFzaXMgbmVnb3RpYXSE8pI+KdgBAJoFAACaBQAAAAKz nQHkAAfpChZcCABFAAWMUjNAAD8G5vpBej0iQXo9KLkIABTtqbmBkw+EdFAYYQgtzAAAZWQK c2FsZXMgZm9yIGRlbGl2ZXJ5IHdpdGhpbiAwLTIxIGRheSBwZXJpb2QuIFByaW9yIGRheXMg c2FsZXMgYWZ0ZXIgMTozMHBtCmFyZSBpbmNsdWRlZC4KCkNVUlJFTlQgVk9MVU1FIC0gKG9u ZSBsb2FkIGVxdWFscyA0MCwwMDAgcG91bmRzKQoKQ2hvaWNlIEN1dHMgICAgICAgICAgICAg ICAgICAgICAgODQuMTMgIGxvYWRzICAgICAgICAgICAgICAgMywzNjUsMTkyICBwb3VuZHMK U2VsZWN0IEN1dHMgICAgICAgICAgICAgICAgICAgICAgODkuNTUgIGxvYWRzICAgICAgICAg ICAgICAgMyw1ODEsOTE5ICBwb3VuZHMKVHJpbW1pbmdzICAgICAgICAgICAgICAgICAgICAg ICAgMjguMTMgIGxvYWRzICAgICAgICAgICAgICAgMSwxMjUsMjc2ICBwb3VuZHMKQ29hcnNl IEdyaW5kcyAgICAgICAgICAgICAgICAgICAgMjQuMjEgIGxvYWRzICAgICAgICAgICAgICAg ICA5NjgsNTQxICBwb3VuZHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQ2hvaWNlIEN1 dHMsIEZhdCBMaW1pdGF0aW9ucyAxLTYKSU1QUy9GTCAgICAgICAgIFN1Yi1QcmltYWwgICAg ICAgICAgICAgIyBvZiAgICAgIFRvdGFsICAgICAgICBQcmljZQpXZWlnaHRlZAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFkZXMgICAgUG91bmRzICAgICAg IFJhbmdlICAgICBBdmVyYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjEwNyAgMSAg UmliLCBPdmVuIHByZXBhcmVkCjEwOUEgMSAgUmliLCByb2FzdC1yZWFkeSwgbGlnaHQgICAg ICAgICAgIDAgICAgICAgICAgIDAKMTA5QSAxICBSaWIsIHJvYXN0LXJlYWR5LCBoZWF2eSAg ICAgICAgICAgNCAgICAgICAxLDM5MyAgIDMwMi40OCAgMzQwLjAwCjMyMS4yNAoxMDlFIDEg IFJpYiwgcmliZXllLCBsaXAtb24sIGJuLWluICAgICAgIDI2ICAgICAgNTgsNzc1ICAgNDAx LjAwICA0MzYuNjAKNDE5Ljk5CjExMkEgMyAgUmliLCByaWJleWUsIGJubHMsIGxpZ2h0ICAg ICAgICAgMTMgICAgICAzOSwxNTggICA0NTAuMDAgIDQ5NS4wMAo0NjMuNDMKMTEyQSAzICBS aWIsIHJpYmV5ZSwgYm5scyxoZWF2eSAgICAgICAgICAxNiAgICAgIDcyLDkwOSAgIDQ1MS4w MCAgNTA1LjAwCjQ3MC4wNgoxMTNBIDEgIENodWNrLCBzcXVhcmUtY3V0LCAyIHBpZWNlICAg ICAgICA0ICAgICAgIDcsNjA0ICAgMTE4LjAwICAxMjAuNDYKMTE5Ljc1CjExM0MgMSAgQ2h1 Y2ssIHNlbWktYm5scywgbmVjay9vZmYKMTEzQyAzICBDaHVjaywgc2VtaS1ibmxzLCBuZWNr L29mZiAgICAgICAgMCAgICAgICAgICAgMAoKhPKSPlVSAgA2AAAANgAAAAAH6QoWXAACs50B 5AgARQAAKLtCQAB9BkVPQXo9KEF6PSIAFLkIkw+EdO2puYFQEP1cPW0AAITykj6dVQIAmgUA AJoFAAAAArOdAeQAB+kKFlwIAEUABYxSNEAAPwbm+UF6PSJBej0ouQgAFO2pvuWTD4R0UBBh CCJtAAAzIENodWNrLCBzZW1pLWJubHMgbi9vIHNoLWN1dAoKMTE0ICAxICBDaHVjaywgc2hv dWxkZXIgY2xvZCAgICAgICAgICAgICAxMCAgICAgIDU5LDUxOSAgICA5OC4wMCAgMTA5Ljgx CjEwMi44MgoxMTRBIDMgIENodWNrLCBzaG91bGRlciBjbG9kLCB0cm1kICAgICAgIDM4ICAg ICA1MDMsNzUxICAgMTEyLjAwICAxMjIuMDAKMTE1LjEyCgozIENodWNrLCBTaGxkIENsb2Qs IDJwYy5zcGxpdAoKMTE0RSAzICBDaHVjaywgQ2xvZCwgQXJtIFJvYXN0ICAgICAgICAgICAg MCAgICAgICAgICAgMAoxMTUgIDEgIENodWNrLCAyLXBpZWNlLCBib25lbGVzcyAgICAgICAg ICA1ICAgICAgIDgsNDY1ICAgMTE1LjAwICAxMjQuMzgKMTIyLjAxCjExNkEgMyAgQ2h1Y2ss IHJvbGwsIGx4bCwgbmVjay9vZmYgICAgICAgNDAgICAgIDgyNCw4MTcgICAxNDQuMDAgIDE2 My4zOAoxNTIuNzgKMTE2QiAxICBDaHVjaywgY2h1Y2sgdGVuZGVyICAgICAgICAgICAgICAz MyAgICAgIDM4LDU1MCAgIDE1Mi4wMCAgMTY2Ljc1CjE1OS43NAoxMTZDIDEgIENodWNrLCBj aHVjayByb2xsICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwCjEyMCAgMSAgQnJpc2tl dCwgZGVja2xlLW9mZiwgYm5scyAgICAgICAgMTQgICAgIDE2MywxMTEgICAgOTIuMDAgIDEw OS4wMAoxMDEuMjAKMTIwQSAzICBCcmlza2V0LCBwb2ludC9vZmYsIGJubHMgICAgICAgICAx MiAgICAgIDE4LDYxOCAgIDE3NC4xNCAgMjE0LjU3CjE4Ny44OQoxMjNBIDMgIFNob3J0IFBs YXRlLCBzaG9ydCByaWIKMTMwICA0ICBDaHVjaywgc2hvcnQgcmliICAgICAgICAgICAgICAg ICAxOCAgICAgIDUyLDAzNyAgIDIxMi4wMCAgMjM2LjAxCjIyNC42NAoxNjAgIDEgIFJvdW5k LCBib25lLWluICAgICAgICAgICAgICAgICAgIDE2ICAgICAgNDksNzcxICAgMTEyLjg2ICAx MjUuMDAKMTE3LjA3CjE2MSAgMSAgUm91bmQsIGJvbmVsZXNzICAgICAgICAgICAgICAgICAg IDggICAgICA0Nyw4MjMgICAxMjYuMDAgIDEzMS4wMAoxMjcuNTIKICAgICAzICBSb3VuZCwg Ym5scy9wZWVsZWQga251Y2tsZSAgICAgICAgMCAgICAgICAgICAgMAogICAgIDMgIFJvdW5k LCBibmxzL3BlZWxlZCBoZWVsLW91dCAgICAgIDE0ICAgICAgNDksMTcxICAgMTM5LjEyICAx NDguMDAKMTQzLjAxCjE2NyAgMSAgUm91bmQsIGtudWNrbGUgICAgICAgICAgICAgICAgICAg IDMgICAgICAxOCwyNTkgICAxMjMuMDAgIDEzMy4wMAoxMjcuNDUKMTY3QSA0ICBSb3VuZCwg a251Y2tsZSwgcGVlbGVkICAgICAgICAgICAzNyAgICAgMTIyLDM0MiAgIDEzMC4wMCAgMTQw LjAwCjEzMy41MAoxNjggIDEgIFJvdW5kLCB0b3AgaW5zaWRlIHJvdW5kICAgICAgICAgIDIw ICAgICAgODEsMzMzICAgMTE4Ljc1ICAxMzAuMDAKMTIwLjSE8pI+ElYCAJoFAACaBQAAAAKz nQHkAAfpChZcCABFAAWMUjVAAD8G5vhBej0iQXo9KLkIABTtqcRJkw+EdFAQYQjEGwAAOQox NjggIDMgIFJvdW5kLCB0b3AgaW5zaWRlIHJvdW5kICAgICAgICAgIDEzICAgICAgMTksMTEw ICAgMTI4LjIxICAxMzYuMDAKMTMyLjUzCjE2OSAgNSAgUm91bmQsIHRvcCBpbnNpZGUsIGRl bnVkZWQgICAgICAgMTIgICAgICAyMyw1ODAgICAxNDUuMDAgIDE3My4wOAoxNTguMTIKMTY5 QSA1ICBSb3VuZCwgVG9wIEluc2lkZSwgY2FwIG9mZiAgICAgICAgMCAgICAgICAgICAgMAox NzAgIDEgIFJvdW5kLCBib3R0b20gZ29vc2VuZWNrICAgICAgICAgICA0ICAgICAgIDQsMTYy ICAgMTI2LjczICAxMzMuMDAKMTI4LjAyCjE3MUIgMyAgUm91bmQsIG91dHNpZGUgcm91bmQg ICAgICAgICAgICAgMzYgICAgIDE1MCw3NzMgICAxMjcuMDAgIDE0MC4wMAoxMzAuMjYKMTcx QyAzICBSb3VuZCwgZXllIG9mIHJvdW5kICAgICAgICAgICAgICAzMiAgICAgIDkyLDM1MiAg IDE4MC4wMCAgMjAyLjAwCjE4Ny4yNQogICAgIDMgIFJvdW5kLCBmbGF0L2V5ZSwgaGVlbC1v dXQgICAgICAgICAwICAgICAgICAgICAwCjE3NCAgMSAgTG9pbiwgc2hvcnQgbG9pbiwgMngz ICAgICAgICAgICAgIDMgICAgICAgMiwzMjUgICAzNjYuMDAgIDM4MC4wMAozNjcuOTAKMTc0 ICAzICBMb2luLCBzaG9ydCBsb2luLCAweDEgICAgICAgICAgICAzNSAgICAgIDg2LDg2NyAg IDQ0NS4wMCAgNDg1LjAwCjQ2Ny44NgoxNzUgIDEgIExvaW4sIHN0cmlwIGxvaW4sIDR4NiAg ICAgICAgICAgICAwICAgICAgICAgICAwCjE3NSAgMyAgTG9pbiwgc3RyaXAgbG9pbiwgMXgx CjE4MCAgMSAgTG9pbiwgc3RyaXAsIGJubHMsIGxpZ2h0CjE4MCAgMSAgTG9pbiwgc3RyaXAs IGJubHMsIGhlYXZ5ICAgICAgICAgIDQgICAgICAgMSw5ODggICAzNzMuMDEgIDM5NC4zOAoz ODAuMDEKICAgICAxICBMb2luLCBTdHJpcCBMb2luIEJubHMuIDF4MSAgICAgICAgOCAgICAg IDE3LDYyMCAgIDQyNS40MSAgNDU1LjAwCjQ0Mi4xMgoxODAgIDMgIExvaW4sIHN0cmlwLCBi bmxzLCAweDEgICAgICAgICAgIDIyICAgICAxMTEsMzg5ICAgNTE3LjAwICA1NDUuMDAKNTIy LjkzCjE4NCAgMSAgTG9pbiwgdG9wIGJ1dHQsIGJubHMsIGxpZ2h0ICAgICAgIDAgICAgICAg ICAgIDAKMTg0ICAxICBMb2luLCB0b3AgYnV0dCwgYm5scywgaGVhdnkgICAgICAxMyAgICAg IDE2LDAyNCAgIDIyMC4wMCAgMjQ1LjAwCjIzMC44OQoxODQgIDMgIExvaW4sIHRvcCBidXR0 LCBib25lbGVzcyAgICAgICAgIDM3ICAgICAgNzIsNDcxICAgMjUzLjUxICAyODcuNDQKMjcx LjU0CjE4NEUgMyAgTG9pbiwgVG9wIEJ1dHQsIDIgcGMuIGJubHMgICAgICAgIDAgICAgICAg ICAgIDAKMTg1QSA0ICBMb2luLCBib3R0b20gc2lybG9pbiwgZmxhcCAgICAgICAyNSAgICAg MTA5LDcwNSAgIDI1NS4wMCAgMjY4LjAwCjI2hPKSPhNWAgA+AQAAPgEAAAACs50B5AAH6QoW XAgARQABMFI2QAA/ButTQXo9IkF6PSi5CAAU7anJrZMPhHRQEWEIEoAAADIuNDcKMTg1QiAx ICBMb2luLCBiYWxsLXRpcCwgYm5scywgbGlnaHQKMTg1QiAxICBMb2luLCBiYWxsLXRpcCwg Ym5scyxoZWF2eSAgICAgICAxOCAgICAgIDUyLDcwMyAgIDIyNS4yNSAgMjU1LjY5CjI0Ni42 MwoKLi4uICAJIAoKS2V5V29yZHMuLi4gIAogICAgYmVlZgogICAgaW93YQogICAgbWFya2V0 CiAgICBwbGFudAogICAgcHJpY2VzCiAgICBzYWxlcwogICAgdXNkYQogICAgTUVBVE9yaWdp biBBc3NpZ25lZEJ5PSJPc3RlckRvd0pvbmVzIiAvPlVTREEKCoTykj4VnAIAPAAAADwAAAAA ArOdAeQAB+kKFlwIAEUAAChSN0AAPwbsWkF6PSJBej0ouP8AFe1202JjCyTUUBBhCE/AAAAA AAAAAACE8pI+VbMCADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAou0NAAH0GRU5Bej0oQXo9 IgAUuQiTD4R07anESVAQ/VwypQAAhPKSPmzSAgA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLtEQAB9BkVNQXo9KEF6PSIAFLkIkw+EdO2pyrZQEP1cLDgAAITykj4K6AIANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi7RUAAfQZFTEF6PShBej0iABS5CJMPhHTtqcq2UBH9XCw3AACE 8pI+C+kCADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUjhAAD8G7FlBej0iQXo9KLkIABTt qcq2kw+EdVAQYQjIiwAAAAAAAAAAhPKSPo3pAgBOAAAATgAAAAAH6QoWXAACs50B5AgARQAA QLtGQAB9BkUzQXo9KEF6PSIAFbj/Ywsk1O1202JQGPfu6cMAADIyNiBUcmFuc2ZlciBjb21w bGV0ZS4NCoTykj7t8QIAUAAAAFAAAAAAArOdAeQAB+kKFlwIAEUAAEJSOUAAPwbsPkF6PSJB ej0ouP8AFe1202JjCyTsUBhhCFCyAABERUxFIDM2MjAwMDg2Lm91dC4wMzA0MDgNCoTykj7n LgMAfAAAAHwAAAAAB+kKFlwAArOdAeQIAEUAAG67R0AAfQZFBEF6PShBej0iABW4/2MLJOzt dtN8UBj31DiyAAA1NTAgMzYyMDAwODYub3V0LjAzMDQwODogVGhlIHN5c3RlbSBjYW5ub3Qg ZmluZCB0aGUgZmlsZSBzcGVjaWZpZWQuIA0KhPKSPgM7AwBPAAAATwAAAAACs50B5AAH6QoW XAgARQAAQVI6QAA/Buw+QXo9IkF6PSi4/wAV7XbTfGMLJTJQGGEIs8AAAFBPUlQgNjUsMTIy LDYxLDM0LDE4NSw5DQqE8pI+0HUDAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGu0hAAH0G RStBej0oQXo9IgAVuP9jCyUy7XbTlVAY97r7bgAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNz ZnVsLg0KhPKSPlJ5AwBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlI7QAA/Buw8QXo9IkF6 PSi4/wAV7XbTlWMLJVBQGGEIPf8AAFNUT1IgMzYyMDAwODYub3V0LjAzMDQwOA0KhPKSPvz5 AwB4AAAAeAAAAAAH6QoWXAACs50B5AgARQAAartJQAB9BkUGQXo9KEF6PSIAFbj/YwslUO12 069QGPegwnQAADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3Ig MzYyMDAwODYub3V0LjAzMDQwOC4NCoTykj61cwQAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUA ADC7SkAAfQZFP0F6PShBej0iABS5Cci3GVUAAAAAcAL68PAVAAACBAVkAQEEAoTykj5odQQA PgAAAD4AAAAAArOdAeQAB+kKFlwIAEUAADBSPEAAPwbsTUF6PSJBej0ouQkAFO2q6YXItxlW cBJhCLJsAAABAQQCAgQFtITykj56rQQANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi7S0AA fQZFRkF6PShBej0iABS5Cci3GVbtqumGUBD9XELcAACE8pI+TrQEAG0EAABtBAAAAAKznQHk AAfpChZcCABFAARfUj1AAD8G6B1Bej0iQXo9KLkJABTtqumGyLcZVlAYYQgTbQAAWFlaWlku Li4gIFRDPTIgVE09MTA0OTgxNzY3OSBNTj0zNjIwMDA4Ni5vdXQgU1JDPWNvbXRleCBQRk49 IkNvbXRleCIgUEZOPSJDb210ZXgiIFBGTj0iRlQgSW5mb3JtYXRpb24gKEVVUikiIAoKLi4u ICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgU3VkZGV1dHNjaGUgWmVpdHVuZzogVC1Nb2Jp bGUgc2V0IHRvIGpvaW4gbW9iaWxlIHRlbGVjb21zIGFsbGlhbmNlCgouLi4gIAkgCgpCeUxp bmUuLi4gIAoKLi4uICAKCkRhdGVMaW5lLi4uICBBcHIgOCwgMjAwMywgKFN1ZGRldXRzY2hl IFplaXR1bmcgL0ZUIEluZm9ybWF0aW9uIHZpYSBDT01URVgpIC0tCgoKCi4uLgoKQ29weXJp Z2h0TGluZS4uLiAgQ29weXJpZ2h0IDIwMDM6IEZpbmFuY2lhbCBUaW1lcyBJbmZvcm1hdGlv bi4gQWxsIHJpZ2h0cyByZXNlcnZlZAoKCi4uLgoKCkZUIEluZm9ybWF0aW9uIChFVVIpCgpU LU1vYmlsZSwgdGhlIG1vYmlsZSB0ZWxlY29tcyBhcm0gb2YgRGV1dHNjaGUgVGVsZWtvbSwg dGhlIEdlcm1hbgp0ZWxlY29tcyBncm91cCwgaGFzIGFubm91bmNlZCBwbGFucyB0byBlbnRl ciBpbnRvIGEgam9pbnQgdmVudHVyZSB3aXRoClNwYW5pc2ggcml2YWwgVGVsZWZvbmljYSBN b3ZpbGVzIGFuZCBJdGFsaWFuIHJpdmFsIFRlbGVjb20gSXRhbGlhIE1vYmlsZSwKdG8gb2Zm ZXIgc3BlZWNoIGFuZCBkYXRhIHNlcnZpY2VzLiBUaGUgYnVzaW5lc3Mgd2lsbCBjb3ZlciBh IGN1c3RvbWVyCmJhc2Ugb2YgMTYyIG1pbGxpb24gYWNyb3NzIDI1IGNvdW50cmllcy4KClRo ZSB0aHJlZSBjb21wYW5pZXMgbGVhZCB0aGUgbWFya2V0cyBpbiB0aGVpciBob21lIGNvdW50 cmllcywgYW5kIHdvcmsgaW4KRXVyb3BlLCBMYXRpbiBBbWVyaWNhIGFuZCB0aGUgVVMgSXQg aXMgYWxzbyByZXBvcnRlZCB0aGF0IHRhbGtzIGFyZQpvbmdvaW5nIG92ZXIgdGhlIHBvc3Np YmlsaXR5IG9mIEZyZW5jaCBncm91cCBPcmFuZ2Ugam9pbmluZyB0aGUgYWxsaWFuY2UuCgpB YnN0cmFjdGVkIGZyb20gU3VkZGV1dHNjaGUgWmVpdHVuZwoKLi4uICAJIAoKS2V5V29yZHMu Li4gIAogICAgZXVyb3BlCiAgICBqb2ludCt2ZW50dXJlCiAgICB0ZWxlY29tCgqE8pI+T7QE ADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUj5AAD8G7FNBej0iQXo9KLkJABTtqu29yLcZ VlARYQja+AAAAAAAAAAAhPKSPtriBABCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANJhUQAB9 BmgxQXo9KEF6PSIbWJUPdHoEIBiNb3SAECy5x9IAAAEBCAoAQigyDUSeN4Tykj63CQUANgAA ADYAAAAAB+kKFlwAArOdAeQIAEUAACi7TEAAfQZFRUF6PShBej0iABS5Cci3GVbtqu2+UBD5 JULbAACE8pI+/xUFADYAAAA2AAAAAAfpChZcAAKznQHkCABFAAAou01AAH0GRURBej0oQXo9 IgAUuQnItxlW7artvlAR+SVC2gAAhPKSPmoXBQA8AAAAPAAAAAACs50B5AAH6QoWXAgARQAA KFI/QAA/BuxSQXo9IkF6PSi5CQAU7artvsi3GVdQEGEI2vcAAAAAAAAAAITykj5PggUAPAAA ADwAAAAAArOdAeQAB+kKFlwIAEUAAChSQEAAPwbsUUF6PSJBej0ouP8AFe12069jCyWSUBBh CE61AAAAAAAAAACE8pI+8LoFAE4AAABOAAAAAAfpChZcAAKznQHkCABFAABAu05AAH0GRStB ej0oQXo9IgAVuP9jCyWS7XbTr1AY96DpBgAAMjI2IFRyYW5zZmVyIGNvbXBsZXRlLg0KhPKS PmzDBQBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlJBQAA/Buw2QXo9IkF6PSi4/wAV7XbT r2MLJapQGGEITqcAAERFTEUgMzYyMDAwODcub3V0LjAzMDQwOA0KhPKSPn9FBgB8AAAAfAAA AAAH6QoWXAACs50B5AgARQAAbrtPQAB9BkT8QXo9KEF6PSIAFbj/Ywslqu1208lQGPeGN/QA ADU1MCAzNjIwMDA4Ny5vdXQuMDMwNDA4OiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBm aWxlIHNwZWNpZmllZC4gDQqE8pI+HVYGAFAAAABQAAAAAAKznQHkAAfpChZcCABFAABCUkJA AD8G7DVBej0iQXo9KLj/ABXtdtPJYwsl8FAYYQi3hwAAUE9SVCA2NSwxMjIsNjEsMzQsMTg1 LDEwDQqE8pI+jJAGAFQAAABUAAAAAAfpChZcAAKznQHkCABFAABGu1BAAH0GRSNBej0oQXo9 IgAVuP9jCyXw7XbT41AY92v6sQAAMjAwIFBPUlQgY29tbWFuZCBzdWNjZXNzZnVsLg0KhPKS PkKeBgBQAAAAUAAAAAACs50B5AAH6QoWXAgARQAAQlJDQAA/Buw0QXo9IkF6PSi4/wAV7XbT 42MLJg5QGGEIO/MAAFNUT1IgMzYyMDAwODcub3V0LjAzMDQwOA0KhPKSPgNXBwB4AAAAeAAA AAAH6QoWXAACs50B5AgARQAAartRQAB9BkT+QXo9KEF6PSIAFbj/YwsmDu120/1QGPdRwbYA ADE1MCBPcGVuaW5nIEJJTkFSWSBtb2RlIGRhdGEgY29ubmVjdGlvbiBmb3IgMzYyMDAwODcu b3V0LjAzMDQwOC4NCoTykj4DWAcAPgAAAD4AAAAAB+kKFlwAArOdAeQIAEUAADC7UkAAfQZF N0F6PShBej0iABS5CoY+00oAAAAAcAL68HiYAAACBAVkAQEEAoTykj6cWQcAPgAAAD4AAAAA ArOdAeQAB+kKFlwIAEUAADBSREAAPwbsRUF6PSJBej0ouQoAFO2u8wiGPtNLcBJhCDFoAAAB AQQCAgQFtITykj55kQcANgAAADYAAAAAB+kKFlwAArOdAeQIAEUAACi7U0AAfQZFPkF6PShB ej0iABS5CoY+00vtrvMJUBD9XMHXAACE8pI+aZkHAJoFAACaBQAAAAKznQHkAAfpChZcCABF AAWMUkVAAD8G5uhBej0iQXo9KLkKABTtrvMJhj7TS1AQYQhP/wAAWFlaWlkuLi4gIFRDPTIg VE09MTA0OTgxNzY3OSBNTj0zNjIwMDA4Ny5vdXQgU1JDPWNvbXRleCBQRk49IkNvbXRleCIg UEZOPSJDb210ZXgiIFBGTj0iQnkgU2VhbiBBZGtpbnMmI3hBOyIgUEZOPSJLbmlnaHQtUmlk ZGVyIE9wZW4iIAoKLi4uICAKCgouLi4gCSAKCgpIZWFkTGluZS4uLiAgT25lIG9mIFlvcmss IFBhLiwgQWdyaWN1bHR1cmFsLCBJbmR1c3RyaWFsIE11c2V1bSdzIEZvdW5kZXJzIERpZXMg YXQgODAKCi4uLiAgCSAKCkJ5TGluZS4uLiAgQnkgU2VhbiBBZGtpbnMKCgouLi4gIAoKRGF0 ZUxpbmUuLi4gIEFwciAwNywgMjAwMyAoWW9yayBEYWlseSBSZWNvcmQgLSBLbmlnaHQgUmlk ZGVyL1RyaWJ1bmUgQnVzaW5lc3MgTmV3cyB2aWEgQ09NVEVYKSAtLQoKCgouLi4KCkNvcHly aWdodExpbmUuLi4gIChjKSAyMDAzLCBZb3JrIERhaWx5IFJlY29yZCwgUGEuIERpc3RyaWJ1 dGVkIGJ5IEtuaWdodCBSaWRkZXIvVHJpYnVuZSBCdXNpbmVzcwoKCi4uLgoKCktuaWdodC1S aWRkZXIgT3BlbgoKRXZlcnkgb3RoZXIgVGh1cnNkYXksIEMgV2FycmVuIFNtaXRoIEpyIHdv dWxkIGpvaW4gc2V2ZXJhbCBvZiBoaXMgZnJpZW5kcwpmb3IgYSBtZWV0aW5nIG9mIHRoZSBs dW5jaCBidW5jaC4KClRoZSBjby1mb3VuZGVyIG9mIHRoZSBBZ3JpY3VsdHVyYWwgYW5kIElu ZHVzdHJpYWwgTXVzZXVtIGluIFlvcmsgd291bGQKaGF2ZSBhIHJlbGF0aXZlIG9yIGEgZnJp ZW5kIGRyaXZlIGhpbSB0byB0aGUgZ3JvdXAncyBzZWxlY3RlZCByZXN0YXVyYW50LAp3aGVy ZSBwYXN0IG1lbW9yaWVzIGFuZCBjdXJyZW50IGhhcHBlbmluZ3Mgd2VyZSB0aGUgdG9waWNz IG9mIGNob2ljZS4KCiJIZSB3YXMganVzdCBhIHJlYWwgY29uZ2VuaWFsIG1hbiwiIHNhaWQg Um9iZXJ0IEx1a2FzLCBvd25lciBvZiBDbGFzc2ljCkNhcmFtZWwgaW4gWW9yay4gIkhlIGFs d2F5cyBoYWQgYSBnb29kIGpva2UgdG8gdGVsbC4iCgpTbWl0aCwgODAsIHdobyBkaWVkIG9m IGEgaGVhcnQgYXR0YWNrIFRodXJzZGF5IGF0IGhpcyBZb3JrIFRvd25zaGlwIGhvbWUsCndh cyBkZXNjcmliZWQgYnkgZnJpZW5kcyBhcyB0YWxlbnRlZCBhbmQgbWluZGZ1bCBvZiBZb3Jr IENvdW50eSdzCmhpc3RvcnkuCgpCb3JuIEp1bHkgMjQsIDE5MjIsIGluIFJpY2htb25kLCBW YS4sIFNtaXRoIHdhcyBhIGdyYWR1YXRlIG9mIFNocml2ZW5oYW0KVW5pdmVyc2l0eSBpbiBF bmdsYW5kLCB0aGUgQ29sbGVnZSBvZiBXaWxsaWFtIGFuZCBNYXJ5IGluIFdpbGxpYW1zYnVy ZywKVmEuLCBhbmQgdGhlIENvbHVtYmlhIEdyYWR1YXRlIFNjaG9vbCBvZiBCdXNpbmVzcyBp biBOZXcgWW9yay4KClRoZSBVUyBBcm15IDkwMm5kIEFpcmJvcm5lIGF3YXJkZWQgU21pdGgg dGhlIEFtZXJpY2FuIFRohPKSPuGZBwCaBQAAmgUAAAACs50B5AAH6QoWXAgARQAFjFJGQAA/ BubnQXo9IkF6PSi5CgAU7a74bYY+00tQGGEIDYoAAGVhdGVyIFJpYmJvbiBhbmQKdGhlIEV1 cm9wZWFuIEFmcmljYW4gTWlkZGxlIEVhc3Rlcm4gVGhlYXRlciBSaWJib24gZm9yIGhpcyBz ZXJ2aWNlIGR1cmluZwpXb3JsZCBXYXIgSUkKCkluIHRoZSB5ZWFycyBmb2xsb3dpbmcgdGhl IHdhciwgU21pdGggYnVpbHQgYSBjYXJlZXIgYW5kIGxhdGVyIHJldGlyZWQgYXMKdGhlIHZp Y2UgcHJlc2lkZW50IG9mIFlvcmsgTmFycm93IEZhYnJpY3MgaW4gU3ByaW5nIEdhcmRlbiBU b3duc2hpcC4KCkluIHRoZSBlYXJseSAxOTcwcywgU21pdGggZ290IGhpcyBmaXJzdCB0YXN0 ZSBmb3IgWW9yayBDb3VudHkgaGlzdG9yeQp3aGVuIGhlIHBhcnRuZXJlZCB3aXRoIEZyZWQg Um9zZW5taWxsZXIgdG8gb3BlbiBhbiBhbnRpcXVlIHNob3AgaW4KU3ByaW5nZXR0c2J1cnkg VG93bnNoaXAuCgoiSSd2ZSBrbm93biBoaW0gZm9yIGFib3V0IDQwIHllYXJzLCBhbmQgU21p dHRpZSBoYXMgYWx3YXlzIG1haW50YWluZWQgYQpzdHJvbmcgaW50ZXJlc3QgaW4gWW9yayBD b3VudHksIiBSb3Nlbm1pbGxlciBzYWlkLgoKU21pdGgsIGtub3duIGFzICJTbWl0dGllIiB0 byBoaXMgZnJpZW5kcywgd291bGQgZnJlcXVlbnRseSB0cmF2ZWwgdG8KYXVjdGlvbnMgd2l0 aCBSb3Nlbm1pbGxlciBpbiBzZWFyY2ggb2YgaW52ZW50b3J5IGZvciBhIHN0b3JlIG9wZXJh dGVkIGJ5ClNtaXRoJ3Mgd2lmZSwgUGF0cmljaWEuCgpZZWFycyBsYXRlciwgU21pdGggY29u dGludWVkIHRoYXQgcHJhY3RpY2Ugd2l0aCBMdWthcy4KCkluIHRoZSBsYXRlIDE5ODBzLCB0 aGUgdHdvIHdvdWxkIHNjb3VyIFlvcmsgQ291bnR5IGluIHNlYXJjaCBvZiBhcnRpZmFjdHMK dG8gZXhoaWJpdCBhdCB0aGUgQWdyaWN1bHR1cmFsIGFuZCBJbmR1c3RyaWFsIE11c2V1bS4K CkluIDE5ODksIHNpeCBjb3VudHkgcmVzaWRlbnRzLCBpbmNsdWRpbmcgU21pdGggYW5kIEx1 a2FzLCBjYW1lIHRvZ2V0aGVyCnRvIGRldmVsb3AgYW4gaWRlYSB0aGF0IHdvdWxkIGxhdGVy IGJsb3Nzb20gaW50byB0aGUgbXVzZXVtLgoKTGF0ZXIsIFNtaXRoIGJlY2FtZSB0aGUgZmly c3QgZXhlY3V0aXZlIGRpcmVjdG9yIG9mIHRoZSBtdXNldW0gYW5kIEx1a2FzCml0cyBzZWNv bmQgcHJlc2lkZW50LgoKU21pdGggd2FzIGtub3duIHRvIHVzZSBoaXMgYXJ0aXN0aWMgdGFs ZW50cyB0byBkZXNpZ24gYW5kIGNyZWF0ZSBtYW55IG9mCnRoZSBtdXNldW0ncyBleGhpYml0 cywgTHVrYXMgc2FpZC4KCkF0IHRoZSB0aW1lIG9mIGhpcyBkZWF0aCwgU21pdGggd2FzIHdv cmtpbmcgb24gdGhlIGxheW91dCBvZiBhIG11c2V1bQpicm9jaHVyZSB0aGUgZmVhdHVyZWQg aW5mb3JtYXRpb24gb24gYW4gYW50aXF1ZSBjYXIgc2hvdywgTHVrYXMgc2FpZC4KCiJXaGVu IEkgZm91boTykj4AmgcAzgEAAM4BAAAAArOdAeQAB+kKFlwIAEUAAcBSR0AAPwbqskF6PSJB ej0ouQoAFO2u/dGGPtNLUBhhCCfxAABkIG91dCBoZSBkaWVkLCBJIHdhcyBhIGJhc2tldCBj YXNlLCIgTHVrYXMgc2FpZC4gIldlIGFsd2F5cwpmb3VuZCBzb2x1dGlvbnMgdG9nZXRoZXIu IgoKVG8gc2VlIG1vcmUgb2YgdGhlIFlvcmsgRGFpbHkgUmVjb3JkLCBvciB0byBzdWJzY3Jp YmUgdG8gdGhlIG5ld3NwYXBlciwgZ28gdG8KIGh0dHA6Ly93d3cueWRyLmNvbQoKLi4uICAJ IAoKS2V5V29yZHMuLi4gIAogICAgYWdyaWN1bHR1cmFsCiAgICBhcm15CiAgICBidXNpbmVz cwogICAgY2FyZWVyCiAgICBlbmdsYW5kCiAgICBleGVjdXRpdmUKICAgIGluZHVzdHJpYWwK ICAgIG11c2V1bQogICAgbmV3X3lvcmsKICAgIHBlbm5zeWx2YW5pYQogICAgcHJlc2lkZW50 CiAgICB0aGVhdGVyCiAgICB0cmF2ZWwKICAgIHVuaXZlcnNpdHkKICAgIHZpcmdpbmlhCgqE 8pI+AZoHADwAAAA8AAAAAAKznQHkAAfpChZcCABFAAAoUkhAAD8G7ElBej0iQXo9KLkKABTt rv9phj7TS1ARYQhRywAAAAAAAAAAhPKSPqIUCAA2AAAANgAAAAAH6QoWXAACs50B5AgARQAA KLtUQAB9BkU9QXo9KEF6PSIAFLkKhj7TS+2u/dFQEP1ctw8AAITykj5CGggANgAAADYAAAAA B+kKFlwAArOdAeQIAEUAACi7VUAAfQZFPEF6PShBej0iABS5CoY+00vtrv9qUBD7xLcOAACE 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 FpGFPbR7rD48bcOAEBag+84AAAEBCApAN40OCR6ZsIfykj4j6QYAYgIAAGICAAAAArOdAeQA B+kKFlwIAEUAAlT0IEAAPgZJRUF6PSJBej0okYUAFj48bcM9tHusgBgW0IyPAAABAQgKCR6Z sEA3jQ4AAAIcCRRscZ/T+XmbfrVCrXtQxtgPAAAAPWRpZmZpZS1oZWxsbWFuLWdyb3VwLWV4 Y2hhbmdlLXNoYTEsZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEAAAAPc3NoLXJzYSxzc2gt ZHNzAAAAZmFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgtY2JjLGFy Y2ZvdXIsYWVzMTkyLWNiYyxhZXMyNTYtY2JjLHJpam5kYWVsLWNiY0BseXNhdG9yLmxpdS5z ZQAAAGZhZXMxMjgtY2JjLDNkZXMtY2JjLGJsb3dmaXNoLWNiYyxjYXN0MTI4LWNiYyxhcmNm b3VyLGFlczE5Mi1jYmMsYWVzMjU2LWNiYyxyaWpuZGFlbC1jYmNAbHlzYXRvci5saXUuc2UA AABVaG1hYy1tZDUsaG1hYy1zaGExLGhtYWMtcmlwZW1kMTYwLGhtYWMtcmlwZW1kMTYwQG9w ZW5zc2guY29tLGhtYWMtc2hhMS05NixobWFjLW1kNS05NgAAAFVobWFjLW1kNSxobWFjLXNo YTEsaG1hYy1yaXBlbWQxNjAsaG1hYy1yaXBlbWQxNjBAb3BlbnNzaC5jb20saG1hYy1zaGEx LTk2LGhtYWMtbWQ1LTk2AAAACW5vbmUsemxpYgAAAAlub25lLHpsaWIAAAAAAAAAAAAAAAAA AAAAAAAAAAAAh/KSPk7pBgBCAAAAQgAAAAAH6QoWXAACs50B5AgARQAANPadQABABkboQXo9 KEF6PSIAFpGFPbR7rD48b+OAEBmA9s4AAAEBCApAN40OCR6ZsIfykj5y6gYAYgIAAGICAAAA B+kKFlwAArOdAeQIAEUAAlT2nkAAQAZEx0F6PShBej0iABaRhT20e6w+PG/jgBgZgBeNAAAB AQgKQDeNDgkembAAAAIcCRTNqxmeZkFZ+KDhJCxJ0OaiAAAAPWRpZmZpZS1oZWxsbWFuLWdy b3VwLWV4Y2hhbmdlLXNoYTEsZGlmZmllLWhlbGxtYW4tZ3JvdXAxLXNoYTEAAAAPc3NoLXJz YSxzc2gtZHNzAAAAZmFlczEyOC1jYmMsM2Rlcy1jYmMsYmxvd2Zpc2gtY2JjLGNhc3QxMjgt Y2JjLGFyY2ZvdXIsYWVzMTkyLWNiYyxhZXMyNTYtY2JjLHJpam5kYWVsLWNiY0BseXNhdG9y LmxpdS5zZQAAAGZhZXMxMjgtY2JjLDNkZXMtY2JjLGJsb3dmaXNoLWNiYyxjYXN0MTI4LWNi YyxhcmNmb3VyLGFlczE5Mi1jYmMsYWVzMjU2LWNiYyxyaWpuZGFlbC1jYmNAbHlzYXRvci5s aXUuc2UAAABVaG1hYy1tZDUsaG1hYy1zaGExLGhtYWMtcmlwZW1kMTYwLGhtYWMtcmlwZW1k MTYwQG9wZW5zc2guY29tLGhtYWMtc2hhMS05NixobWFjLW1kNS05NgAAAFVobWFjLW1kNSxo bWFjLXNoYTEsaG1hYy1yaXBlbWQxNjAsaG1hYy1yaXBlbWQxNjBAb3BlbnNzaC5jb20saG1h Yy1zaGExLTk2LGhtYWMtbWQ1LTk2AAAACW5vbmUsemxpYgAAAAlub25lLHpsaWIAAAAAAAAA AAAAAAAAAAAAAAAAAAAAh/KSPmfwBgBaAAAAWgAAAAACs50B5AAH6QoWXAgARQAATPQhQAA+ BktMQXo9IkF6PSiRhQAWPjxv4z20fcyAGBmAwlcAAAEBCAoJHpmxQDeNDgAAABQGIgAABAAA AAgAAAAgAAAAAAAAAIfykj54/gYA6gEAAOoBAAAAB+kKFlwAArOdAeQIAEUAAdz2n0AAQAZF PkF6PShBej0iABaRhT20fcw+PG/7gBgZgPAEAAABAQgKQDeNDwkembEAAAGkCh8AAAGPZpuj 7WYfImoJC+VkSiu0IJNxt4/D5oSKCVghmT9ZCEyl7hIFL5d9AfBmbwP2VzsZnf7Jq5RYjCxg 3js+fPUJRYeRn8w/tAphwmHokaD5HZ/8jzDKEs+AndgpDdeG+osEH/rFeTw484dX6meQRyrC aSGFtVSwBG6MBlyYPArMjS+Fq0vt984jMAkhjJaR/kQmFYDUFJ8dRHGwtd954iQlJHTrw7e1 SQlQu0OL9Jjnn4eUSYs6O1+7QoKcO76kBn8owjvkA3e5hr1UQ8zPAkBbjMyqCegXnwFo1JaZ lBcaatmPgQFbyE4QpE4e/S4IYsXRqv6ZAUcVo2gA29mmxRwCJsyCplHa5Pc9VMTRA8E9HBXP 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 --Q3zDsRpNtQ-- From davem@redhat.com Tue Apr 8 15:22:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Apr 2003 15:23:05 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h38MMiFu028752 for ; Tue, 8 Apr 2003 15:22:45 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id PAA18904; Tue, 8 Apr 2003 15:17:06 -0700 Date: Tue, 08 Apr 2003 15:17:05 -0700 (PDT) Message-Id: <20030408.151705.73784032.davem@redhat.com> To: lkml@winux.com Cc: netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: sequence number problem with zero length window size From: "David S. Miller" In-Reply-To: <16019.1179.697600.659029@eagle.skarven.net> References: <16019.1179.697600.659029@eagle.skarven.net> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2195 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: lkml@winux.com Date: Tue, 8 Apr 2003 13:19:23 -0400 This IS the problem I'm reporting: When the window size goes to zero, the sender (Linux 2.4.19) sends a packet with the wrong sequence number. In the attached trace, see packets starting at number 5470, time stamp 695.453571. Here the client acks for sequence number ....741 but the sender then sends a packet with sequence number ...740. Congratulations, you've witnessed a zero-window probe. This is not a bug. We probe zero windows by sending a dummy byte "in the past" that we know the other side has received already, because this packet will be: 1) legal, in the window 2) make the other side generate an ACK and thus give us an updated indication of the current window size From niv@us.ibm.com Tue Apr 8 19:29:28 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 08 Apr 2003 19:29:36 -0700 (PDT) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h392TLFu032709 for ; Tue, 8 Apr 2003 19:29:28 -0700 Received: from westrelay01.boulder.ibm.com (westrelay01.boulder.ibm.com [9.17.195.10]) by e34.co.us.ibm.com (8.12.9/8.12.2) with ESMTP id h392T8A9071076; Tue, 8 Apr 2003 22:29:08 -0400 Received: from w-nivedita.beaverton.ibm.com (d03av01.boulder.ibm.com [9.17.193.81]) by westrelay01.boulder.ibm.com (8.12.8/NCO/VER6.5) with ESMTP id h392T72W081688; Tue, 8 Apr 2003 20:29:08 -0600 Date: Tue, 8 Apr 2003 19:29:07 -0700 (PDT) From: Nivedita Singhvi X-X-Sender: nivedita@w-nivedita.beaverton.ibm.com To: David Miller cc: Randy Dunlap , Subject: [Patch 2.4.20+] missing SNMP stats Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2196 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev Here is the 2.4 version of the patch to support those SNMP TCP counters currently not supported: RtoAlgorithm RtoMin RtoMax MaxConn EstabResets thanks, Nivedita diff -urN linux-2.4.20/include/net/snmp.h linux-2.4.20mibp/include/net/snmp.h --- linux-2.4.20/include/net/snmp.h Thu Nov 22 11:47:11 2001 +++ linux-2.4.20mibp/include/net/snmp.h Tue Apr 8 18:40:09 2003 @@ -268,5 +268,8 @@ #define SNMP_INC_STATS(mib, field) ((mib)[2*smp_processor_id()+!in_softirq()].field++) #define SNMP_INC_STATS_BH(mib, field) ((mib)[2*smp_processor_id()].field++) #define SNMP_INC_STATS_USER(mib, field) ((mib)[2*smp_processor_id()+1].field++) - +#define SNMP_ADD_STATS_BH(mib, field, addend) \ + ((mib)[2*smp_processor_id()].field += addend) +#define SNMP_ADD_STATS_USER(mib, field, addend) \ + ((mib)[2*smp_processor_id()+1].field += addend) #endif diff -urN linux-2.4.20/include/net/tcp.h linux-2.4.20mibp/include/net/tcp.h --- linux-2.4.20/include/net/tcp.h Thu Nov 28 15:53:15 2002 +++ linux-2.4.20mibp/include/net/tcp.h Tue Apr 8 18:40:20 2003 @@ -30,6 +30,7 @@ #include #include #include +#include /* This is for all connections with a full identity, no wildcards. * New scheme, half the table is for TIME_WAIT, the other half is @@ -621,6 +622,8 @@ #define TCP_INC_STATS(field) SNMP_INC_STATS(tcp_statistics, field) #define TCP_INC_STATS_BH(field) SNMP_INC_STATS_BH(tcp_statistics, field) #define TCP_INC_STATS_USER(field) SNMP_INC_STATS_USER(tcp_statistics, field) +#define TCP_ADD_STATS_BH(field, val) SNMP_ADD_STATS_BH(tcp_statistics, field, val) +#define TCP_ADD_STATS_USER(field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val) extern void tcp_put_port(struct sock *sk); extern void __tcp_put_port(struct sock *sk); @@ -1372,6 +1375,9 @@ break; case TCP_CLOSE: + if (oldstate == TCP_CLOSE_WAIT || oldstate == TCP_ESTABLISHED) + TCP_INC_STATS(TcpEstabResets); + sk->prot->unhash(sk); if (sk->prev && !(sk->userlocks&SOCK_BINDPORT_LOCK)) tcp_put_port(sk); @@ -1830,4 +1836,13 @@ #define TCP_CHECK_TIMER(sk) do { } while (0) +static inline void tcp_mib_init(void) +{ + /* See RFC 2012 */ + TCP_ADD_STATS_USER(TcpRtoAlgorithm, 1); + TCP_ADD_STATS_USER(TcpRtoMin, TCP_RTO_MIN*1000/HZ); + TCP_ADD_STATS_USER(TcpRtoMax, TCP_RTO_MAX*1000/HZ); + TCP_ADD_STATS_USER(TcpMaxConn, -1); +} + #endif /* _TCP_H */ diff -urN linux-2.4.20/net/ipv4/proc.c linux-2.4.20mibp/net/ipv4/proc.c --- linux-2.4.20/net/ipv4/proc.c Thu Nov 28 15:53:15 2002 +++ linux-2.4.20mibp/net/ipv4/proc.c Tue Apr 8 18:41:06 2003 @@ -134,9 +134,17 @@ len += sprintf (buffer + len, "\nTcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts\n" "Tcp:"); - for (i=0; i; Wed, 9 Apr 2003 01:13:21 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id BAA20244; Wed, 9 Apr 2003 01:07:41 -0700 Date: Wed, 09 Apr 2003 01:07:41 -0700 (PDT) Message-Id: <20030409.010741.38678969.davem@redhat.com> To: niv@us.ibm.com Cc: rddunlap@osdl.org, netdev@oss.sgi.com Subject: Re: [Patch 2.4.20+] missing SNMP stats From: "David S. Miller" In-Reply-To: References: X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2197 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Nivedita Singhvi Date: Tue, 8 Apr 2003 19:29:07 -0700 (PDT) Here is the 2.4 version of the patch to support those SNMP TCP counters currently not supported: Applied, with your small correction. From yoshfuji@linux-ipv6.org Wed Apr 9 04:41:43 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 09 Apr 2003 04:41:50 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h39BfgFu010038 for ; Wed, 9 Apr 2003 04:41:43 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h39BfvDG002697; Wed, 9 Apr 2003 20:41:57 +0900 Date: Wed, 09 Apr 2003 20:41:57 +0900 (JST) Message-Id: <20030409.204157.51648508.yoshfuji@linux-ipv6.org> To: davem@redhat.com, kuznet@ms2.inr.ac.ru CC: netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: MOD_{INC,SEC}_USE_COUNT() in net/ipv{4,6} From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2198 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello. This patch (against 2.5.67) converts MOD_{INC,DEC}_USE_COUNT in net/ipv{4,6} to try_module_get() and module_put(). Thanks you. Index: net/ipv4/ip_gre.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv4/ip_gre.c,v retrieving revision 1.1.1.8 diff -u -r1.1.1.8 ip_gre.c --- net/ipv4/ip_gre.c 22 Mar 2003 01:52:17 -0000 1.1.1.8 +++ net/ipv4/ip_gre.c 9 Apr 2003 11:28:11 -0000 @@ -262,10 +262,11 @@ if (!create) return NULL; - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return NULL; dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL); if (dev == NULL) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return NULL; } memset(dev, 0, sizeof(*dev) + sizeof(*t)); @@ -297,7 +298,7 @@ failed: kfree(dev); - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return NULL; } @@ -305,7 +306,7 @@ { if (dev != &ipgre_fb_tunnel_dev) { kfree(dev); - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); } } @@ -920,7 +921,8 @@ struct ip_tunnel_parm p; struct ip_tunnel *t; - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return -EBUSY; switch (cmd) { case SIOCGETTUNNEL: @@ -1035,7 +1037,7 @@ } done: - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return err; } @@ -1115,7 +1117,8 @@ { struct ip_tunnel *t = (struct ip_tunnel*)dev->priv; - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return -EBUSY; if (MULTICAST(t->parms.iph.daddr)) { struct flowi fl = { .oif = t->parms.link, .nl_u = { .ip4_u = @@ -1125,13 +1128,13 @@ .proto = IPPROTO_GRE }; struct rtable *rt; if (ip_route_output_key(&rt, &fl)) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return -EADDRNOTAVAIL; } dev = rt->u.dst.dev; ip_rt_put(rt); if (__in_dev_get(dev) == NULL) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return -EADDRNOTAVAIL; } t->mlink = dev->ifindex; @@ -1150,7 +1153,7 @@ in_dev_put(in_dev); } } - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return 0; } @@ -1247,13 +1250,14 @@ #ifdef MODULE static int ipgre_fb_tunnel_open(struct net_device *dev) { - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return -EBUSY; return 0; } static int ipgre_fb_tunnel_close(struct net_device *dev) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return 0; } #endif Index: net/ipv4/ipip.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv4/ipip.c,v retrieving revision 1.1.1.8 diff -u -r1.1.1.8 ipip.c --- net/ipv4/ipip.c 22 Mar 2003 01:52:17 -0000 1.1.1.8 +++ net/ipv4/ipip.c 9 Apr 2003 11:28:11 -0000 @@ -231,10 +231,11 @@ if (!create) return NULL; - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return NULL; dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL); if (dev == NULL) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return NULL; } memset(dev, 0, sizeof(*dev) + sizeof(*t)); @@ -266,7 +267,7 @@ failed: kfree(dev); - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return NULL; } @@ -274,7 +275,7 @@ { if (dev != &ipip_fb_tunnel_dev) { kfree(dev); - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); } } @@ -682,7 +683,8 @@ struct ip_tunnel_parm p; struct ip_tunnel *t; - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return -EBUSY; switch (cmd) { case SIOCGETTUNNEL: @@ -782,7 +784,7 @@ } done: - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return err; } @@ -861,13 +863,14 @@ #ifdef MODULE static int ipip_fb_tunnel_open(struct net_device *dev) { - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return -EBUSY; return 0; } static int ipip_fb_tunnel_close(struct net_device *dev) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return 0; } #endif Index: net/ipv6/af_inet6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/af_inet6.c,v retrieving revision 1.1.1.11 diff -u -r1.1.1.11 af_inet6.c --- net/ipv6/af_inet6.c 8 Apr 2003 08:57:58 -0000 1.1.1.11 +++ net/ipv6/af_inet6.c 9 Apr 2003 11:28:11 -0000 @@ -111,7 +111,7 @@ #ifdef INET_REFCNT_DEBUG atomic_dec(&inet6_sock_nr); #endif - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); } static __inline__ kmem_cache_t *inet6_sk_slab(int protocol) @@ -242,7 +242,10 @@ atomic_inc(&inet6_sock_nr); atomic_inc(&inet_sock_nr); #endif - MOD_INC_USE_COUNT; + if (!try_get_module(THIS_MODULE)) { + inet_sock_release(sk); + return -EBUSY; + } if (inet->num) { /* It assumes that any protocol which allows @@ -255,7 +258,7 @@ if (sk->prot->init) { int err = sk->prot->init(sk); if (err != 0) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); inet_sock_release(sk); return err; } Index: net/ipv6/ipv6_sockglue.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ipv6_sockglue.c,v retrieving revision 1.1.1.8 diff -u -r1.1.1.8 ipv6_sockglue.c --- net/ipv6/ipv6_sockglue.c 8 Apr 2003 08:57:58 -0000 1.1.1.8 +++ net/ipv6/ipv6_sockglue.c 9 Apr 2003 11:28:11 -0000 @@ -196,7 +196,7 @@ #ifdef INET_REFCNT_DEBUG atomic_dec(&inet6_sock_nr); #endif - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); retv = 0; break; } Index: net/ipv6/sit.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/sit.c,v retrieving revision 1.1.1.8 diff -u -r1.1.1.8 sit.c --- net/ipv6/sit.c 22 Mar 2003 01:52:23 -0000 1.1.1.8 +++ net/ipv6/sit.c 9 Apr 2003 11:28:11 -0000 @@ -170,10 +170,11 @@ if (!create) return NULL; - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return NULL; dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL); if (dev == NULL) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return NULL; } memset(dev, 0, sizeof(*dev) + sizeof(*t)); @@ -205,7 +206,7 @@ failed: kfree(dev); - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return NULL; } @@ -213,7 +214,7 @@ { if (dev != &ipip6_fb_tunnel_dev) { kfree(dev); - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); } } @@ -622,7 +623,8 @@ struct ip_tunnel_parm p; struct ip_tunnel *t; - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return -EBUSY; switch (cmd) { case SIOCGETTUNNEL: @@ -721,7 +723,7 @@ } done: - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return err; } @@ -801,13 +803,14 @@ #ifdef MODULE static int ipip6_fb_tunnel_open(struct net_device *dev) { - MOD_INC_USE_COUNT; + if (!try_module_get(THIS_MODULE)) + return -EBUSY; return 0; } static int ipip6_fb_tunnel_close(struct net_device *dev) { - MOD_DEC_USE_COUNT; + module_put(THIS_MODULE); return 0; } #endif -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From mcr@sandelman.ottawa.on.ca Wed Apr 9 10:49:36 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 09 Apr 2003 10:49:50 -0700 (PDT) Received: from noxmail.sandelman.ottawa.on.ca (cyphermail.sandelman.ottawa.on.ca [192.139.46.78]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h39HnPFu001596 for ; Wed, 9 Apr 2003 10:49:32 -0700 Received: from sandelman.ottawa.on.ca (marajade.sandelman.ottawa.on.ca [192.139.46.20]) by noxmail.sandelman.ottawa.on.ca (8.11.6/8.11.6) with ESMTP id h39Hn8M20916 (using TLSv1/SSLv3 with cipher EDH-RSA-DES-CBC3-SHA (168 bits) verified OK); Wed, 9 Apr 2003 13:49:09 -0400 (EDT) Received: from marajade.sandelman.ottawa.on.ca (marajade [127.0.0.1] (may be forged)) by sandelman.ottawa.on.ca (8.12.3/8.12.3/Debian -4) with ESMTP id h39Hn7rj029350 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Wed, 9 Apr 2003 13:49:08 -0400 Received: from marajade.sandelman.ottawa.on.ca (mcr@localhost) by marajade.sandelman.ottawa.on.ca (8.12.3/8.12.3/Debian-5) with ESMTP id h39Hn6XU029346; Wed, 9 Apr 2003 13:49:06 -0400 Message-Id: <200304091749.h39Hn6XU029346@marajade.sandelman.ottawa.on.ca> To: hadi CC: netdev@oss.sgi.com Subject: Netlink as an IP Services Protocol to Informational In-reply-to: Your message of "Wed, 09 Apr 2003 11:18:08 EDT." <200304091518.LAA02420@ietf.org> Mime-Version: 1.0 (generated by tm-edit 1.8) Content-Type: text/plain; charset=US-ASCII Date: Wed, 09 Apr 2003 13:49:05 -0400 From: Michael Richardson X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2199 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcr@sandelman.ottawa.on.ca Precedence: bulk X-list: netdev >>>>> "The" == The IESG writes: The> The IESG has approved the Internet-Draft 'Netlink as an IP Services The> Protocol' as an Informational RFC. The> This document is the product of the Forwarding and Control Element The> Separation Working Group. The IESG contact persons are Bill Fenner The> and Alex Zinin. .... Congrats to Jamal for this hard work on this. ] ON HUMILITY: to err is human. To moo, bovine. | firewalls [ ] Michael Richardson, Sandelman Software Works, Ottawa, ON |net architect[ ] mcr@sandelman.ottawa.on.ca http://www.sandelman.ottawa.on.ca/ |device driver[ ] panic("Just another Debian GNU/Linux using, kernel hacking, security guy"); [ From ak@suse.de Wed Apr 9 10:58:15 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 09 Apr 2003 10:58:27 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h39HwDFu001936 for ; Wed, 9 Apr 2003 10:58:15 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id 242DA14793; Wed, 9 Apr 2003 19:58:08 +0200 (MEST) Subject: Re: Netlink as an IP Services Protocol to Informational From: Andi Kleen To: Michael Richardson Cc: hadi , netdev@oss.sgi.com In-Reply-To: <200304091749.h39Hn6XU029346@marajade.sandelman.ottawa.on.ca> References: <200304091749.h39Hn6XU029346@marajade.sandelman.ottawa.on.ca> Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.8 Date: 09 Apr 2003 19:58:06 +0200 Message-Id: <1049911087.6957.6.camel@averell> Mime-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2200 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Wed, 2003-04-09 at 19:49, Michael Richardson wrote: > > >>>>> "The" == The IESG writes: > The> The IESG has approved the Internet-Draft 'Netlink as an IP Services > The> Protocol' as an Informational RFC. > The> This document is the product of the Forwarding and Control Element > The> Separation Working Group. The IESG contact persons are Bill Fenner > The> and Alex Zinin. > > .... > > Congrats to Jamal for this hard work on this. Yes congratulations from me too. -Andi (who unfortunately wasn't much help I guess on this :/) From Robert.Olsson@data.slu.se Wed Apr 9 11:46:56 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 09 Apr 2003 11:47:04 -0700 (PDT) Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h39IksFu002846 for ; Wed, 9 Apr 2003 11:46:55 -0700 Received: (from robert@localhost) by robur.slu.se (8.9.3p2/8.9.3) id UAA15757; Wed, 9 Apr 2003 20:57:26 +0200 From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16020.27926.342127.52157@robur.slu.se> Date: Wed, 9 Apr 2003 20:57:26 +0200 To: Andi Kleen Cc: Michael Richardson , hadi , netdev@oss.sgi.com Subject: Re: Netlink as an IP Services Protocol to Informational In-Reply-To: <1049911087.6957.6.camel@averell> References: <200304091749.h39Hn6XU029346@marajade.sandelman.ottawa.on.ca> <1049911087.6957.6.camel@averell> X-Mailer: VM 6.92 under Emacs 19.34.1 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2201 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev > > Congrats to Jamal for this hard work on this. > > Yes congratulations from me too. From me as well... This was not was an easy job. Cheers. --ro From davem@redhat.com Wed Apr 9 18:06:25 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 09 Apr 2003 18:06:33 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3A16OFu017465 for ; Wed, 9 Apr 2003 18:06:24 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id SAA22032; Wed, 9 Apr 2003 18:00:05 -0700 Date: Wed, 09 Apr 2003 18:00:04 -0700 (PDT) Message-Id: <20030409.180004.08009488.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: MOD_{INC,SEC}_USE_COUNT() in net/ipv{4,6} From: "David S. Miller" In-Reply-To: <20030409.204157.51648508.yoshfuji@linux-ipv6.org> References: <20030409.204157.51648508.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2204 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 788 Lines: 18 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Wed, 09 Apr 2003 20:41:57 +0900 (JST) This patch (against 2.5.67) converts MOD_{INC,DEC}_USE_COUNT in net/ipv{4,6} to try_module_get() and module_put(). Applied, but let's recognize that ipv6 is totally broken in this area. The try_module_get()'s, in order to work, would need to happen at a higher layer (socket ops or similar). But even this is broken, module unloading of ipv6 needs to be done via some kind of callback scheme, the simple counter mechanism that modules use now is inappropriate for things like ipv6 which already keeps track of it's own references internally and only it knows how to interlock properly to cleanly check for module references and to shut down the whole module. From kuznet@ms2.inr.ac.ru Wed Apr 9 19:54:49 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 09 Apr 2003 19:54:56 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3A2slFu020899 for ; Wed, 9 Apr 2003 19:54:48 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id GAA06560; Thu, 10 Apr 2003 06:54:38 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200304100254.GAA06560@sex.inr.ac.ru> Subject: Re: MOD_{INC,SEC}_USE_COUNT() in net/ipv{4,6} To: davem@redhat.com (David S. Miller) Date: Thu, 10 Apr 2003 06:54:38 +0400 (MSD) Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com, usagi@linux-ipv6.org In-Reply-To: <20030409.180004.08009488.davem@redhat.com> from "David S. Miller" at Apr 9, 3 06:00:04 pm X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2205 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Content-Length: 374 Lines: 14 Hello! > This patch (against 2.5.67) converts MOD_{INC,DEC}_USE_COUNT in > net/ipv{4,6} to try_module_get() and module_put(). > > Applied, but Why not to delete this things instead? Calls of these functions from inside of module is completely meaningless. I remember I put them there just to mimic behaviour of another devices, but it was just a mistake. Alexey From davem@redhat.com Wed Apr 9 23:35:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 09 Apr 2003 23:35:51 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3A6ZeFu024943 for ; Wed, 9 Apr 2003 23:35:41 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA22636; Wed, 9 Apr 2003 23:29:19 -0700 Date: Wed, 09 Apr 2003 23:29:18 -0700 (PDT) Message-Id: <20030409.232918.112623123.davem@redhat.com> To: kuznet@ms2.inr.ac.ru Cc: yoshfuji@linux-ipv6.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: MOD_{INC,SEC}_USE_COUNT() in net/ipv{4,6} From: "David S. Miller" In-Reply-To: <200304100254.GAA06560@sex.inr.ac.ru> References: <20030409.180004.08009488.davem@redhat.com> <200304100254.GAA06560@sex.inr.ac.ru> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2206 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 6418 Lines: 294 From: kuznet@ms2.inr.ac.ru Date: Thu, 10 Apr 2003 06:54:38 +0400 (MSD) Why not to delete this things instead? Calls of these functions from inside of module is completely meaningless. Better to implement correctly than to outright delete. Please review. # This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.1176 -> 1.1177 # net/ipv4/ip_gre.c 1.21 -> 1.22 # net/ipv4/ipip.c 1.24 -> 1.25 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 03/04/09 davem@nuts.ninka.net 1.1177 # [IPV4]: Do proper netdev module refcounting in tunnel drivers. # -------------------------------------------- # diff -Nru a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c --- a/net/ipv4/ip_gre.c Wed Apr 9 23:34:23 2003 +++ b/net/ipv4/ip_gre.c Wed Apr 9 23:34:23 2003 @@ -262,13 +262,10 @@ if (!create) return NULL; - if (!try_module_get(THIS_MODULE)) - return NULL; dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL); - if (dev == NULL) { - module_put(THIS_MODULE); + if (dev == NULL) return NULL; - } + memset(dev, 0, sizeof(*dev) + sizeof(*t)); dev->priv = (void*)(dev+1); nt = (struct ip_tunnel*)dev->priv; @@ -288,6 +285,7 @@ goto failed; memcpy(nt->parms.name, dev->name, IFNAMSIZ); } + SET_MODULE_OWNER(dev); if (register_netdevice(dev) < 0) goto failed; @@ -298,16 +296,13 @@ failed: kfree(dev); - module_put(THIS_MODULE); return NULL; } static void ipgre_tunnel_destructor(struct net_device *dev) { - if (dev != &ipgre_fb_tunnel_dev) { + if (dev != &ipgre_fb_tunnel_dev) kfree(dev); - module_put(THIS_MODULE); - } } static void ipgre_tunnel_uninit(struct net_device *dev) @@ -921,9 +916,6 @@ struct ip_tunnel_parm p; struct ip_tunnel *t; - if (!try_module_get(THIS_MODULE)) - return -EBUSY; - switch (cmd) { case SIOCGETTUNNEL: t = NULL; @@ -1037,7 +1029,6 @@ } done: - module_put(THIS_MODULE); return err; } @@ -1117,8 +1108,6 @@ { struct ip_tunnel *t = (struct ip_tunnel*)dev->priv; - if (!try_module_get(THIS_MODULE)) - return -EBUSY; if (MULTICAST(t->parms.iph.daddr)) { struct flowi fl = { .oif = t->parms.link, .nl_u = { .ip4_u = @@ -1127,16 +1116,12 @@ .tos = RT_TOS(t->parms.iph.tos) } }, .proto = IPPROTO_GRE }; struct rtable *rt; - if (ip_route_output_key(&rt, &fl)) { - module_put(THIS_MODULE); + if (ip_route_output_key(&rt, &fl)) return -EADDRNOTAVAIL; - } dev = rt->u.dst.dev; ip_rt_put(rt); - if (__in_dev_get(dev) == NULL) { - module_put(THIS_MODULE); + if (__in_dev_get(dev) == NULL) return -EADDRNOTAVAIL; - } t->mlink = dev->ifindex; ip_mc_inc_group(__in_dev_get(dev), t->parms.iph.daddr); } @@ -1153,7 +1138,6 @@ in_dev_put(in_dev); } } - module_put(THIS_MODULE); return 0; } @@ -1247,31 +1231,12 @@ return 0; } -#ifdef MODULE -static int ipgre_fb_tunnel_open(struct net_device *dev) -{ - if (!try_module_get(THIS_MODULE)) - return -EBUSY; - return 0; -} - -static int ipgre_fb_tunnel_close(struct net_device *dev) -{ - module_put(THIS_MODULE); - return 0; -} -#endif - int __init ipgre_fb_tunnel_init(struct net_device *dev) { struct ip_tunnel *tunnel = (struct ip_tunnel*)dev->priv; struct iphdr *iph; ipgre_tunnel_init_gen(dev); -#ifdef MODULE - dev->open = ipgre_fb_tunnel_open; - dev->stop = ipgre_fb_tunnel_close; -#endif iph = &ipgre_fb_tunnel.parms.iph; iph->version = 4; @@ -1295,11 +1260,7 @@ * And now the modules code and kernel interface. */ -#ifdef MODULE -int init_module(void) -#else int __init ipgre_init(void) -#endif { printk(KERN_INFO "GRE over IPv4 tunneling driver\n"); @@ -1309,13 +1270,12 @@ } ipgre_fb_tunnel_dev.priv = (void*)&ipgre_fb_tunnel; + SET_MODULE_OWNER(&ipgre_fb_tunnel_dev); register_netdev(&ipgre_fb_tunnel_dev); return 0; } -#ifdef MODULE - -void cleanup_module(void) +void ipgre_fini(void) { if (inet_del_protocol(&ipgre_protocol, IPPROTO_GRE) < 0) printk(KERN_INFO "ipgre close: can't remove protocol\n"); @@ -1323,5 +1283,8 @@ unregister_netdev(&ipgre_fb_tunnel_dev); } +#ifdef MODULE +module_init(ipgre_init); #endif +module_exit(ipgre_fini); MODULE_LICENSE("GPL"); diff -Nru a/net/ipv4/ipip.c b/net/ipv4/ipip.c --- a/net/ipv4/ipip.c Wed Apr 9 23:34:23 2003 +++ b/net/ipv4/ipip.c Wed Apr 9 23:34:23 2003 @@ -231,13 +231,10 @@ if (!create) return NULL; - if (!try_module_get(THIS_MODULE)) - return NULL; dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL); - if (dev == NULL) { - module_put(THIS_MODULE); + if (dev == NULL) return NULL; - } + memset(dev, 0, sizeof(*dev) + sizeof(*t)); dev->priv = (void*)(dev+1); nt = (struct ip_tunnel*)dev->priv; @@ -257,6 +254,7 @@ goto failed; memcpy(nt->parms.name, dev->name, IFNAMSIZ); } + SET_MODULE_OWNER(dev); if (register_netdevice(dev) < 0) goto failed; @@ -267,16 +265,13 @@ failed: kfree(dev); - module_put(THIS_MODULE); return NULL; } static void ipip_tunnel_destructor(struct net_device *dev) { - if (dev != &ipip_fb_tunnel_dev) { + if (dev != &ipip_fb_tunnel_dev) kfree(dev); - module_put(THIS_MODULE); - } } static void ipip_tunnel_uninit(struct net_device *dev) @@ -683,9 +678,6 @@ struct ip_tunnel_parm p; struct ip_tunnel *t; - if (!try_module_get(THIS_MODULE)) - return -EBUSY; - switch (cmd) { case SIOCGETTUNNEL: t = NULL; @@ -784,7 +776,6 @@ } done: - module_put(THIS_MODULE); return err; } @@ -860,30 +851,11 @@ return 0; } -#ifdef MODULE -static int ipip_fb_tunnel_open(struct net_device *dev) -{ - if (!try_module_get(THIS_MODULE)) - return -EBUSY; - return 0; -} - -static int ipip_fb_tunnel_close(struct net_device *dev) -{ - module_put(THIS_MODULE); - return 0; -} -#endif - int __init ipip_fb_tunnel_init(struct net_device *dev) { struct iphdr *iph; ipip_tunnel_init_gen(dev); -#ifdef MODULE - dev->open = ipip_fb_tunnel_open; - dev->stop = ipip_fb_tunnel_close; -#endif iph = &ipip_fb_tunnel.parms.iph; iph->version = 4; @@ -913,6 +885,7 @@ } ipip_fb_tunnel_dev.priv = (void*)&ipip_fb_tunnel; + SET_MODULE_OWNER(&ipip_fb_tunnel_dev); register_netdev(&ipip_fb_tunnel_dev); return 0; } From Dimitry.Ketov@avalon.ru Thu Apr 10 10:46:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 10 Apr 2003 10:46:40 -0700 (PDT) Received: from smtp.avalon.ru (ns.avalon.ru [195.209.229.227]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3AHkXFu002128 for ; Thu, 10 Apr 2003 10:46:34 -0700 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-MimeOLE: Produced By Microsoft Exchange V6.0.6249.0 Subject: [PATCH] [2.4.20] filter_list destroy fix in net/sched/sch_prio.c Date: Thu, 10 Apr 2003 21:46:12 +0400 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] [2.4.20] filter_list destroy fix in net/sched/sch_prio.c Thread-Index: AcL2BZM+86EVewkGQc+3orAwc2LBoQ== From: "Dimitry V. Ketov" To: , Cc: Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3AHkXFu002128 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2207 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Dimitry.Ketov@avalon.ru Precedence: bulk X-list: netdev Content-Length: 653 Lines: 27 The prio qdisc does not destroy its filter list, when someone deletes qdisc from interface without explicit filter deleting. This patch fixes that behavior. --- linux-2.4.20/net/sched/sch_prio.c Sat Aug 3 04:39:46 2002 +++ linux/net/sched/sch_prio.c Thu Apr 10 17:52:55 2003 @@ -158,11 +158,19 @@ { int prio; struct prio_sched_data *q = (struct prio_sched_data *)sch->data; + struct tcf_proto *tp; for (prio=0; priobands; prio++) { qdisc_destroy(q->queues[prio]); q->queues[prio] = &noop_qdisc; } + + while((tp = q->filter_list) != NULL) + { + q->filter_list = tp->next; + tp->ops->destroy(tp); + } + MOD_DEC_USE_COUNT; } From hadi@cyberus.ca Thu Apr 10 11:19:37 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 10 Apr 2003 11:19:41 -0700 (PDT) Received: from mx01.cyberus.ca (mx01.cyberus.ca [216.191.240.22]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3AIJZFu004531 for ; Thu, 10 Apr 2003 11:19:36 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx01.cyberus.ca with esmtp (Exim 4.14) id 193gK6-000296-Sr; Thu, 10 Apr 2003 13:58:54 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3AHwDqu087731; Thu, 10 Apr 2003 13:58:13 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3AHvkPx087728; Thu, 10 Apr 2003 13:58:12 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Thu, 10 Apr 2003 13:57:46 -0400 (EDT) From: jamal To: "Dimitry V. Ketov" cc: netdev@oss.sgi.com, "" , "" Subject: Re: [PATCH] [2.4.20] filter_list destroy fix in net/sched/sch_prio.c In-Reply-To: Message-ID: <20030410135727.M86925@shell.cyberus.ca> References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2208 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 787 Lines: 38 Looks good to me. cheers, jamal On Thu, 10 Apr 2003, Dimitry V. Ketov wrote: > The prio qdisc does not destroy its filter list, when someone deletes > qdisc from interface without explicit filter deleting. > This patch fixes that behavior. > > --- linux-2.4.20/net/sched/sch_prio.c Sat Aug 3 04:39:46 2002 > +++ linux/net/sched/sch_prio.c Thu Apr 10 17:52:55 2003 > @@ -158,11 +158,19 @@ > { > int prio; > struct prio_sched_data *q = (struct prio_sched_data *)sch->data; > + struct tcf_proto *tp; > > for (prio=0; priobands; prio++) { > qdisc_destroy(q->queues[prio]); > q->queues[prio] = &noop_qdisc; > } > + > + while((tp = q->filter_list) != NULL) > + { > + q->filter_list = tp->next; > + tp->ops->destroy(tp); > + } > + > MOD_DEC_USE_COUNT; > } > > > > From hadi@cyberus.ca Thu Apr 10 11:23:23 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 10 Apr 2003 11:23:25 -0700 (PDT) Received: from mx01.cyberus.ca (mx01.cyberus.ca [216.191.240.22]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3AINMFu004941 for ; Thu, 10 Apr 2003 11:23:22 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx01.cyberus.ca with esmtp (Exim 4.14) id 193ghm-0007Vu-Bu; Thu, 10 Apr 2003 14:23:22 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3AIMgqu087803; Thu, 10 Apr 2003 14:22:42 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3AIMf4f087800; Thu, 10 Apr 2003 14:22:41 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Thu, 10 Apr 2003 14:22:41 -0400 (EDT) From: jamal To: Robert Olsson cc: Andi Kleen , Michael Richardson , "" Subject: Re: Netlink as an IP Services Protocol to Informational In-Reply-To: <16020.27926.342127.52157@robur.slu.se> Message-ID: <20030410141149.E86925@shell.cyberus.ca> References: <200304091749.h39Hn6XU029346@marajade.sandelman.ottawa.on.ca> <1049911087.6957.6.camel@averell> <16020.27926.342127.52157@robur.slu.se> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2209 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 449 Lines: 20 On Wed, 9 Apr 2003, Robert Olsson wrote: > > > > Congrats to Jamal for this hard work on this. > > > > Yes congratulations from me too. > > From me as well... This was not was an easy job. Next steps: http://www.ietf.org/internet-drafts/draft-jhsrha-forces-netlink2-00.txt draft needs update. Slightly more uptodate: http://www.sstanamera.com/~forces/Ietf56/netlink2.pdf We'll be putting out GPL code for the extensions. cheers, jamal From hadi@cyberus.ca Thu Apr 10 11:26:41 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 10 Apr 2003 11:26:46 -0700 (PDT) Received: from mx03.cyberus.ca (mx03.cyberus.ca [216.191.240.24]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3AIQeFu005270 for ; Thu, 10 Apr 2003 11:26:41 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx03.cyberus.ca with esmtp (Exim 4.14) id 193gkx-000CSZ-Mt; Thu, 10 Apr 2003 14:26:39 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3AIPxqu087819; Thu, 10 Apr 2003 14:25:59 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3AIPxGD087816; Thu, 10 Apr 2003 14:25:59 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Thu, 10 Apr 2003 14:25:59 -0400 (EDT) From: jamal To: Michael Richardson cc: netdev@oss.sgi.com Subject: Re: Netlink as an IP Services Protocol to Informational In-Reply-To: <200304091749.h39Hn6XU029346@marajade.sandelman.ottawa.on.ca> Message-ID: <20030410142253.V86925@shell.cyberus.ca> References: <200304091749.h39Hn6XU029346@marajade.sandelman.ottawa.on.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2210 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 472 Lines: 15 Question for you, since you are a security expert: We are having problems deciding whethet TLS needs reliability or whether it needs connection orientedness. Connection orientedness is essentially being able to connect and leave (example TCP SYN,SYNACK,ACK...FIN,FINACK) Reliability is ensuring delivery i.e Retransmits and keeping state of dataflow vs ACKs and sequence numbers. Does TLS just need somehow to setup the connection or does it need both? cheers, jamal From acme@conectiva.com.br Thu Apr 10 12:11:21 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 10 Apr 2003 12:11:30 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3AJBJFu007655 for ; Thu, 10 Apr 2003 12:11:21 -0700 Received: from [200.181.169.249] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 193hWY-000807-00; Thu, 10 Apr 2003 16:15:50 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id C53041966C; Thu, 10 Apr 2003 19:11:52 +0000 (UTC) Date: Thu, 10 Apr 2003 16:11:51 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: kuznet@ms2.inr.ac.ru, yoshfuji@linux-ipv6.org, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: MOD_{INC,SEC}_USE_COUNT() in net/ipv{4,6} Message-ID: <20030410191151.GM6070@conectiva.com.br> References: <20030409.180004.08009488.davem@redhat.com> <200304100254.GAA06560@sex.inr.ac.ru> <20030409.232918.112623123.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030409.232918.112623123.davem@redhat.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2211 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 529 Lines: 15 I'm studying how to properly do this for net_proto_family, hope to get this done in the weekend. I'm doing the try_module_get(net_families[family]->owner) at sock_create, etc. - Arnaldo Em Wed, Apr 09, 2003 at 11:29:18PM -0700, David S. Miller escreveu: > From: kuznet@ms2.inr.ac.ru > Date: Thu, 10 Apr 2003 06:54:38 +0400 (MSD) > > Why not to delete this things instead? Calls of these functions > from inside of module is completely meaningless. > > Better to implement correctly than to outright delete. > From greearb@candelatech.com Fri Apr 11 00:56:41 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 11 Apr 2003 00:56:49 -0700 (PDT) Received: from grok.yi.org (IDENT:G4zNAiblKnoR4y1yr9j45/OjelEBunkJ@dhcp93-dsl-usw3.w-link.net [206.129.84.93]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3B7ucFu029464 for ; Fri, 11 Apr 2003 00:56:41 -0700 Received: from candelatech.com (IDENT:YfXwRes93S8HZqBVoTw0nrRKIWVfzWwQ@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.6) with ESMTP id h3B7ub510078 for ; Fri, 11 Apr 2003 00:56:37 -0700 Message-ID: <3E967535.2000409@candelatech.com> Date: Fri, 11 Apr 2003 00:56:37 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "'netdev@oss.sgi.com'" Subject: A better way to get driver stats than parsing /proc/net/dev ? Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2212 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 324 Lines: 12 Is there an ioctl or some other binary means of getting the info that /proc/net/dev provides? Thanks, Ben -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From Dimitry.Ketov@avalon.ru Fri Apr 11 02:11:37 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 11 Apr 2003 02:12:16 -0700 (PDT) Received: from smtp.avalon.ru (ns.avalon.ru [195.209.229.227]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3B9BZFu004916 for ; Fri, 11 Apr 2003 02:11:37 -0700 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-MimeOLE: Produced By Microsoft Exchange V6.0.6249.0 Subject: [PATCH] [2.4.20] filter_list destroy fix in net/sched/sch_csz.c Date: Fri, 11 Apr 2003 13:11:17 +0400 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH] [2.4.20] filter_list destroy fix in net/sched/sch_csz.c Thread-Index: AcL2BZM+86EVewkGQc+3orAwc2LBoQ== From: "Dimitry V. Ketov" To: , Cc: Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3B9BZFu004916 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2213 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Dimitry.Ketov@avalon.ru Precedence: bulk X-list: netdev Content-Length: 577 Lines: 23 Same as prio qdisc, the csz qdisc does not destroy its filter list, when someone deletes qdisc from interface without explicit filter deleting. So here is the patch. :) --- linux-2.4.20/net/sched/sch_csz.c Fri Dec 21 20:42:06 2001 +++ linux/net/sched/sch_csz.c Fri Apr 11 12:33:08 2003 @@ -749,6 +749,15 @@ static void csz_destroy(struct Qdisc* sch) { + struct csz_sched_data *q = (struct csz_sched_data *)sch->data; + struct tcf_proto *tp; + + while((tp = q->filter_list) != NULL) + { + q->filter_list = tp->next; + tp->ops->destroy(tp); + } + MOD_DEC_USE_COUNT; } From linux-netdev@gmane.org Fri Apr 11 08:20:33 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 11 Apr 2003 08:20:38 -0700 (PDT) Received: from main.gmane.org (main.gmane.org [80.91.224.249]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3BFKVFu018301 for ; Fri, 11 Apr 2003 08:20:32 -0700 Received: from list by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 1940Jn-0004w5-00 for ; Fri, 11 Apr 2003 17:19:55 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: netdev@oss.sgi.com Received: from news by main.gmane.org with local (Exim 3.35 #1 (Debian)) id 1940Jl-0004vk-00 for ; Fri, 11 Apr 2003 17:19:53 +0200 From: Jason Lunz Subject: Re: A better way to get driver stats than parsing /proc/net/dev ? Date: Fri, 11 Apr 2003 15:19:52 +0000 (UTC) Organization: PBR Streetgang Message-ID: References: <3E967535.2000409@candelatech.com> X-Complaints-To: usenet@main.gmane.org User-Agent: slrn/0.9.7.4 (Linux) X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2214 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: lunz@falooley.org Precedence: bulk X-list: netdev Content-Length: 216 Lines: 8 greearb@candelatech.com said: > Is there an ioctl or some other binary means of getting the info that > /proc/net/dev provides? You can do it with netlink sockets. See print_linkinfo() in the iproute2 code. Jason From ury@bofh.homeunix.org Fri Apr 11 09:38:15 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 11 Apr 2003 09:38:20 -0700 (PDT) Received: from grayling.magister.by (magister.by [212.44.94.161]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3BGc9Fu021677 for ; Fri, 11 Apr 2003 09:38:13 -0700 Received: from mail by grayling.magister.by with drweb-scanned id 1941XO-0004sQ-Uk for netdev@oss.sgi.com; Fri, 11 Apr 2003 19:38:02 +0300 Received: from [217.21.43.229] (helo=elf.hostel10) by grayling.magister.by with asmtp (TLSv1:DES-CBC3-SHA:168) id 1941XO-0004sJ-P7 for netdev@oss.sgi.com; Fri, 11 Apr 2003 19:38:02 +0300 Received: from localhost.localdomain ([127.0.0.1] helo=elf.hostel10) by elf.hostel10 with smtp (Exim 4.14) id 1941WT-0000Av-Ih for netdev@oss.sgi.com; Fri, 11 Apr 2003 19:37:05 +0300 Date: Fri, 11 Apr 2003 19:37:05 +0300 From: "Ury N. Stankevich" To: netdev@oss.sgi.com Subject: bug in 2.4.20 Message-Id: <20030411193705.02eeea7f.ury@bofh.homeunix.org> X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2215 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ury@bofh.homeunix.org Precedence: bulk X-list: netdev Content-Length: 400 Lines: 22 hi i use 2.4.20xfs kernel on my box with 4 eth cards 2 rtl8139 eth0, eth1 2 rtl8029 eth2, eth3 and one time samba fail use eth3 iface and i found... # ip n ls dev eth3 .. 10.103.104.255 nud failed .. broadcast address appear in arp table while i have C class network attached. after # ip l set eth3 dowm; ip l set eth3 up all become fine. any suggestions? -- Linux registered user #287505 From greearb@candelatech.com Fri Apr 11 10:27:08 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 11 Apr 2003 10:27:16 -0700 (PDT) Received: from grok.yi.org (IDENT:IH3V4ytmVls+JT4IMwwE5gvDt7DKdblw@dhcp93-dsl-usw3.w-link.net [206.129.84.93]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3BHR7Fu023242 for ; Fri, 11 Apr 2003 10:27:08 -0700 Received: from candelatech.com (IDENT:RLeq4ZI+LYpVZnmt1ZsTHusysmfLM9GB@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.6) with ESMTP id h3BHQv513951; Fri, 11 Apr 2003 10:26:58 -0700 Message-ID: <3E96FAE1.7030302@candelatech.com> Date: Fri, 11 Apr 2003 10:26:57 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jason Lunz CC: netdev@oss.sgi.com Subject: Re: A better way to get driver stats than parsing /proc/net/dev ? References: <3E967535.2000409@candelatech.com> In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2216 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 789 Lines: 29 Jason Lunz wrote: > greearb@candelatech.com said: > >>Is there an ioctl or some other binary means of getting the info that >>/proc/net/dev provides? > > > You can do it with netlink sockets. See print_linkinfo() in the iproute2 > code. Seems that a lot of code is needed just to read the stats :( And every man page I read says use libnetlink instead, but I can't find any docs on libnetlink itself (and the .ru ftp link for iproute2 seems down). Do you know of any pointers as to how to use libnetlink, or if it really makes netlink easier to use? > > Jason > -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From oakes_ge@pannaway.com Fri Apr 11 13:33:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 11 Apr 2003 13:33:42 -0700 (PDT) Received: from thar.pannaway.com (dpvc-64-222-186-48.man.east.verizon.net [64.222.186.48]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3BKXXFu000499 for ; Fri, 11 Apr 2003 13:33:34 -0700 thread-index: AcMAabZAcrqTTuCMQ9+PhZ0uxJGvIQ== Received: from Oakes ([172.16.1.128]) by thar.pannaway.com with Microsoft SMTPSVC(5.0.2195.5329); Fri, 11 Apr 2003 16:34:12 -0400 From: "George E. Oakes" Content-Transfer-Encoding: 7bit To: Subject: PING statistics Content-Class: urn:content-classes:message Priority: normal Date: Fri, 11 Apr 2003 16:33:28 -0400 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0000_01C30048.14D981B0" X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) Importance: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-MS-TNEF-Correlator: X-OriginalArrivalTime: 11 Apr 2003 20:34:12.0484 (UTC) FILETIME=[B6329440:01C30069] X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2217 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: oakes_ge@pannaway.com Precedence: bulk X-list: netdev Content-Length: 4040 Lines: 92 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C30048.14D981B0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hi, I'm looking at a box with an embedded web server running uClinux 2.4.20 (Brecis) - Run a ping on my loopback then stop it, and result of ping is 211 sent and 211 replies. Look at the output of netstat -s Under ICMP: 428 ICMP messages received 0 input ICMP message failed. ICMP input historam: echo requests: 217 (unsure why this doesn't match 211 sent???????) echo replies:211 217 ICMP messages sent 0 ICMP messages failed: ICMP output histogram: echo replies: 217 Output of netstat -i for lo Link encap: Local Loopback inet addr: 127.0.0.1 Mask: 255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:422 errors:0 dropped:0 overruns:0 frame:0 TX packets:422 errors:0 dropped:0 overruns:0 frame:0 collisions:0 txqueuelen:0 My question: Why are RX and TX packets the same (adding echo request of 211 and echo reply of 211 to equal 422)? Thanks for any light you can shed, Regards George Oakes Technical Writer, Pannaway Technologies ------=_NextPart_000_0000_01C30048.14D981B0 Content-Type: application/ms-tnef; name="winmail.dat" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="winmail.dat" eJ8+IhwUAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEIgAcAGAAAAElQTS5NaWNy b3NvZnQgTWFpbC5Ob3RlADEIAQ2ABAACAAAAAgACAAEGgAMADgAAANMHBAALABAAIQAAAAUAHwEB A5AGADwHAAAiAAAACwACAAEAAAALACMAAAAAAAMAJgAAAAAACwApAAAAAAADADYAAAAAAB4AcAAB AAAAEAAAAFBJTkcgc3RhdGlzdGljcwACAXEAAQAAABYAAAABwwBpmGBP2v/g+4hOqbMNDxAP0Bcz AAACAR0MAQAAABsAAABTTVRQOk9BS0VTX0dFQFBBTk5BV0FZLkNPTQAACwABDgAAAABAAAYOAGb+ imkAwwECAQoOAQAAABgAAAAAAAAApiQsitfhMUqRTJm9thG4TcKAAAALAB8OAQAAAAIBCRABAAAA QgMAAD4DAADwBAAATFpGdadgLlgDAAoAcmNwZzEyNRYyAPgLYG4OEDAzM08B9wKkA+MCAGNoCsBz sGV0MCAHEwKAfQqBknYIkHdrC4BkNAxgDmMAUAsDC7UgSGkshwqiCoQKgEknbSAJACJvEmFnIGEF QGEgyQbgeCAD8HRoFXADoC5lBtAJgAEAZBYAZWISIBEgcnYEkCBydUZuAwAVUXVDbAuAdSEV8DIu NC4ToShCRQlwYwQAKSAtFApSGxfgFaFwFUICICBteckU8nBiANBrIBYwCfDVF1B0G9AgFiAsFlEX AJEJcHN1bAVAb2Ya9PMEABjAMTEXUQIwHRMegqcJcAtQCJBzLhQKTBURxxVyHEEbQHV0cCGgHcJu bhEwHJAVgS0QsBQZVYMSgBehSUNNUDoUCjg0Mjgj4xtwB5BzYeZnB5EZYWVpF5ALMRQiTxFQC4Ah wiVKIGYLcGxvCYAgBSVDJyRoBAAcoHK0YW0kNSAWgBDgbx1RpnEKUByQczoecTcZMO8X4B2ACXAW AGgbkBYwHlFkZG8HkG4nBUAAwHRrEOAedz8uhCkqbR+zOv8egRQEK9IlTB7CJqYlTChU/yQ1JUMh lSnTCcAqPy/lK8LlFApPIa8taSrAAhAFwB8JACAbC4AcIAnwY2Fw/yuwINA7EAMgINEb4xQEC4A3 ETAVcBbQciuwDiA3LoYwPYEeoE1hc2srsTw1NT2DAUAjRCVwTE9AT1BCQUNLB/BVIE5OSU5HBdBU VcA6MTY0MzYF0BEw7QUQY0CwGkVYGvAcASJBajolADIWgHIDYBEQOrcRUD0QG9BwM+ERUG8Xke8X 0UNCA1A1oGVDUBQIFwDuVEIfQy9EPyAI4RhwAJC/AiBHQgzQK1EKUCiAbkUqvQqATRuQK1NJsSuw Vyyh/wrAIXBCAR0iRgghQyXAB4D/GTA88RVCKuodwh6CHSIvh38bkE/1HKAWgCtQO5FGsSn6PxQK VBDwOsAzgQWxAHDRG5FpZ2gFQHkIYElAFQORcxxQZBP7UmVnMwsRIsVHZQWwKCFPYbtGYCLFVCrh AwA7glcFEBZ0BJAdAFAAcG5hd+5hG5BYMwjxZx/RRUkUBAUR4QBb8AAACwAAgAggBgAAAAAAwAAA AAAAAEYAAAAAA4UAAAAAAAADAAKACCAGAAAAAADAAAAAAAAARgAAAAAQhQAAAAAAAAMADIAIIAYA AAAAAMAAAAAAAABGAAAAAFKFAAB9bgEAHgANgAggBgAAAAAAwAAAAAAAAEYAAAAAVIUAAAEAAAAE AAAAOS4wAAsADoAIIAYAAAAAAMAAAAAAAABGAAAAAAaFAAAAAAAAAwAPgAggBgAAAAAAwAAAAAAA AEYAAAAAAYUAAAAAAAALABiACCAGAAAAAADAAAAAAAAARgAAAAAOhQAAAAAAAAMAGYAIIAYAAAAA AMAAAAAAAABGAAAAABGFAAAAAAAAAwAbgAggBgAAAAAAwAAAAAAAAEYAAAAAGIUAAAAAAAALADSA CCAGAAAAAADAAAAAAAAARgAAAACChQAAAQAAAAIB+A8BAAAAEAAAAKYkLIrX4TFKkUyZvbYRuE0C AfoPAQAAABAAAACmJCyK1+ExSpFMmb22EbhNAgH7DwEAAACjAAAAAAAAADihuxAF5RAaobsIACsq VsIAAFBTVFBSWC5ETEwAAAAAAAAAAE5JVEH5v7gBAKoAN9luAAAAQzpcRG9jdW1lbnRzIGFuZCBT ZXR0aW5nc1xvYWtlc19nZS5QQU5OQVdBWVxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRh XE1pY3Jvc29mdFxPdXRsb29rXG1haWxib3gucHN0AAADAP4PBQAAAAMADTT9NwAAAgF/AAEAAAA1 AAAAPERCRUtKQkVNRFBKSkpLSkxHUEtNT0VPSUNLQUEub2FrZXNfZ2VAcGFubmF3YXkuY29tPgAA AAADAAYQL0qlcQMABxAIAwAAAwAQEAAAAAADABEQAAAAAB4ACBABAAAAZQAAAEhJLElNTE9PS0lO R0FUQUJPWFdJVEhBTkVNQkVEREVEV0VCU0VSVkVSUlVOTklOR1VDTElOVVgyNDIwKEJSRUNJUykt UlVOQVBJTkdPTk1ZTE9PUEJBQ0tUSEVOU1RPUElULEEAAAAAv7o= ------=_NextPart_000_0000_01C30048.14D981B0-- From davem@redhat.com Sat Apr 12 00:32:19 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 12 Apr 2003 00:32:26 -0700 (PDT) Received: from rth.ninka.net (rth.ninka.net [216.101.162.244]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3C7WIFu008529 for ; Sat, 12 Apr 2003 00:32:19 -0700 Received: from rth.ninka.net (localhost.localdomain [127.0.0.1]) by rth.ninka.net (8.12.8/8.12.8) with ESMTP id h3C7W75t013221; Sat, 12 Apr 2003 00:32:07 -0700 Received: (from davem@localhost) by rth.ninka.net (8.12.8/8.12.8/Submit) id h3C7W5W3013219; Sat, 12 Apr 2003 00:32:05 -0700 X-Authentication-Warning: rth.ninka.net: davem set sender to davem@redhat.com using -f Subject: Re: [PATCH] [2.4.20] filter_list destroy fix in net/sched/sch_prio.c From: "David S. Miller" To: jamal Cc: "Dimitry V. Ketov" , netdev@oss.sgi.com, linux-kernel@vger.kernel.org, "Alexey N. Kuznetsov" In-Reply-To: <20030410135727.M86925@shell.cyberus.ca> References: <20030410135727.M86925@shell.cyberus.ca> Content-Type: text/plain Content-Transfer-Encoding: 7bit Organization: Message-Id: <1050132725.13106.2.camel@rth.ninka.net> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 12 Apr 2003 00:32:05 -0700 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2218 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 211 Lines: 8 On Thu, 2003-04-10 at 10:57, jamal wrote: > Looks good to me. He missed sch_csz.c, I already sent a patch I wrote for this to Linus and Marcelo will get a copy soon'ish. -- David S. Miller From greearb@candelatech.com Sat Apr 12 13:33:13 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 12 Apr 2003 13:33:20 -0700 (PDT) Received: from grok.yi.org (IDENT:6Q4z9mwHUoqpjzKl5PROLTc5ey40R+BJ@dhcp93-dsl-usw3.w-link.net [206.129.84.93]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3CKX6Fu017518 for ; Sat, 12 Apr 2003 13:33:13 -0700 Received: from candelatech.com (IDENT:Ms/0iCpLhArM1KLINu6wUtqfd7jUkf9+@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.6) with ESMTP id h3CKX5510811 for ; Sat, 12 Apr 2003 13:33:05 -0700 Message-ID: <3E987801.2080107@candelatech.com> Date: Sat, 12 Apr 2003 13:33:05 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "'netdev@oss.sgi.com'" Subject: Interesting machine lockup with 8139too driver. Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2219 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 1120 Lines: 31 I was beating my machine with 8139 NICs (and a slow CPU and only 128MB RAM) by running a lot of UDP and TCP connections through it... I usually set my socket buffers quite large, so they may be consuming too much of the vital kernel RAM. After a while, I saw this repeated over and over on the console: eth[01]: Memory squeeze, dropping packet. Now, that is the only thing I can see on this machine. I cannot get a bash prompt and changing virtual terminals does not work. I did not see the OOM handler kick in, though it's possible it scrolled off the screen. At the least, it may be worthwhile to throttle the squeeze messages... As a caveat: I'm running some of my own hacked up networking code, and it's possible its leaking memory or doing something else bad. I have not seen this problem on my other machine with different NIC (and faster CPU and more RAM), though. Take it easy, Ben -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From rddunlap@osdl.org Mon Apr 14 08:04:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 08:04:58 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EF4iFu016386 for ; Mon, 14 Apr 2003 08:04:45 -0700 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3EF4fW12588; Mon, 14 Apr 2003 08:04:41 -0700 Date: Mon, 14 Apr 2003 08:03:47 -0700 From: "Randy.Dunlap" To: linux-net@vger.kernel.org Cc: davem@redhat.com, netdev@oss.sgi.com Subject: [RFC/PATCH] ICMPv6 MIB stats per-interface Message-Id: <20030414080347.0af818f7.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2220 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 19457 Lines: 561 Hi, I'm looking for feedback on this patch.... and (feedback) on future IPv6 MIB stats patches if anyone cares to go that far. This patch modifies the ICMPv6 MIB statistics to be collected per network-interface instead of globally, as required by RFC 2466 (ICMPv6 MIB Group). [This patch is to 2.5.67-plain.] 1. Icmp6 MIB counters are no longer per-cpu since they are per-interface. Do they need to be per-interface * per-cpu ? 2. This patch modifies the contents of /proc/net/snmp6 for the Icmp6* fields. I began the patch by prefixing each Icmp6 field with , e.g.: eth0:Icmp6InMsgs 1520 eth0:Icmp6InErrors 0 eth0:Icmp6OutMsgs 40 lo:Icmp6InMsgs 1520 lo:Icmp6InErrors 0 lo:Icmp6OutMsgs 40 dummy0:Icmp6InMsgs 1520 dummy0:Icmp6InErrors 0 dummy0:Icmp6OutMsgs 40 but I had some feedback that the following format was more preferable: interface:eth0 Icmp6InMsgs 1520 Icmp6InErrors 0 Icmp6OutMsgs 40 interface:lo Icmp6InMsgs 25 Icmp6InErrors 0 Icmp6OutMsgs 15 interface:dummy0 Icmp6InMsgs 15 Icmp6InErrors 0 Icmp6OutMsgs 10 However, if it isn't possible to modify the proc file contents at all, how about adding new files to /proc/net/* ? Is that OK? I have a commitment from someone to modify the Net-SNMP package to support a /proc/net/snmp6 format when it is agreed upon, and I will modify the netstat program in the net-tools package. Comments? -- ~Randy ["in English any noun can be verbed." bah!] diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/include/linux/netdevice.h linux-2567-icmpv6/include/linux/netdevice.h --- linux-2567-pv/include/linux/netdevice.h Mon Apr 7 10:32:51 2003 +++ linux-2567-icmpv6/include/linux/netdevice.h Wed Apr 9 14:03:34 2003 @@ -335,6 +335,7 @@ struct net_device void *dn_ptr; /* DECnet specific data */ void *ip6_ptr; /* IPv6 specific data */ void *ec_ptr; /* Econet specific data */ + struct icmpv6_mib *icmpv6_stats[2]; struct list_head poll_list; /* Link to poll list */ int quota; diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/include/net/icmp.h linux-2567-icmpv6/include/net/icmp.h --- linux-2567-pv/include/net/icmp.h Mon Apr 7 10:32:26 2003 +++ linux-2567-icmpv6/include/net/icmp.h Thu Apr 10 16:48:00 2003 @@ -20,6 +20,7 @@ #include #include +#include #include #include diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/include/net/ipv6.h linux-2567-icmpv6/include/net/ipv6.h --- linux-2567-pv/include/net/ipv6.h Mon Apr 7 10:32:25 2003 +++ linux-2567-icmpv6/include/net/ipv6.h Sun Apr 13 20:50:53 2003 @@ -110,14 +110,31 @@ DECLARE_SNMP_STAT(struct ipv6_mib, ipv6_ #define IP6_INC_STATS(field) SNMP_INC_STATS(ipv6_statistics, field) #define IP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(ipv6_statistics, field) #define IP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(ipv6_statistics, field) -DECLARE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics); -#define ICMP6_INC_STATS(field) SNMP_INC_STATS(icmpv6_statistics, field) -#define ICMP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(icmpv6_statistics, field) -#define ICMP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(icmpv6_statistics, field) -#define ICMP6_STATS_PTR_BH(field) \ - (& \ - ((per_cpu_ptr(icmpv6_statistics[0], smp_processor_id()))-> \ - field)) + +/////DECLARE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics); +#if 0 +#define ICMP6_INC_STATS(dev, field) \ + SNMP_INC_IFSTATS(dev, icmpv6_stats, field) +#define ICMP6_INC_STATS_BH(dev, field) \ + SNMP_INC_IFSTATS_BH(dev, icmpv6_stats, field) +#define ICMP6_INC_STATS_USER(dev, field) \ + SNMP_INC_IFSTATS_USER(dev, icmpv6_stats, field) +#endif +#define ICMP6_INC_STATS(dev, field) do { \ + SNMP_INC_IFSTATS(dev, icmpv6_stats, field); \ +} while (0) +#define ICMP6_INC_STATS_BH(dev, field) do { \ + SNMP_INC_IFSTATS_BH(dev, icmpv6_stats, field); \ +} while (0) +#define ICMP6_INC_STATS_USER(dev, field) do { \ + SNMP_INC_IFSTATS_USER(dev, icmpv6_stats, field); \ +} while (0) +#define ICMP6_INC_STATS_OFFSET_BH(dev, base, offset) do { \ + struct icmpv6_mib *__mib = dev->icmpv6_stats[0]; \ + unsigned long *field = (unsigned long *)&(__mib->base) + offset; \ + *field = *field + 1; \ +} while (0) + DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6); #define UDP6_INC_STATS(field) SNMP_INC_STATS(udp_stats_in6, field) #define UDP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(udp_stats_in6, field) diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/include/net/snmp.h linux-2567-icmpv6/include/net/snmp.h --- linux-2567-pv/include/net/snmp.h Mon Apr 7 10:31:05 2003 +++ linux-2567-icmpv6/include/net/snmp.h Thu Apr 10 16:48:45 2003 @@ -22,6 +22,7 @@ #define _SNMP_H #include +#include /* * We use all unsigned longs. Linux will soon be so reliable that even these @@ -314,5 +315,18 @@ struct linux_mib (per_cpu_ptr(mib[0], smp_processor_id())->field += addend) #define SNMP_ADD_STATS_USER(mib, field, addend) \ (per_cpu_ptr(mib[1], smp_processor_id())->field += addend) + +#define SNMP_INC_IFSTATS_BH(dev, mib, field) \ + (dev->mib[0]->field++) +#define SNMP_INC_IFSTATS_USER(dev, mib, field) \ + (dev->mib[1]->field++) +#define SNMP_INC_IFSTATS(dev, mib, field) \ + (dev->mib[!in_softirq()]->field++) +#define SNMP_DEC_IFSTATS(dev, mib, field) \ + (dev->mib[!in_softirq()]->field--) +#define SNMP_ADD_IFSTATS_BH(dev, mib, field, addend) \ + (dev->mib[0]->field += addend) +#define SNMP_ADD_IFSTATS_USER(dev, mib, field, addend) \ + (dev->mib[1]->field += addend) #endif diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/include/net/sock.h linux-2567-icmpv6/include/net/sock.h --- linux-2567-pv/include/net/sock.h Mon Apr 7 10:32:16 2003 +++ linux-2567-icmpv6/include/net/sock.h Thu Apr 10 16:47:18 2003 @@ -51,6 +51,7 @@ #include #include +#include #include /* diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/net/core/dev.c linux-2567-icmpv6/net/core/dev.c --- linux-2567-pv/net/core/dev.c Mon Apr 7 10:31:20 2003 +++ linux-2567-icmpv6/net/core/dev.c Sun Apr 13 20:48:09 2003 @@ -2519,6 +2519,20 @@ int dev_new_index(void) } } +#ifdef CONFIG_IPV6 +static int alloc_icmpv6_stats(struct net_device *dev) +{ + dev->icmpv6_stats[0] = kmalloc(2 * sizeof(struct icmpv6_mib), GFP_KERNEL); + if (!dev->icmpv6_stats[0]) + return -ENOMEM; + memset(dev->icmpv6_stats[0], 0, 2 * sizeof(struct icmpv6_mib)); + dev->icmpv6_stats[1] = (void *)dev->icmpv6_stats[0] + sizeof(struct icmpv6_mib); + return 0; +} +#else +#define alloc_icmpv6_stats(dev) 0 +#endif + static int dev_boot_phase = 1; /** @@ -2559,12 +2573,17 @@ int register_netdevice(struct net_device goto out; #endif /* CONFIG_NET_DIVERT */ + if (alloc_icmpv6_stats(dev)) { + ret = -ENOMEM; + goto out_err; + } + dev->iflink = -1; /* Init, if this function is available */ ret = -EIO; if (dev->init && dev->init(dev)) - goto out_err; + goto out_err_mib; dev->ifindex = dev_new_index(); if (dev->iflink == -1) @@ -2574,12 +2593,12 @@ int register_netdevice(struct net_device ret = -EEXIST; for (dp = &dev_base; (d = *dp) != NULL; dp = &d->next) { if (d == dev || !strcmp(d->name, dev->name)) - goto out_err; + goto out_err_mib; } snprintf(dev->kobj.name,KOBJ_NAME_LEN,dev->name); kobj_set_kset_s(dev,net_subsys); if ((ret = kobject_register(&dev->kobj))) - goto out_err; + goto out_err_mib; /* * nil rebuild_header routine, @@ -2612,6 +2631,8 @@ int register_netdevice(struct net_device out: return ret; +out_err_mib: + kfree(dev->icmpv6_stats[0]); out_err: #ifdef CONFIG_NET_DIVERT free_divert_blk(dev); @@ -2725,6 +2746,7 @@ int unregister_netdevice(struct net_devi #ifdef CONFIG_NET_DIVERT free_divert_blk(dev); #endif + kfree(dev->icmpv6_stats[0]); if (dev->destructor != NULL) { #ifdef NET_REFCNT_DEBUG @@ -2830,6 +2852,9 @@ static int __init net_dev_init(void) BUG_ON(!dev_boot_phase); if (dev_proc_init()) + goto out; + + if (alloc_icmpv6_stats(&loopback_dev)) goto out; subsystem_register(&net_subsys); diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/net/ipv6/af_inet6.c linux-2567-icmpv6/net/ipv6/af_inet6.c --- linux-2567-pv/net/ipv6/af_inet6.c Mon Apr 7 10:31:45 2003 +++ linux-2567-icmpv6/net/ipv6/af_inet6.c Wed Apr 9 14:03:34 2003 @@ -641,15 +641,6 @@ static int __init init_ipv6_mibs(void) if (!ipv6_statistics[1]) goto err_ip_mib1; - icmpv6_statistics[0] = kmalloc_percpu(sizeof (struct icmpv6_mib), - GFP_KERNEL); - if (!icmpv6_statistics[0]) - goto err_icmp_mib0; - icmpv6_statistics[1] = kmalloc_percpu(sizeof (struct icmpv6_mib), - GFP_KERNEL); - if (!icmpv6_statistics[1]) - goto err_icmp_mib1; - udp_stats_in6[0] = kmalloc_percpu(sizeof (struct udp_mib), GFP_KERNEL); if (!udp_stats_in6[0]) @@ -666,10 +657,6 @@ static int __init init_ipv6_mibs(void) sizeof (struct ipv6_mib)); memset(per_cpu_ptr(ipv6_statistics[1], i), 0, sizeof (struct ipv6_mib)); - memset(per_cpu_ptr(icmpv6_statistics[0], i), 0, - sizeof (struct icmpv6_mib)); - memset(per_cpu_ptr(icmpv6_statistics[1], i), 0, - sizeof (struct icmpv6_mib)); memset(per_cpu_ptr(udp_stats_in6[0], i), 0, sizeof (struct udp_mib)); memset(per_cpu_ptr(udp_stats_in6[1], i), 0, @@ -681,10 +668,6 @@ static int __init init_ipv6_mibs(void) err_udp_mib1: kfree_percpu(udp_stats_in6[0]); err_udp_mib0: - kfree_percpu(icmpv6_statistics[1]); -err_icmp_mib1: - kfree_percpu(icmpv6_statistics[0]); -err_icmp_mib0: kfree_percpu(ipv6_statistics[1]); err_ip_mib1: kfree_percpu(ipv6_statistics[0]); @@ -697,8 +680,6 @@ static void cleanup_ipv6_mibs(void) { kfree_percpu(ipv6_statistics[0]); kfree_percpu(ipv6_statistics[1]); - kfree_percpu(icmpv6_statistics[0]); - kfree_percpu(icmpv6_statistics[1]); kfree_percpu(udp_stats_in6[0]); kfree_percpu(udp_stats_in6[1]); } diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/net/ipv6/icmp.c linux-2567-icmpv6/net/ipv6/icmp.c --- linux-2567-pv/net/ipv6/icmp.c Mon Apr 7 10:30:59 2003 +++ linux-2567-icmpv6/net/ipv6/icmp.c Sun Apr 13 20:51:34 2003 @@ -64,7 +64,7 @@ #include #include -DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics); +/////DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics); /* * ICMP socket(s) for flow control. @@ -353,8 +353,8 @@ void icmpv6_send(struct sk_buff *skb, in ip6_build_xmit(sk, icmpv6_getfrag, &msg, &fl, len, NULL, -1, MSG_DONTWAIT); if (type >= ICMPV6_DEST_UNREACH && type <= ICMPV6_PARAMPROB) - ICMP6_STATS_PTR_BH(Icmp6OutDestUnreachs) [type-ICMPV6_DEST_UNREACH]++; - ICMP6_INC_STATS_BH(Icmp6OutMsgs); + ICMP6_INC_STATS_OFFSET_BH(dev, Icmp6OutDestUnreachs, type - ICMPV6_DEST_UNREACH); + ICMP6_INC_STATS_BH(dev, Icmp6OutMsgs); out: icmpv6_xmit_unlock(); } @@ -397,8 +397,8 @@ static void icmpv6_echo_reply(struct sk_ ip6_build_xmit(sk, icmpv6_getfrag, &msg, &fl, msg.len, NULL, -1, MSG_DONTWAIT); - ICMP6_INC_STATS_BH(Icmp6OutEchoReplies); - ICMP6_INC_STATS_BH(Icmp6OutMsgs); + ICMP6_INC_STATS_BH(skb->dev, Icmp6OutEchoReplies); + ICMP6_INC_STATS_BH(skb->dev, Icmp6OutMsgs); icmpv6_xmit_unlock(); } @@ -468,7 +468,7 @@ static int icmpv6_rcv(struct sk_buff **p struct icmp6hdr *hdr; int type; - ICMP6_INC_STATS_BH(Icmp6InMsgs); + ICMP6_INC_STATS_BH(dev, Icmp6InMsgs); saddr = &skb->nh.ipv6h->saddr; daddr = &skb->nh.ipv6h->daddr; @@ -516,9 +516,9 @@ static int icmpv6_rcv(struct sk_buff **p type = hdr->icmp6_type; if (type >= ICMPV6_DEST_UNREACH && type <= ICMPV6_PARAMPROB) - ICMP6_STATS_PTR_BH(Icmp6InDestUnreachs)[type-ICMPV6_DEST_UNREACH]++; + ICMP6_INC_STATS_OFFSET_BH(dev, Icmp6InDestUnreachs, type - ICMPV6_DEST_UNREACH); else if (type >= ICMPV6_ECHO_REQUEST && type <= NDISC_REDIRECT) - ICMP6_STATS_PTR_BH(Icmp6InEchos)[type-ICMPV6_ECHO_REQUEST]++; + ICMP6_INC_STATS_OFFSET_BH(dev, Icmp6InEchos, type - ICMPV6_ECHO_REQUEST); switch (type) { case ICMPV6_ECHO_REQUEST: @@ -596,7 +596,7 @@ static int icmpv6_rcv(struct sk_buff **p return 0; discard_it: - ICMP6_INC_STATS_BH(Icmp6InErrors); + ICMP6_INC_STATS_BH(dev, Icmp6InErrors); kfree_skb(skb); return 0; } diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/net/ipv6/ipv6_syms.c linux-2567-icmpv6/net/ipv6/ipv6_syms.c --- linux-2567-pv/net/ipv6/ipv6_syms.c Mon Apr 7 10:32:16 2003 +++ linux-2567-icmpv6/net/ipv6/ipv6_syms.c Wed Apr 9 14:39:32 2003 @@ -9,7 +9,6 @@ EXPORT_SYMBOL(ipv6_addr_type); EXPORT_SYMBOL(icmpv6_send); -EXPORT_SYMBOL(icmpv6_statistics); EXPORT_SYMBOL(icmpv6_err_convert); EXPORT_SYMBOL(ndisc_mc_map); EXPORT_SYMBOL(register_inet6addr_notifier); diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/net/ipv6/mcast.c linux-2567-icmpv6/net/ipv6/mcast.c --- linux-2567-pv/net/ipv6/mcast.c Mon Apr 7 10:32:28 2003 +++ linux-2567-icmpv6/net/ipv6/mcast.c Wed Apr 9 14:03:34 2003 @@ -569,10 +569,10 @@ static void igmp6_send(struct in6_addr * dev_queue_xmit(skb); if (type == ICMPV6_MGM_REDUCTION) - ICMP6_INC_STATS(Icmp6OutGroupMembReductions); + ICMP6_INC_STATS(dev, Icmp6OutGroupMembReductions); else - ICMP6_INC_STATS(Icmp6OutGroupMembResponses); - ICMP6_INC_STATS(Icmp6OutMsgs); + ICMP6_INC_STATS(dev, Icmp6OutGroupMembResponses); + ICMP6_INC_STATS(dev, Icmp6OutMsgs); return; out: diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/net/ipv6/ndisc.c linux-2567-icmpv6/net/ipv6/ndisc.c --- linux-2567-pv/net/ipv6/ndisc.c Mon Apr 7 10:31:48 2003 +++ linux-2567-icmpv6/net/ipv6/ndisc.c Wed Apr 9 14:03:34 2003 @@ -499,8 +499,8 @@ static void ndisc_send_na(struct net_dev skb->dst = dst; dst_output(skb); - ICMP6_INC_STATS(Icmp6OutNeighborAdvertisements); - ICMP6_INC_STATS(Icmp6OutMsgs); + ICMP6_INC_STATS(dev, Icmp6OutNeighborAdvertisements); + ICMP6_INC_STATS(dev, Icmp6OutMsgs); } void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh, @@ -578,8 +578,8 @@ void ndisc_send_ns(struct net_device *de skb->dst = dst; dst_output(skb); - ICMP6_INC_STATS(Icmp6OutNeighborSolicits); - ICMP6_INC_STATS(Icmp6OutMsgs); + ICMP6_INC_STATS(dev, Icmp6OutNeighborSolicits); + ICMP6_INC_STATS(dev, Icmp6OutMsgs); } void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr, @@ -646,8 +646,8 @@ void ndisc_send_rs(struct net_device *de skb->dst = dst; dst_output(skb); - ICMP6_INC_STATS(Icmp6OutRouterSolicits); - ICMP6_INC_STATS(Icmp6OutMsgs); + ICMP6_INC_STATS(dev, Icmp6OutRouterSolicits); + ICMP6_INC_STATS(dev, Icmp6OutMsgs); } @@ -1381,8 +1381,8 @@ void ndisc_send_redirect(struct sk_buff skb->dst = dst; dst_output(skb); - ICMP6_INC_STATS(Icmp6OutRedirects); - ICMP6_INC_STATS(Icmp6OutMsgs); + ICMP6_INC_STATS(dev, Icmp6OutRedirects); + ICMP6_INC_STATS(dev, Icmp6OutMsgs); } static void pndisc_redo(struct sk_buff *skb) diff -Naurp -X /home/rddunlap/doc/dontdiff-osdl linux-2567-pv/net/ipv6/proc.c linux-2567-icmpv6/net/ipv6/proc.c --- linux-2567-pv/net/ipv6/proc.c Mon Apr 7 10:31:05 2003 +++ linux-2567-icmpv6/net/ipv6/proc.c Wed Apr 9 14:37:48 2003 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -53,12 +54,14 @@ static int sockstat6_seq_show(struct seq } -static struct snmp6_item +struct snmp6_item { char *name; void **mib; int offset; -} snmp6_list[] = { +}; + +static struct snmp6_item snmp6_ipv6_list[] = { /* ipv6 mib according to draft-ietf-ipngwg-ipv6-mib-04 */ #define SNMP6_GEN(x) { #x , (void **)ipv6_statistics, offsetof(struct ipv6_mib, x) } SNMP6_GEN(Ip6InReceives), @@ -84,6 +87,8 @@ static struct snmp6_item SNMP6_GEN(Ip6InMcastPkts), SNMP6_GEN(Ip6OutMcastPkts), #undef SNMP6_GEN +}; + /* icmpv6 mib according to draft-ietf-ipngwg-ipv6-icmp-mib-02 Exceptions: {In|Out}AdminProhibs are removed, because I see @@ -94,7 +99,8 @@ static struct snmp6_item OutRouterAdvertisements too. OutGroupMembQueries too. */ -#define SNMP6_GEN(x) { #x , (void **)icmpv6_statistics, offsetof(struct icmpv6_mib, x) } +static struct snmp6_item snmp6_icmp6_list[] = { +#define SNMP6_GEN(x) { #x , NULL, offsetof(struct icmpv6_mib, x) } SNMP6_GEN(Icmp6InMsgs), SNMP6_GEN(Icmp6InErrors), SNMP6_GEN(Icmp6InDestUnreachs), @@ -124,6 +130,9 @@ static struct snmp6_item SNMP6_GEN(Icmp6OutGroupMembResponses), SNMP6_GEN(Icmp6OutGroupMembReductions), #undef SNMP6_GEN +}; + +static struct snmp6_item snmp6_udp6_list[] = { #define SNMP6_GEN(x) { "Udp6" #x , (void **)udp_stats_in6, offsetof(struct udp_mib, Udp##x) } SNMP6_GEN(InDatagrams), SNMP6_GEN(NoPorts), @@ -151,13 +160,46 @@ fold_field(void *mib[], int offt) return res; } +static inline unsigned long +fold_field_per_if(void *mib[], int offt) +{ + return *((unsigned long *) (((void *)mib[0]) + offt)) + + *((unsigned long *) (((void *)mib[1]) + offt)); +} + static int snmp6_seq_show(struct seq_file *seq, void *v) { int i; + struct net_device *dev; - for (i=0; inext) { + seq_printf(seq, "interface:%s\n", dev ? dev->name : "dev=nil"); + + for (i=0; iicmpv6_stats[0] || !dev->icmpv6_stats[1]) { + seq_printf(seq, "bad stats ptrs: %p, %p\n", + dev->icmpv6_stats[0], dev->icmpv6_stats[1]); + break; + } + else + seq_printf(seq, "%-32s\t%lu\n", + snmp6_icmp6_list[i].name, + fold_field_per_if((void *)dev->icmpv6_stats, snmp6_icmp6_list[i].offset)); + } + } + read_unlock(&dev_base_lock); + + for (i=0; idaddr, th->dest, &hdr->saddr, th->source, skb->dev->ifindex); if (sk == NULL) { - ICMP6_INC_STATS_BH(Icmp6InErrors); + ICMP6_INC_STATS_BH(skb->dev, Icmp6InErrors); return; } From yoshfuji@linux-ipv6.org Mon Apr 14 08:28:54 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 08:29:03 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EFSrFu017023 for ; Mon, 14 Apr 2003 08:28:54 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3EFTFDG002516; Tue, 15 Apr 2003 00:29:16 +0900 Date: Tue, 15 Apr 2003 00:29:15 +0900 (JST) Message-Id: <20030415.002915.71906095.yoshfuji@linux-ipv6.org> To: rddunlap@osdl.org Cc: linux-net@vger.kernel.org, davem@redhat.com, netdev@oss.sgi.com Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030414080347.0af818f7.rddunlap@osdl.org> References: <20030414080347.0af818f7.rddunlap@osdl.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2221 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 1074 Lines: 31 In article <20030414080347.0af818f7.rddunlap@osdl.org> (at Mon, 14 Apr 2003 08:03:47 -0700), "Randy.Dunlap" says: > This patch modifies the ICMPv6 MIB statistics to be collected per > network-interface instead of globally, as required by RFC 2466 > (ICMPv6 MIB Group). We, USAGI, have similar code for linux-2.4. (Sorry, I forgot this one... :-p) We store per-interface in inet6_dev{}, because this information blongs to inet6 layer. I'd recommend that we split information per interface 1) to minimize the /proc file 2) to minimize the effort to rewrite snmp daemon (e.g. net-snmp) We use /proc/net/dev_snmp6/{1,2,...}. Example: # cat /proc/net/dev_snmp6/1 Ip6LastChange 1616 Ip6InReceives 1108 Ip6InHdrErrors 0 Ip6InTooBigErrors 0 : Icmp6InMsgs 1107 Icmp6InErrors 549 Icmp6InDestUnreachs 1106 : -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Mon Apr 14 09:12:46 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 09:13:24 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EGCjFu017643 for ; Mon, 14 Apr 2003 09:12:45 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id JAA06800; Mon, 14 Apr 2003 09:06:11 -0700 Date: Mon, 14 Apr 2003 09:06:10 -0700 (PDT) Message-Id: <20030414.090610.117741299.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: rddunlap@osdl.org, linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: "David S. Miller" In-Reply-To: <20030415.002915.71906095.yoshfuji@linux-ipv6.org> References: <20030414080347.0af818f7.rddunlap@osdl.org> <20030415.002915.71906095.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2222 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 609 Lines: 17 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 15 Apr 2003 00:29:15 +0900 (JST) I'd recommend that we split information per interface 1) to minimize the /proc file 2) to minimize the effort to rewrite snmp daemon (e.g. net-snmp) We use /proc/net/dev_snmp6/{1,2,...}. Example: I very much like this general idea. But I want to suggest a different naming scheme. Let us follow the lead of things like /proc/sys/net/ipv4/conf/ where subfiles and subdirectories are named using device name. So we'd then have /proc/net/dev_snmp6/{lo,eth0,eth1} etc. Ok? From yoshfuji@linux-ipv6.org Mon Apr 14 09:41:19 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 09:41:22 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EGfIFu018750 for ; Mon, 14 Apr 2003 09:41:18 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3EGemDG002955; Tue, 15 Apr 2003 01:40:48 +0900 Date: Tue, 15 Apr 2003 01:40:47 +0900 (JST) Message-Id: <20030415.014047.39346510.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: rddunlap@osdl.org, linux-net@vger.kernel.org, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030414.090610.117741299.davem@redhat.com> References: <20030414080347.0af818f7.rddunlap@osdl.org> <20030415.002915.71906095.yoshfuji@linux-ipv6.org> <20030414.090610.117741299.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2223 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 388 Lines: 11 In article <20030414.090610.117741299.davem@redhat.com> (at Mon, 14 Apr 2003 09:06:10 -0700 (PDT)), "David S. Miller" says: > So we'd then have /proc/net/dev_snmp6/{lo,eth0,eth1} etc. > > Ok? Okay. I'd like to see ifIndex in that file, too. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Mon Apr 14 09:42:22 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 09:42:55 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EGgLFu018959 for ; Mon, 14 Apr 2003 09:42:21 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id JAA06895; Mon, 14 Apr 2003 09:35:48 -0700 Date: Mon, 14 Apr 2003 09:35:48 -0700 (PDT) Message-Id: <20030414.093548.24867400.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: rddunlap@osdl.org, linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: "David S. Miller" In-Reply-To: <20030415.014047.39346510.yoshfuji@linux-ipv6.org> References: <20030415.002915.71906095.yoshfuji@linux-ipv6.org> <20030414.090610.117741299.davem@redhat.com> <20030415.014047.39346510.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2224 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 181 Lines: 6 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 15 Apr 2003 01:40:47 +0900 (JST) I'd like to see ifIndex in that file, too. No problems. From rddunlap@osdl.org Mon Apr 14 09:56:29 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 09:56:32 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EGuSFu019900 for ; Mon, 14 Apr 2003 09:56:29 -0700 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3EGpPW19705; Mon, 14 Apr 2003 09:51:25 -0700 Date: Mon, 14 Apr 2003 09:50:30 -0700 From: "Randy.Dunlap" To: YOSHIFUJI Hideaki / =?ISO-8859-1?Q?=B5=C8=C6=A3=B1=D1=CC=C0?= Cc: davem@redhat.com, linux-net@vger.kernel.org, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface Message-Id: <20030414095030.50ad9652.rddunlap@osdl.org> In-Reply-To: <20030415.014047.39346510.yoshfuji@linux-ipv6.org> References: <20030414080347.0af818f7.rddunlap@osdl.org> <20030415.002915.71906095.yoshfuji@linux-ipv6.org> <20030414.090610.117741299.davem@redhat.com> <20030415.014047.39346510.yoshfuji@linux-ipv6.org> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3EGuSFu019900 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2225 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 556 Lines: 19 On Tue, 15 Apr 2003 01:40:47 +0900 (JST) YOSHIFUJI Hideaki / µÈÆ£±ÑÌÀ wrote: | In article <20030414.090610.117741299.davem@redhat.com> (at Mon, 14 Apr 2003 09:06:10 -0700 (PDT)), "David S. Miller" says: | | > So we'd then have /proc/net/dev_snmp6/{lo,eth0,eth1} etc. | > | > Ok? | | Okay. I'd like to see ifIndex in that file, too. Yes, sounds good. Is this something that you plan to extract from the USAGI Linux 2.4 patches and submit for 2.5, or should I continue with my patches? Thanks, -- ~Randy From yoshfuji@linux-ipv6.org Mon Apr 14 10:17:03 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 10:17:07 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EHH2Fu020346 for ; Mon, 14 Apr 2003 10:17:03 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3EHHSDG003144; Tue, 15 Apr 2003 02:17:28 +0900 Date: Tue, 15 Apr 2003 02:17:28 +0900 (JST) Message-Id: <20030415.021728.70559400.yoshfuji@linux-ipv6.org> To: rddunlap@osdl.org Cc: davem@redhat.com, linux-net@vger.kernel.org, netdev@oss.sgi.com, usagi-core@linux-ipv6.org Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030414095030.50ad9652.rddunlap@osdl.org> References: <20030414.090610.117741299.davem@redhat.com> <20030415.014047.39346510.yoshfuji@linux-ipv6.org> <20030414095030.50ad9652.rddunlap@osdl.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3EHH2Fu020346 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2226 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 925 Lines: 24 In article <20030414095030.50ad9652.rddunlap@osdl.org> (at Mon, 14 Apr 2003 09:50:30 -0700), "Randy.Dunlap" says: > On Tue, 15 Apr 2003 01:40:47 +0900 (JST) YOSHIFUJI Hideaki / µÈÆ£±ÑÌÀ wrote: > > | In article <20030414.090610.117741299.davem@redhat.com> (at Mon, 14 Apr 2003 09:06:10 -0700 (PDT)), "David S. Miller" says: > | > | > So we'd then have /proc/net/dev_snmp6/{lo,eth0,eth1} etc. > | > > | > Ok? > | > | Okay. I'd like to see ifIndex in that file, too. > > Yes, sounds good. > > Is this something that you plan to extract from the USAGI Linux 2.4 > patches and submit for 2.5, or should I continue with my patches? Please let me see your patch in details. I'll do it today... (It is 2:00am... I'm sleepy... zzz...) -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From yoshfuji@linux-ipv6.org Mon Apr 14 10:31:40 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 10:31:48 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EHVdFu020803 for ; Mon, 14 Apr 2003 10:31:40 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3EHVwDG003220; Tue, 15 Apr 2003 02:31:58 +0900 Date: Tue, 15 Apr 2003 02:31:58 +0900 (JST) Message-Id: <20030415.023158.36869337.yoshfuji@linux-ipv6.org> To: davem@redhat.com, kuznet@ms2.inr.ac.ru CC: netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: [PATCH] [NET] use fl6_{src,dst} etc. From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2227 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 15622 Lines: 502 Hello. This cleans up usage of members in flowi{}; use fl6_{src,dst} etc. Patch is against linux-2.5.67 + Changeset 1.1202. (I think this change is suitable for linux-2.4 but I haven't prepared patch againt it.) Thanks. Index: include/net/flow.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/net/flow.h,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.2.58.1 diff -u -r1.1.1.2 -r1.1.1.2.58.1 --- include/net/flow.h 16 Oct 2002 04:25:20 -0000 1.1.1.2 +++ include/net/flow.h 14 Apr 2003 14:42:49 -0000 1.1.1.2.58.1 @@ -52,4 +52,8 @@ } uli_u; }; +#define fl_sport uli_u.ports.sport +#define fl_dport uli_u.ports.dport +#define fl_type uli_u.icmpt.type +#define fl_code uli_u.icmpt.code #endif Index: net/ipv6/datagram.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/datagram.c,v retrieving revision 1.1.1.3 retrieving revision 1.1.1.3.54.1 diff -u -r1.1.1.3 -r1.1.1.3.54.1 --- net/ipv6/datagram.c 30 Oct 2002 09:43:18 -0000 1.1.1.3 +++ net/ipv6/datagram.c 14 Apr 2003 15:42:43 -0000 1.1.1.3.54.1 @@ -91,7 +91,7 @@ serr->ee.ee_info = info; serr->ee.ee_data = 0; serr->addr_offset = (u8*)&iph->daddr - skb->nh.raw; - serr->port = fl->uli_u.ports.dport; + serr->port = fl->fl_dport; skb->h.raw = skb->tail; __skb_pull(skb, skb->tail - skb->data); Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/icmp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.10.1 diff -u -r1.1.1.9 -r1.1.1.9.10.1 --- net/ipv6/icmp.c 25 Mar 2003 04:33:45 -0000 1.1.1.9 +++ net/ipv6/icmp.c 14 Apr 2003 14:42:49 -0000 1.1.1.9.10.1 @@ -312,12 +312,12 @@ } fl.proto = IPPROTO_ICMPV6; - fl.nl_u.ip6_u.daddr = &hdr->saddr; - fl.nl_u.ip6_u.saddr = saddr; + fl.fl6_dst = &hdr->saddr; + fl.fl6_src = saddr; fl.oif = iif; fl.fl6_flowlabel = 0; - fl.uli_u.icmpt.type = type; - fl.uli_u.icmpt.code = code; + fl.fl_type = type; + fl.fl_code = code; icmpv6_xmit_lock(); @@ -386,12 +386,12 @@ msg.daddr = &skb->nh.ipv6h->saddr; fl.proto = IPPROTO_ICMPV6; - fl.nl_u.ip6_u.daddr = msg.daddr; - fl.nl_u.ip6_u.saddr = saddr; + fl.fl6_dst = msg.daddr; + fl.fl6_src = saddr; fl.oif = skb->dev->ifindex; fl.fl6_flowlabel = 0; - fl.uli_u.icmpt.type = ICMPV6_ECHO_REPLY; - fl.uli_u.icmpt.code = 0; + fl.fl_type = ICMPV6_ECHO_REPLY; + fl.fl_code = 0; icmpv6_xmit_lock(); Index: net/ipv6/ip6_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ip6_output.c,v retrieving revision 1.1.1.8 retrieving revision 1.1.1.8.8.2 diff -u -r1.1.1.8 -r1.1.1.8.8.2 --- net/ipv6/ip6_output.c 2 Apr 2003 04:16:14 -0000 1.1.1.8 +++ net/ipv6/ip6_output.c 14 Apr 2003 15:42:43 -0000 1.1.1.8.8.2 @@ -146,8 +146,8 @@ fl.fl6_src = &iph->saddr; fl.oif = skb->sk ? skb->sk->bound_dev_if : 0; fl.fl6_flowlabel = 0; - fl.uli_u.ports.dport = 0; - fl.uli_u.ports.sport = 0; + fl.fl_dport = 0; + fl.fl_sport = 0; dst = ip6_route_output(skb->sk, &fl); @@ -186,7 +186,7 @@ struct ipv6_txoptions *opt) { struct ipv6_pinfo *np = sk ? inet6_sk(sk) : NULL; - struct in6_addr *first_hop = fl->nl_u.ip6_u.daddr; + struct in6_addr *first_hop = fl->fl6_dst; struct dst_entry *dst = skb->dst; struct ipv6hdr *hdr; u8 proto = fl->proto; @@ -241,7 +241,7 @@ hdr->nexthdr = proto; hdr->hop_limit = hlimit; - ipv6_addr_copy(&hdr->saddr, fl->nl_u.ip6_u.saddr); + ipv6_addr_copy(&hdr->saddr, fl->fl6_src); ipv6_addr_copy(&hdr->daddr, first_hop); mtu = dst_pmtu(dst); @@ -306,8 +306,8 @@ hdr->hop_limit = hlimit; hdr->nexthdr = fl->proto; - ipv6_addr_copy(&hdr->saddr, fl->nl_u.ip6_u.saddr); - ipv6_addr_copy(&hdr->daddr, fl->nl_u.ip6_u.daddr); + ipv6_addr_copy(&hdr->saddr, fl->fl6_src); + ipv6_addr_copy(&hdr->daddr, fl->fl6_dst); return hdr; } @@ -524,7 +524,7 @@ fl->fl6_dst = rt0->addr; } - if (!fl->oif && ipv6_addr_is_multicast(fl->nl_u.ip6_u.daddr)) + if (!fl->oif && ipv6_addr_is_multicast(fl->fl6_dst)) fl->oif = np->mcast_oif; dst = __sk_dst_check(sk, np->dst_cookie); @@ -701,7 +701,7 @@ * cleanup */ out: - ip6_dst_store(sk, dst, fl->nl_u.ip6_u.daddr == &np->daddr ? &np->daddr : NULL); + ip6_dst_store(sk, dst, fl->fl6_dst == &np->daddr ? &np->daddr : NULL); if (err > 0) err = np->recverr ? net_xmit_errno(err) : 0; return err; Index: net/ipv6/ndisc.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ndisc.c,v retrieving revision 1.1.1.8 retrieving revision 1.1.1.8.2.1 diff -u -r1.1.1.8 -r1.1.1.8.2.1 --- net/ipv6/ndisc.c 14 Apr 2003 04:34:17 -0000 1.1.1.8 +++ net/ipv6/ndisc.c 14 Apr 2003 14:42:49 -0000 1.1.1.8.2.1 @@ -405,8 +405,8 @@ fl->fl6_src = saddr; fl->fl6_dst = daddr; fl->proto = IPPROTO_ICMPV6; - fl->uli_u.icmpt.type = type; - fl->uli_u.icmpt.code = 0; + fl->fl_type = type; + fl->fl_code = 0; } static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, Index: net/ipv6/route.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/route.c,v retrieving revision 1.1.1.11 retrieving revision 1.1.1.11.2.1 diff -u -r1.1.1.11 -r1.1.1.11.2.1 --- net/ipv6/route.c 14 Apr 2003 04:34:17 -0000 1.1.1.11 +++ net/ipv6/route.c 14 Apr 2003 14:42:49 -0000 1.1.1.11.2.1 @@ -449,13 +449,12 @@ int strict; int attempts = 3; - strict = ipv6_addr_type(fl->nl_u.ip6_u.daddr) & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL); + strict = ipv6_addr_type(fl->fl6_dst) & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL); relookup: read_lock_bh(&rt6_lock); - fn = fib6_lookup(&ip6_routing_table, fl->nl_u.ip6_u.daddr, - fl->nl_u.ip6_u.saddr); + fn = fib6_lookup(&ip6_routing_table, fl->fl6_dst, fl->fl6_src); restart: rt = fn->leaf; @@ -477,9 +476,8 @@ if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) { read_unlock_bh(&rt6_lock); - rt = rt6_cow(rt, fl->nl_u.ip6_u.daddr, - fl->nl_u.ip6_u.saddr); - + rt = rt6_cow(rt, fl->fl6_dst, fl->fl6_src); + if (rt->u.dst.error != -EEXIST || --attempts <= 0) goto out2; @@ -1585,15 +1583,11 @@ skb->mac.raw = skb->data; skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); - fl.proto = 0; - fl.nl_u.ip6_u.daddr = NULL; - fl.nl_u.ip6_u.saddr = NULL; - fl.uli_u.icmpt.type = 0; - fl.uli_u.icmpt.code = 0; + memset(&fl, 0, sizeof(fl)); if (rta[RTA_SRC-1]) - fl.nl_u.ip6_u.saddr = (struct in6_addr*)RTA_DATA(rta[RTA_SRC-1]); + fl.fl6_src = (struct in6_addr*)RTA_DATA(rta[RTA_SRC-1]); if (rta[RTA_DST-1]) - fl.nl_u.ip6_u.daddr = (struct in6_addr*)RTA_DATA(rta[RTA_DST-1]); + fl.fl6_dst = (struct in6_addr*)RTA_DATA(rta[RTA_DST-1]); if (rta[RTA_IIF-1]) memcpy(&iif, RTA_DATA(rta[RTA_IIF-1]), sizeof(int)); @@ -1617,8 +1611,7 @@ NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid; err = rt6_fill_node(skb, rt, - fl.nl_u.ip6_u.daddr, - fl.nl_u.ip6_u.saddr, + fl.fl6_dst, fl.fl6_src, iif, RTM_NEWROUTE, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, nlh); Index: net/ipv6/tcp_ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/tcp_ipv6.c,v retrieving revision 1.1.1.12 retrieving revision 1.1.1.12.6.2 diff -u -r1.1.1.12 -r1.1.1.12.6.2 --- net/ipv6/tcp_ipv6.c 8 Apr 2003 08:57:58 -0000 1.1.1.12 +++ net/ipv6/tcp_ipv6.c 14 Apr 2003 15:42:43 -0000 1.1.1.12.6.2 @@ -670,12 +670,12 @@ fl.fl6_dst = &np->daddr; fl.fl6_src = saddr; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = usin->sin6_port; - fl.uli_u.ports.sport = inet->sport; + fl.fl_dport = usin->sin6_port; + fl.fl_sport = inet->sport; if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } if (!fl.fl6_src) @@ -796,11 +796,11 @@ for now. */ fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &np->daddr; - fl.nl_u.ip6_u.saddr = &np->saddr; + fl.fl6_dst = &np->daddr; + fl.fl6_src = &np->saddr; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = inet->dport; - fl.uli_u.ports.sport = inet->sport; + fl.fl_dport = inet->dport; + fl.fl_sport = inet->sport; dst = ip6_route_output(sk, &fl); } else @@ -881,12 +881,12 @@ int err = -1; fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr; - fl.nl_u.ip6_u.saddr = &req->af.v6_req.loc_addr; + fl.fl6_dst = &req->af.v6_req.rmt_addr; + fl.fl6_src = &req->af.v6_req.loc_addr; fl.fl6_flowlabel = 0; fl.oif = req->af.v6_req.iif; - fl.uli_u.ports.dport = req->rmt_port; - fl.uli_u.ports.sport = inet_sk(sk)->sport; + fl.fl_dport = req->rmt_port; + fl.fl_sport = inet_sk(sk)->sport; if (dst == NULL) { opt = np->opt; @@ -901,7 +901,7 @@ if (opt && opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } dst = ip6_route_output(sk, &fl); @@ -917,7 +917,7 @@ &req->af.v6_req.loc_addr, &req->af.v6_req.rmt_addr, csum_partial((char *)th, skb->len, skb->csum)); - fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr; + fl.fl6_dst = &req->af.v6_req.rmt_addr; err = ip6_xmit(sk, skb, &fl, opt); if (err == NET_XMIT_CN) err = 0; @@ -1019,19 +1019,18 @@ buff->csum = csum_partial((char *)t1, sizeof(*t1), 0); - fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr; - fl.nl_u.ip6_u.saddr = &skb->nh.ipv6h->daddr; + fl.fl6_dst = &skb->nh.ipv6h->saddr; + fl.fl6_src = &skb->nh.ipv6h->daddr; fl.fl6_flowlabel = 0; - t1->check = csum_ipv6_magic(fl.nl_u.ip6_u.saddr, - fl.nl_u.ip6_u.daddr, + t1->check = csum_ipv6_magic(fl.fl6_src, fl.fl6_dst, sizeof(*t1), IPPROTO_TCP, buff->csum); fl.proto = IPPROTO_TCP; fl.oif = tcp_v6_iif(skb); - fl.uli_u.ports.dport = t1->dest; - fl.uli_u.ports.sport = t1->source; + fl.fl_dport = t1->dest; + fl.fl_sport = t1->source; /* sk = NULL, but it is safe for now. RST socket required. */ buff->dst = ip6_route_output(NULL, &fl); @@ -1084,19 +1083,18 @@ buff->csum = csum_partial((char *)t1, tot_len, 0); - fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr; - fl.nl_u.ip6_u.saddr = &skb->nh.ipv6h->daddr; + fl.fl6_dst = &skb->nh.ipv6h->saddr; + fl.fl6_src = &skb->nh.ipv6h->daddr; fl.fl6_flowlabel = 0; - t1->check = csum_ipv6_magic(fl.nl_u.ip6_u.saddr, - fl.nl_u.ip6_u.daddr, + t1->check = csum_ipv6_magic(fl.fl6_src, fl.fl6_dst, tot_len, IPPROTO_TCP, buff->csum); fl.proto = IPPROTO_TCP; fl.oif = tcp_v6_iif(skb); - fl.uli_u.ports.dport = t1->dest; - fl.uli_u.ports.sport = t1->source; + fl.fl_dport = t1->dest; + fl.fl_sport = t1->source; buff->dst = ip6_route_output(NULL, &fl); @@ -1335,16 +1333,16 @@ if (dst == NULL) { fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr; + fl.fl6_dst = &req->af.v6_req.rmt_addr; if (opt && opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } - fl.nl_u.ip6_u.saddr = &req->af.v6_req.loc_addr; + fl.fl6_src = &req->af.v6_req.loc_addr; fl.fl6_flowlabel = 0; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = req->rmt_port; - fl.uli_u.ports.sport = inet_sk(sk)->sport; + fl.fl_dport = req->rmt_port; + fl.fl_sport = inet_sk(sk)->sport; dst = ip6_route_output(sk, &fl); } @@ -1732,16 +1730,16 @@ struct flowi fl; fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &np->daddr; - fl.nl_u.ip6_u.saddr = &np->saddr; + fl.fl6_dst = &np->daddr; + fl.fl6_src = &np->saddr; fl.fl6_flowlabel = np->flow_label; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = inet->dport; - fl.uli_u.ports.sport = inet->sport; + fl.fl_dport = inet->dport; + fl.fl_sport = inet->sport; if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } dst = ip6_route_output(sk, &fl); @@ -1774,12 +1772,12 @@ fl.fl6_flowlabel = np->flow_label; IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel); fl.oif = sk->bound_dev_if; - fl.uli_u.ports.sport = inet->sport; - fl.uli_u.ports.dport = inet->dport; + fl.fl_sport = inet->sport; + fl.fl_dport = inet->dport; if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } dst = __sk_dst_check(sk, np->dst_cookie); @@ -1799,7 +1797,7 @@ skb->dst = dst_clone(dst); /* Restore final destination back after routing done */ - fl.nl_u.ip6_u.daddr = &np->daddr; + fl.fl6_dst = &np->daddr; return ip6_xmit(sk, skb, &fl, np->opt); } Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/udp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.8.1 diff -u -r1.1.1.9 -r1.1.1.9.8.1 --- net/ipv6/udp.c 2 Apr 2003 04:16:14 -0000 1.1.1.9 +++ net/ipv6/udp.c 14 Apr 2003 15:42:43 -0000 1.1.1.9.8.1 @@ -352,8 +352,8 @@ fl.fl6_dst = &np->daddr; fl.fl6_src = &saddr; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = inet->dport; - fl.uli_u.ports.sport = inet->sport; + fl.fl_dport = inet->dport; + fl.fl_sport = inet->sport; if (!fl.oif && (addr_type&IPV6_ADDR_MULTICAST)) fl.oif = np->mcast_oif; @@ -936,8 +936,8 @@ fl.fl6_dst = daddr; if (fl.fl6_src == NULL && !ipv6_addr_any(&np->saddr)) fl.fl6_src = &np->saddr; - fl.uli_u.ports.dport = udh.uh.dest; - fl.uli_u.ports.sport = udh.uh.source; + fl.fl_dport = udh.uh.dest; + fl.fl_sport = udh.uh.source; err = ip6_build_xmit(sk, udpv6_getfrag, &udh, &fl, len, opt, hlimit, msg->msg_flags); Index: net/ipv6/xfrm6_policy.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/xfrm6_policy.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.2.2.1 diff -u -r1.1.1.2 -r1.1.1.2.2.1 --- net/ipv6/xfrm6_policy.c 14 Apr 2003 04:34:17 -0000 1.1.1.2 +++ net/ipv6/xfrm6_policy.c 14 Apr 2003 15:42:43 -0000 1.1.1.2.2.1 @@ -195,8 +195,8 @@ if (pskb_may_pull(skb, skb->nh.raw + offset + 4 - skb->data)) { u16 *ports = (u16 *)exthdr; - fl->uli_u.ports.sport = ports[0]; - fl->uli_u.ports.dport = ports[1]; + fl->fl_sport = ports[0]; + fl->fl_dport = ports[1]; } return; Index: net/ipv6/xfrm6_state.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/xfrm6_state.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.10.1 diff -u -r1.1.1.1 -r1.1.1.1.10.1 --- net/ipv6/xfrm6_state.c 24 Mar 2003 05:46:10 -0000 1.1.1.1 +++ net/ipv6/xfrm6_state.c 14 Apr 2003 15:42:43 -0000 1.1.1.1.10.1 @@ -27,9 +27,9 @@ * to current session. */ memcpy(&x->sel.daddr, fl->fl6_dst, sizeof(struct in6_addr)); memcpy(&x->sel.saddr, fl->fl6_src, sizeof(struct in6_addr)); - x->sel.dport = fl->uli_u.ports.dport; + x->sel.dport = fl->fl_dport; x->sel.dport_mask = ~0; - x->sel.sport = fl->uli_u.ports.sport; + x->sel.sport = fl->fl_sport; x->sel.sport_mask = ~0; x->sel.prefixlen_d = 128; x->sel.prefixlen_s = 128; -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Mon Apr 14 10:38:49 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 10:38:52 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EHcmFu021169 for ; Mon, 14 Apr 2003 10:38:49 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id KAA07055; Mon, 14 Apr 2003 10:31:44 -0700 Date: Mon, 14 Apr 2003 10:31:43 -0700 (PDT) Message-Id: <20030414.103143.64788453.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] [NET] use fl6_{src,dst} etc. From: "David S. Miller" In-Reply-To: <20030415.023158.36869337.yoshfuji@linux-ipv6.org> References: <20030415.023158.36869337.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2228 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 708 Lines: 22 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 15 Apr 2003 02:31:58 +0900 (JST) I think this idea needs a slight modification: +#define fl_sport uli_u.ports.sport +#define fl_dport uli_u.ports.dport +#define fl_type uli_u.icmpt.type +#define fl_code uli_u.icmpt.code Other protocols like DecNET will use these areas, and I already know that DecNET defines it's own struct member of the flow uli_u union that itself has members named sport and dport. How about the following instead? +#define fl_ports_sport uli_u.ports.sport +#define fl_ports_dport uli_u.ports.dport +#define fl_icmp_type uli_u.icmpt.type +#define fl_icmp_code uli_u.icmpt.code Ok? From yoshfuji@linux-ipv6.org Mon Apr 14 10:51:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 10:51:45 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EHpfFu021581 for ; Mon, 14 Apr 2003 10:51:42 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3EHq6DG003361; Tue, 15 Apr 2003 02:52:07 +0900 Date: Tue, 15 Apr 2003 02:52:06 +0900 (JST) Message-Id: <20030415.025206.31321166.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] [NET] use fl6_{src,dst} etc. From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030414.103143.64788453.davem@redhat.com> References: <20030415.023158.36869337.yoshfuji@linux-ipv6.org> <20030414.103143.64788453.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2229 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 574 Lines: 17 In article <20030414.103143.64788453.davem@redhat.com> (at Mon, 14 Apr 2003 10:31:43 -0700 (PDT)), "David S. Miller" says: > How about the following instead? > > +#define fl_ports_sport uli_u.ports.sport > +#define fl_ports_dport uli_u.ports.dport > +#define fl_icmp_type uli_u.icmpt.type > +#define fl_icmp_code uli_u.icmpt.code > > Ok? fl_ip_{sport,dport}? (fl_port_{sport,dport} sounds like "white horse is white" to me.) -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Mon Apr 14 10:55:31 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 10:55:34 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EHtVFu021934 for ; Mon, 14 Apr 2003 10:55:31 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id KAA07102; Mon, 14 Apr 2003 10:48:27 -0700 Date: Mon, 14 Apr 2003 10:48:26 -0700 (PDT) Message-Id: <20030414.104826.104550461.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] [NET] use fl6_{src,dst} etc. From: "David S. Miller" In-Reply-To: <20030415.025206.31321166.yoshfuji@linux-ipv6.org> References: <20030415.023158.36869337.yoshfuji@linux-ipv6.org> <20030414.103143.64788453.davem@redhat.com> <20030415.025206.31321166.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2230 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 240 Lines: 7 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 15 Apr 2003 02:52:06 +0900 (JST) fl_ip_{sport,dport}? (fl_port_{sport,dport} sounds like "white horse is white" to me.) Ok, fl_ip_* is fine. :-) From yoshfuji@linux-ipv6.org Mon Apr 14 11:20:49 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 11:20:58 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EIKmFu023736 for ; Mon, 14 Apr 2003 11:20:48 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3EIL9DG003563; Tue, 15 Apr 2003 03:21:10 +0900 Date: Tue, 15 Apr 2003 03:21:09 +0900 (JST) Message-Id: <20030415.032109.127483264.yoshfuji@linux-ipv6.org> To: davem@redhat.com, kuznet@ms2.inr.ac.ru CC: netdev@oss.sgi.com, linux-kernel@vger.kernel.org, usagi@linux-ipv6.org Subject: [PATCH] [IPV6] Fixed multiple mistake extension header handling From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2231 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 19938 Lines: 712 Hello. ChangeSet 1.977.5.12: "[IPV6] Process all extension headers via ipproto->handler" broke IPv6 extension header handling. - double free if sending Parameter Problem message in reassembly code. - (sometimes) broken checksum - HbH not producing unknown header; it is only allowed at the beginning of the exthdrs chain. - wrong pointer value in Parameter Problem message. I've fixed the problem. Patch is against 2.5.67 + CS 1.1202. Thank you. Index: include/net/protocol.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/net/protocol.h,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.10.1 diff -u -r1.1.1.5 -r1.1.1.5.10.1 --- include/net/protocol.h 2 Apr 2003 04:14:22 -0000 1.1.1.5 +++ include/net/protocol.h 14 Apr 2003 17:24:49 -0000 1.1.1.5.10.1 @@ -44,15 +44,17 @@ #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) struct inet6_protocol { - int (*handler)(struct sk_buff **skbp); + int (*handler)(struct sk_buff **skb, unsigned int *nhoffp); void (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, int type, int code, int offset, __u32 info); - int no_policy; + unsigned int flags; /* INET6_PROTO_xxx */ }; +#define INET6_PROTO_NOPOLICY 0x1 +#define INET6_PROTO_FINAL 0x2 #endif /* This is used to register socket interfaces for IP protocols. */ Index: include/net/xfrm.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/net/xfrm.h,v retrieving revision 1.1.1.14 retrieving revision 1.1.1.14.4.1 diff -u -r1.1.1.14 -r1.1.1.14.4.1 --- include/net/xfrm.h 14 Apr 2003 04:33:59 -0000 1.1.1.14 +++ include/net/xfrm.h 14 Apr 2003 17:24:49 -0000 1.1.1.14.4.1 @@ -760,7 +760,7 @@ extern int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type); extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler); extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler); -extern int xfrm6_rcv(struct sk_buff **pskb); +extern int xfrm6_rcv(struct sk_buff **pskb, unsigned int *nhoffp); extern int xfrm6_clear_mutable_options(struct sk_buff *skb, u16 *nh_offset, int dir); extern int xfrm_user_policy(struct sock *sk, int optname, u8 *optval, int optlen); Index: net/ipv6/af_inet6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/af_inet6.c,v retrieving revision 1.1.1.12 retrieving revision 1.1.1.12.4.1 diff -u -r1.1.1.12 -r1.1.1.12.4.1 --- net/ipv6/af_inet6.c 14 Apr 2003 04:34:17 -0000 1.1.1.12 +++ net/ipv6/af_inet6.c 14 Apr 2003 17:24:49 -0000 1.1.1.12.4.1 @@ -805,7 +805,6 @@ sit_init(); /* Init v6 extension headers. */ - ipv6_hopopts_init(); ipv6_rthdr_init(); ipv6_frag_init(); ipv6_nodata_init(); Index: net/ipv6/ah6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ah6.c,v retrieving revision 1.1.1.7 retrieving revision 1.1.1.7.4.1 diff -u -r1.1.1.7 -r1.1.1.7.4.1 --- net/ipv6/ah6.c 14 Apr 2003 04:34:17 -0000 1.1.1.7 +++ net/ipv6/ah6.c 14 Apr 2003 17:24:49 -0000 1.1.1.7.4.1 @@ -330,7 +330,7 @@ static struct inet6_protocol ah6_protocol = { .handler = xfrm6_rcv, .err_handler = ah6_err, - .no_policy = 1, + .flags = INET6_PROTO_NOPOLICY, }; int __init ah6_init(void) Index: net/ipv6/esp6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/esp6.c,v retrieving revision 1.1.1.7 retrieving revision 1.1.1.7.4.1 diff -u -r1.1.1.7 -r1.1.1.7.4.1 --- net/ipv6/esp6.c 14 Apr 2003 04:34:17 -0000 1.1.1.7 +++ net/ipv6/esp6.c 14 Apr 2003 17:24:49 -0000 1.1.1.7.4.1 @@ -501,7 +501,7 @@ static struct inet6_protocol esp6_protocol = { .handler = xfrm6_rcv, .err_handler = esp6_err, - .no_policy = 1, + .flags = INET6_PROTO_NOPOLICY, }; int __init esp6_init(void) Index: net/ipv6/exthdrs.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/exthdrs.c,v retrieving revision 1.1.1.4 retrieving revision 1.1.1.4.12.2 diff -u -r1.1.1.4 -r1.1.1.4.12.2 --- net/ipv6/exthdrs.c 25 Mar 2003 04:33:45 -0000 1.1.1.4 +++ net/ipv6/exthdrs.c 14 Apr 2003 17:26:57 -0000 1.1.1.4.12.2 @@ -18,9 +18,9 @@ /* Changes: * yoshfuji : ensure not to overrun while parsing * tlv options. - * Mitsuru KANDA @USAGI : Remove ipv6_parse_exthdrs(). - * : Register inbound extention header - * : handlers as inet6_protocol{}. + * Mitsuru KANDA @USAGI and: Remove ipv6_parse_exthdrs(). + * YOSHIFUJI Hideaki @USAGI Register inbound extention header + * handlers as inet6_protocol{}. */ #include @@ -153,38 +153,37 @@ {-1, NULL} }; -static int ipv6_destopt_rcv(struct sk_buff **skbp) +static int ipv6_destopt_rcv(struct sk_buff **skbp, unsigned int *nhoffp) { struct sk_buff *skb = *skbp; struct inet6_skb_parm *opt = (struct inet6_skb_parm *)skb->cb; - u8 nexthdr = 0; if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) || !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) { kfree_skb(skb); - return 0; + return -1; } - nexthdr = ((struct ipv6_destopt_hdr *)skb->h.raw)->nexthdr; - opt->dst1 = skb->h.raw - skb->nh.raw; if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { skb->h.raw += ((skb->h.raw[1]+1)<<3); - return -nexthdr; + *nhoffp = opt->dst1; + return 1; } - - return 0; + + return -1; } static struct inet6_protocol destopt_protocol = { - .handler = ipv6_destopt_rcv, + .handler = ipv6_destopt_rcv, + .flags = INET6_PROTO_NOPOLICY, }; void __init ipv6_destopt_init(void) { - if (inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS) < 0) + if (inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS) < 0) printk(KERN_ERR "ipv6_destopt_init: Could not register protocol\n"); } @@ -192,7 +191,7 @@ NONE header. No data in packet. ********************************/ -static int ipv6_nodata_rcv(struct sk_buff **skbp) +static int ipv6_nodata_rcv(struct sk_buff **skbp, unsigned int *nhoffp) { struct sk_buff *skb = *skbp; @@ -203,6 +202,7 @@ static struct inet6_protocol nodata_protocol = { .handler = ipv6_nodata_rcv, + .flags = INET6_PROTO_NOPOLICY, }; void __init ipv6_nodata_init(void) @@ -215,7 +215,7 @@ Routing header. ********************************/ -static int ipv6_rthdr_rcv(struct sk_buff **skbp) +static int ipv6_rthdr_rcv(struct sk_buff **skbp, unsigned int *nhoffp) { struct sk_buff *skb = *skbp; struct inet6_skb_parm *opt = (struct inet6_skb_parm *)skb->cb; @@ -223,7 +223,6 @@ struct in6_addr daddr; int addr_type; int n, i; - u8 nexthdr = 0; struct ipv6_rt_hdr *hdr; struct rt0_hdr *rthdr; @@ -232,16 +231,15 @@ !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) { IP6_INC_STATS_BH(Ip6InHdrErrors); kfree_skb(skb); - return 0; + return -1; } hdr = (struct ipv6_rt_hdr *) skb->h.raw; - nexthdr = hdr->nexthdr; if ((ipv6_addr_type(&skb->nh.ipv6h->daddr)&IPV6_ADDR_MULTICAST) || skb->pkt_type != PACKET_HOST) { kfree_skb(skb); - return 0; + return -1; } looped_back: @@ -250,12 +248,13 @@ skb->h.raw += (hdr->hdrlen + 1) << 3; opt->dst0 = opt->dst1; opt->dst1 = 0; - return -nexthdr; + *nhoffp = (&hdr->nexthdr) - skb->nh.raw; + return 1; } if (hdr->type != IPV6_SRCRT_TYPE_0 || (hdr->hdrlen & 0x01)) { icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, hdr->type != IPV6_SRCRT_TYPE_0 ? 2 : 1); - return 0; + return -1; } /* @@ -267,7 +266,7 @@ if (hdr->segments_left > n) { icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->segments_left) - skb->nh.raw); - return 0; + return -1; } /* We are about to mangle packet header. Be careful! @@ -277,7 +276,7 @@ struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC); kfree_skb(skb); if (skb2 == NULL) - return 0; + return -1; *skbp = skb = skb2; opt = (struct inet6_skb_parm *)skb2->cb; hdr = (struct ipv6_rt_hdr *) skb2->h.raw; @@ -296,7 +295,7 @@ if (addr_type&IPV6_ADDR_MULTICAST) { kfree_skb(skb); - return 0; + return -1; } ipv6_addr_copy(&daddr, addr); @@ -307,26 +306,27 @@ ip6_route_input(skb); if (skb->dst->error) { dst_input(skb); - return 0; + return -1; } if (skb->dst->dev->flags&IFF_LOOPBACK) { if (skb->nh.ipv6h->hop_limit <= 1) { icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, 0, skb->dev); kfree_skb(skb); - return 0; + return -1; } skb->nh.ipv6h->hop_limit--; goto looped_back; } dst_input(skb); - return 0; + return -1; } static struct inet6_protocol rthdr_protocol = { .handler = ipv6_rthdr_rcv, + .flags = INET6_PROTO_NOPOLICY, }; void __init ipv6_rthdr_init(void) @@ -468,34 +468,6 @@ if (ip6_parse_tlv(tlvprochopopt_lst, skb)) return sizeof(struct ipv6hdr); return -1; -} - -/* This is fake. We have already parsed hopopts in ipv6_rcv(). -mk */ -static int ipv6_hopopts_rcv(struct sk_buff **skbp) -{ - struct sk_buff *skb = *skbp; - u8 nexthdr = 0; - - if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) || - !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) { - kfree_skb(skb); - return 0; - } - nexthdr = ((struct ipv6_hopopt_hdr *)skb->h.raw)->nexthdr; - skb->h.raw += (skb->h.raw[1]+1)<<3; - - return -nexthdr; -} - -static struct inet6_protocol hopopts_protocol = -{ - .handler = ipv6_hopopts_rcv, -}; - -void __init ipv6_hopopts_init(void) -{ - if (inet6_add_protocol(&hopopts_protocol, IPPROTO_HOPOPTS) < 0) - printk(KERN_ERR "ipv6_hopopts_init: Could not register protocol\n"); } /* Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/icmp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.12.1 diff -u -r1.1.1.9 -r1.1.1.9.12.1 --- net/ipv6/icmp.c 25 Mar 2003 04:33:45 -0000 1.1.1.9 +++ net/ipv6/icmp.c 14 Apr 2003 17:24:49 -0000 1.1.1.9.12.1 @@ -74,10 +74,11 @@ static struct socket *__icmpv6_socket[NR_CPUS]; #define icmpv6_socket __icmpv6_socket[smp_processor_id()] -static int icmpv6_rcv(struct sk_buff **pskb); +static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp); static struct inet6_protocol icmpv6_protocol = { .handler = icmpv6_rcv, + .flags = INET6_PROTO_FINAL, }; struct icmpv6_msg { @@ -459,7 +460,7 @@ * Handle icmp messages */ -static int icmpv6_rcv(struct sk_buff **pskb) +static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp) { struct sk_buff *skb = *pskb; struct net_device *dev = skb->dev; Index: net/ipv6/ip6_input.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ip6_input.c,v retrieving revision 1.1.1.8 retrieving revision 1.1.1.8.10.2 diff -u -r1.1.1.8 -r1.1.1.8.10.2 --- net/ipv6/ip6_input.c 2 Apr 2003 04:16:14 -0000 1.1.1.8 +++ net/ipv6/ip6_input.c 14 Apr 2003 17:26:57 -0000 1.1.1.8.10.2 @@ -17,7 +17,8 @@ */ /* Changes * - * Mitsuru KANDA @USAGI : Remove ipv6_parse_exthdrs(). + * Mitsuru KANDA @USAGI and + * YOSHIFUJI Hideaki @USAGI: Remove ipv6_parse_exthdrs(). */ #include @@ -128,22 +129,34 @@ static inline int ip6_input_finish(struct sk_buff *skb) { - struct ipv6hdr *hdr = skb->nh.ipv6h; struct inet6_protocol *ipprot; struct sock *raw_sk; - int nexthdr = hdr->nexthdr; + unsigned int nhoff; + int nexthdr; u8 hash; + int cksum_sub = 0; skb->h.raw = skb->nh.raw + sizeof(struct ipv6hdr); - if (!pskb_pull(skb, skb->h.raw - skb->data)) - goto discard; + /* + * Parse extension headers + */ - if (skb->ip_summed == CHECKSUM_HW) - skb->csum = csum_sub(skb->csum, - csum_partial(skb->nh.raw, skb->h.raw-skb->nh.raw, 0)); + nexthdr = skb->nh.ipv6h->nexthdr; + nhoff = offsetof(struct ipv6hdr, nexthdr); + + /* Skip hop-by-hop options, they are already parsed. */ + if (nexthdr == NEXTHDR_HOP) { + nhoff = sizeof(struct ipv6hdr); + nexthdr = skb->h.raw[0]; + skb->h.raw += (skb->h.raw[1]+1)<<3; + } resubmit: + if (!pskb_pull(skb, skb->h.raw - skb->data)) + goto discard; + nexthdr = skb->nh.raw[nhoff]; + raw_sk = raw_v6_htable[nexthdr & (MAX_INET_PROTOS - 1)]; if (raw_sk) ipv6_raw_deliver(skb, nexthdr); @@ -152,23 +165,29 @@ if ((ipprot = inet6_protos[hash]) != NULL) { int ret; - if (!ipprot->no_policy && + if (ipprot->flags & INET6_PROTO_FINAL) { + if (!cksum_sub && skb->ip_summed == CHECKSUM_HW) { + skb->csum = csum_sub(skb->csum, + csum_partial(skb->nh.raw, skb->h.raw-skb->nh.raw, 0)); + cksum_sub++; + } + } + if (!(ipprot->flags & INET6_PROTO_NOPOLICY) && !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { kfree_skb(skb); return 0; } - ret = ipprot->handler(&skb); - if (ret < 0) { - nexthdr = -ret; + + ret = ipprot->handler(&skb, &nhoff); + if (ret > 0) goto resubmit; - } - IP6_INC_STATS_BH(Ip6InDelivers); + else if (ret == 0) + IP6_INC_STATS_BH(Ip6InDelivers); } else { if (!raw_sk) { if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { IP6_INC_STATS_BH(Ip6InUnknownProtos); - icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, - offsetof(struct ipv6hdr, nexthdr)); + icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, nhoff); } } else { IP6_INC_STATS_BH(Ip6InDelivers); Index: net/ipv6/reassembly.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/reassembly.c,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.12.1 diff -u -r1.1.1.5 -r1.1.1.5.12.1 --- net/ipv6/reassembly.c 25 Mar 2003 04:33:45 -0000 1.1.1.5 +++ net/ipv6/reassembly.c 14 Apr 2003 17:24:49 -0000 1.1.1.5.12.1 @@ -520,13 +520,13 @@ * the last and the first frames arrived and all the bits are here. */ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in, + unsigned int *nhoffp, struct net_device *dev) { struct sk_buff *fp, *head = fq->fragments; int remove_fraghdr = 0; int payload_len; - int nhoff; - u8 nexthdr = 0; + unsigned int nhoff; fq_kill(fq); @@ -537,8 +537,6 @@ payload_len = (head->data - head->nh.raw) - sizeof(struct ipv6hdr) + fq->len; nhoff = head->h.raw - head->nh.raw; - nexthdr = ((struct frag_hdr*)head->h.raw)->nexthdr; - if (payload_len > 65535) { payload_len -= 8; if (payload_len > 65535) @@ -613,12 +611,10 @@ if (head->ip_summed == CHECKSUM_HW) head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); - if (!pskb_pull(head, head->h.raw - head->data)) - goto out_fail; - IP6_INC_STATS_BH(Ip6ReasmOKs); fq->fragments = NULL; - return nexthdr; + *nhoffp = nhoff; + return 1; out_oversize: if (net_ratelimit()) @@ -629,18 +625,16 @@ printk(KERN_DEBUG "ip6_frag_reasm: no memory for reassembly\n"); out_fail: IP6_INC_STATS_BH(Ip6ReasmFails); - return 0; + return -1; } -static int ipv6_frag_rcv(struct sk_buff **skbp) +static int ipv6_frag_rcv(struct sk_buff **skbp, unsigned int *nhoffp) { struct sk_buff *skb = *skbp; struct net_device *dev = skb->dev; struct frag_hdr *fhdr; struct frag_queue *fq; struct ipv6hdr *hdr; - int nhoff = skb->h.raw - skb->nh.raw; - u8 nexthdr = 0; hdr = skb->nh.ipv6h; @@ -649,23 +643,23 @@ /* Jumbo payload inhibits frag. header */ if (hdr->payload_len==0) { icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw); - goto discard; + return -1; } if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+sizeof(struct frag_hdr))) { icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw); - goto discard; + return -1; } hdr = skb->nh.ipv6h; fhdr = (struct frag_hdr *)skb->h.raw; - nexthdr = fhdr->nexthdr; if (!(fhdr->frag_off & htons(0xFFF9))) { /* It is not a fragmented frame */ skb->h.raw += sizeof(struct frag_hdr); IP6_INC_STATS_BH(Ip6ReasmOKs); - return (u8*)fhdr - skb->nh.raw; + *nhoffp = (u8*)fhdr - skb->nh.raw; + return 1; } if (atomic_read(&ip6_frag_mem) > sysctl_ip6frag_high_thresh) @@ -676,26 +670,26 @@ spin_lock(&fq->lock); - ip6_frag_queue(fq, skb, fhdr, nhoff); + ip6_frag_queue(fq, skb, fhdr, *nhoffp); if (fq->last_in == (FIRST_IN|LAST_IN) && fq->meat == fq->len) - ret = ip6_frag_reasm(fq, skbp, dev); + ret = ip6_frag_reasm(fq, skbp, nhoffp, dev); spin_unlock(&fq->lock); fq_put(fq); - return -ret; + return ret; } -discard: IP6_INC_STATS_BH(Ip6ReasmFails); kfree_skb(skb); - return 0; + return -1; } static struct inet6_protocol frag_protocol = { .handler = ipv6_frag_rcv, + .flags = INET6_PROTO_NOPOLICY, }; void __init ipv6_frag_init(void) Index: net/ipv6/tcp_ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/tcp_ipv6.c,v retrieving revision 1.1.1.12 retrieving revision 1.1.1.12.8.1 diff -u -r1.1.1.12 -r1.1.1.12.8.1 --- net/ipv6/tcp_ipv6.c 8 Apr 2003 08:57:58 -0000 1.1.1.12 +++ net/ipv6/tcp_ipv6.c 14 Apr 2003 17:24:49 -0000 1.1.1.12.8.1 @@ -1591,7 +1591,7 @@ return 0; } -static int tcp_v6_rcv(struct sk_buff **pskb) +static int tcp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp) { struct sk_buff *skb = *pskb; struct tcphdr *th; @@ -1657,7 +1657,7 @@ bh_unlock_sock(sk); sock_put(sk); - return ret; + return ret ? -1 : 0; no_tcp_socket: if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) @@ -2193,7 +2193,7 @@ static struct inet6_protocol tcpv6_protocol = { .handler = tcp_v6_rcv, .err_handler = tcp_v6_err, - .no_policy = 1, + .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, }; extern struct proto_ops inet6_stream_ops; Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/udp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.10.1 diff -u -r1.1.1.9 -r1.1.1.9.10.1 --- net/ipv6/udp.c 2 Apr 2003 04:16:14 -0000 1.1.1.9 +++ net/ipv6/udp.c 14 Apr 2003 17:24:49 -0000 1.1.1.9.10.1 @@ -640,7 +640,7 @@ read_unlock(&udp_hash_lock); } -static int udpv6_rcv(struct sk_buff **pskb) +static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp) { struct sk_buff *skb = *pskb; struct sock *sk; @@ -954,7 +954,7 @@ static struct inet6_protocol udpv6_protocol = { .handler = udpv6_rcv, .err_handler = udpv6_err, - .no_policy = 1, + .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, }; #define LINE_LEN 190 Index: net/ipv6/xfrm6_input.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/xfrm6_input.c,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.4.1 diff -u -r1.1.1.5 -r1.1.1.5.4.1 --- net/ipv6/xfrm6_input.c 14 Apr 2003 04:34:17 -0000 1.1.1.5 +++ net/ipv6/xfrm6_input.c 14 Apr 2003 17:24:49 -0000 1.1.1.5.4.1 @@ -123,7 +123,7 @@ return nexthdr; } -int xfrm6_rcv(struct sk_buff **pskb) +int xfrm6_rcv(struct sk_buff **pskb, unsigned int *nhoffp) { struct sk_buff *skb = *pskb; int err; @@ -233,6 +233,7 @@ memcpy(skb->sp->x+skb->sp->len, xfrm_vec, xfrm_nr*sizeof(struct sec_decap_state)); skb->sp->len += xfrm_nr; + skb->ip_summed = CHECKSUM_NONE; if (decaps) { if (!(skb->dev->flags&IFF_LOOPBACK)) { @@ -240,9 +241,10 @@ skb->dst = NULL; } netif_rx(skb); - return 0; + return -1; } else { - return -nexthdr; + *nhoffp = nh_offset; + return 1; } drop_unlock: @@ -253,7 +255,7 @@ while (--xfrm_nr >= 0) xfrm_state_put(xfrm_vec[xfrm_nr].xvec); kfree_skb(skb); - return 0; + return -1; } void __init xfrm6_input_init(void) -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From davem@redhat.com Mon Apr 14 11:27:54 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 11:27:57 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3EIRrFu024116 for ; Mon, 14 Apr 2003 11:27:54 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id LAA07201; Mon, 14 Apr 2003 11:20:49 -0700 Date: Mon, 14 Apr 2003 11:20:49 -0700 (PDT) Message-Id: <20030414.112049.05124201.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org, usagi@linux-ipv6.org Subject: Re: [PATCH] [IPV6] Fixed multiple mistake extension header handling From: "David S. Miller" In-Reply-To: <20030415.032109.127483264.yoshfuji@linux-ipv6.org> References: <20030415.032109.127483264.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2232 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 499 Lines: 14 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 15 Apr 2003 03:21:09 +0900 (JST) - double free if sending Parameter Problem message in reassembly code. - (sometimes) broken checksum - HbH not producing unknown header; it is only allowed at the beginning of the exthdrs chain. - wrong pointer value in Parameter Problem message. I've fixed the problem. Patch is against 2.5.67 + CS 1.1202. Patch applied, thank you very much. From yoshfuji@linux-ipv6.org Mon Apr 14 19:57:56 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 19:58:08 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3F2vrFu005916 for ; Mon, 14 Apr 2003 19:57:54 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3F2w8DG006154; Tue, 15 Apr 2003 11:58:08 +0900 Date: Tue, 15 Apr 2003 11:58:07 +0900 (JST) Message-Id: <20030415.115807.127545284.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] [NET] use fl6_{src,dst} etc. From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030414.104826.104550461.davem@redhat.com> References: <20030414.103143.64788453.davem@redhat.com> <20030415.025206.31321166.yoshfuji@linux-ipv6.org> <20030414.104826.104550461.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2233 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 22555 Lines: 706 In article <20030414.104826.104550461.davem@redhat.com> (at Mon, 14 Apr 2003 10:48:26 -0700 (PDT)), "David S. Miller" says: > Ok, fl_ip_* is fine. :-) This is the revised patch against 2.5.67 + ChangeSet 1.1202. Thanks. Index: include/net/flow.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/net/flow.h,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 flow.h --- include/net/flow.h 16 Oct 2002 04:25:20 -0000 1.1.1.2 +++ include/net/flow.h 14 Apr 2003 19:06:49 -0000 @@ -50,6 +50,10 @@ __u32 spi; } uli_u; +#define fl_ip_sport uli_u.ports.sport +#define fl_ip_dport uli_u.ports.dport +#define fl_icmp_type uli_u.icmpt.type +#define fl_icmp_code uli_u.icmpt.code +#define fl_ipsec_spi uli_u.spi }; - #endif Index: include/net/route.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/net/route.h,v retrieving revision 1.1.1.7 retrieving revision 1.1.1.7.46.1 diff -u -r1.1.1.7 -r1.1.1.7.46.1 --- include/net/route.h 9 Jan 2003 11:14:19 -0000 1.1.1.7 +++ include/net/route.h 14 Apr 2003 18:46:05 -0000 1.1.1.7.46.1 @@ -173,13 +173,13 @@ static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport, struct sock *sk) { - if (sport != (*rp)->fl.uli_u.ports.sport || - dport != (*rp)->fl.uli_u.ports.dport) { + if (sport != (*rp)->fl.fl_ip_sport || + dport != (*rp)->fl.fl_ip_dport) { struct flowi fl; memcpy(&fl, &(*rp)->fl, sizeof(fl)); - fl.uli_u.ports.sport = sport; - fl.uli_u.ports.dport = dport; + fl.fl_ip_sport = sport; + fl.fl_ip_dport = dport; ip_rt_put(*rp); *rp = NULL; return ip_route_output_flow(rp, &fl, sk, 0); Index: include/net/xfrm.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/net/xfrm.h,v retrieving revision 1.1.1.14 retrieving revision 1.1.1.14.2.1 diff -u -r1.1.1.14 -r1.1.1.14.2.1 --- include/net/xfrm.h 14 Apr 2003 04:33:59 -0000 1.1.1.14 +++ include/net/xfrm.h 14 Apr 2003 18:46:05 -0000 1.1.1.14.2.1 @@ -295,11 +295,11 @@ static inline u32 __flow_hash4(struct flowi *fl) { - u32 hash = fl->fl4_src ^ fl->uli_u.ports.sport; + u32 hash = fl->fl4_src ^ fl->fl_ip_sport; hash = ((hash & 0xF0F0F0F0) >> 4) | ((hash & 0x0F0F0F0F) << 4); - hash ^= fl->fl4_dst ^ fl->uli_u.ports.dport; + hash ^= fl->fl4_dst ^ fl->fl_ip_dport; hash ^= (hash >> 10); hash ^= (hash >> 20); return hash & (XFRM_FLOWCACHE_HASH_SIZE-1); @@ -309,13 +309,13 @@ { u32 hash = fl->fl6_src->s6_addr32[2] ^ fl->fl6_src->s6_addr32[3] ^ - fl->uli_u.ports.sport; + fl->fl_ip_sport; hash = ((hash & 0xF0F0F0F0) >> 4) | ((hash & 0x0F0F0F0F) << 4); hash ^= fl->fl6_dst->s6_addr32[2] ^ fl->fl6_dst->s6_addr32[3] ^ - fl->uli_u.ports.dport; + fl->fl_ip_dport; hash ^= (hash >> 10); hash ^= (hash >> 20); return hash & (XFRM_FLOWCACHE_HASH_SIZE-1); @@ -454,8 +454,8 @@ { return addr_match(&fl->fl4_dst, &sel->daddr, sel->prefixlen_d) && addr_match(&fl->fl4_src, &sel->saddr, sel->prefixlen_s) && - !((fl->uli_u.ports.dport^sel->dport)&sel->dport_mask) && - !((fl->uli_u.ports.sport^sel->sport)&sel->sport_mask) && + !((fl->fl_ip_dport^sel->dport)&sel->dport_mask) && + !((fl->fl_ip_sport^sel->sport)&sel->sport_mask) && (fl->proto == sel->proto || !sel->proto) && (fl->oif == sel->ifindex || !sel->ifindex); } @@ -465,8 +465,8 @@ { return addr_match(fl->fl6_dst, &sel->daddr, sel->prefixlen_d) && addr_match(fl->fl6_src, &sel->saddr, sel->prefixlen_s) && - !((fl->uli_u.ports.dport^sel->dport)&sel->dport_mask) && - !((fl->uli_u.ports.sport^sel->sport)&sel->sport_mask) && + !((fl->fl_ip_dport^sel->dport)&sel->dport_mask) && + !((fl->fl_ip_sport^sel->sport)&sel->sport_mask) && (fl->proto == sel->proto || !sel->proto) && (fl->oif == sel->ifindex || !sel->ifindex); } Index: net/ipv4/xfrm4_policy.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv4/xfrm4_policy.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.2.2.2 diff -u -r1.1.1.2 -r1.1.1.2.2.2 --- net/ipv4/xfrm4_policy.c 14 Apr 2003 04:34:11 -0000 1.1.1.2 +++ net/ipv4/xfrm4_policy.c 14 Apr 2003 18:57:36 -0000 1.1.1.2.2.2 @@ -180,8 +180,8 @@ if (pskb_may_pull(skb, xprth + 4 - skb->data)) { u16 *ports = (u16 *)xprth; - fl->uli_u.ports.sport = ports[0]; - fl->uli_u.ports.dport = ports[1]; + fl->fl_ip_sport = ports[0]; + fl->fl_ip_dport = ports[1]; } break; @@ -189,7 +189,7 @@ if (pskb_may_pull(skb, xprth + 4 - skb->data)) { u32 *ehdr = (u32 *)xprth; - fl->uli_u.spi = ehdr[0]; + fl->fl_ipsec_spi = ehdr[0]; } break; @@ -197,7 +197,7 @@ if (pskb_may_pull(skb, xprth + 8 - skb->data)) { u32 *ah_hdr = (u32*)xprth; - fl->uli_u.spi = ah_hdr[1]; + fl->fl_ipsec_spi = ah_hdr[1]; } break; @@ -205,11 +205,11 @@ if (pskb_may_pull(skb, xprth + 4 - skb->data)) { u16 *ipcomp_hdr = (u16 *)xprth; - fl->uli_u.spi = ntohl(ntohs(ipcomp_hdr[1])); + fl->fl_ipsec_spi = ntohl(ntohs(ipcomp_hdr[1])); } break; default: - fl->uli_u.spi = 0; + fl->fl_ipsec_spi = 0; break; }; } else { Index: net/ipv4/xfrm4_state.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv4/xfrm4_state.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.10.2 diff -u -r1.1.1.1 -r1.1.1.1.10.2 --- net/ipv4/xfrm4_state.c 24 Mar 2003 05:46:08 -0000 1.1.1.1 +++ net/ipv4/xfrm4_state.c 14 Apr 2003 18:38:53 -0000 1.1.1.1.10.2 @@ -20,9 +20,9 @@ { x->sel.daddr.a4 = fl->fl4_dst; x->sel.saddr.a4 = fl->fl4_src; - x->sel.dport = fl->uli_u.ports.dport; + x->sel.dport = fl->fl_ip_dport; x->sel.dport_mask = ~0; - x->sel.sport = fl->uli_u.ports.sport; + x->sel.sport = fl->fl_ip_sport; x->sel.sport_mask = ~0; x->sel.prefixlen_d = 32; x->sel.prefixlen_s = 32; Index: net/ipv6/datagram.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/datagram.c,v retrieving revision 1.1.1.3 retrieving revision 1.1.1.3.54.2 diff -u -r1.1.1.3 -r1.1.1.3.54.2 --- net/ipv6/datagram.c 30 Oct 2002 09:43:18 -0000 1.1.1.3 +++ net/ipv6/datagram.c 14 Apr 2003 18:38:53 -0000 1.1.1.3.54.2 @@ -91,7 +91,7 @@ serr->ee.ee_info = info; serr->ee.ee_data = 0; serr->addr_offset = (u8*)&iph->daddr - skb->nh.raw; - serr->port = fl->uli_u.ports.dport; + serr->port = fl->fl_ip_dport; skb->h.raw = skb->tail; __skb_pull(skb, skb->tail - skb->data); Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/icmp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.10.2 diff -u -r1.1.1.9 -r1.1.1.9.10.2 --- net/ipv6/icmp.c 25 Mar 2003 04:33:45 -0000 1.1.1.9 +++ net/ipv6/icmp.c 14 Apr 2003 18:38:53 -0000 1.1.1.9.10.2 @@ -312,12 +312,12 @@ } fl.proto = IPPROTO_ICMPV6; - fl.nl_u.ip6_u.daddr = &hdr->saddr; - fl.nl_u.ip6_u.saddr = saddr; + fl.fl6_dst = &hdr->saddr; + fl.fl6_src = saddr; fl.oif = iif; fl.fl6_flowlabel = 0; - fl.uli_u.icmpt.type = type; - fl.uli_u.icmpt.code = code; + fl.fl_icmp_type = type; + fl.fl_icmp_code = code; icmpv6_xmit_lock(); @@ -386,12 +386,12 @@ msg.daddr = &skb->nh.ipv6h->saddr; fl.proto = IPPROTO_ICMPV6; - fl.nl_u.ip6_u.daddr = msg.daddr; - fl.nl_u.ip6_u.saddr = saddr; + fl.fl6_dst = msg.daddr; + fl.fl6_src = saddr; fl.oif = skb->dev->ifindex; fl.fl6_flowlabel = 0; - fl.uli_u.icmpt.type = ICMPV6_ECHO_REPLY; - fl.uli_u.icmpt.code = 0; + fl.fl_icmp_type = ICMPV6_ECHO_REPLY; + fl.fl_icmp_code = 0; icmpv6_xmit_lock(); Index: net/ipv6/ip6_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ip6_output.c,v retrieving revision 1.1.1.8 retrieving revision 1.1.1.8.8.3 diff -u -r1.1.1.8 -r1.1.1.8.8.3 --- net/ipv6/ip6_output.c 2 Apr 2003 04:16:14 -0000 1.1.1.8 +++ net/ipv6/ip6_output.c 14 Apr 2003 18:38:53 -0000 1.1.1.8.8.3 @@ -146,8 +146,8 @@ fl.fl6_src = &iph->saddr; fl.oif = skb->sk ? skb->sk->bound_dev_if : 0; fl.fl6_flowlabel = 0; - fl.uli_u.ports.dport = 0; - fl.uli_u.ports.sport = 0; + fl.fl_ip_dport = 0; + fl.fl_ip_sport = 0; dst = ip6_route_output(skb->sk, &fl); @@ -186,7 +186,7 @@ struct ipv6_txoptions *opt) { struct ipv6_pinfo *np = sk ? inet6_sk(sk) : NULL; - struct in6_addr *first_hop = fl->nl_u.ip6_u.daddr; + struct in6_addr *first_hop = fl->fl6_dst; struct dst_entry *dst = skb->dst; struct ipv6hdr *hdr; u8 proto = fl->proto; @@ -241,7 +241,7 @@ hdr->nexthdr = proto; hdr->hop_limit = hlimit; - ipv6_addr_copy(&hdr->saddr, fl->nl_u.ip6_u.saddr); + ipv6_addr_copy(&hdr->saddr, fl->fl6_src); ipv6_addr_copy(&hdr->daddr, first_hop); mtu = dst_pmtu(dst); @@ -306,8 +306,8 @@ hdr->hop_limit = hlimit; hdr->nexthdr = fl->proto; - ipv6_addr_copy(&hdr->saddr, fl->nl_u.ip6_u.saddr); - ipv6_addr_copy(&hdr->daddr, fl->nl_u.ip6_u.daddr); + ipv6_addr_copy(&hdr->saddr, fl->fl6_src); + ipv6_addr_copy(&hdr->daddr, fl->fl6_dst); return hdr; } @@ -524,7 +524,7 @@ fl->fl6_dst = rt0->addr; } - if (!fl->oif && ipv6_addr_is_multicast(fl->nl_u.ip6_u.daddr)) + if (!fl->oif && ipv6_addr_is_multicast(fl->fl6_dst)) fl->oif = np->mcast_oif; dst = __sk_dst_check(sk, np->dst_cookie); @@ -701,7 +701,7 @@ * cleanup */ out: - ip6_dst_store(sk, dst, fl->nl_u.ip6_u.daddr == &np->daddr ? &np->daddr : NULL); + ip6_dst_store(sk, dst, fl->fl6_dst == &np->daddr ? &np->daddr : NULL); if (err > 0) err = np->recverr ? net_xmit_errno(err) : 0; return err; Index: net/ipv6/ndisc.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ndisc.c,v retrieving revision 1.1.1.8 retrieving revision 1.1.1.8.2.2 diff -u -r1.1.1.8 -r1.1.1.8.2.2 --- net/ipv6/ndisc.c 14 Apr 2003 04:34:17 -0000 1.1.1.8 +++ net/ipv6/ndisc.c 14 Apr 2003 18:38:53 -0000 1.1.1.8.2.2 @@ -405,8 +405,8 @@ fl->fl6_src = saddr; fl->fl6_dst = daddr; fl->proto = IPPROTO_ICMPV6; - fl->uli_u.icmpt.type = type; - fl->uli_u.icmpt.code = 0; + fl->fl_icmp_type = type; + fl->fl_icmp_code = 0; } static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, Index: net/ipv6/raw.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/raw.c,v retrieving revision 1.1.1.6 retrieving revision 1.1.1.6.8.1 diff -u -r1.1.1.6 -r1.1.1.6.8.1 --- net/ipv6/raw.c 2 Apr 2003 04:16:14 -0000 1.1.1.6 +++ net/ipv6/raw.c 14 Apr 2003 18:53:17 -0000 1.1.1.6.8.1 @@ -622,8 +622,8 @@ fl.fl6_dst = daddr; if (fl.fl6_src == NULL && !ipv6_addr_any(&np->saddr)) fl.fl6_src = &np->saddr; - fl.uli_u.icmpt.type = 0; - fl.uli_u.icmpt.code = 0; + fl.fl_icmp_type = 0; + fl.fl_icmp_code = 0; if (raw_opt->checksum) { struct rawv6_fakehdr hdr; Index: net/ipv6/route.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/route.c,v retrieving revision 1.1.1.11 retrieving revision 1.1.1.11.2.1 diff -u -r1.1.1.11 -r1.1.1.11.2.1 --- net/ipv6/route.c 14 Apr 2003 04:34:17 -0000 1.1.1.11 +++ net/ipv6/route.c 14 Apr 2003 14:42:49 -0000 1.1.1.11.2.1 @@ -449,13 +449,12 @@ int strict; int attempts = 3; - strict = ipv6_addr_type(fl->nl_u.ip6_u.daddr) & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL); + strict = ipv6_addr_type(fl->fl6_dst) & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL); relookup: read_lock_bh(&rt6_lock); - fn = fib6_lookup(&ip6_routing_table, fl->nl_u.ip6_u.daddr, - fl->nl_u.ip6_u.saddr); + fn = fib6_lookup(&ip6_routing_table, fl->fl6_dst, fl->fl6_src); restart: rt = fn->leaf; @@ -477,9 +476,8 @@ if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) { read_unlock_bh(&rt6_lock); - rt = rt6_cow(rt, fl->nl_u.ip6_u.daddr, - fl->nl_u.ip6_u.saddr); - + rt = rt6_cow(rt, fl->fl6_dst, fl->fl6_src); + if (rt->u.dst.error != -EEXIST || --attempts <= 0) goto out2; @@ -1585,15 +1583,11 @@ skb->mac.raw = skb->data; skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr)); - fl.proto = 0; - fl.nl_u.ip6_u.daddr = NULL; - fl.nl_u.ip6_u.saddr = NULL; - fl.uli_u.icmpt.type = 0; - fl.uli_u.icmpt.code = 0; + memset(&fl, 0, sizeof(fl)); if (rta[RTA_SRC-1]) - fl.nl_u.ip6_u.saddr = (struct in6_addr*)RTA_DATA(rta[RTA_SRC-1]); + fl.fl6_src = (struct in6_addr*)RTA_DATA(rta[RTA_SRC-1]); if (rta[RTA_DST-1]) - fl.nl_u.ip6_u.daddr = (struct in6_addr*)RTA_DATA(rta[RTA_DST-1]); + fl.fl6_dst = (struct in6_addr*)RTA_DATA(rta[RTA_DST-1]); if (rta[RTA_IIF-1]) memcpy(&iif, RTA_DATA(rta[RTA_IIF-1]), sizeof(int)); @@ -1617,8 +1611,7 @@ NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid; err = rt6_fill_node(skb, rt, - fl.nl_u.ip6_u.daddr, - fl.nl_u.ip6_u.saddr, + fl.fl6_dst, fl.fl6_src, iif, RTM_NEWROUTE, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, nlh); Index: net/ipv6/tcp_ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/tcp_ipv6.c,v retrieving revision 1.1.1.12 retrieving revision 1.1.1.12.6.3 diff -u -r1.1.1.12 -r1.1.1.12.6.3 --- net/ipv6/tcp_ipv6.c 8 Apr 2003 08:57:58 -0000 1.1.1.12 +++ net/ipv6/tcp_ipv6.c 14 Apr 2003 18:38:53 -0000 1.1.1.12.6.3 @@ -670,12 +670,12 @@ fl.fl6_dst = &np->daddr; fl.fl6_src = saddr; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = usin->sin6_port; - fl.uli_u.ports.sport = inet->sport; + fl.fl_ip_dport = usin->sin6_port; + fl.fl_ip_sport = inet->sport; if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } if (!fl.fl6_src) @@ -796,11 +796,11 @@ for now. */ fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &np->daddr; - fl.nl_u.ip6_u.saddr = &np->saddr; + fl.fl6_dst = &np->daddr; + fl.fl6_src = &np->saddr; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = inet->dport; - fl.uli_u.ports.sport = inet->sport; + fl.fl_ip_dport = inet->dport; + fl.fl_ip_sport = inet->sport; dst = ip6_route_output(sk, &fl); } else @@ -881,12 +881,12 @@ int err = -1; fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr; - fl.nl_u.ip6_u.saddr = &req->af.v6_req.loc_addr; + fl.fl6_dst = &req->af.v6_req.rmt_addr; + fl.fl6_src = &req->af.v6_req.loc_addr; fl.fl6_flowlabel = 0; fl.oif = req->af.v6_req.iif; - fl.uli_u.ports.dport = req->rmt_port; - fl.uli_u.ports.sport = inet_sk(sk)->sport; + fl.fl_ip_dport = req->rmt_port; + fl.fl_ip_sport = inet_sk(sk)->sport; if (dst == NULL) { opt = np->opt; @@ -901,7 +901,7 @@ if (opt && opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } dst = ip6_route_output(sk, &fl); @@ -917,7 +917,7 @@ &req->af.v6_req.loc_addr, &req->af.v6_req.rmt_addr, csum_partial((char *)th, skb->len, skb->csum)); - fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr; + fl.fl6_dst = &req->af.v6_req.rmt_addr; err = ip6_xmit(sk, skb, &fl, opt); if (err == NET_XMIT_CN) err = 0; @@ -1019,19 +1019,18 @@ buff->csum = csum_partial((char *)t1, sizeof(*t1), 0); - fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr; - fl.nl_u.ip6_u.saddr = &skb->nh.ipv6h->daddr; + fl.fl6_dst = &skb->nh.ipv6h->saddr; + fl.fl6_src = &skb->nh.ipv6h->daddr; fl.fl6_flowlabel = 0; - t1->check = csum_ipv6_magic(fl.nl_u.ip6_u.saddr, - fl.nl_u.ip6_u.daddr, + t1->check = csum_ipv6_magic(fl.fl6_src, fl.fl6_dst, sizeof(*t1), IPPROTO_TCP, buff->csum); fl.proto = IPPROTO_TCP; fl.oif = tcp_v6_iif(skb); - fl.uli_u.ports.dport = t1->dest; - fl.uli_u.ports.sport = t1->source; + fl.fl_ip_dport = t1->dest; + fl.fl_ip_sport = t1->source; /* sk = NULL, but it is safe for now. RST socket required. */ buff->dst = ip6_route_output(NULL, &fl); @@ -1084,19 +1083,18 @@ buff->csum = csum_partial((char *)t1, tot_len, 0); - fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr; - fl.nl_u.ip6_u.saddr = &skb->nh.ipv6h->daddr; + fl.fl6_dst = &skb->nh.ipv6h->saddr; + fl.fl6_src = &skb->nh.ipv6h->daddr; fl.fl6_flowlabel = 0; - t1->check = csum_ipv6_magic(fl.nl_u.ip6_u.saddr, - fl.nl_u.ip6_u.daddr, + t1->check = csum_ipv6_magic(fl.fl6_src, fl.fl6_dst, tot_len, IPPROTO_TCP, buff->csum); fl.proto = IPPROTO_TCP; fl.oif = tcp_v6_iif(skb); - fl.uli_u.ports.dport = t1->dest; - fl.uli_u.ports.sport = t1->source; + fl.fl_ip_dport = t1->dest; + fl.fl_ip_sport = t1->source; buff->dst = ip6_route_output(NULL, &fl); @@ -1335,16 +1333,16 @@ if (dst == NULL) { fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr; + fl.fl6_dst = &req->af.v6_req.rmt_addr; if (opt && opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } - fl.nl_u.ip6_u.saddr = &req->af.v6_req.loc_addr; + fl.fl6_src = &req->af.v6_req.loc_addr; fl.fl6_flowlabel = 0; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = req->rmt_port; - fl.uli_u.ports.sport = inet_sk(sk)->sport; + fl.fl_ip_dport = req->rmt_port; + fl.fl_ip_sport = inet_sk(sk)->sport; dst = ip6_route_output(sk, &fl); } @@ -1732,16 +1730,16 @@ struct flowi fl; fl.proto = IPPROTO_TCP; - fl.nl_u.ip6_u.daddr = &np->daddr; - fl.nl_u.ip6_u.saddr = &np->saddr; + fl.fl6_dst = &np->daddr; + fl.fl6_src = &np->saddr; fl.fl6_flowlabel = np->flow_label; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = inet->dport; - fl.uli_u.ports.sport = inet->sport; + fl.fl_ip_dport = inet->dport; + fl.fl_ip_sport = inet->sport; if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } dst = ip6_route_output(sk, &fl); @@ -1774,12 +1772,12 @@ fl.fl6_flowlabel = np->flow_label; IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel); fl.oif = sk->bound_dev_if; - fl.uli_u.ports.sport = inet->sport; - fl.uli_u.ports.dport = inet->dport; + fl.fl_ip_sport = inet->sport; + fl.fl_ip_dport = inet->dport; if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; - fl.nl_u.ip6_u.daddr = rt0->addr; + fl.fl6_dst = rt0->addr; } dst = __sk_dst_check(sk, np->dst_cookie); @@ -1799,7 +1797,7 @@ skb->dst = dst_clone(dst); /* Restore final destination back after routing done */ - fl.nl_u.ip6_u.daddr = &np->daddr; + fl.fl6_dst = &np->daddr; return ip6_xmit(sk, skb, &fl, np->opt); } Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/udp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.8.2 diff -u -r1.1.1.9 -r1.1.1.9.8.2 --- net/ipv6/udp.c 2 Apr 2003 04:16:14 -0000 1.1.1.9 +++ net/ipv6/udp.c 14 Apr 2003 18:38:53 -0000 1.1.1.9.8.2 @@ -352,8 +352,8 @@ fl.fl6_dst = &np->daddr; fl.fl6_src = &saddr; fl.oif = sk->bound_dev_if; - fl.uli_u.ports.dport = inet->dport; - fl.uli_u.ports.sport = inet->sport; + fl.fl_ip_dport = inet->dport; + fl.fl_ip_sport = inet->sport; if (!fl.oif && (addr_type&IPV6_ADDR_MULTICAST)) fl.oif = np->mcast_oif; @@ -936,8 +936,8 @@ fl.fl6_dst = daddr; if (fl.fl6_src == NULL && !ipv6_addr_any(&np->saddr)) fl.fl6_src = &np->saddr; - fl.uli_u.ports.dport = udh.uh.dest; - fl.uli_u.ports.sport = udh.uh.source; + fl.fl_ip_dport = udh.uh.dest; + fl.fl_ip_sport = udh.uh.source; err = ip6_build_xmit(sk, udpv6_getfrag, &udh, &fl, len, opt, hlimit, msg->msg_flags); Index: net/ipv6/xfrm6_policy.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/xfrm6_policy.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.2.2.3 diff -u -r1.1.1.2 -r1.1.1.2.2.3 --- net/ipv6/xfrm6_policy.c 14 Apr 2003 04:34:17 -0000 1.1.1.2 +++ net/ipv6/xfrm6_policy.c 14 Apr 2003 18:57:36 -0000 1.1.1.2.2.3 @@ -195,8 +195,8 @@ if (pskb_may_pull(skb, skb->nh.raw + offset + 4 - skb->data)) { u16 *ports = (u16 *)exthdr; - fl->uli_u.ports.sport = ports[0]; - fl->uli_u.ports.dport = ports[1]; + fl->fl_ip_sport = ports[0]; + fl->fl_ip_dport = ports[1]; } return; @@ -205,7 +205,7 @@ case IPPROTO_ESP: case IPPROTO_COMP: default: - fl->uli_u.spi = 0; + fl->fl_ipsec_spi = 0; return; }; } Index: net/ipv6/xfrm6_state.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/xfrm6_state.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.10.2 diff -u -r1.1.1.1 -r1.1.1.1.10.2 --- net/ipv6/xfrm6_state.c 24 Mar 2003 05:46:10 -0000 1.1.1.1 +++ net/ipv6/xfrm6_state.c 14 Apr 2003 18:38:53 -0000 1.1.1.1.10.2 @@ -27,9 +27,9 @@ * to current session. */ memcpy(&x->sel.daddr, fl->fl6_dst, sizeof(struct in6_addr)); memcpy(&x->sel.saddr, fl->fl6_src, sizeof(struct in6_addr)); - x->sel.dport = fl->uli_u.ports.dport; + x->sel.dport = fl->fl_ip_dport; x->sel.dport_mask = ~0; - x->sel.sport = fl->uli_u.ports.sport; + x->sel.sport = fl->fl_ip_sport; x->sel.sport_mask = ~0; x->sel.prefixlen_d = 128; x->sel.prefixlen_s = 128; Index: net/sctp/ipv6.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/sctp/ipv6.c,v retrieving revision 1.1.1.13 retrieving revision 1.1.1.13.6.1 diff -u -r1.1.1.13 -r1.1.1.13.6.1 --- net/sctp/ipv6.c 8 Apr 2003 08:57:59 -0000 1.1.1.13 +++ net/sctp/ipv6.c 14 Apr 2003 18:57:17 -0000 1.1.1.13.6.1 @@ -165,8 +165,8 @@ fl.oif = transport->saddr.v6.sin6_scope_id; else fl.oif = sk->bound_dev_if; - fl.uli_u.ports.sport = inet_sk(sk)->sport; - fl.uli_u.ports.dport = transport->ipaddr.v6.sin6_port; + fl.fl_ip_sport = inet_sk(sk)->sport; + fl.fl_ip_dport = transport->ipaddr.v6.sin6_port; if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From yoshfuji@linux-ipv6.org Mon Apr 14 23:59:14 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 14 Apr 2003 23:59:17 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3F6xCFu008530 for ; Mon, 14 Apr 2003 23:59:13 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3F6xcDG007709; Tue, 15 Apr 2003 15:59:38 +0900 Date: Tue, 15 Apr 2003 15:59:38 +0900 (JST) Message-Id: <20030415.155938.23711671.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: rddunlap@osdl.org, linux-net@vger.kernel.org, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030415.014047.39346510.yoshfuji@linux-ipv6.org> References: <20030415.002915.71906095.yoshfuji@linux-ipv6.org> <20030414.090610.117741299.davem@redhat.com> <20030415.014047.39346510.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2234 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 861 Lines: 23 In article <20030415.014047.39346510.yoshfuji@linux-ipv6.org> (at Tue, 15 Apr 2003 01:40:47 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > In article <20030414.090610.117741299.davem@redhat.com> (at Mon, 14 Apr 2003 09:06:10 -0700 (PDT)), "David S. Miller" says: > > > So we'd then have /proc/net/dev_snmp6/{lo,eth0,eth1} etc. > > > > Ok? > > Okay. I'd like to see ifIndex in that file, too. BTW, for example, if we do # ip link set eth9 name foobar if_indextoname() will return foobar. we, however, will see /proc/sys/net/ipv6/conf/eth9 instead of /proc/sys/net/ipv6/conf/foobar. This is not good. Is this just a bug not having NETDEV_CHANGENAME handler to rename it? -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From erik@hensema.net Tue Apr 15 01:09:52 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 01:10:03 -0700 (PDT) Received: from dexter.hensema.net (cc78409-a.hnglo1.ov.home.nl [212.120.97.185]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3F89oFu010119 for ; Tue, 15 Apr 2003 01:09:52 -0700 Received: from bender.home.hensema.net (bender.ipv6.hensema.net [IPv6:2001:888:10a1:0:202:44ff:fe69:60f5]) by dexter.hensema.net (8.12.3/8.12.3) with ESMTP id h3F89nfc009843 for ; Tue, 15 Apr 2003 10:09:49 +0200 Received: from bender.home.hensema.net (localhost [127.0.0.1]) by bender.home.hensema.net (8.12.3/8.12.3) with ESMTP id h3F89mcp001309 for ; Tue, 15 Apr 2003 10:09:49 +0200 Received: (from erik@localhost) by bender.home.hensema.net (8.12.3/8.12.3/Submit) id h3F89mOT001308 for netdev@oss.sgi.com; Tue, 15 Apr 2003 10:09:48 +0200 Date: Tue, 15 Apr 2003 10:09:48 +0200 From: Erik Hensema To: netdev@oss.sgi.com Subject: IPv6 autoconfiguration slow on 2.5.66-mm3 Message-ID: <20030415080948.GB1192@hensema.net> Reply-To: erik@hensema.net Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.27i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2235 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: erik@hensema.net Precedence: bulk X-list: netdev Content-Length: 1358 Lines: 38 Hi, My 2.5.66-mm3 system is slow to receive an autoconfigured IPv6 address. Today it took about 7 minutes of uptime before my interface was configured. This was before: | bender:~ # ip -6 a | 1: lo: mtu 16436 qdisc noqueue | inet6 ::1/128 scope host | 3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 | inet6 fe80::202:44ff:fe69:60f5/64 scope link And this after: | bender:~ # ip -6 a | 1: lo: mtu 16436 qdisc noqueue | inet6 ::1/128 scope host | 3: eth0: mtu 1500 qdisc pfifo_fast qlen 100 | inet6 fe80::202:44ff:fe69:60f5/64 scope link | inet6 2001:888:10a1:0:202:44ff:fe69:60f5/64 scope global dynamic | valid_lft 2591995sec preferred_lft 604795sec | bender:~ # uptime | 10:01:14 up 7 min, 5 users, load average: 0.02, 0.14, 0.09 In dmesg: | 8139too Fast Ethernet driver 0.9.26 | eth0: RealTek RTL8139 Fast Ethernet at 0xe0b4ee00, 00:02:44:69:60:f5, IRQ 16 | eth0: Identified 8139 chip type 'RTL-8139C' | eth0: Setting 100mbps full-duplex based on auto-negotiated partner ability 45e1. | eth0: no IPv6 routers present My router is running zebra-0.92a-238 (SuSE 8.0). Autoconfiguration works fine and instantly on 2.4 kernels. It *could* be IO-APIC related, I haven't tested that yet. -- Erik Hensema (erik@hensema.net) From kala@pinerecords.com Tue Apr 15 06:43:21 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 06:43:44 -0700 (PDT) Received: from louise.pinerecords.com (louise.pinerecords.com [213.168.176.16]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FDhJFu022365 for ; Tue, 15 Apr 2003 06:43:21 -0700 Received: from louise.pinerecords.com (kala@localhost [127.0.0.1]) by louise.pinerecords.com with ESMTP id h3FDh5xh022776 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 15 Apr 2003 15:43:05 +0200 Received: (from kala@localhost) by louise.pinerecords.com (submit) id h3FDh5tF022775; Tue, 15 Apr 2003 15:43:05 +0200 Date: Tue, 15 Apr 2003 15:43:05 +0200 From: Tomas Szepe To: jamal Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [PATCH] qdisc oops fix Message-ID: <20030415134305.GF15944@louise.pinerecords.com> References: <20030415084706.O1131@shell.cyberus.ca> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030415084706.O1131@shell.cyberus.ca> User-Agent: Mutt/1.4.1i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2236 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: szepe@pinerecords.com Precedence: bulk X-list: netdev Content-Length: 4466 Lines: 120 > [hadi@cyberus.ca] > > I dont understand why > > - sch = kmalloc(size, GFP_KERNEL); > + sch = kmalloc(size, GFP_ATOMIC); > > mysteriously fixes the problem? Could the problem be elsewhere? > Can you repost what the issue was? I am not on lk and i just saw the > posting on a web page. Here. Date: Sat, 12 Apr 2003 10:21:37 +0200 From: Martin Volf To: linux-kernel@vger.kernel.org Subject: qdisc misbehavior detected at slab.c:1128 + fix Hello, when loading hundreds of QoS rules by tc on SMP machine (2 Xeons with HT) right after booting the system, I always get kernel BUG at slab.c:1128: ksymoops 2.4.8 on i686 2.4.20. Options used -V (default) -k /proc/ksyms (default) -l /proc/modules (default) -o /lib/modules/2.4.20/ (default) -m /boot/System.map (specified) kernel BUG at slab.c:1128! invalid operand: 0000 CPU: 0 EIP: 0010:[] Not tainted Using defaults from ksymoops -t elf32-i386 -a i386 EFLAGS: 00010202 eax: 000001f0 ebx: 00000000 ecx: 000001f0 edx: 00000000 esi: dfff9450 edi: 000001f0 ebp: dc7bda00 esp: dc5e3bfc ds: 0018 es: 0018 ss: 0018 Process tc (pid: 303, stackpage=dc5e3000) Stack: 00000246 000001f0 000001f0 dfff9458 dfff9460 dfff9450 00000246 000001f0 dc7bda00 c01376fd dfff9450 000001f0 000001f0 dc652e00 c02d3a60 dc711460 dc7bda00 c021b809 dfff9450 000001f0 c15fea00 00000064 dc652e00 dc5b8034 Call Trace: [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] Code: 0f 0b 68 04 f9 63 27 c0 c7 44 24 0c 01 00 00 00 89 c8 25 f0 >>EIP; c01367b8 <===== >>esi; dfff9450 <_end+1fc91518/20686128> >>ebp; dc7bda00 <_end+1c455ac8/20686128> >>esp; dc5e3bfc <_end+1c27bcc4/20686128> Trace; c01376fd <__kmem_cache_alloc+6d/140> Trace; c021b809 Trace; e0a4b71d <[sch_htb]htb_change_class+40d/600> Trace; e0a48108 <[sch_htb]htb_find+58/70> Trace; c021d5aa Trace; e0a4d1e0 <[sch_htb]htb_class_ops+0/0> Trace; c0219b18 Trace; c0219740 Trace; c0219450 Trace; c022121a Trace; c02209f1 Trace; c0220f71 Trace; c020a5c5 Trace; c020bce7 Trace; c0130010 Trace; c012d5b5 Trace; c012d821 Trace; c0117f48 Trace; c020b11d Trace; c020c1d6 Trace; c0117dc0 Trace; c0107800 Trace; c010770f Code; c01367b8 00000000 <_EIP>: Code; c01367b8 <===== 0: 0f 0b ud2a <===== Code; c01367ba 2: 68 04 f9 63 27 push $0x2763f904 Code; c01367bf 7: c0 c7 44 rol $0x44,%bh Code; c01367c2 a: 24 0c and $0xc,%al Code; c01367c4 c: 01 00 add %eax,(%eax) Code; c01367c6 e: 00 00 add %al,(%eax) Code; c01367c8 10: 89 c8 mov %ecx,%eax Code; c01367ca 12: 25 f0 00 00 00 and $0xf0,%eax <0>Kernel panic: Aiee, killing interrupt handler! On UP machine even with SMP kernel (the same configuration) it never happened. Guided by the comment in slab.c:1122 I tried (without knowing what I was doing;-) following little patch to net/sched/sch_generic.c and it seems to fix it. --- sch_generic.c.orig 2003-01-04 14:42:02.000000000 +0100 +++ sch_generic.c 2003-04-12 08:58:34.000000000 +0200 @@ -372,7 +372,7 @@ struct Qdisc *sch; int size = sizeof(*sch) + ops->priv_size; - sch = kmalloc(size, GFP_KERNEL); + sch = kmalloc(size, GFP_ATOMIC); if (!sch) return NULL; memset(sch, 0, size); Is it the correct fix? Thanks, Martin Volf From hadi@cyberus.ca Tue Apr 15 07:00:21 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 07:00:24 -0700 (PDT) Received: from mx02.cyberus.ca (mx02.cyberus.ca [216.191.240.26]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FE0KFu023519 for ; Tue, 15 Apr 2003 07:00:21 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx02.cyberus.ca with esmtp (Exim 4.14) id 195QC9-000C5X-Vg; Tue, 15 Apr 2003 09:09:53 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3FD9Bqu002297; Tue, 15 Apr 2003 09:09:11 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3FD95XG002294; Tue, 15 Apr 2003 09:09:11 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 15 Apr 2003 09:09:05 -0400 (EDT) From: jamal To: Tomas Szepe cc: linux-kernel@vger.kernel.org, "" Subject: Re: [PATCH] qdisc oops fix Message-ID: <20030415084706.O1131@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2237 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 396 Lines: 17 Hi, Pass those net patches to the maintainers (not Alan, not Linus, not Marcello) and CC netdev (optionally cc lk)? I dont understand why - sch = kmalloc(size, GFP_KERNEL); + sch = kmalloc(size, GFP_ATOMIC); mysteriously fixes the problem? Could the problem be elsewhere? Can you repost what the issue was? I am not on lk and i just saw the posting on a web page. cheers, jamal From hadi@cyberus.ca Tue Apr 15 07:32:07 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 07:32:12 -0700 (PDT) Received: from mx01.cyberus.ca (mx01.cyberus.ca [216.191.240.22]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FEW1Fu024276 for ; Tue, 15 Apr 2003 07:32:06 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx01.cyberus.ca with esmtp (Exim 4.14) id 195RTZ-0008Ab-6F; Tue, 15 Apr 2003 10:31:57 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3FEV5qu002404; Tue, 15 Apr 2003 10:31:05 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3FEV4Q3002401; Tue, 15 Apr 2003 10:31:04 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 15 Apr 2003 10:31:04 -0400 (EDT) From: jamal To: Tomas Szepe cc: linux-kernel@vger.kernel.org, "" Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <20030415134305.GF15944@louise.pinerecords.com> Message-ID: <20030415102918.U2397@shell.cyberus.ca> References: <20030415084706.O1131@shell.cyberus.ca> <20030415134305.GF15944@louise.pinerecords.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2238 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 1123 Lines: 34 Can you try a different qdisc - not htb to reproduce the problem? cheers, jamal On Tue, 15 Apr 2003, Tomas Szepe wrote: > Trace; c01376fd <__kmem_cache_alloc+6d/140> > Trace; c021b809 > Trace; e0a4b71d <[sch_htb]htb_change_class+40d/600> > Trace; e0a48108 <[sch_htb]htb_find+58/70> > Trace; c021d5aa > Trace; e0a4d1e0 <[sch_htb]htb_class_ops+0/0> > Trace; c0219b18 > Trace; c0219740 > Trace; c0219450 > Trace; c022121a > Trace; c02209f1 > Trace; c0220f71 > Trace; c020a5c5 > Trace; c020bce7 > Trace; c0130010 > Trace; c012d5b5 > Trace; c012d821 > Trace; c0117f48 > Trace; c020b11d > Trace; c020c1d6 > Trace; c0117dc0 > Trace; c0107800 > Trace; c010770f > From rddunlap@osdl.org Tue Apr 15 09:35:55 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 09:36:00 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FGZsFu029567 for ; Tue, 15 Apr 2003 09:35:55 -0700 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3FGZjW24218; Tue, 15 Apr 2003 09:35:45 -0700 Date: Tue, 15 Apr 2003 09:34:42 -0700 From: "Randy.Dunlap" To: YOSHIFUJI Hideaki / =?ISO-8859-1?Q?=B5=C8=C6=A3=B1=D1=CC=C0?= Cc: davem@redhat.com, linux-net@vger.kernel.org, netdev@oss.sgi.com, usagi-core@linux-ipv6.org Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface Message-Id: <20030415093442.0913486d.rddunlap@osdl.org> In-Reply-To: <20030415.021728.70559400.yoshfuji@linux-ipv6.org> References: <20030414.090610.117741299.davem@redhat.com> <20030415.014047.39346510.yoshfuji@linux-ipv6.org> <20030414095030.50ad9652.rddunlap@osdl.org> <20030415.021728.70559400.yoshfuji@linux-ipv6.org> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3FGZsFu029567 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2239 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 1338 Lines: 39 On Tue, 15 Apr 2003 02:17:28 +0900 (JST) YOSHIFUJI Hideaki / µÈÆ£±ÑÌÀ wrote: | In article <20030414095030.50ad9652.rddunlap@osdl.org> (at Mon, 14 Apr 2003 09:50:30 -0700), "Randy.Dunlap" says: | | > On Tue, 15 Apr 2003 01:40:47 +0900 (JST) YOSHIFUJI Hideaki / µÈÆ£±ÑÌÀ wrote: | > | > | In article <20030414.090610.117741299.davem@redhat.com> (at Mon, 14 Apr 2003 09:06:10 -0700 (PDT)), "David S. Miller" says: | > | | > | > So we'd then have /proc/net/dev_snmp6/{lo,eth0,eth1} etc. | > | > | > | > Ok? | > | | > | Okay. I'd like to see ifIndex in that file, too. | > | > Yes, sounds good. | > | > Is this something that you plan to extract from the USAGI Linux 2.4 | > patches and submit for 2.5, or should I continue with my patches? | | Please let me see your patch in details. | I'll do it today... (It is 2:00am... I'm sleepy... zzz...) | | -- | Hideaki YOSHIFUJI @ USAGI Project | GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA Hi- Do you have any updates (recommendations) on how to proceed on this? Have you looked at my patch file? I think that we can make some progress without having an answer to your question about /proc/sys/net/ipv6/conf/foobar file renaming. Thanks, -- ~Randy From yoshfuji@linux-ipv6.org Tue Apr 15 11:06:53 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 11:06:59 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FI6pFu032381 for ; Tue, 15 Apr 2003 11:06:53 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3FI7IDG011296; Wed, 16 Apr 2003 03:07:18 +0900 Date: Wed, 16 Apr 2003 03:07:10 +0900 (JST) Message-Id: <20030416.030710.19512552.yoshfuji@linux-ipv6.org> To: rddunlap@osdl.org Cc: davem@redhat.com, linux-net@vger.kernel.org, netdev@oss.sgi.com, usagi-core@linux-ipv6.org Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030415093442.0913486d.rddunlap@osdl.org> References: <20030414095030.50ad9652.rddunlap@osdl.org> <20030415.021728.70559400.yoshfuji@linux-ipv6.org> <20030415093442.0913486d.rddunlap@osdl.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2240 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 842 Lines: 24 In article <20030415093442.0913486d.rddunlap@osdl.org> (at Tue, 15 Apr 2003 09:34:42 -0700), "Randy.Dunlap" says: > Do you have any updates (recommendations) on how to proceed on this? > Have you looked at my patch file? Yes. I looked at the patch. I also learned about seqfile. Now I'm typing procfs seqfile part. I'll send you my (uncompleted) patch. I think per-cpu * per-interface. and, I believe statictics should be held in inet6_dev{}. We need ipv6 part, too. Would you work on this? (I don't have enough time to complete this in April...) > I think that we can make some progress without having an answer to > your question about /proc/sys/net/ipv6/conf/foobar file renaming. Sure. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From rddunlap@osdl.org Tue Apr 15 11:13:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 11:13:55 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FIDiFu032757 for ; Tue, 15 Apr 2003 11:13:45 -0700 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3FIDdW25867; Tue, 15 Apr 2003 11:13:39 -0700 Date: Tue, 15 Apr 2003 11:12:36 -0700 From: "Randy.Dunlap" To: YOSHIFUJI Hideaki / =?ISO-8859-1?Q?=B5=C8=C6=A3=B1=D1=CC=C0?= Cc: davem@redhat.com, linux-net@vger.kernel.org, netdev@oss.sgi.com, usagi-core@linux-ipv6.org Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface Message-Id: <20030415111236.6e7e8ca2.rddunlap@osdl.org> In-Reply-To: <20030416.030710.19512552.yoshfuji@linux-ipv6.org> References: <20030414095030.50ad9652.rddunlap@osdl.org> <20030415.021728.70559400.yoshfuji@linux-ipv6.org> <20030415093442.0913486d.rddunlap@osdl.org> <20030416.030710.19512552.yoshfuji@linux-ipv6.org> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3FIDiFu032757 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2241 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 947 Lines: 30 On Wed, 16 Apr 2003 03:07:10 +0900 (JST) YOSHIFUJI Hideaki / µÈÆ£±ÑÌÀ wrote: | In article <20030415093442.0913486d.rddunlap@osdl.org> (at Tue, 15 Apr 2003 09:34:42 -0700), "Randy.Dunlap" says: | | > Do you have any updates (recommendations) on how to proceed on this? | > Have you looked at my patch file? | | Yes. I looked at the patch. | I also learned about seqfile. | Now I'm typing procfs seqfile part. | I'll send you my (uncompleted) patch. I can help with seq_file if you need it. | I think per-cpu * per-interface. | and, I believe statictics should be held in inet6_dev{}. | We need ipv6 part, too. Would you work on this? | (I don't have enough time to complete this in April...) Yes, I'll begin on IPv6 statistics. | > I think that we can make some progress without having an answer to | > your question about /proc/sys/net/ipv6/conf/foobar file renaming. | | Sure. -- ~Randy From rddunlap@osdl.org Tue Apr 15 13:15:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 13:15:49 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FKFiFu004259 for ; Tue, 15 Apr 2003 13:15:45 -0700 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3FKFhW17793; Tue, 15 Apr 2003 13:15:43 -0700 Date: Tue, 15 Apr 2003 13:14:39 -0700 From: "Randy.Dunlap" To: linux-net@vger.kernel.org Cc: netdev@oss.sgi.com Subject: [mini-howto] network-interface-naming Message-Id: <20030415131439.050edd43.rddunlap@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2242 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev Content-Length: 252 Lines: 13 Hi, Based on a couple of email threads on lkml last month, I did a short writeup of (ethernet) network-interface naming. It's available at http://www.xenotime.net/linux/network-interface-names.txt Corrections to it are welcome. Thanks, -- ~Randy From kala@pinerecords.com Tue Apr 15 14:10:58 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 14:11:06 -0700 (PDT) Received: from louise.pinerecords.com (root@louise.pinerecords.com [213.168.176.16]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FLAuFu005935 for ; Tue, 15 Apr 2003 14:10:57 -0700 Received: from louise.pinerecords.com (kala@localhost [127.0.0.1]) by louise.pinerecords.com with ESMTP id h3FLAoxh025796 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 15 Apr 2003 23:10:50 +0200 Received: (from kala@localhost) by louise.pinerecords.com (submit) id h3FLAnV4025795; Tue, 15 Apr 2003 23:10:49 +0200 Date: Tue, 15 Apr 2003 23:10:49 +0200 From: Tomas Szepe To: jamal Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [PATCH] qdisc oops fix Message-ID: <20030415211049.GB22780@louise.pinerecords.com> References: <20030415084706.O1131@shell.cyberus.ca> <20030415134305.GF15944@louise.pinerecords.com> <20030415102918.U2397@shell.cyberus.ca> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030415102918.U2397@shell.cyberus.ca> User-Agent: Mutt/1.4.1i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2243 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: szepe@pinerecords.com Precedence: bulk X-list: netdev Content-Length: 164 Lines: 8 > [hadi@cyberus.ca] > > Can you try a different qdisc - not htb to reproduce the problem? Not quite possible I'm afraid. -- Tomas Szepe From ja@ssi.bg Tue Apr 15 15:59:46 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 15:59:54 -0700 (PDT) Received: from u.domain.uli (ja.mac.ssi.bg [217.79.71.194]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3FMxgFu017919 for ; Tue, 15 Apr 2003 15:59:44 -0700 Received: from localhost (IDENT:ja@localhost [127.0.0.1]) by u.domain.uli (8.11.6/8.11.6) with ESMTP id h3FMgie01856; Wed, 16 Apr 2003 01:42:44 +0300 Date: Wed, 16 Apr 2003 01:42:43 +0300 (EEST) From: Julian Anastasov X-X-Sender: ja@u.domain.uli To: Tomas Szepe cc: netdev@oss.sgi.com, jamal , Martin Devera Subject: Re: [PATCH] qdisc oops fix Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2244 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ja@ssi.bg Precedence: bulk X-list: netdev Content-Length: 295 Lines: 16 Hello, May be this is not the right fix: > - sch = kmalloc(size, GFP_KERNEL); > + sch = kmalloc(size, GFP_ATOMIC); better Devik to provide fix for htb_change_class that will not call qdisc_create_dflt under bh lock (sch_tree_lock). Regards -- Julian Anastasov From hadi@cyberus.ca Tue Apr 15 17:54:18 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 17:54:25 -0700 (PDT) Received: from mx01.cyberus.ca (mx01.cyberus.ca [216.191.240.22]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3G0sHFu021933 for ; Tue, 15 Apr 2003 17:54:18 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx01.cyberus.ca with esmtp (Exim 4.14) id 195bBl-000Iqx-NC; Tue, 15 Apr 2003 20:54:13 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3G0rUqu004043; Tue, 15 Apr 2003 20:53:30 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3G0rSvi004040; Tue, 15 Apr 2003 20:53:29 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Tue, 15 Apr 2003 20:53:28 -0400 (EDT) From: jamal To: Julian Anastasov cc: Tomas Szepe , "" , Martin Devera Subject: Re: [PATCH] qdisc oops fix In-Reply-To: Message-ID: <20030415205232.Y4013@shell.cyberus.ca> References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2245 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 458 Lines: 28 Yep. That looks like the problem. Thanks for narrowing it down Julian. cheers, jamal On Wed, 16 Apr 2003, Julian Anastasov wrote: > > Hello, > > May be this is not the right fix: > > > - sch = kmalloc(size, GFP_KERNEL); > > + sch = kmalloc(size, GFP_ATOMIC); > > better Devik to provide fix for htb_change_class that will not > call qdisc_create_dflt under bh lock (sch_tree_lock). > > Regards > > -- > Julian Anastasov > > From util@hosting.rdsbv.ro Tue Apr 15 22:41:26 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 22:41:34 -0700 (PDT) Received: from hosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3G5fOFu001414 for ; Tue, 15 Apr 2003 22:41:26 -0700 Received: from hosting.rdsbv.ro (hosting.rdsbv.ro [213.157.185.164]) by hosting.rdsbv.ro (8.12.9/8.12.8) with ESMTP id h3G5f20A027319; Wed, 16 Apr 2003 08:41:04 +0300 Date: Wed, 16 Apr 2003 08:41:01 +0300 (EEST) From: Catalin BOIE To: jamal cc: Tomas Szepe , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <20030415084706.O1131@shell.cyberus.ca> Message-ID: References: <20030415084706.O1131@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2246 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 1550 Lines: 50 > - sch = kmalloc(size, GFP_KERNEL); > + sch = kmalloc(size, GFP_ATOMIC); > > mysteriously fixes the problem? Could the problem be elsewhere? > Can you repost what the issue was? I am not on lk and i just saw the > posting on a web page. With many rules (~5000 classes and ~3500 qdiscs and ~50000 filters) the kernel oopses in slab.c:1128. It happens on high rates (~15mbit). On low rates, doesn't. Seems that an interrupt come and broke the memory allocation. >>EIP; c0127ab4 <===== >>EAX; ffffffff >>EBX; c12c52c0 >>EDI; c12c52c0 >>ESP; ceab1c60 Trace; c0127e0f Trace; c01d3cac Trace; d081ecc7 Trace; c01d5265 Trace; d0820600 Trace; c01d27e4 Trace; c01d0605 <__neigh_event_send+89/1b4> Trace; c01d7cd4 Trace; c01d7730 Trace; c01d7b73 Trace; c01c79d5 Trace; c01c8b48 Trace; c0120010 > > cheers, > jamal > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > --- Catalin(ux) BOIE catab@deuroconsult.ro From devik@cdi.cz Tue Apr 15 23:50:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 15 Apr 2003 23:50:52 -0700 (PDT) Received: from luxik.cdi.cz (root@inway106.cdi.cz [213.151.81.106]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3G6ocFu003122 for ; Tue, 15 Apr 2003 23:50:40 -0700 Received: from a81-137.dialup.iol.cz ([194.228.137.81] helo=devix) by luxik.cdi.cz with asmtp (Exim 3.34 #3) id 195gkD-0002er-00; Wed, 16 Apr 2003 08:50:10 +0200 Received: from devik (helo=localhost) by devix with local-esmtp (Exim 3.16 #8) id 195gRR-0000Cv-00; Wed, 16 Apr 2003 08:30:45 +0200 Date: Wed, 16 Apr 2003 08:30:45 +0200 (CEST) From: devik X-X-Sender: To: Julian Anastasov cc: Tomas Szepe , , jamal Subject: Re: [PATCH] qdisc oops fix In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-2013918615-1050474645=:557" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2247 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: devik@cdi.cz Precedence: bulk X-list: netdev Content-Length: 13297 Lines: 244 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. --8323328-2013918615-1050474645=:557 Content-Type: TEXT/PLAIN; charset=US-ASCII Hello, The bug you are speaking about was fixed at 27 Jan 2003 and is included in 2.4.21pre (I hope ;-). I'm attaching diff from 2.4.20 version to my current one. regards, ------------------------------- Martin Devera aka devik Linux kernel QoS/HTB maintainer http://luxik.cdi.cz/~devik/ On Wed, 16 Apr 2003, Julian Anastasov wrote: > > Hello, > > May be this is not the right fix: > > > - sch = kmalloc(size, GFP_KERNEL); > > + sch = kmalloc(size, GFP_ATOMIC); > > better Devik to provide fix for htb_change_class that will not > call qdisc_create_dflt under bh lock (sch_tree_lock). > > Regards > > -- > Julian Anastasov > > --8323328-2013918615-1050474645=:557 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="htb_2.4.20_1.19.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="htb_2.4.20_1.19.diff" LS0tIHNjaF9odGIuYwkyMDAzLzAxLzExIDIxOjMxOjMxCTEuMTYNCisrKyBz Y2hfaHRiLmMJMjAwMy8wMy8yMCAxNDowODozNg0KQEAgLTE5LDcgKzE5LDcg QEANCiAgKgkJCWNyZWF0ZWQgdGVzdCBjYXNlIHNvIHRoYXQgSSB3YXMgYWJs ZSB0byBmaXggbmFzdHkgYnVnDQogICoJCWFuZCBtYW55IG90aGVycy4gdGhh bmtzLg0KICAqDQotICogJElkOiBzY2hfaHRiLmMsdiAxLjE2IDIwMDMvMDEv MTEgMjE6MzE6MzEgZGV2aWsgRXhwICQNCisgKiAkSWQ6IHNjaF9odGIuYyx2 IDEuMTkgMjAwMy8wMy8yMCAxMjoxMzoxNCBkZXZpayBFeHAgZGV2aWsgJA0K ICAqLw0KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4NCiAjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+DQpAQCAtNzEsMTYgKzcxLDEyIEBADQogI2RlZmlu ZSBIVEJfSFlTVEVSRVNJUyAxLyogd2hldGhlciB0byB1c2UgbW9kZSBoeXN0 ZXJlc2lzIGZvciBzcGVlZHVwICovDQogI2RlZmluZSBIVEJfUUxPQ0soUykg c3Bpbl9sb2NrX2JoKCYoUyktPmRldi0+cXVldWVfbG9jaykNCiAjZGVmaW5l IEhUQl9RVU5MT0NLKFMpIHNwaW5fdW5sb2NrX2JoKCYoUyktPmRldi0+cXVl dWVfbG9jaykNCi0jZGVmaW5lIEhUQl9WRVIgMHgzMDAwOAkvKiBtYWpvciBt dXN0IGJlIG1hdGNoZWQgd2l0aCBudW1iZXIgc3VwbGllZCBieSBUQyBhcyB2 ZXJzaW9uICovDQorI2RlZmluZSBIVEJfVkVSIDB4MzAwMGMJLyogbWFqb3Ig bXVzdCBiZSBtYXRjaGVkIHdpdGggbnVtYmVyIHN1cGxpZWQgYnkgVEMgYXMg dmVyc2lvbiAqLw0KIA0KICNpZiBIVEJfVkVSID4+IDE2ICE9IFRDX0hUQl9Q Uk9UT1ZFUg0KICNlcnJvciAiTWlzbWF0Y2hlZCBzY2hfaHRiLmMgYW5kIHBr dF9zY2guaCINCiAjZW5kaWYNCiANCi0vKiB0ZW1wb3JhcnkgZGVidWcgZGVm aW5lcyB0byBiZSByZW1vdmVkIGFmdGVyIGJldGEgc3RhZ2UgKi8NCi0jZGVm aW5lIERFVklLX01FTkQoTikNCi0jZGVmaW5lIERFVklLX01TVEFSVChOKQ0K LQ0KIC8qIGRlYnVnZ2luZyBzdXBwb3J0OyBTIGlzIHN1YnN5c3RlbSwgdGhl c2UgYXJlIGRlZmluZWQ6DQogICAwIC0gbmV0bGluayBtZXNzYWdlcw0KICAg MSAtIGVucXVldWUNCkBAIC0yMTksNiArMjE1LDkgQEANCiAgICAgLyogdGlt ZSBvZiBuZWFyZXN0IGV2ZW50IHBlciBsZXZlbCAocm93KSAqLw0KICAgICB1 bnNpZ25lZCBsb25nIG5lYXJfZXZfY2FjaGVbVENfSFRCX01BWERFUFRIXTsN CiANCisgICAgLyogY2FjaGVkIHZhbHVlIG9mIGppZmZpZXMgaW4gZGVxdWV1 ZSAqLw0KKyAgICB1bnNpZ25lZCBsb25nIGppZmZpZXM7DQorDQogICAgIC8q IHdoZXRoZXIgd2UgaGl0IG5vbi13b3JrIGNvbnNlcnZpbmcgY2xhc3MgZHVy aW5nIHRoaXMgZGVxdWV1ZTsgd2UgdXNlICovDQogICAgIGludCBud2NfaGl0 OwkvKiB0aGlzIHRvIGRpc2FibGUgbWluZGVsYXkgY29tcGxhaW50IGluIGRl cXVldWUgKi8NCiANCkBAIC0zMzgsNyArMzM3LDcgQEANCiBzdGF0aWMgdm9p ZCBodGJfZGVidWdfZHVtcCAoc3RydWN0IGh0Yl9zY2hlZCAqcSkNCiB7DQog CWludCBpLHA7DQotCXByaW50ayhLRVJOX0RFQlVHICJodGIqZyBqPSVsdVxu IixqaWZmaWVzKTsNCisJcHJpbnRrKEtFUk5fREVCVUcgImh0YipnIGo9JWx1 IGxqPSVsdVxuIixqaWZmaWVzLHEtPmppZmZpZXMpOw0KIAkvKiByb3dzICov DQogCWZvciAoaT1UQ19IVEJfTUFYREVQVEgtMTtpPj0wO2ktLSkgew0KIAkJ cHJpbnRrKEtFUk5fREVCVUcgImh0YipyJWQgbT0leCIsaSxxLT5yb3dfbWFz a1tpXSk7DQpAQCAtNDIxLDkgKzQyMCw4IEBADQogCWlmICgoZGVsYXkgPD0g MCB8fCBkZWxheSA+IGNsLT5tYnVmZmVyKSAmJiBuZXRfcmF0ZWxpbWl0KCkp DQogCQlwcmludGsoS0VSTl9FUlIgIkhUQjogc3VzcGljaW91cyBkZWxheSBp biB3YWl0X3RyZWUgZD0lbGQgY2w9JVggaD0lZFxuIixkZWxheSxjbC0+Y2xh c3NpZCxkZWJ1Z19oaW50KTsNCiAjZW5kaWYNCi0JREVWSUtfTVNUQVJUKDkp Ow0KLQljbC0+cHFfa2V5ID0gamlmZmllcyArIFBTQ0hFRF9VUzJKSUZGSUUo ZGVsYXkpOw0KLQlpZiAoY2wtPnBxX2tleSA9PSBqaWZmaWVzKQ0KKwljbC0+ cHFfa2V5ID0gcS0+amlmZmllcyArIFBTQ0hFRF9VUzJKSUZGSUUoZGVsYXkp Ow0KKwlpZiAoY2wtPnBxX2tleSA9PSBxLT5qaWZmaWVzKQ0KIAkJY2wtPnBx X2tleSsrOw0KIA0KIAkvKiB1cGRhdGUgdGhlIG5lYXJlc3QgZXZlbnQgY2Fj aGUgKi8NCkBAIC00NDAsNyArNDM4LDYgQEANCiAJfQ0KIAlyYl9saW5rX25v ZGUoJmNsLT5wcV9ub2RlLCBwYXJlbnQsIHApOw0KIAlyYl9pbnNlcnRfY29s b3IoJmNsLT5wcV9ub2RlLCAmcS0+d2FpdF9wcVtjbC0+bGV2ZWxdKTsNCi0J REVWSUtfTUVORCg5KTsNCiB9DQogDQogLyoqDQpAQCAtNjg5LDcgKzY4Niw2 IEBADQogICAgIHN0cnVjdCBodGJfc2NoZWQgKnEgPSAoc3RydWN0IGh0Yl9z Y2hlZCAqKXNjaC0+ZGF0YTsNCiAgICAgc3RydWN0IGh0Yl9jbGFzcyAqY2wg PSBodGJfY2xhc3NpZnkoc2tiLHNjaCk7DQogDQotICAgIERFVklLX01TVEFS VCgwKTsNCiAgICAgaWYgKGNsID09IEhUQl9ESVJFQ1QgfHwgIWNsKSB7DQog CS8qIGVucXVldWUgdG8gaGVscGVyIHF1ZXVlICovDQogCWlmIChxLT5kaXJl Y3RfcXVldWUucWxlbiA8IHEtPmRpcmVjdF9xbGVuICYmIGNsKSB7DQpAQCAt Njk4LDI1ICs2OTQsMjAgQEANCiAJfSBlbHNlIHsNCiAJICAgIGtmcmVlX3Nr YiAoc2tiKTsNCiAJICAgIHNjaC0+c3RhdHMuZHJvcHMrKzsNCi0JICAgIERF VklLX01FTkQoMCk7DQogCSAgICByZXR1cm4gTkVUX1hNSVRfRFJPUDsNCiAJ fQ0KICAgICB9IGVsc2UgaWYgKGNsLT51bi5sZWFmLnEtPmVucXVldWUoc2ti LCBjbC0+dW4ubGVhZi5xKSAhPSBORVRfWE1JVF9TVUNDRVNTKSB7DQogCXNj aC0+c3RhdHMuZHJvcHMrKzsNCiAJY2wtPnN0YXRzLmRyb3BzKys7DQotCURF VklLX01FTkQoMCk7DQogCXJldHVybiBORVRfWE1JVF9EUk9QOw0KICAgICB9 IGVsc2Ugew0KIAljbC0+c3RhdHMucGFja2V0cysrOyBjbC0+c3RhdHMuYnl0 ZXMgKz0gc2tiLT5sZW47DQotCURFVklLX01TVEFSVCgxKTsNCiAJaHRiX2Fj dGl2YXRlIChxLGNsKTsNCi0JREVWSUtfTUVORCgxKTsNCiAgICAgfQ0KIA0K ICAgICBzY2gtPnEucWxlbisrOw0KICAgICBzY2gtPnN0YXRzLnBhY2tldHMr Kzsgc2NoLT5zdGF0cy5ieXRlcyArPSBza2ItPmxlbjsNCiAgICAgSFRCX0RC RygxLDEsImh0Yl9lbnFfb2sgY2w9JVggc2tiPSVwXG4iLGNsP2NsLT5jbGFz c2lkOjAsc2tiKTsNCi0gICAgREVWSUtfTUVORCgwKTsNCiAgICAgcmV0dXJu IE5FVF9YTUlUX1NVQ0NFU1M7DQogfQ0KIA0KQEAgLTgxOSw3ICs4MTAsNyBA QA0KIAkJCQkgICAgICAgY2wtPmNsYXNzaWQsIGRpZmYsDQogCQkJCSAgICAg ICAodW5zaWduZWQgbG9uZyBsb25nKSBxLT5ub3csDQogCQkJCSAgICAgICAo dW5zaWduZWQgbG9uZyBsb25nKSBjbC0+dF9jLA0KLQkJCQkgICAgICAgamlm Zmllcyk7DQorCQkJCSAgICAgICBxLT5qaWZmaWVzKTsNCiAJCQlkaWZmID0g MTAwMDsNCiAJCX0NCiAjZW5kaWYNCkBAIC04NjIsNiArODUzLDcgQEANCiAg Kg0KICAqIFNjYW5zIGV2ZW50IHF1ZXVlIGZvciBwZW5kaW5nIGV2ZW50cyBh bmQgYXBwbGllcyB0aGVtLiBSZXR1cm5zIGppZmZpZXMgdG8NCiAgKiBuZXh0 IHBlbmRpbmcgZXZlbnQgKDAgZm9yIG5vIGV2ZW50IGluIHBxKS4NCisgKiBO b3RlOiBBcGxpZWQgYXJlIGV2ZW50cyB3aG9zZSBoYXZlIGNsLT5wcV9rZXkg PD0gamlmZmllcy4NCiAgKi8NCiBzdGF0aWMgbG9uZyBodGJfZG9fZXZlbnRz KHN0cnVjdCBodGJfc2NoZWQgKnEsaW50IGxldmVsKQ0KIHsNCkBAIC04NzYs OSArODY4LDkgQEANCiAJCXdoaWxlIChwLT5yYl9sZWZ0KSBwID0gcC0+cmJf bGVmdDsNCiANCiAJCWNsID0gcmJfZW50cnkocCwgc3RydWN0IGh0Yl9jbGFz cywgcHFfbm9kZSk7DQotCQlpZiAoY2wtPnBxX2tleSAtIChqaWZmaWVzKzEp IDwgMHg4MDAwMDAwMCkgew0KLQkJCUhUQl9EQkcoOCwzLCJodGJfZG9fZXZf cmV0IGRlbGF5PSVsZFxuIixjbC0+cHFfa2V5IC0gamlmZmllcyk7DQotCQkJ cmV0dXJuIGNsLT5wcV9rZXkgLSBqaWZmaWVzOw0KKwkJaWYgKGNsLT5wcV9r ZXkgLSAocS0+amlmZmllcysxKSA8IDB4ODAwMDAwMDApIHsNCisJCQlIVEJf REJHKDgsMywiaHRiX2RvX2V2X3JldCBkZWxheT0lbGRcbiIsY2wtPnBxX2tl eSAtIHEtPmppZmZpZXMpOw0KKwkJCXJldHVybiBjbC0+cHFfa2V5IC0gcS0+ amlmZmllczsNCiAJCX0NCiAJCWh0Yl9zYWZlX3JiX2VyYXNlKHAscS0+d2Fp dF9wcStsZXZlbCk7DQogCQlkaWZmID0gUFNDSEVEX1RESUZGX1NBRkUocS0+ bm93LCBjbC0+dF9jLCAodTMyKWNsLT5tYnVmZmVyLCAwKTsNCkBAIC04ODks NyArODgxLDcgQEANCiAJCQkJICAgICAgIGNsLT5jbGFzc2lkLCBkaWZmLA0K IAkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcS0+bm93LA0KIAkJ CQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2wtPnRfYywNCi0JCQkJ ICAgICAgIGppZmZpZXMpOw0KKwkJCQkgICAgICAgcS0+amlmZmllcyk7DQog CQkJZGlmZiA9IDEwMDA7DQogCQl9DQogI2VuZGlmDQpAQCAtOTUyLDcgKzk0 NCw2IEBADQogCS8vc3RydWN0IGh0Yl9zY2hlZCAqcSA9IChzdHJ1Y3QgaHRi X3NjaGVkICopc2NoLT5kYXRhOw0KIAlzdHJ1Y3QgaHRiX2NsYXNzICpjbCwq c3RhcnQ7DQogCS8qIGxvb2sgaW5pdGlhbCBjbGFzcyB1cCBpbiB0aGUgcm93 ICovDQotCURFVklLX01TVEFSVCg2KTsNCiAJc3RhcnQgPSBjbCA9IGh0Yl9s b29rdXBfbGVhZiAocS0+cm93W2xldmVsXStwcmlvLHByaW8scS0+cHRyW2xl dmVsXStwcmlvKTsNCiAJDQogCWRvIHsNCkBAIC05NzEsOCArOTYyLDYgQEAN CiAJCWNsID0gaHRiX2xvb2t1cF9sZWFmIChxLT5yb3dbbGV2ZWxdK3ByaW8s cHJpbyxxLT5wdHJbbGV2ZWxdK3ByaW8pOw0KIAl9IHdoaWxlIChjbCAhPSBz dGFydCk7DQogDQotCURFVklLX01FTkQoNik7DQotCURFVklLX01TVEFSVCg3 KTsNCiAJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsNCiAJCWlmICgoY2wt PnVuLmxlYWYuZGVmaWNpdFtsZXZlbF0gLT0gc2tiLT5sZW4pIDwgMCkgew0K IAkJCUhUQl9EQkcoNCwyLCJodGJfbmV4dF9jbCBvbGRwdHI9JXAgcXVhbnRf YWRkPSVkXG4iLA0KQEAgLTk4NCwxMSArOTczLDggQEANCiAJCSAgIGdpdmVz IHVzIHNsaWdodGx5IGJldHRlciBwZXJmb3JtYW5jZSAqLw0KIAkJaWYgKCFj bC0+dW4ubGVhZi5xLT5xLnFsZW4pDQogCQkJaHRiX2RlYWN0aXZhdGUgKHEs Y2wpOw0KLQlERVZJS19NU1RBUlQoOCk7DQogCQlodGJfY2hhcmdlX2NsYXNz IChxLGNsLGxldmVsLHNrYi0+bGVuKTsNCi0JREVWSUtfTUVORCg4KTsNCiAJ fQ0KLQlERVZJS19NRU5EKDcpOw0KIAlyZXR1cm4gc2tiOw0KIH0NCiANCkBA IC0xMDAzLDcgKzk4OSw4IEBADQogCQlkZWxheSA9IDUqSFo7DQogCX0NCiAJ ZGVsX3RpbWVyKCZxLT50aW1lcik7DQotCXEtPnRpbWVyLmV4cGlyZXMgPSBq aWZmaWVzICsgZGVsYXk7DQorCS8qIHdoeSBkb24ndCB1c2UgamlmZmllcyBo ZXJlID8gYmVjYXVzZSBleHBpcmVzIGNhbiBiZSBpbiBwYXN0ICovDQorCXEt PnRpbWVyLmV4cGlyZXMgPSBxLT5qaWZmaWVzICsgZGVsYXk7DQogCWFkZF90 aW1lcigmcS0+dGltZXIpOw0KIAlzY2gtPmZsYWdzIHw9IFRDUV9GX1RIUk9U VExFRDsNCiAJc2NoLT5zdGF0cy5vdmVybGltaXRzKys7DQpAQCAtMTAxNiw3 ICsxMDAzLDExIEBADQogCXN0cnVjdCBodGJfc2NoZWQgKnEgPSAoc3RydWN0 IGh0Yl9zY2hlZCAqKXNjaC0+ZGF0YTsNCiAJaW50IGxldmVsOw0KIAlsb25n IG1pbl9kZWxheTsNCisjaWZkZWYgSFRCX0RFQlVHDQorCWludCBldnNfdXNl ZCA9IDA7DQorI2VuZGlmDQogDQorCXEtPmppZmZpZXMgPSBqaWZmaWVzOw0K IAlIVEJfREJHKDMsMSwiaHRiX2RlcSBkaXJjbnQ9JWQgcWxlbj0lZFxuIixz a2JfcXVldWVfbGVuKCZxLT5kaXJlY3RfcXVldWUpLA0KIAkJCXNjaC0+cS5x bGVuKTsNCiANCkBAIC0xMDI3LDcgKzEwMTgsNiBAQA0KIAkJcmV0dXJuIHNr YjsNCiAJfQ0KIA0KLQlERVZJS19NU1RBUlQoMik7DQogCWlmICghc2NoLT5x LnFsZW4pIGdvdG8gZmluOw0KIAlQU0NIRURfR0VUX1RJTUUocS0+bm93KTsN CiANCkBAIC0xMDM3LDE3ICsxMDI3LDE3IEBADQogCQkvKiBjb21tb24gY2Fz ZSBvcHRpbWl6YXRpb24gLSBza2lwIGV2ZW50IGhhbmRsZXIgcXVpY2tseSAq Lw0KIAkJaW50IG07DQogCQlsb25nIGRlbGF5Ow0KLQlERVZJS19NU1RBUlQo Myk7DQotCQlpZiAoamlmZmllcyAtIHEtPm5lYXJfZXZfY2FjaGVbbGV2ZWxd IDwgMHg4MDAwMDAwMCB8fCAwKSB7DQorCQlpZiAocS0+amlmZmllcyAtIHEt Pm5lYXJfZXZfY2FjaGVbbGV2ZWxdIDwgMHg4MDAwMDAwMCB8fCAwKSB7DQog CQkJZGVsYXkgPSBodGJfZG9fZXZlbnRzKHEsbGV2ZWwpOw0KLQkJCXEtPm5l YXJfZXZfY2FjaGVbbGV2ZWxdICs9IGRlbGF5ID8gZGVsYXkgOiBIWjsNCisJ CQlxLT5uZWFyX2V2X2NhY2hlW2xldmVsXSA9IHEtPmppZmZpZXMgKyAoZGVs YXkgPyBkZWxheSA6IEhaKTsNCisjaWZkZWYgSFRCX0RFQlVHDQorCQkJZXZz X3VzZWQrKzsNCisjZW5kaWYNCiAJCX0gZWxzZQ0KLQkJCWRlbGF5ID0gcS0+ bmVhcl9ldl9jYWNoZVtsZXZlbF0gLSBqaWZmaWVzOwkNCisJCQlkZWxheSA9 IHEtPm5lYXJfZXZfY2FjaGVbbGV2ZWxdIC0gcS0+amlmZmllczsJDQogCQkN CiAJCWlmIChkZWxheSAmJiBtaW5fZGVsYXkgPiBkZWxheSkgDQogCQkJbWlu X2RlbGF5ID0gZGVsYXk7DQotCURFVklLX01FTkQoMyk7DQotCURFVklLX01T VEFSVCg1KTsNCiAJCW0gPSB+cS0+cm93X21hc2tbbGV2ZWxdOw0KIAkJd2hp bGUgKG0gIT0gKGludCkoLTEpKSB7DQogCQkJaW50IHByaW8gPSBmZnogKG0p Ow0KQEAgLTEwNTYsMjkgKzEwNDYsMjQgQEANCiAJCQlpZiAobGlrZWx5KHNr YiAhPSBOVUxMKSkgew0KIAkJCQlzY2gtPnEucWxlbi0tOw0KIAkJCQlzY2gt PmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7DQotCURFVklLX01FTkQoNSk7 DQogCQkJCWdvdG8gZmluOw0KIAkJCX0NCiAJCX0NCi0JREVWSUtfTUVORCg1 KTsNCiAJfQ0KLQlERVZJS19NU1RBUlQoNCk7DQogI2lmZGVmIEhUQl9ERUJV Rw0KIAlpZiAoIXEtPm53Y19oaXQgJiYgbWluX2RlbGF5ID49IDEwKkhaICYm IG5ldF9yYXRlbGltaXQoKSkgew0KLQkJaWYgKG1pbl9kZWxheSA9PSBMT05H X01BWCkgDQotCQkJcHJpbnRrKEtFUk5fRVJSICJIVEI6IGRlcXVldWUgYnVn LCByZXBvcnQgaXQgcGxlYXNlICFcbiIpOw0KLQkJZWxzZSB7DQorCQlpZiAo bWluX2RlbGF5ID09IExPTkdfTUFYKSB7DQorCQkJcHJpbnRrKEtFUk5fRVJS ICJIVEI6IGRlcXVldWUgYnVnICglZCwlbHUsJWx1KSwgcmVwb3J0IGl0IHBs ZWFzZSAhXG4iLA0KKwkJCQkJZXZzX3VzZWQscS0+amlmZmllcyxqaWZmaWVz KTsNCisJCQlodGJfZGVidWdfZHVtcChxKTsNCisJCX0gZWxzZSANCiAJCQlw cmludGsoS0VSTl9XQVJOSU5HICJIVEI6IG1pbmRlbGF5PSVsZCwgc29tZSBj bGFzcyBoYXMgIg0KIAkJCQkJInRvbyBzbWFsbCByYXRlXG4iLG1pbl9kZWxh eSk7DQotCQkJaHRiX2RlYnVnX2R1bXAocSk7DQotCQl9DQogCX0NCiAjZW5k aWYNCiAJaHRiX2RlbGF5X2J5IChzY2gsbWluX2RlbGF5ID4gNSpIWiA/IDUq SFogOiBtaW5fZGVsYXkpOw0KLQlERVZJS19NRU5EKDQpOw0KIGZpbjoNCi0J SFRCX0RCRygzLDEsImh0Yl9kZXFfZW5kICVzIGo9JWx1IHNrYj0lcFxuIixz Y2gtPmRldi0+bmFtZSxqaWZmaWVzLHNrYik7DQotCURFVklLX01FTkQoMik7 DQorCUhUQl9EQkcoMywxLCJodGJfZGVxX2VuZCAlcyBqPSVsdSBza2I9JXBc biIsc2NoLT5kZXYtPm5hbWUscS0+amlmZmllcyxza2IpOw0KIAlyZXR1cm4g c2tiOw0KIH0NCiANCkBAIC0xNDQ5LDYgKzE0MzQsNyBAQA0KIAlpZiAoIXJ0 YWIgfHwgIWN0YWIpIGdvdG8gZmFpbHVyZTsNCiANCiAJaWYgKCFjbCkgeyAv KiBuZXcgY2xhc3MgKi8NCisJCXN0cnVjdCBRZGlzYyAqbmV3X3E7DQogCQkv KiBjaGVjayBmb3IgdmFsaWQgY2xhc3NpZCAqLw0KIAkJaWYgKCFjbGFzc2lk IHx8IFRDX0hfTUFKKGNsYXNzaWRec2NoLT5oYW5kbGUpIHx8IGh0Yl9maW5k KGNsYXNzaWQsc2NoKSkNCiAJCQlnb3RvIGZhaWx1cmU7DQpAQCAtMTQ3Miw2 ICsxNDU4LDEwIEBADQogCQljbC0+bWFnaWMgPSBIVEJfQ01BR0lDOw0KICNl bmRpZg0KIA0KKwkJLyogY3JlYXRlIGxlYWYgcWRpc2MgZWFybHkgYmVjYXVz ZSBpdCB1c2VzIGttYWxsb2MoR1BGX0tFUk5FTCkNCisJCSAgIHNvIHRoYXQg Y2FuJ3QgYmUgdXNlZCBpbnNpZGUgb2Ygc2NoX3RyZWVfbG9jaw0KKwkJICAg LS0gdGhhbmtzIHRvIEthcmxpcyBQZWlzZW5pZWtzICovDQorCQluZXdfcSA9 IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3Bz KTsNCiAJCXNjaF90cmVlX2xvY2soc2NoKTsNCiAJCWlmIChwYXJlbnQgJiYg IXBhcmVudC0+bGV2ZWwpIHsNCiAJCQkvKiB0dXJuIHBhcmVudCBpbnRvIGlu bmVyIG5vZGUgKi8NCkBAIC0xNDkwLDggKzE0ODAsNyBAQA0KIAkJCW1lbXNl dCAoJnBhcmVudC0+dW4uaW5uZXIsMCxzaXplb2YocGFyZW50LT51bi5pbm5l cikpOw0KIAkJfQ0KIAkJLyogbGVhZiAod2UpIG5lZWRzIGVsZW1lbnRhcnkg cWRpc2MgKi8NCi0JCWlmICghKGNsLT51bi5sZWFmLnEgPSBxZGlzY19jcmVh dGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcykpKQ0KLQkJCWNs LT51bi5sZWFmLnEgPSAmbm9vcF9xZGlzYzsNCisJCWNsLT51bi5sZWFmLnEg PSBuZXdfcSA/IG5ld19xIDogJm5vb3BfcWRpc2M7DQogDQogCQljbC0+Y2xh c3NpZCA9IGNsYXNzaWQ7IGNsLT5wYXJlbnQgPSBwYXJlbnQ7DQogDQo= --8323328-2013918615-1050474645=:557-- From ja@ssi.bg Wed Apr 16 00:37:12 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 00:37:47 -0700 (PDT) Received: from u.domain.uli (ja.mac.ssi.bg [217.79.71.194]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3G7b6Fu004134 for ; Wed, 16 Apr 2003 00:37:09 -0700 Received: from localhost (IDENT:ja@localhost [127.0.0.1]) by u.domain.uli (8.11.6/8.11.6) with ESMTP id h3G7OCR01159; Wed, 16 Apr 2003 10:24:12 +0300 Date: Wed, 16 Apr 2003 10:24:12 +0300 (EEST) From: Julian Anastasov X-X-Sender: ja@u.domain.uli To: devik cc: Tomas Szepe , , jamal Subject: Re: [PATCH] qdisc oops fix In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2249 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ja@ssi.bg Precedence: bulk X-list: netdev Content-Length: 454 Lines: 22 Hello, On Wed, 16 Apr 2003, devik wrote: > The bug you are speaking about was fixed at 27 Jan 2003 > and is included in 2.4.21pre (I hope ;-). > I'm attaching diff from 2.4.20 version to my current one. Oh, yes, I'm sleeping :) I'm even using this update, sorry! > regards, > ------------------------------- > Martin Devera aka devik > Linux kernel QoS/HTB maintainer > http://luxik.cdi.cz/~devik/ Regards -- Julian Anastasov From bhards@bigpond.net.au Wed Apr 16 04:00:55 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 04:01:01 -0700 (PDT) Received: from mta02ps.bigpond.com (mta02ps.bigpond.com [144.135.25.134]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GB0pFu012898 for ; Wed, 16 Apr 2003 04:00:54 -0700 Received: from pc-00217 ([144.135.25.75]) by mta02ps.bigpond.com (Netscape Messaging Server 4.15 mta02ps Jul 16 2002 22:47:55) with SMTP id HDFNX700.85I; Wed, 16 Apr 2003 21:00:43 +1000 Received: from CPE-203-51-31-109.nsw.bigpond.net.au ([203.51.31.109]) by psmam03bpa.bigpond.com(MailRouter V3.2g 89/13136608); 16 Apr 2003 21:00:43 From: Brad Hards To: "Randy.Dunlap" , linux-net@vger.kernel.org Subject: Re: [mini-howto] network-interface-naming Date: Wed, 16 Apr 2003 20:58:19 +1000 User-Agent: KMail/1.5.9 Cc: netdev@oss.sgi.com References: <20030415131439.050edd43.rddunlap@osdl.org> In-Reply-To: <20030415131439.050edd43.rddunlap@osdl.org> MIME-Version: 1.0 Content-Description: clearsigned data Content-Disposition: inline Content-Type: Text/Plain; charset="iso-8859-1" Message-Id: <200304162058.19610.bhards@bigpond.net.au> Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3GB0pFu012898 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2250 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bhards@bigpond.net.au Precedence: bulk X-list: netdev Content-Length: 656 Lines: 24 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Wed, 16 Apr 2003 06:14 am, Randy.Dunlap wrote: > Hi, G'day Randy, > Based on a couple of email threads on lkml last month, I did a short > writeup of (ethernet) network-interface naming. > > It's available at > http://www.xenotime.net/linux/network-interface-names.txt While I haven't yet actually tried it, I'd like to thank you for writing all this up. Certainly a very useful looking set of techniques. Brad -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE+nTdLW6pHgIdAuOMRAnkxAKCXk8x26HZu2iVyK9UOg2uR4Onk0wCgh97R NdEgFOk87tTlZqiChZnKpv8= =k3nL -----END PGP SIGNATURE----- From hadi@cyberus.ca Wed Apr 16 04:49:51 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 04:50:27 -0700 (PDT) Received: from mx02.cyberus.ca (mx02.cyberus.ca [216.191.240.26]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GBnoFu015130 for ; Wed, 16 Apr 2003 04:49:51 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx02.cyberus.ca with esmtp (Exim 4.14) id 195lQE-000DfT-7y; Wed, 16 Apr 2003 07:49:50 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3GBn7qu005209; Wed, 16 Apr 2003 07:49:07 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3GBn2ki005206; Wed, 16 Apr 2003 07:49:02 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Wed, 16 Apr 2003 07:49:02 -0400 (EDT) From: jamal To: Catalin BOIE cc: Tomas Szepe , "" , "" , "" , "" Subject: Re: [PATCH] qdisc oops fix In-Reply-To: Message-ID: <20030416072952.E4013@shell.cyberus.ca> References: <20030415084706.O1131@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2251 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 1703 Lines: 56 This is a different problem from previous one posted. Theres a small window (exposed given that you are provisioning a lot of qdiscs and running traffic at the same time) that an incoming packet interupt will cause the BUG(). GFP_ATOMIC will fix it, but i wonder if it appropriate. Alexey or Manfred? cheers, jamal PS:- 15mbits is not a lot of traffic ;-> On Wed, 16 Apr 2003, Catalin BOIE wrote: > > - sch = kmalloc(size, GFP_KERNEL); > > + sch = kmalloc(size, GFP_ATOMIC); > > > > mysteriously fixes the problem? Could the problem be elsewhere? > > Can you repost what the issue was? I am not on lk and i just saw the > > posting on a web page. > > With many rules (~5000 classes and ~3500 qdiscs and ~50000 filters) > the kernel oopses in slab.c:1128. > It happens on high rates (~15mbit). > On low rates, doesn't. > > Seems that an interrupt come and broke the memory allocation. > > > >>EIP; c0127ab4 <===== > > >>EAX; ffffffff > >>EBX; c12c52c0 > >>EDI; c12c52c0 > >>ESP; ceab1c60 > > Trace; c0127e0f > Trace; c01d3cac > Trace; d081ecc7 > Trace; c01d5265 > Trace; d0820600 > Trace; c01d27e4 > Trace; c01d0605 <__neigh_event_send+89/1b4> > Trace; c01d7cd4 > Trace; c01d7730 > Trace; c01d7b73 > Trace; c01c79d5 > Trace; c01c8b48 > Trace; c0120010 > > From manfred@colorfullife.com Wed Apr 16 08:24:17 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 08:24:26 -0700 (PDT) Received: from dbl.q-ag.de (IDENT:root@dbl.q-ag.de [80.146.160.66]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GFOFFu021741 for ; Wed, 16 Apr 2003 08:24:16 -0700 Received: from colorfullife.com (localhost.localdomain [127.0.0.1]) by dbl.q-ag.de (8.12.8/8.12.8) with ESMTP id h3GFN78G007245; Wed, 16 Apr 2003 17:23:08 +0200 Message-ID: <3E9D755A.8060601@colorfullife.com> Date: Wed, 16 Apr 2003 17:23:06 +0200 From: Manfred Spraul User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030313 X-Accept-Language: en-us, en MIME-Version: 1.0 To: jamal CC: Catalin BOIE , Tomas Szepe , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> In-Reply-To: <20030416072952.E4013@shell.cyberus.ca> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2252 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev Content-Length: 1711 Lines: 55 jamal wrote: >This is a different problem from previous one posted. > >Theres a small window (exposed given that you are provisioning a lot >of qdiscs and running traffic at the same time) that an incoming packet >interupt will cause the BUG(). > >GFP_ATOMIC will fix it, but i wonder if it appropriate. > > This is a 2.4 kernel, correct? >>With many rules (~5000 classes and ~3500 qdiscs and ~50000 filters) >>the kernel oopses in slab.c:1128. >> This check? if (in_interrupt() && (flags & SLAB_LEVEL_MASK) != SLAB_ATOMIC) BUG(); It's triggered, because someone does something like spin_lock_bh(&my_lock); p = kmalloc(,GFP_KERNEL); I don't like the proposed fix: usually code that calls kmalloc(,GFP_KERNEL) assumes that it runs at process space, e.g. uses semaphores, or non-bh spinlocks, etc. slab just happens to contain a test that complains about illegal calls. >>Trace; c0127e0f >>Trace; c01d3cac >>Trace; d081ecc7 >>Trace; c01d5265 >>Trace; d0820600 >>Trace; c01d27e4 >>Trace; c01d0605 <__neigh_event_send+89/1b4> >>Trace; c01d7cd4 >>Trace; c01d7730 >>Trace; c01d7b73 >>Trace; c01c79d5 >>Trace; c01c8b48 >>Trace; c0120010 >> >> >> >> I don't understand the backtrace. Were any modules loaded? Perhaps 0xd081ecc7 is a module. I'd add a if(in_interrupt()) show_stack(NULL); into qdisc_create_dflt(), and try to reproduce the bug without modules. -- Manfred From kala@pinerecords.com Wed Apr 16 09:12:50 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 09:13:21 -0700 (PDT) Received: from louise.pinerecords.com (root@louise.pinerecords.com [213.168.176.16]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GGCmFu022853 for ; Wed, 16 Apr 2003 09:12:49 -0700 Received: from louise.pinerecords.com (kala@localhost [127.0.0.1]) by louise.pinerecords.com with ESMTP id h3GG66xh000679 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 16 Apr 2003 18:06:06 +0200 Received: (from kala@localhost) by louise.pinerecords.com (submit) id h3GG66EA000678; Wed, 16 Apr 2003 18:06:06 +0200 Date: Wed, 16 Apr 2003 18:06:06 +0200 From: Tomas Szepe To: Manfred Spraul Cc: jamal , Catalin BOIE , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix Message-ID: <20030416160606.GA32575@louise.pinerecords.com> References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> <3E9D755A.8060601@colorfullife.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3E9D755A.8060601@colorfullife.com> User-Agent: Mutt/1.4.1i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2253 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: szepe@pinerecords.com Precedence: bulk X-list: netdev Content-Length: 936 Lines: 26 > [manfred@colorfullife.com] > > >>Trace; c0127e0f > >>Trace; c01d3cac > >>Trace; d081ecc7 > >>Trace; c01d5265 > >>Trace; d0820600 > >>Trace; c01d27e4 > >>Trace; c01d0605 <__neigh_event_send+89/1b4> > >>Trace; c01d7cd4 > >>Trace; c01d7730 > >>Trace; c01d7b73 > >>Trace; c01c79d5 > >>Trace; c01c8b48 > >>Trace; c0120010 > >> > I don't understand the backtrace. Were any modules loaded? Perhaps > 0xd081ecc7 is a module. The original backtrace as provided by Martin Volf does not contain any weird addresses such as 0xd081ecc7 above: http://marc.theaimsgroup.com/?l=linux-kernel&m=105013596721774&w=2 -- Tomas Szepe From manfred@colorfullife.com Wed Apr 16 09:54:23 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 09:54:28 -0700 (PDT) Received: from dbl.q-ag.de (IDENT:root@dbl.q-ag.de [80.146.160.66]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GGsKFu024221 for ; Wed, 16 Apr 2003 09:54:22 -0700 Received: from colorfullife.com (localhost.localdomain [127.0.0.1]) by dbl.q-ag.de (8.12.8/8.12.8) with ESMTP id h3GGqu8G007858; Wed, 16 Apr 2003 18:52:57 +0200 Message-ID: <3E9D8A68.5050207@colorfullife.com> Date: Wed, 16 Apr 2003 18:52:56 +0200 From: Manfred Spraul User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030313 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Tomas Szepe CC: jamal , Catalin BOIE , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> <3E9D755A.8060601@colorfullife.com> <20030416160606.GA32575@louise.pinerecords.com> In-Reply-To: <20030416160606.GA32575@louise.pinerecords.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2254 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev Content-Length: 326 Lines: 16 Tomas Szepe wrote: >The original backtrace as provided by Martin Volf does not contain >any weird addresses such as 0xd081ecc7 above: > >http://marc.theaimsgroup.com/?l=linux-kernel&m=105013596721774&w=2 > > Thanks. The bug was caused by sch_tree_lock() in htb_change_class(). 2.4.21-pre7 contains a fix. -- Manfred From davem@redhat.com Wed Apr 16 10:53:39 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 10:53:43 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GHrcFu025568 for ; Wed, 16 Apr 2003 10:53:39 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id KAA13113; Wed, 16 Apr 2003 10:46:43 -0700 Date: Wed, 16 Apr 2003 10:46:42 -0700 (PDT) Message-Id: <20030416.104642.129988781.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: rddunlap@osdl.org, linux-net@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [RFC/PATCH] ICMPv6 MIB stats per-interface From: "David S. Miller" In-Reply-To: <20030415.155938.23711671.yoshfuji@linux-ipv6.org> References: <20030414.090610.117741299.davem@redhat.com> <20030415.014047.39346510.yoshfuji@linux-ipv6.org> <20030415.155938.23711671.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2255 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 458 Lines: 14 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 15 Apr 2003 15:59:38 +0900 (JST) BTW, for example, if we do # ip link set eth9 name foobar if_indextoname() will return foobar. we, however, will see /proc/sys/net/ipv6/conf/eth9 instead of /proc/sys/net/ipv6/conf/foobar. This is not good. Is this just a bug not having NETDEV_CHANGENAME handler to rename it? I think this is a bug, yes. From davem@redhat.com Wed Apr 16 10:57:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 10:57:28 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GHvOFu026358 for ; Wed, 16 Apr 2003 10:57:24 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id KAA13123; Wed, 16 Apr 2003 10:49:12 -0700 Date: Wed, 16 Apr 2003 10:49:12 -0700 (PDT) Message-Id: <20030416.104912.49554424.davem@redhat.com> To: yoshfuji@linux-ipv6.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PATCH] [NET] use fl6_{src,dst} etc. From: "David S. Miller" In-Reply-To: <20030415.115807.127545284.yoshfuji@linux-ipv6.org> References: <20030415.025206.31321166.yoshfuji@linux-ipv6.org> <20030414.104826.104550461.davem@redhat.com> <20030415.115807.127545284.yoshfuji@linux-ipv6.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2256 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 415 Lines: 10 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 15 Apr 2003 11:58:07 +0900 (JST) In article <20030414.104826.104550461.davem@redhat.com> (at Mon, 14 Apr 2003 10:48:26 -0700 (PDT)), "David S. Miller" says: > Ok, fl_ip_* is fine. :-) This is the revised patch against 2.5.67 + ChangeSet 1.1202. Thanks. I've applied your patch, thank you. From m.c.p@wolk-project.de Wed Apr 16 11:04:51 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 11:04:54 -0700 (PDT) Received: from mx00.linux-systeme.com (lindsey.linux-systeme.com [80.190.48.67]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GI4nFu026810 for ; Wed, 16 Apr 2003 11:04:50 -0700 Received: from pD955F72E.dip.t-dialin.net (pD955F72E.dip.t-dialin.net [217.85.247.46]) (authenticated bits=0) by mx00.linux-systeme.com (8.12.9/8.12.9/Debian-1) with ESMTP id h3GI3WUV012626 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO); Wed, 16 Apr 2003 20:03:37 +0200 From: Marc-Christian Petersen Organization: Working Overloaded Linux Kernel To: Manfred Spraul , Tomas Szepe Subject: Re: [PATCH] qdisc oops fix Date: Wed, 16 Apr 2003 20:03:06 +0200 User-Agent: KMail/1.5.1 Cc: jamal , Catalin BOIE , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru References: <20030415084706.O1131@shell.cyberus.ca> <20030416160606.GA32575@louise.pinerecords.com> <3E9D8A68.5050207@colorfullife.com> In-Reply-To: <3E9D8A68.5050207@colorfullife.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200304162003.06600.m.c.p@wolk-project.de> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2257 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: m.c.p@wolk-project.de Precedence: bulk X-list: netdev Content-Length: 432 Lines: 13 On Wednesday 16 April 2003 18:52, Manfred Spraul wrote: Hi Manfred, > >The original backtrace as provided by Martin Volf does not contain > >any weird addresses such as 0xd081ecc7 above: > >http://marc.theaimsgroup.com/?l=linux-kernel&m=105013596721774&w=2 > Thanks. > The bug was caused by sch_tree_lock() in htb_change_class(). > 2.4.21-pre7 contains a fix. am I just blind or isn't there a fix in -pre7|current-BK? ciao, Marc From hadi@cyberus.ca Wed Apr 16 11:19:28 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 11:19:31 -0700 (PDT) Received: from mx02.cyberus.ca (mx02.cyberus.ca [216.191.240.26]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GIJQFu027679 for ; Wed, 16 Apr 2003 11:19:27 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx02.cyberus.ca with esmtp (Exim 4.14) id 195rVD-000LrQ-Lz; Wed, 16 Apr 2003 14:19:23 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3GIIWqu006173; Wed, 16 Apr 2003 14:18:32 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3GIIAfc006170; Wed, 16 Apr 2003 14:18:11 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Wed, 16 Apr 2003 14:18:10 -0400 (EDT) From: jamal To: Marc-Christian Petersen cc: Manfred Spraul , Tomas Szepe , Catalin BOIE , "" , "" , "" Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <200304162003.06600.m.c.p@wolk-project.de> Message-ID: <20030416140440.O5912@shell.cyberus.ca> References: <20030415084706.O1131@shell.cyberus.ca> <20030416160606.GA32575@louise.pinerecords.com> <3E9D8A68.5050207@colorfullife.com> <200304162003.06600.m.c.p@wolk-project.de> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2258 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 660 Lines: 23 On Wed, 16 Apr 2003, Marc-Christian Petersen wrote: > On Wednesday 16 April 2003 18:52, Manfred Spraul wrote: > > Hi Manfred, > > > >The original backtrace as provided by Martin Volf does not contain > > >any weird addresses such as 0xd081ecc7 above: > > >http://marc.theaimsgroup.com/?l=linux-kernel&m=105013596721774&w=2 > > Thanks. > > The bug was caused by sch_tree_lock() in htb_change_class(). > > 2.4.21-pre7 contains a fix. > am I just blind or isn't there a fix in -pre7|current-BK? > No you are not ;-> Yes, the fix for that specific problem is in 2.4.21-pre7. I think Tomas might have missed that we moved on to the next problem. cheers, jamal From hadi@cyberus.ca Wed Apr 16 11:40:02 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 11:40:11 -0700 (PDT) Received: from mx03.cyberus.ca (mx03.cyberus.ca [216.191.240.24]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GIe0Fu028528 for ; Wed, 16 Apr 2003 11:40:01 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx03.cyberus.ca with esmtp (Exim 4.14) id 195rpA-0000rt-3y; Wed, 16 Apr 2003 14:40:00 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3GIdHqu006210; Wed, 16 Apr 2003 14:39:17 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3GIdHad006207; Wed, 16 Apr 2003 14:39:17 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Wed, 16 Apr 2003 14:39:17 -0400 (EDT) From: jamal To: Manfred Spraul cc: Catalin BOIE , Tomas Szepe , "" , "" , "" Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <3E9D755A.8060601@colorfullife.com> Message-ID: <20030416142802.E5912@shell.cyberus.ca> References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> <3E9D755A.8060601@colorfullife.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2259 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 2040 Lines: 72 On Wed, 16 Apr 2003, Manfred Spraul wrote: > jamal wrote: > > >This is a different problem from previous one posted. > > > >Theres a small window (exposed given that you are provisioning a lot > >of qdiscs and running traffic at the same time) that an incoming packet > >interupt will cause the BUG(). > > > >GFP_ATOMIC will fix it, but i wonder if it appropriate. > > > > > This is a 2.4 kernel, correct? > Catalin, Can you what kernel that is? > >>With many rules (~5000 classes and ~3500 qdiscs and ~50000 filters) > >>the kernel oopses in slab.c:1128. > >> > This check? > if (in_interrupt() && (flags & SLAB_LEVEL_MASK) != SLAB_ATOMIC) > BUG(); thats the one i meant. > It's triggered, because someone does something like > spin_lock_bh(&my_lock); > p = kmalloc(,GFP_KERNEL); > > I don't like the proposed fix: usually code that calls > kmalloc(,GFP_KERNEL) assumes that it runs at process space, e.g. uses > semaphores, or non-bh spinlocks, etc. > slab just happens to contain a test that complains about illegal calls. ok. Nice. > > >>Trace; c0127e0f > >>Trace; c01d3cac > >>Trace; d081ecc7 > >>Trace; c01d5265 > >>Trace; d0820600 > >>Trace; c01d27e4 > >>Trace; c01d0605 <__neigh_event_send+89/1b4> > >>Trace; c01d7cd4 > >>Trace; c01d7730 > >>Trace; c01d7b73 > >>Trace; c01c79d5 > >>Trace; c01c8b48 > >>Trace; c0120010 > >> > >> > >> > >> > I don't understand the backtrace. Were any modules loaded? Perhaps > 0xd081ecc7 is a module. > Probably a module. Again Catalin, run no modules. > I'd add a > if(in_interrupt()) show_stack(NULL); > into qdisc_create_dflt(), and try to reproduce the bug without modules. > Catalin - again instead of your fix can you please add this call? cheers, jamal From ja@ssi.bg Wed Apr 16 12:44:28 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 12:44:33 -0700 (PDT) Received: from l.himel.bg (IDENT:root@unamed.infotel.bg [212.39.68.18] (may be forged)) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GJiPFu029718 for ; Wed, 16 Apr 2003 12:44:27 -0700 Received: from linux.himel.bg (IDENT:ja@linux.himel.bg [127.0.0.1]) by l.himel.bg (8.11.6/8.9.3) with ESMTP id h3GJhti05556; Wed, 16 Apr 2003 22:43:55 +0300 Date: Wed, 16 Apr 2003 22:43:55 +0300 (EEST) From: Julian Anastasov X-X-Sender: ja@l To: jamal cc: Manfred Spraul , Catalin BOIE , Tomas Szepe , , , Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <20030416142802.E5912@shell.cyberus.ca> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2260 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ja@ssi.bg Precedence: bulk X-list: netdev Content-Length: 650 Lines: 23 Hello, On Wed, 16 Apr 2003, jamal wrote: > > >This is a different problem from previous one posted. The problem should be the same. This 'lock bh + GFP_KERNEL' BUG happens only when slab allocates pages, not on each kmalloc. > > >Theres a small window (exposed given that you are provisioning a lot > > >of qdiscs and running traffic at the same time) that an incoming packet > > >interupt will cause the BUG(). This should not happen, may be you see another place that violates the above rule? IMO, the only problem is that it is not good to hold locks (including bh one) while using GFP_KERNEL. Regards -- Julian Anastasov From kala@pinerecords.com Wed Apr 16 14:44:39 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 14:44:46 -0700 (PDT) Received: from louise.pinerecords.com (root@louise.pinerecords.com [213.168.176.16]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3GLibFu031861 for ; Wed, 16 Apr 2003 14:44:38 -0700 Received: from louise.pinerecords.com (kala@localhost [127.0.0.1]) by louise.pinerecords.com with ESMTP id h3GLiNxh003467 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 16 Apr 2003 23:44:23 +0200 Received: (from kala@localhost) by louise.pinerecords.com (submit) id h3GLiNoQ003466; Wed, 16 Apr 2003 23:44:23 +0200 Date: Wed, 16 Apr 2003 23:44:23 +0200 From: Tomas Szepe To: jamal Cc: Marc-Christian Petersen , Manfred Spraul , Catalin BOIE , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix Message-ID: <20030416214422.GM32575@louise.pinerecords.com> References: <20030415084706.O1131@shell.cyberus.ca> <20030416160606.GA32575@louise.pinerecords.com> <3E9D8A68.5050207@colorfullife.com> <200304162003.06600.m.c.p@wolk-project.de> <20030416140440.O5912@shell.cyberus.ca> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030416140440.O5912@shell.cyberus.ca> User-Agent: Mutt/1.4.1i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2261 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: szepe@pinerecords.com Precedence: bulk X-list: netdev Content-Length: 727 Lines: 20 > [hadi@cyberus.ca] > > > > > >The original backtrace as provided by Martin Volf does not contain > > > >any weird addresses such as 0xd081ecc7 above: > > > >http://marc.theaimsgroup.com/?l=linux-kernel&m=105013596721774&w=2 > > > Thanks. > > > The bug was caused by sch_tree_lock() in htb_change_class(). > > > 2.4.21-pre7 contains a fix. > > am I just blind or isn't there a fix in -pre7|current-BK? > > > > No you are not ;-> Yes, the fix for that specific problem is in > 2.4.21-pre7. I think Tomas might have missed that we moved on to the > next problem. Trouble is, the fix went in for already -pre5 (cset 1.930.3.5), so if you only look at the pre6->pre7 changelog (like I did), you aren't likely to find it. 8) T. From kazunori@miyazawa.org Wed Apr 16 21:00:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 21:00:53 -0700 (PDT) Received: from miyazawa.org (usen-43x235x12x234.ap-USEN.usen.ad.jp [43.235.12.234]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3H40eFu007208 for ; Wed, 16 Apr 2003 21:00:41 -0700 Received: from monza.miyazawa.org (softdnserr [3ffe:501:41c:3:2d0:59ff:feab:4ac0]) (AUTH: LOGIN kazunori, ) by miyazawa.org with esmtp; Thu, 17 Apr 2003 12:39:40 +0900 Date: Thu, 17 Apr 2003 13:02:31 +0900 From: Kazunori Miyazawa To: davem@redhat.com, kuznet@ms2.inr.ac.ru Cc: netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: [PACTH][IPV6] Introduce ip6_append_data Message-Id: <20030417130231.179c7f00.kazunori@miyazawa.org> X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i386-debian-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2262 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kazunori@miyazawa.org Precedence: bulk X-list: netdev Content-Length: 48711 Lines: 1882 Hello, This patch introduces ip6_append_data and related functions, which are similer to ip_append_data and the functions in IPv4. This makes the kernel transmit fragmented packets with IPsec and cork the datagram packet. This patch is for linux-2.5.67 + CS1.1202 #ip6_frag_xmit and ip6_build_xmit remain. Best regards, --Kazunori Miyazawa (Yokogawa Electric Corporation) Index: include/linux/ipv6.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/linux/ipv6.h,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.10.3 diff -u -u -r1.1.1.5 -r1.1.1.5.10.3 --- include/linux/ipv6.h 8 Apr 2003 08:57:38 -0000 1.1.1.5 +++ include/linux/ipv6.h 17 Apr 2003 02:14:13 -0000 1.1.1.5.10.3 @@ -121,6 +121,7 @@ #include #include /* struct ipv6_mc_socklist */ #include +#include /* This structure contains results of exthdrs parsing @@ -178,6 +179,11 @@ struct ipv6_txoptions *opt; struct sk_buff *pktoptions; + struct { + struct ipv6_txoptions *opt; + struct rt6_info *rt; + struct flowi *fl; + } cork; }; struct raw6_opt { @@ -200,6 +206,7 @@ struct sock sk; struct ipv6_pinfo *pinet6; struct inet_opt inet; + struct udp_opt udp; struct ipv6_pinfo inet6; }; Index: include/linux/skbuff.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/linux/skbuff.h,v retrieving revision 1.1.1.8 retrieving revision 1.1.1.8.12.1 diff -u -u -r1.1.1.8 -r1.1.1.8.12.1 --- include/linux/skbuff.h 2 Apr 2003 04:14:20 -0000 1.1.1.8 +++ include/linux/skbuff.h 16 Apr 2003 14:34:33 -0000 1.1.1.8.12.1 @@ -792,6 +792,15 @@ return len + skb_headlen(skb); } +static inline void skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size) +{ + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + frag->page = page; + frag->page_offset = off; + frag->size = size; + skb_shinfo(skb)->nr_frags = i+1; +} + #define SKB_PAGE_ASSERT(skb) do { if (skb_shinfo(skb)->nr_frags) \ BUG(); } while (0) #define SKB_FRAG_ASSERT(skb) do { if (skb_shinfo(skb)->frag_list) \ Index: include/net/ipv6.h =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/include/net/ipv6.h,v retrieving revision 1.1.1.5 retrieving revision 1.1.1.5.14.1 diff -u -u -r1.1.1.5 -r1.1.1.5.14.1 --- include/net/ipv6.h 25 Mar 2003 04:32:21 -0000 1.1.1.5 +++ include/net/ipv6.h 16 Apr 2003 14:34:33 -0000 1.1.1.5.14.1 @@ -292,6 +292,26 @@ struct ipv6_txoptions *opt, int hlimit, int flags); +extern int ip6_append_data(struct sock *sk, + int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), + void *from, + int length, + int transhdrlen, + int hlimit, + struct ipv6_txoptions *opt, + struct flowi *fl, + struct rt6_info *rt, + unsigned int flags); + +extern int ip6_push_pending_frames(struct sock *sk); + +extern void ip6_flush_pending_frames(struct sock *sk); + +extern int ip6_dst_lookup(struct sock *sk, + struct dst_entry **dst, + struct flowi *fl, + struct in6_addr **saddr); + /* * skb processing functions */ Index: net/ipv4/ip_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv4/ip_output.c,v retrieving revision 1.1.1.12 retrieving revision 1.1.1.12.6.1 diff -u -u -r1.1.1.12 -r1.1.1.12.6.1 --- net/ipv4/ip_output.c 14 Apr 2003 04:34:12 -0000 1.1.1.12 +++ net/ipv4/ip_output.c 16 Apr 2003 14:34:34 -0000 1.1.1.12.6.1 @@ -685,16 +685,6 @@ return 0; } -static void -skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size) -{ - skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - frag->page = page; - frag->page_offset = off; - frag->size = size; - skb_shinfo(skb)->nr_frags = i+1; -} - static inline unsigned int csum_page(struct page *page, int offset, int copy) { Index: net/ipv6/icmp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/icmp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.14.5 diff -u -u -r1.1.1.9 -r1.1.1.9.14.5 --- net/ipv6/icmp.c 25 Mar 2003 04:33:45 -0000 1.1.1.9 +++ net/ipv6/icmp.c 17 Apr 2003 01:43:15 -0000 1.1.1.9.14.5 @@ -26,6 +26,7 @@ * yoshfuji : ensure to sent parameter problem for * fragments. * YOSHIFUJI Hideaki @USAGI: added sysctl for icmp rate limit. + * Kazunori MIYAZAWA @USAGI: change output process to use ip6_append_data */ #include @@ -101,42 +102,6 @@ spin_unlock_bh(&icmpv6_socket->sk->lock.slock); } - - -/* - * getfrag callback - */ - -static int icmpv6_getfrag(const void *data, struct in6_addr *saddr, - char *buff, unsigned int offset, unsigned int len) -{ - struct icmpv6_msg *msg = (struct icmpv6_msg *) data; - struct icmp6hdr *icmph; - __u32 csum; - - if (offset) { - csum = skb_copy_and_csum_bits(msg->skb, msg->offset + - (offset - sizeof(struct icmp6hdr)), - buff, len, msg->csum); - msg->csum = csum; - return 0; - } - - csum = csum_partial_copy_nocheck((void *) &msg->icmph, buff, - sizeof(struct icmp6hdr), msg->csum); - - csum = skb_copy_and_csum_bits(msg->skb, msg->offset, - buff + sizeof(struct icmp6hdr), - len - sizeof(struct icmp6hdr), csum); - - icmph = (struct icmp6hdr *) buff; - - icmph->icmp6_cksum = csum_ipv6_magic(saddr, msg->daddr, msg->len, - IPPROTO_ICMPV6, csum); - return 0; -} - - /* * Slightly more convenient version of icmpv6_send. */ @@ -239,6 +204,55 @@ return (optval&0xC0) == 0x80; } +int icmpv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct icmp6hdr *thdr, int len) +{ + struct sk_buff *skb; + struct icmp6hdr *icmp6h; + int err = 0; + + if ((skb = skb_peek(&sk->write_queue)) == NULL) + goto out; + + icmp6h = (struct icmp6hdr*) skb->h.raw; + memcpy(icmp6h, thdr, sizeof(struct icmp6hdr)); + icmp6h->icmp6_cksum = 0; + + if (skb_queue_len(&sk->write_queue) == 1) { + skb->csum = csum_partial((char *)icmp6h, + sizeof(struct icmp6hdr), skb->csum); + icmp6h->icmp6_cksum = csum_ipv6_magic(fl->fl6_src, + fl->fl6_dst, + len, fl->proto, skb->csum); + } else { + u32 tmp_csum = 0; + + skb_queue_walk(&sk->write_queue, skb) { + tmp_csum = csum_add(tmp_csum, skb->csum); + } + + tmp_csum = csum_partial((char *)icmp6h, + sizeof(struct icmp6hdr), tmp_csum); + tmp_csum = csum_ipv6_magic(fl->fl6_src, + fl->fl6_dst, + len, fl->proto, tmp_csum); + icmp6h->icmp6_cksum = tmp_csum; + } + if (icmp6h->icmp6_cksum == 0) + icmp6h->icmp6_cksum = -1; + ip6_push_pending_frames(sk); +out: + return err; +} + +static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) +{ + struct sk_buff *org_skb = (struct sk_buff *)from; + __u32 csum = 0; + csum = skb_copy_and_csum_bits(org_skb, offset, to, len, csum); + skb->csum = csum_block_add(skb->csum, csum, odd); + return 0; +} + /* * Send an ICMP message in response to a packet in error */ @@ -248,12 +262,16 @@ { struct ipv6hdr *hdr = skb->nh.ipv6h; struct sock *sk = icmpv6_socket->sk; - struct in6_addr *saddr = NULL; - int iif = 0; - struct icmpv6_msg msg; + struct ipv6_pinfo *np = inet6_sk(sk); + struct in6_addr *saddr = NULL, *tmp_saddr = NULL; + struct dst_entry *dst; + struct icmp6hdr tmp_hdr; struct flowi fl; + int iif = 0; int addr_type = 0; - int len; + int len, plen; + int hlimit = -1; + int err = 0; if ((u8*)hdr < skb->head || (u8*)(hdr+1) > skb->tail) return; @@ -324,48 +342,64 @@ if (!icmpv6_xrlim_allow(sk, type, &fl)) goto out; - /* - * ok. kick it. checksum will be provided by the - * getfrag_t callback. - */ - - msg.icmph.icmp6_type = type; - msg.icmph.icmp6_code = code; - msg.icmph.icmp6_cksum = 0; - msg.icmph.icmp6_pointer = htonl(info); - - msg.skb = skb; - msg.offset = skb->nh.raw - skb->data; - msg.csum = 0; - msg.daddr = &hdr->saddr; - - len = skb->len - msg.offset + sizeof(struct icmp6hdr); - len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr)); + tmp_hdr.icmp6_type = type; + tmp_hdr.icmp6_code = code; + tmp_hdr.icmp6_cksum = 0; + tmp_hdr.icmp6_pointer = htonl(info); + + if (!fl.oif && ipv6_addr_is_multicast(fl.nl_u.ip6_u.daddr)) + fl.oif = np->mcast_oif; + + err = ip6_dst_lookup(sk, &dst, &fl, &tmp_saddr); + if (err) goto out; + + if (hlimit < 0) { + if (ipv6_addr_is_multicast(fl.fl6_dst)) + hlimit = np->mcast_hops; + else + hlimit = np->hop_limit; + if (hlimit < 0) + hlimit = ((struct rt6_info*)dst)->rt6i_hoplimit; + } + plen = skb->nh.raw - skb->data; + __skb_pull(skb, plen); + len = skb->len; + len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr)); if (len < 0) { if (net_ratelimit()) printk(KERN_DEBUG "icmp: len problem\n"); + __skb_push(skb, plen); goto out; } - msg.len = len; + err = ip6_append_data(sk, icmpv6_getfrag, skb, len + sizeof(struct icmp6hdr), sizeof(struct icmp6hdr), + hlimit, NULL, &fl, (struct rt6_info*)dst, MSG_DONTWAIT); + if (err) + ip6_flush_pending_frames(sk); + else + err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, len + sizeof(struct icmp6hdr)); + __skb_push(skb, plen); - ip6_build_xmit(sk, icmpv6_getfrag, &msg, &fl, len, NULL, -1, - MSG_DONTWAIT); if (type >= ICMPV6_DEST_UNREACH && type <= ICMPV6_PARAMPROB) ICMP6_STATS_PTR_BH(Icmp6OutDestUnreachs) [type-ICMPV6_DEST_UNREACH]++; ICMP6_INC_STATS_BH(Icmp6OutMsgs); out: + if (tmp_saddr) kfree(tmp_saddr); icmpv6_xmit_unlock(); } static void icmpv6_echo_reply(struct sk_buff *skb) { struct sock *sk = icmpv6_socket->sk; + struct ipv6_pinfo *np = inet6_sk(sk); + struct in6_addr *saddr = NULL, *tmp_saddr = NULL; struct icmp6hdr *icmph = (struct icmp6hdr *) skb->h.raw; - struct in6_addr *saddr; - struct icmpv6_msg msg; + struct icmp6hdr tmp_hdr; struct flowi fl; + struct dst_entry *dst; + int err = 0; + int hlimit = -1; saddr = &skb->nh.ipv6h->daddr; @@ -373,20 +407,11 @@ ipv6_chk_acast_addr(0, saddr)) saddr = NULL; - msg.icmph.icmp6_type = ICMPV6_ECHO_REPLY; - msg.icmph.icmp6_code = 0; - msg.icmph.icmp6_cksum = 0; - msg.icmph.icmp6_identifier = icmph->icmp6_identifier; - msg.icmph.icmp6_sequence = icmph->icmp6_sequence; - - msg.skb = skb; - msg.offset = 0; - msg.csum = 0; - msg.len = skb->len + sizeof(struct icmp6hdr); - msg.daddr = &skb->nh.ipv6h->saddr; + memcpy(&tmp_hdr, icmph, sizeof(tmp_hdr)); + tmp_hdr.icmp6_type = ICMPV6_ECHO_REPLY; fl.proto = IPPROTO_ICMPV6; - fl.nl_u.ip6_u.daddr = msg.daddr; + fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr; fl.nl_u.ip6_u.saddr = saddr; fl.oif = skb->dev->ifindex; fl.fl6_flowlabel = 0; @@ -395,11 +420,36 @@ icmpv6_xmit_lock(); - ip6_build_xmit(sk, icmpv6_getfrag, &msg, &fl, msg.len, NULL, -1, - MSG_DONTWAIT); + if (!fl.oif && ipv6_addr_is_multicast(fl.nl_u.ip6_u.daddr)) + fl.oif = np->mcast_oif; + + err = ip6_dst_lookup(sk, &dst, &fl, &tmp_saddr); + + if (err) goto out; + + if (hlimit < 0) { + if (ipv6_addr_is_multicast(fl.fl6_dst)) + hlimit = np->mcast_hops; + else + hlimit = np->hop_limit; + if (hlimit < 0) + hlimit = ((struct rt6_info*)dst)->rt6i_hoplimit; + } + + err = ip6_append_data(sk, icmpv6_getfrag, skb, skb->len + sizeof(struct icmp6hdr), + sizeof(struct icmp6hdr), hlimit, NULL, &fl, + (struct rt6_info*)dst, MSG_DONTWAIT); + + if (err) + ip6_flush_pending_frames(sk); + else + err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, skb->len + sizeof(struct icmp6hdr)); + + ICMP6_INC_STATS_BH(Icmp6OutEchoReplies); ICMP6_INC_STATS_BH(Icmp6OutMsgs); - +out: + if (tmp_saddr) kfree(tmp_saddr); icmpv6_xmit_unlock(); } Index: net/ipv6/ip6_output.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/ip6_output.c,v retrieving revision 1.1.1.8 retrieving revision 1.1.1.8.12.7 diff -u -u -r1.1.1.8 -r1.1.1.8.12.7 --- net/ipv6/ip6_output.c 2 Apr 2003 04:16:14 -0000 1.1.1.8 +++ net/ipv6/ip6_output.c 17 Apr 2003 02:01:29 -0000 1.1.1.8.12.7 @@ -23,6 +23,9 @@ * * H. von Brand : Added missing #include * Imran Patel : frag id should be in NBO + * Kazunori MIYAZAWA @USAGI + * : add ip6_append_data and related functions + * for datagram xmit */ #include @@ -52,6 +55,8 @@ #include #include +static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)); + static __inline__ void ipv6_select_ident(struct sk_buff *skb, struct frag_hdr *fhdr) { static u32 ipv6_fragmentation_id = 1; @@ -98,7 +103,7 @@ } -int ip6_output(struct sk_buff *skb) +int ip6_output2(struct sk_buff *skb) { struct dst_entry *dst = skb->dst; struct net_device *dev = dst->dev; @@ -133,6 +138,13 @@ return NF_HOOK(PF_INET6, NF_IP6_POST_ROUTING, skb,NULL, skb->dev,ip6_output_finish); } +int ip6_output(struct sk_buff *skb) +{ + if ((skb->len > skb->dst->dev->mtu || skb_shinfo(skb)->frag_list)) + return ip6_fragment(skb, ip6_output2); + else + return ip6_output2(skb); +} #ifdef CONFIG_NETFILTER int ip6_route_me_harder(struct sk_buff *skb) @@ -844,4 +856,659 @@ drop: kfree_skb(skb); return -EINVAL; +} + +static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) +{ + to->pkt_type = from->pkt_type; + to->priority = from->priority; + to->protocol = from->protocol; + to->security = from->security; + to->dst = dst_clone(from->dst); + to->dev = from->dev; + +#ifdef CONFIG_NET_SCHED + to->tc_index = from->tc_index; +#endif +#ifdef CONFIG_NETFILTER + to->nfmark = from->nfmark; + /* Connection association is same as pre-frag packet */ + to->nfct = from->nfct; + nf_conntrack_get(to->nfct); +#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) + to->nf_bridge = from->nf_bridge; + nf_bridge_get(to->nf_bridge); +#endif +#ifdef CONFIG_NETFILTER_DEBUG + to->nf_debug = from->nf_debug; +#endif +#endif +} + +static int ip6_found_nexthdr(struct sk_buff *skb, u8 **nexthdr) +{ + u16 offset = sizeof(struct ipv6hdr); + struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1); + unsigned int packet_len = skb->tail - skb->nh.raw; + int found_rhdr = 0; + *nexthdr = &skb->nh.ipv6h->nexthdr; + + while (offset + 1 <= packet_len) { + + switch (**nexthdr) { + + case NEXTHDR_HOP: + case NEXTHDR_ROUTING: + case NEXTHDR_DEST: + if (**nexthdr == NEXTHDR_ROUTING) found_rhdr = 1; + if (**nexthdr == NEXTHDR_DEST && found_rhdr) return offset; + offset += ipv6_optlen(exthdr); + *nexthdr = &exthdr->nexthdr; + exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); + break; + default : + return offset; + } + } + + return offset; +} + +static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) +{ + struct net_device *dev; + struct rt6_info *rt = (struct rt6_info*)skb->dst; + struct sk_buff *frag; + struct ipv6hdr *tmp_hdr; + struct frag_hdr *fh; + unsigned int mtu, hlen, left, len; + u32 frag_id = 0; + int ptr, offset = 0, err=0; + u8 *prevhdr, nexthdr = 0; + + dev = rt->u.dst.dev; + hlen = ip6_found_nexthdr(skb, &prevhdr); + nexthdr = *prevhdr; + + mtu = dst_pmtu(&rt->u.dst) - hlen - sizeof(struct frag_hdr); + + if (skb_shinfo(skb)->frag_list) { + int first_len = 0; + + if (first_len - hlen > mtu || + ((first_len - hlen) & 7) || + skb_cloned(skb)) + goto slow_path; + + for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) { + /* Correct geometry. */ + if (frag->len > mtu || + ((frag->len & 7) && frag->next) || + skb_headroom(frag) < hlen) + goto slow_path; + + /* Correct socket ownership. */ + if (frag->sk == NULL) + goto slow_path; + + /* Partially cloned skb? */ + if (skb_shared(frag)) + goto slow_path; + } + + err = 0; + offset = 0; + frag = skb_shinfo(skb)->frag_list; + skb_shinfo(skb)->frag_list = 0; + /* BUILD HEADER */ + + tmp_hdr = kmalloc(hlen, GFP_ATOMIC); + if (!tmp_hdr) { + IP6_INC_STATS(Ip6FragFails); + return -ENOMEM; + } + + *prevhdr = NEXTHDR_FRAGMENT; + memcpy(tmp_hdr, skb->nh.raw, hlen); + __skb_pull(skb, hlen); + fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr)); + skb->nh.raw = __skb_push(skb, hlen); + memcpy(skb->nh.raw, tmp_hdr, hlen); + + ipv6_select_ident(skb, fh); + fh->nexthdr = nexthdr; + fh->reserved = 0; + fh->frag_off = htons(0x0001); + frag_id = fh->identification; + + first_len = skb_pagelen(skb); + skb->data_len = first_len - skb_headlen(skb); + skb->len = first_len; + skb->nh.ipv6h->payload_len = htons(first_len - sizeof(struct ipv6hdr)); + + + for (;;) { + /* Prepare header of the next frame, + * before previous one went down. */ + if (frag) { + frag->h.raw = frag->data; + fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr)); + frag->nh.raw = __skb_push(frag, hlen); + memcpy(frag->nh.raw, tmp_hdr, hlen); + offset += skb->len - hlen - sizeof(struct frag_hdr); + fh->nexthdr = nexthdr; + fh->reserved = 0; + if (frag->next != NULL) + offset |= 0x0001; + fh->frag_off = htons(offset); + fh->identification = frag_id; + frag->nh.ipv6h->payload_len = htons(frag->len - sizeof(struct ipv6hdr)); + ip6_copy_metadata(frag, skb); + } + err = output(skb); + + if (err || !frag) + break; + + skb = frag; + frag = skb->next; + skb->next = NULL; + } + + if (tmp_hdr) + kfree(tmp_hdr); + + if (err == 0) { + IP6_INC_STATS(Ip6FragOKs); + return 0; + } + + while (frag) { + skb = frag->next; + kfree_skb(frag); + frag = skb; + } + + IP6_INC_STATS(Ip6FragFails); + return err; + } + +slow_path: + left = skb->len - hlen; /* Space per frame */ + ptr = hlen; /* Where to start from */ + + /* + * Fragment the datagram. + */ + + *prevhdr = NEXTHDR_FRAGMENT; + + /* + * Keep copying data until we run out. + */ + while(left > 0) { + len = left; + /* IF: it doesn't fit, use 'mtu' - the data space left */ + if (len > mtu) + len = mtu; + /* IF: we are not sending upto and including the packet end + then align the next start on an eight byte boundary */ + if (len < left) { + len &= ~7; + } + /* + * Allocate buffer. + */ + + if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_RESERVED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) { + NETDEBUG(printk(KERN_INFO "IPv6: frag: no memory for new fragment!\n")); + err = -ENOMEM; + goto fail; + } + + /* + * Set up data on packet + */ + + ip6_copy_metadata(frag, skb); + skb_reserve(frag, LL_RESERVED_SPACE(rt->u.dst.dev)); + skb_put(frag, len + hlen + sizeof(struct frag_hdr)); + frag->nh.raw = frag->data; + fh = (struct frag_hdr*)(frag->data + hlen); + frag->h.raw = frag->data + hlen + sizeof(struct frag_hdr); + + /* + * Charge the memory for the fragment to any owner + * it might possess + */ + if (skb->sk) + skb_set_owner_w(frag, skb->sk); + + /* + * Copy the packet header into the new buffer. + */ + memcpy(frag->nh.raw, skb->data, hlen); + + /* + * Build fragment header. + */ + fh->nexthdr = nexthdr; + fh->reserved = 0; + if (frag_id) { + ipv6_select_ident(skb, fh); + frag_id = fh->identification; + } else + fh->identification = frag_id; + + /* + * Copy a block of the IP datagram. + */ + if (skb_copy_bits(skb, ptr, frag->h.raw, len)) + BUG(); + left -= len; + + fh->frag_off = htons( left > 0 ? (offset | 0x0001) : offset); + frag->nh.ipv6h->payload_len = htons(frag->len - sizeof(struct ipv6hdr)); + + ptr += len; + offset += len; + + /* + * Put this fragment into the sending queue. + */ + + IP6_INC_STATS(Ip6FragCreates); + + err = output(frag); + if (err) + goto fail; + } + kfree_skb(skb); + IP6_INC_STATS(Ip6FragOKs); + return err; + +fail: + kfree_skb(skb); + IP6_INC_STATS(Ip6FragFails); + return err; +} + +int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl, struct in6_addr **saddr) +{ + struct ipv6_pinfo *np = inet6_sk(sk); + int err = 0; + + *dst = __sk_dst_check(sk, np->dst_cookie); + if (*dst) { + struct rt6_info *rt = (struct rt6_info*)*dst; + + /* Yes, checking route validity in not connected + case is not very simple. Take into account, + that we do not support routing by source, TOS, + and MSG_DONTROUTE --ANK (980726) + + 1. If route was host route, check that + cached destination is current. + If it is network route, we still may + check its validity using saved pointer + to the last used address: daddr_cache. + We do not want to save whole address now, + (because main consumer of this service + is tcp, which has not this problem), + so that the last trick works only on connected + sockets. + 2. oif also should be the same. + */ + + if (((rt->rt6i_dst.plen != 128 || + ipv6_addr_cmp(fl->fl6_dst, &rt->rt6i_dst.addr)) + && (np->daddr_cache == NULL || + ipv6_addr_cmp(fl->fl6_dst, np->daddr_cache))) + || (fl->oif && fl->oif != (*dst)->dev->ifindex)) { + *dst = NULL; + } else + dst_hold(*dst); + } + + if (*dst == NULL) + *dst = ip6_route_output(sk, fl); + + if ((*dst)->error) { + IP6_INC_STATS(Ip6OutNoRoutes); + dst_release(*dst); + return -ENETUNREACH; + } + + if (fl->fl6_src == NULL) { + *saddr = kmalloc(sizeof(struct in6_addr), GFP_ATOMIC); + err = ipv6_get_saddr(*dst, fl->fl6_dst, *saddr); + + if (err) { +#if IP6_DEBUG >= 2 + printk(KERN_DEBUG "ip6_build_xmit: " + "no availiable source address\n"); +#endif + return err; + } + fl->fl6_src = *saddr; + } + + if (*dst) { + if ((err = xfrm_lookup(dst, fl, sk, 0)) < 0) { + dst_release(*dst); + return -ENETUNREACH; + } + } + + return 0; +} + +int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), + void *from, int length, int transhdrlen, + int hlimit, struct ipv6_txoptions *opt, struct flowi *fl, struct rt6_info *rt, + unsigned int flags) +{ + struct inet_opt *inet = inet_sk(sk); + struct ipv6_pinfo *np = inet6_sk(sk); + struct sk_buff *skb; + unsigned int maxfraglen, fragheaderlen; + int exthdrlen; + int hh_len; + int mtu; + int copy = 0; + int err; + int offset = 0; + int csummode = CHECKSUM_NONE; + + if (flags&MSG_PROBE) + return 0; + if (skb_queue_empty(&sk->write_queue)) { + /* + * setup for corking + */ + if (opt) { + if (np->cork.opt == NULL) + np->cork.opt = kmalloc(opt->tot_len, sk->allocation); + memcpy(np->cork.opt, opt, opt->tot_len); + inet->cork.flags |= IPCORK_OPT; + /* need source address above miyazawa*/ + exthdrlen += opt->opt_flen ? opt->opt_flen : 0; + } + dst_hold(&rt->u.dst); + np->cork.rt = rt; + np->cork.fl = fl; + inet->cork.fragsize = mtu = dst_pmtu(&rt->u.dst); + inet->cork.length = 0; + inet->sndmsg_page = NULL; + inet->sndmsg_off = 0; + if ((exthdrlen = rt->u.dst.header_len) != 0) { + length += exthdrlen; + transhdrlen += exthdrlen; + } + } else { + rt = np->cork.rt; + if (inet->cork.flags & IPCORK_OPT) + opt = np->cork.opt; + transhdrlen = 0; + exthdrlen = 0; + mtu = inet->cork.fragsize; + } + + hh_len = (rt->u.dst.dev->hard_header_len&~15) + 16; + + fragheaderlen = sizeof(struct ipv6hdr) + (opt ? opt->opt_nflen : 0); + maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen - sizeof(struct frag_hdr); + + if (mtu < 65576) { + if (inet->cork.length + length > 0xFFFF - fragheaderlen) { + ipv6_local_error(sk, EMSGSIZE, fl, mtu-exthdrlen); + return -EMSGSIZE; + } + } + + inet->cork.length += length; + + if ((skb = skb_peek_tail(&sk->write_queue)) == NULL) + goto alloc_new_skb; + + while (length > 0) { + if ((copy = maxfraglen - skb->len) <= 0) { + char *data; + unsigned int datalen; + unsigned int fraglen; + unsigned int alloclen; + BUG_TRAP(copy == 0); +alloc_new_skb: + datalen = maxfraglen - fragheaderlen; + if (datalen > length) + datalen = length; + fraglen = datalen + fragheaderlen; + if ((flags & MSG_MORE) && + !(rt->u.dst.dev->features&NETIF_F_SG)) + alloclen = maxfraglen; + else + alloclen = fraglen; + alloclen += sizeof(struct frag_hdr); + if (transhdrlen) { + skb = sock_alloc_send_skb(sk, + alloclen + hh_len + 15, + (flags & MSG_DONTWAIT), &err); + } else { + skb = NULL; + if (atomic_read(&sk->wmem_alloc) <= 2*sk->sndbuf) + skb = sock_wmalloc(sk, + alloclen + hh_len + 15, 1, + sk->allocation); + if (unlikely(skb == NULL)) + err = -ENOBUFS; + } + if (skb == NULL) + goto error; + /* + * Fill in the control structures + */ + skb->ip_summed = csummode; + skb->csum = 0; + /* reserve 8 byte for fragmentation */ + skb_reserve(skb, hh_len+sizeof(struct frag_hdr)); + + /* + * Find where to start putting bytes + */ + data = skb_put(skb, fraglen); + skb->nh.raw = data + exthdrlen; + data += fragheaderlen; + skb->h.raw = data + exthdrlen; + copy = datalen - transhdrlen; + if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, 0, skb) < 0) { + err = -EFAULT; + kfree_skb(skb); + goto error; + } + + offset += copy; + length -= datalen; + transhdrlen = 0; + exthdrlen = 0; + csummode = CHECKSUM_NONE; + + /* + * Put the packet on the pending queue + */ + __skb_queue_tail(&sk->write_queue, skb); + continue; + } + + if (copy > length) + copy = length; + + if (!(rt->u.dst.dev->features&NETIF_F_SG)) { + unsigned int off; + + off = skb->len; + if (getfrag(from, skb_put(skb, copy), + offset, copy, off, skb) < 0) { + __skb_trim(skb, off); + err = -EFAULT; + goto error; + } + } else { + int i = skb_shinfo(skb)->nr_frags; + skb_frag_t *frag = &skb_shinfo(skb)->frags[i-1]; + struct page *page = inet->sndmsg_page; + int off = inet->sndmsg_off; + unsigned int left; + + if (page && (left = PAGE_SIZE - off) > 0) { + if (copy >= left) + copy = left; + if (page != frag->page) { + if (i == MAX_SKB_FRAGS) { + err = -EMSGSIZE; + goto error; + } + get_page(page); + skb_fill_page_desc(skb, i, page, inet->sndmsg_off, 0); + frag = &skb_shinfo(skb)->frags[i]; + } + } else if(i < MAX_SKB_FRAGS) { + if (copy > PAGE_SIZE) + copy = PAGE_SIZE; + page = alloc_pages(sk->allocation, 0); + if (page == NULL) { + err = -ENOMEM; + goto error; + } + inet->sndmsg_page = page; + inet->sndmsg_off = 0; + + skb_fill_page_desc(skb, i, page, 0, 0); + frag = &skb_shinfo(skb)->frags[i]; + skb->truesize += PAGE_SIZE; + atomic_add(PAGE_SIZE, &sk->wmem_alloc); + } else { + err = -EMSGSIZE; + goto error; + } + if (getfrag(from, page_address(frag->page)+frag->page_offset+frag->size, offset, copy, skb->len, skb) < 0) { + err = -EFAULT; + goto error; + } + inet->sndmsg_off += copy; + frag->size += copy; + skb->len += copy; + skb->data_len += copy; + } + offset += copy; + length -= copy; + } + return 0; +error: + inet->cork.length -= length; + IP6_INC_STATS(Ip6OutDiscards); + return err; +} + +int ip6_push_pending_frames(struct sock *sk) +{ + struct sk_buff *skb, *tmp_skb; + struct sk_buff **tail_skb; + struct in6_addr *final_dst = NULL; + struct inet_opt *inet = inet_sk(sk); + struct ipv6_pinfo *np = inet6_sk(sk); + struct ipv6hdr *hdr; + struct ipv6_txoptions *opt = np->cork.opt; + struct rt6_info *rt = np->cork.rt; + struct flowi *fl = np->cork.fl; + unsigned char proto = fl->proto; + int err = 0; + + if ((skb = __skb_dequeue(&sk->write_queue)) == NULL) + goto out; + tail_skb = &(skb_shinfo(skb)->frag_list); + + /* move skb->data to ip header from ext header */ + if (skb->data < skb->nh.raw) + __skb_pull(skb, skb->nh.raw - skb->data); + while ((tmp_skb = __skb_dequeue(&sk->write_queue)) != NULL) { + __skb_pull(tmp_skb, skb->h.raw - skb->nh.raw); + *tail_skb = tmp_skb; + tail_skb = &(tmp_skb->next); + skb->len += tmp_skb->len; + skb->data_len += tmp_skb->len; +#if 0 /* Logically correct, but useless work, ip_fragment() will have to undo */ + skb->truesize += tmp_skb->truesize; + __sock_put(tmp_skb->sk); + tmp_skb->destructor = NULL; + tmp_skb->sk = NULL; +#endif + } + + final_dst = fl->fl6_dst; + __skb_pull(skb, skb->h.raw - skb->nh.raw); + if (opt && opt->opt_flen) + ipv6_push_frag_opts(skb, opt, &proto); + if (opt && opt->opt_nflen) + ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst); + + skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr)); + + *(u32*)hdr = fl->fl6_flowlabel | htonl(0x60000000); + + if (skb->len < 65536) + hdr->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); + else + hdr->payload_len = 0; + hdr->hop_limit = np->hop_limit; + hdr->nexthdr = proto; + memcpy(&hdr->saddr, fl->fl6_src, sizeof(struct in6_addr)); + memcpy(&hdr->daddr, final_dst, sizeof(struct in6_addr)); + + skb->dst = dst_clone(&rt->u.dst); + err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output); + if (err) { + if (err > 0) + err = inet->recverr ? net_xmit_errno(err) : 0; + if (err) + goto error; + } + +out: + inet->cork.flags &= ~IPCORK_OPT; + if (np->cork.opt) { + kfree(np->cork.opt); + np->cork.opt = NULL; + } + if (np->cork.rt) { + np->cork.rt = NULL; + } + if (np->cork.fl) { + np->cork.fl = NULL; + } + return err; +error: + goto out; +} + +void ip6_flush_pending_frames(struct sock *sk) +{ + struct inet_opt *inet = inet_sk(sk); + struct ipv6_pinfo *np = inet6_sk(sk); + struct sk_buff *skb; + + while ((skb = __skb_dequeue_tail(&sk->write_queue)) != NULL) + kfree_skb(skb); + + inet->cork.flags &= ~IPCORK_OPT; + + if (np->cork.opt) { + kfree(np->cork.opt); + np->cork.opt = NULL; + } + if (np->cork.rt) { + np->cork.rt = NULL; + } + if (np->cork.fl) { + np->cork.fl = NULL; + } } Index: net/ipv6/raw.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/raw.c,v retrieving revision 1.1.1.6 retrieving revision 1.1.1.6.12.5 diff -u -u -r1.1.1.6 -r1.1.1.6.12.5 --- net/ipv6/raw.c 2 Apr 2003 04:16:14 -0000 1.1.1.6 +++ net/ipv6/raw.c 17 Apr 2003 01:43:15 -0000 1.1.1.6.12.5 @@ -12,6 +12,7 @@ * Fixes: * Hideaki YOSHIFUJI : sin6_scope_id support * YOSHIFUJI,H.@USAGI : raw checksum (RFC2292(bis) compliance) + * Kazunori MIYAZAWA @USAGI: change process style to use ip6_append_data * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,6 +30,8 @@ #include #include #include +#include +#include #include #include @@ -435,87 +438,116 @@ goto out_free; } -/* - * Sending... - */ - -struct rawv6_fakehdr { - struct iovec *iov; - struct sock *sk; - __u32 len; - __u32 cksum; - __u32 proto; - struct in6_addr *daddr; -}; - -static int rawv6_getfrag(const void *data, struct in6_addr *saddr, - char *buff, unsigned int offset, unsigned int len) +static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct raw6_opt *opt, int len) { - struct iovec *iov = (struct iovec *) data; + struct sk_buff *skb; + int err = 0; + u16 *csum; - return memcpy_fromiovecend(buff, iov, offset, len); -} + if ((skb = skb_peek(&sk->write_queue)) == NULL) + goto out; -static int rawv6_frag_cksum(const void *data, struct in6_addr *addr, - char *buff, unsigned int offset, - unsigned int len) -{ - struct rawv6_fakehdr *hdr = (struct rawv6_fakehdr *) data; - - if (csum_partial_copy_fromiovecend(buff, hdr->iov, offset, - len, &hdr->cksum)) - return -EFAULT; - - if (offset == 0) { - struct sock *sk; - struct raw6_opt *opt; - struct in6_addr *daddr; - - sk = hdr->sk; - opt = raw6_sk(sk); + if (opt->offset + 1 < len) + csum = (u16 *)(skb->h.raw + opt->offset); + else { + err = -EINVAL; + goto out; + } - if (hdr->daddr) - daddr = hdr->daddr; - else - daddr = addr + 1; - - hdr->cksum = csum_ipv6_magic(addr, daddr, hdr->len, - hdr->proto, hdr->cksum); - - if (opt->offset + 1 < len) { - __u16 *csum; + if (skb_queue_len(&sk->write_queue) == 1) { + /* + * Only one fragment on the socket. + */ + /* should be check HW csum miyazawa */ + *csum = csum_ipv6_magic(fl->fl6_src, + fl->fl6_dst, + len, fl->proto, skb->csum); + } else { + u32 tmp_csum = 0; - csum = (__u16 *) (buff + opt->offset); - if (*csum) { - /* in case cksum was not initialized */ - __u32 sum = hdr->cksum; - sum += *csum; - *csum = hdr->cksum = (sum + (sum>>16)); - } else { - *csum = hdr->cksum; - } - } else { - if (net_ratelimit()) - printk(KERN_DEBUG "icmp: cksum offset too big\n"); - return -EINVAL; + skb_queue_walk(&sk->write_queue, skb) { + tmp_csum = csum_add(tmp_csum, skb->csum); } - } - return 0; + + tmp_csum = csum_ipv6_magic(fl->fl6_src, + fl->fl6_dst, + len, fl->proto, tmp_csum); + *csum = tmp_csum; + } + if (*csum == 0) + *csum = -1; + ip6_push_pending_frames(sk); +out: + return err; } +static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, + struct flowi *fl, struct rt6_info *rt, + unsigned int flags) +{ + struct inet_opt *inet = inet_sk(sk); + struct ipv6hdr *iph; + struct sk_buff *skb; + unsigned int hh_len; + int err; + + if (length > rt->u.dst.dev->mtu) { + ipv6_local_error(sk, EMSGSIZE, fl, rt->u.dst.dev->mtu); + return -EMSGSIZE; + } + if (flags&MSG_PROBE) + goto out; + + hh_len = LL_RESERVED_SPACE(rt->u.dst.dev); + + skb = sock_alloc_send_skb(sk, length+hh_len+15, + flags&MSG_DONTWAIT, &err); + if (skb == NULL) + goto error; + skb_reserve(skb, hh_len); + + skb->priority = sk->priority; + skb->dst = dst_clone(&rt->u.dst); + + skb->nh.ipv6h = iph = (struct ipv6hdr *)skb_put(skb, length); + + skb->ip_summed = CHECKSUM_NONE; + + skb->h.raw = skb->nh.raw; + err = memcpy_fromiovecend((void *)iph, from, 0, length); + if (err) + goto error_fault; + + err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, rt->u.dst.dev, + dst_output); + if (err > 0) + err = inet->recverr ? net_xmit_errno(err) : 0; + if (err) + goto error; +out: + return 0; + +error_fault: + err = -EFAULT; + kfree_skb(skb); +error: + IP6_INC_STATS(Ip6OutDiscards); + return err; +} static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, int len) { struct ipv6_txoptions opt_space; struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name; + struct in6_addr *daddr, *saddr = NULL; struct inet_opt *inet = inet_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk); + struct raw6_opt *raw_opt = raw6_sk(sk); struct ipv6_txoptions *opt = NULL; struct ip6_flowlabel *flowlabel = NULL; + struct dst_entry *dst = NULL; struct flowi fl; int addr_len = msg->msg_namelen; - struct in6_addr *daddr; - struct raw6_opt *raw_opt; int hlimit = -1; u16 proto; int err; @@ -549,6 +581,8 @@ if (!proto) proto = inet->num; + else if (proto != inet->num) + return(-EINVAL); if (proto > 255) return(-EINVAL); @@ -587,6 +621,7 @@ * unspecfied destination address * treated as error... is this correct ? */ + fl6_sock_release(flowlabel); return(-EINVAL); } @@ -616,39 +651,71 @@ if (flowlabel) opt = fl6_merge_options(&opt_space, flowlabel, opt); - raw_opt = raw6_sk(sk); - fl.proto = proto; fl.fl6_dst = daddr; if (fl.fl6_src == NULL && !ipv6_addr_any(&np->saddr)) fl.fl6_src = &np->saddr; fl.uli_u.icmpt.type = 0; fl.uli_u.icmpt.code = 0; - - if (raw_opt->checksum) { - struct rawv6_fakehdr hdr; - - hdr.iov = msg->msg_iov; - hdr.sk = sk; - hdr.len = len; - hdr.cksum = 0; - hdr.proto = proto; - if (opt && opt->srcrt) - hdr.daddr = daddr; + /* merge ip6_build_xmit from ip6_output */ + if (opt && opt->srcrt) { + struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; + fl.fl6_dst = rt0->addr; + } + + if (!fl.oif && ipv6_addr_is_multicast(fl.nl_u.ip6_u.daddr)) + fl.oif = np->mcast_oif; + + err = ip6_dst_lookup(sk, &dst, &fl, &saddr); + if (err) goto out; + + if (hlimit < 0) { + if (ipv6_addr_is_multicast(fl.fl6_dst)) + hlimit = np->mcast_hops; else - hdr.daddr = NULL; + hlimit = np->hop_limit; + if (hlimit < 0) + hlimit = ((struct rt6_info*)dst)->rt6i_hoplimit; + } + + if (msg->msg_flags&MSG_CONFIRM) + goto do_confirm; - err = ip6_build_xmit(sk, rawv6_frag_cksum, &hdr, &fl, len, - opt, hlimit, msg->msg_flags); +back_from_confirm: + if (inet->hdrincl) { + err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, (struct rt6_info*)dst, msg->msg_flags); } else { - err = ip6_build_xmit(sk, rawv6_getfrag, msg->msg_iov, &fl, len, - opt, hlimit, msg->msg_flags); + lock_sock(sk); + err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, len, 0, + hlimit, opt, &fl, (struct rt6_info*)dst, msg->msg_flags); + + if (err) + ip6_flush_pending_frames(sk); + else if (!(msg->msg_flags & MSG_MORE)) { + if (raw_opt->checksum) { + err = rawv6_push_pending_frames(sk, &fl, raw_opt, len); + } else { + err = ip6_push_pending_frames(sk); + } + } } +done: + ip6_dst_store(sk, dst, fl.nl_u.ip6_u.daddr == &np->daddr ? &np->daddr : NULL); + if (err > 0) + err = np->recverr ? net_xmit_errno(err) : 0; + release_sock(sk); +out: fl6_sock_release(flowlabel); - + if (saddr) kfree(saddr); return err<0?err:len; +do_confirm: + dst_confirm(dst); + if (!(msg->msg_flags & MSG_PROBE) || len) + goto back_from_confirm; + err = 0; + goto done; } static int rawv6_seticmpfilter(struct sock *sk, int level, int optname, Index: net/ipv6/udp.c =================================================================== RCS file: /cvsroot/usagi/usagi-backport/linux25/net/ipv6/udp.c,v retrieving revision 1.1.1.9 retrieving revision 1.1.1.9.12.4 diff -u -u -r1.1.1.9 -r1.1.1.9.12.4 --- net/ipv6/udp.c 2 Apr 2003 04:16:14 -0000 1.1.1.9 +++ net/ipv6/udp.c 17 Apr 2003 01:43:15 -0000 1.1.1.9.12.4 @@ -14,6 +14,7 @@ * YOSHIFUJI Hideaki @USAGI and: Support IPV6_V6ONLY socket option, which * Alexey Kuznetsov allow both IPv4 and IPv6 sockets to bind * a single port at the same time. + * Kazunori MIYAZAWA @USAGI: change process style to use ip6_append_data * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -738,96 +739,117 @@ kfree_skb(skb); return(0); } - /* - * Sending + * Throw away all pending data and cancel the corking. Socket is locked. */ - -struct udpv6fakehdr +static void udp_v6_flush_pending_frames(struct sock *sk) { - struct udphdr uh; - struct iovec *iov; - __u32 wcheck; - __u32 pl_len; - struct in6_addr *daddr; -}; + struct udp_opt *up = udp_sk(sk); + + if (up->pending) { + up->pending = 0; + ip6_flush_pending_frames(sk); + } +} /* - * with checksum + * Sending */ -static int udpv6_getfrag(const void *data, struct in6_addr *addr, - char *buff, unsigned int offset, unsigned int len) +static int udp_v6_push_pending_frames(struct sock *sk, struct udp_opt *up) { - struct udpv6fakehdr *udh = (struct udpv6fakehdr *) data; - char *dst; - int final = 0; - int clen = len; + struct sk_buff *skb; + struct udphdr *uh; + struct ipv6_pinfo *np = inet6_sk(sk); + struct flowi *fl = np->cork.fl; + int err = 0; - dst = buff; + /* Grab the skbuff where UDP header space exists. */ + if ((skb = skb_peek(&sk->write_queue)) == NULL) + goto out; - if (offset) { - offset -= sizeof(struct udphdr); + /* + * Create a UDP header + */ + uh = skb->h.uh; + uh->source = fl->uli_u.ports.sport; + uh->dest = fl->uli_u.ports.dport; + uh->len = htons(up->len); + uh->check = 0; + + if (sk->no_check == UDP_CSUM_NOXMIT) { + skb->ip_summed = CHECKSUM_NONE; + goto send; + } + + if (skb_queue_len(&sk->write_queue) == 1) { + skb->csum = csum_partial((char *)uh, + sizeof(struct udphdr), skb->csum); + uh->check = csum_ipv6_magic(fl->fl6_src, + fl->fl6_dst, + up->len, fl->proto, skb->csum); } else { - dst += sizeof(struct udphdr); - final = 1; - clen -= sizeof(struct udphdr); - } - - if (csum_partial_copy_fromiovecend(dst, udh->iov, offset, - clen, &udh->wcheck)) - return -EFAULT; + u32 tmp_csum = 0; - if (final) { - struct in6_addr *daddr; - - udh->wcheck = csum_partial((char *)udh, sizeof(struct udphdr), - udh->wcheck); - - if (udh->daddr) { - daddr = udh->daddr; - } else { - /* - * use packet destination address - * this should improve cache locality - */ - daddr = addr + 1; - } - udh->uh.check = csum_ipv6_magic(addr, daddr, - udh->pl_len, IPPROTO_UDP, - udh->wcheck); - if (udh->uh.check == 0) - udh->uh.check = -1; + skb_queue_walk(&sk->write_queue, skb) { + tmp_csum = csum_add(tmp_csum, skb->csum); + } + tmp_csum = csum_partial((char *)uh, + sizeof(struct udphdr), tmp_csum); + tmp_csum = csum_ipv6_magic(fl->fl6_src, + fl->fl6_dst, + up->len, fl->proto, tmp_csum); + uh->check = tmp_csum; - memcpy(buff, udh, sizeof(struct udphdr)); } - return 0; + if (uh->check == 0) + uh->check = -1; + +send: + err = ip6_push_pending_frames(sk); +out: + up->len = 0; + up->pending = 0; + return err; } -static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, int ulen) +static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, int len) { struct ipv6_txoptions opt_space; - struct udpv6fakehdr udh; + struct udp_opt *up = udp_sk(sk); struct inet_opt *inet = inet_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk); struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) msg->msg_name; + struct in6_addr *daddr, *saddr = NULL; struct ipv6_txoptions *opt = NULL; struct ip6_flowlabel *flowlabel = NULL; struct flowi fl; + struct dst_entry *dst; int addr_len = msg->msg_namelen; - struct in6_addr *daddr; - int len = ulen + sizeof(struct udphdr); + int ulen = len; int addr_type; int hlimit = -1; - + int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; int err; /* Rough check on arithmetic overflow, better check is made in ip6_build_xmit */ - if (ulen < 0 || ulen > INT_MAX - sizeof(struct udphdr)) + if (len < 0 || len > INT_MAX - sizeof(struct udphdr)) return -EMSGSIZE; + if (up->pending) { + /* + * There are pending frames. + * The socket lock must be held while it's corked. + */ + lock_sock(sk); + if (likely(up->pending)) + goto do_append_data; + release_sock(sk); + } + ulen += sizeof(struct udphdr); + fl.fl6_flowlabel = 0; fl.oif = 0; @@ -835,7 +857,7 @@ if (sin6->sin6_family == AF_INET) { if (__ipv6_only_sock(sk)) return -ENETUNREACH; - return udp_sendmsg(iocb, sk, msg, ulen); + return udp_sendmsg(iocb, sk, msg, len); } if (addr_len < SIN6_LEN_RFC2133) @@ -847,7 +869,7 @@ if (sin6->sin6_port == 0) return -EINVAL; - udh.uh.dest = sin6->sin6_port; + up->dport = sin6->sin6_port; daddr = &sin6->sin6_addr; if (np->sndflow) { @@ -873,7 +895,7 @@ if (sk->state != TCP_ESTABLISHED) return -ENOTCONN; - udh.uh.dest = inet->dport; + up->dport = inet->dport; daddr = &np->daddr; fl.fl6_flowlabel = np->flow_label; } @@ -888,15 +910,14 @@ sin.sin_family = AF_INET; sin.sin_addr.s_addr = daddr->s6_addr32[3]; - sin.sin_port = udh.uh.dest; + sin.sin_port = up->dport; msg->msg_name = (struct sockaddr *)(&sin); msg->msg_namelen = sizeof(sin); fl6_sock_release(flowlabel); - return udp_sendmsg(iocb, sk, msg, ulen); + return udp_sendmsg(iocb, sk, msg, len); } - udh.daddr = NULL; if (!fl.oif) fl.oif = sk->bound_dev_if; fl.fl6_src = NULL; @@ -922,33 +943,172 @@ opt = np->opt; if (flowlabel) opt = fl6_merge_options(&opt_space, flowlabel, opt); - if (opt && opt->srcrt) - udh.daddr = daddr; - - udh.uh.source = inet->sport; - udh.uh.len = len < 0x10000 ? htons(len) : 0; - udh.uh.check = 0; - udh.iov = msg->msg_iov; - udh.wcheck = 0; - udh.pl_len = len; fl.proto = IPPROTO_UDP; fl.fl6_dst = daddr; if (fl.fl6_src == NULL && !ipv6_addr_any(&np->saddr)) fl.fl6_src = &np->saddr; - fl.uli_u.ports.dport = udh.uh.dest; - fl.uli_u.ports.sport = udh.uh.source; + fl.uli_u.ports.dport = up->dport; + fl.uli_u.ports.sport = inet->sport; + + /* merge ip6_build_xmit from ip6_output */ + if (opt && opt->srcrt) { + struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; + fl.fl6_dst = rt0->addr; + } - err = ip6_build_xmit(sk, udpv6_getfrag, &udh, &fl, len, opt, hlimit, - msg->msg_flags); + if (!fl.oif && ipv6_addr_is_multicast(fl.nl_u.ip6_u.daddr)) + fl.oif = np->mcast_oif; + err = ip6_dst_lookup(sk, &dst, &fl, &saddr); + if (err) goto out; + + if (hlimit < 0) { + if (ipv6_addr_is_multicast(fl.fl6_dst)) + hlimit = np->mcast_hops; + else + hlimit = np->hop_limit; + if (hlimit < 0) + hlimit = ((struct rt6_info*)dst)->rt6i_hoplimit; + } + + if (msg->msg_flags&MSG_CONFIRM) + goto do_confirm; +back_from_confirm: + + lock_sock(sk); + if (unlikely(up->pending)) { + /* The socket is already corked while preparing it. */ + /* ... which is an evident application bug. --ANK */ + release_sock(sk); + + NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "udp cork app bug 2\n")); + err = -EINVAL; + goto out; + } + + up->pending = 1; + +do_append_data: + up->len += ulen; + err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, ulen, sizeof(struct udphdr), + hlimit, opt, &fl, (struct rt6_info*)dst, + corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags); + if (err) + udp_v6_flush_pending_frames(sk); + else if (!corkreq) + err = udp_v6_push_pending_frames(sk, up); + + ip6_dst_store(sk, dst, fl.nl_u.ip6_u.daddr == &np->daddr ? &np->daddr : NULL); + if (err > 0) + err = np->recverr ? net_xmit_errno(err) : 0; + release_sock(sk); +out: fl6_sock_release(flowlabel); + if (saddr) kfree(saddr); + if (!err) { + UDP_INC_STATS_USER(UdpOutDatagrams); + return len; + } + return err; - if (err < 0) - return err; +do_confirm: + dst_confirm(dst); + if (!(msg->msg_flags&MSG_PROBE) || len) + goto back_from_confirm; + err = 0; + goto out; +} + +static int udpv6_destroy_sock(struct sock *sk) +{ + lock_sock(sk); + udp_v6_flush_pending_frames(sk); + release_sock(sk); + + inet6_destroy_sock(sk); + + return 0; +} + +/* + * Socket option code for UDP + */ +static int udpv6_setsockopt(struct sock *sk, int level, int optname, + char *optval, int optlen) +{ + struct udp_opt *up = udp_sk(sk); + int val; + int err = 0; + + if (level != SOL_UDP) + return ipv6_setsockopt(sk, level, optname, optval, optlen); - UDP6_INC_STATS_USER(UdpOutDatagrams); - return ulen; + if(optlencorkflag = 1; + } else { + up->corkflag = 0; + lock_sock(sk); + udp_v6_push_pending_frames(sk, up); + release_sock(sk); + } + break; + + case UDP_ENCAP: + up->encap_type = val; + break; + + default: + err = -ENOPROTOOPT; + break; + }; + + return err; +} + +static int udpv6_getsockopt(struct sock *sk, int level, int optname, + char *optval, int *optlen) +{ + struct udp_opt *up = udp_sk(sk); + int val, len; + + if (level != SOL_UDP) + return ipv6_getsockopt(sk, level, optname, optval, optlen); + + if(get_user(len,optlen)) + return -EFAULT; + + len = min_t(unsigned int, len, sizeof(int)); + + if(len < 0) + return -EINVAL; + + switch(optname) { + case UDP_CORK: + val = up->corkflag; + break; + + case UDP_ENCAP: + val = up->encap_type; + break; + + default: + return -ENOPROTOOPT; + }; + + if(put_user(len, optlen)) + return -EFAULT; + if(copy_to_user(optval, &val,len)) + return -EFAULT; + return 0; } static struct inet6_protocol udpv6_protocol = { @@ -1038,9 +1198,9 @@ .connect = udpv6_connect, .disconnect = udp_disconnect, .ioctl = udp_ioctl, - .destroy = inet6_destroy_sock, - .setsockopt = ipv6_setsockopt, - .getsockopt = ipv6_getsockopt, + .destroy = udpv6_destroy_sock, + .setsockopt = udpv6_setsockopt, + .getsockopt = udpv6_getsockopt, .sendmsg = udpv6_sendmsg, .recvmsg = udpv6_recvmsg, .backlog_rcv = udpv6_queue_rcv_skb, From davem@redhat.com Wed Apr 16 21:10:37 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 21:10:46 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3H4AaFu007593 for ; Wed, 16 Apr 2003 21:10:36 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id VAA14688; Wed, 16 Apr 2003 21:03:07 -0700 Date: Wed, 16 Apr 2003 21:03:06 -0700 (PDT) Message-Id: <20030416.210306.110472553.davem@redhat.com> To: kazunori@miyazawa.org Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, usagi@linux-ipv6.org Subject: Re: [PACTH][IPV6] Introduce ip6_append_data From: "David S. Miller" In-Reply-To: <20030417130231.179c7f00.kazunori@miyazawa.org> References: <20030417130231.179c7f00.kazunori@miyazawa.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2263 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 431 Lines: 12 You take direct page_address() of page, this is in general illegal. Generally you must kmap the page to access it in the kernel as it may be a HIGHMEM page. I know that right now you control all the allocations with alloc_page() and sk->allocation cannot currently allow highmem pages, but let us not start with the assumptions right now :-) As soon as you write udp6_sendfile() you will need to handle this, that is for sure. From util@hosting.rdsbv.ro Wed Apr 16 22:13:39 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 22:13:47 -0700 (PDT) Received: from hosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3H5DbFu009382 for ; Wed, 16 Apr 2003 22:13:39 -0700 Received: from hosting.rdsbv.ro (hosting.rdsbv.ro [213.157.185.164]) by hosting.rdsbv.ro (8.12.9/8.12.8) with ESMTP id h3H5DQ0A024986; Thu, 17 Apr 2003 08:13:28 +0300 Date: Thu, 17 Apr 2003 08:13:26 +0300 (EEST) From: Catalin BOIE To: jamal cc: Catalin BOIE , Tomas Szepe , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, manfred@colorfullife.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <20030416072952.E4013@shell.cyberus.ca> Message-ID: References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2264 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 2026 Lines: 65 Hi! > This is a different problem from previous one posted. Same oops in slab.c:1128. Why do you think is different. > Theres a small window (exposed given that you are provisioning a lot > of qdiscs and running traffic at the same time) that an incoming packet > interupt will cause the BUG(). > > GFP_ATOMIC will fix it, but i wonder if it appropriate. > > Alexey or Manfred? > > cheers, > jamal > > PS:- 15mbits is not a lot of traffic ;-> Yes, I know. I was comparing 15mbit with almost no traffic on the machine running same qdiscs/filters/classes... :) > > On Wed, 16 Apr 2003, Catalin BOIE wrote: > > > > - sch = kmalloc(size, GFP_KERNEL); > > > + sch = kmalloc(size, GFP_ATOMIC); > > > > > > mysteriously fixes the problem? Could the problem be elsewhere? > > > Can you repost what the issue was? I am not on lk and i just saw the > > > posting on a web page. > > > > With many rules (~5000 classes and ~3500 qdiscs and ~50000 filters) > > the kernel oopses in slab.c:1128. > > It happens on high rates (~15mbit). > > On low rates, doesn't. > > > > Seems that an interrupt come and broke the memory allocation. > > > > > > >>EIP; c0127ab4 <===== > > > > >>EAX; ffffffff > > >>EBX; c12c52c0 > > >>EDI; c12c52c0 > > >>ESP; ceab1c60 > > > > Trace; c0127e0f > > Trace; c01d3cac > > Trace; d081ecc7 > > Trace; c01d5265 > > Trace; d0820600 > > Trace; c01d27e4 > > Trace; c01d0605 <__neigh_event_send+89/1b4> > > Trace; c01d7cd4 > > Trace; c01d7730 > > Trace; c01d7b73 > > Trace; c01c79d5 > > Trace; c01c8b48 > > Trace; c0120010 > > > > > --- Catalin(ux) BOIE catab@deuroconsult.ro From util@hosting.rdsbv.ro Wed Apr 16 22:25:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 22:25:51 -0700 (PDT) Received: from hosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3H5PhFu009766 for ; Wed, 16 Apr 2003 22:25:44 -0700 Received: from hosting.rdsbv.ro (hosting.rdsbv.ro [213.157.185.164]) by hosting.rdsbv.ro (8.12.9/8.12.8) with ESMTP id h3H5Pc0A025451; Thu, 17 Apr 2003 08:25:38 +0300 Date: Thu, 17 Apr 2003 08:25:38 +0300 (EEST) From: Catalin BOIE To: Tomas Szepe cc: Manfred Spraul , jamal , Catalin BOIE , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <20030416160606.GA32575@louise.pinerecords.com> Message-ID: References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> <3E9D755A.8060601@colorfullife.com> <20030416160606.GA32575@louise.pinerecords.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2265 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 1050 Lines: 31 > > >>Trace; c0127e0f > > >>Trace; c01d3cac > > >>Trace; d081ecc7 > > >>Trace; c01d5265 > > >>Trace; d0820600 > > >>Trace; c01d27e4 > > >>Trace; c01d0605 <__neigh_event_send+89/1b4> > > >>Trace; c01d7cd4 > > >>Trace; c01d7730 > > >>Trace; c01d7b73 > > >>Trace; c01c79d5 > > >>Trace; c01c8b48 > > >>Trace; c0120010 > > >> > > I don't understand the backtrace. Were any modules loaded? Perhaps > > 0xd081ecc7 is a module. Yes, is htb module. I don't know why it didn't resolved. > The original backtrace as provided by Martin Volf does not contain > any weird addresses such as 0xd081ecc7 above: > > http://marc.theaimsgroup.com/?l=linux-kernel&m=105013596721774&w=2 > > -- > Tomas Szepe > --- Catalin(ux) BOIE catab@deuroconsult.ro From util@hosting.rdsbv.ro Wed Apr 16 23:06:57 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 16 Apr 2003 23:07:01 -0700 (PDT) Received: from hosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3H66tFu010361 for ; Wed, 16 Apr 2003 23:06:56 -0700 Received: from hosting.rdsbv.ro (hosting.rdsbv.ro [213.157.185.164]) by hosting.rdsbv.ro (8.12.9/8.12.8) with ESMTP id h3H66d0A027415; Thu, 17 Apr 2003 09:06:39 +0300 Date: Thu, 17 Apr 2003 09:06:39 +0300 (EEST) From: Catalin BOIE To: jamal cc: Manfred Spraul , Catalin BOIE , Tomas Szepe , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <20030416142802.E5912@shell.cyberus.ca> Message-ID: References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> <3E9D755A.8060601@colorfullife.com> <20030416142802.E5912@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2266 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 1773 Lines: 59 > Catalin, Can you what kernel that is? 2.4.20pre10 works ok but 2.4.20 crash. With traffic -> no crash with 2.4.20. Without traffic, on other machine, no crash. > > It's triggered, because someone does something like > > spin_lock_bh(&my_lock); > > p = kmalloc(,GFP_KERNEL); > > > > I don't like the proposed fix: usually code that calls > > kmalloc(,GFP_KERNEL) assumes that it runs at process space, e.g. uses > > semaphores, or non-bh spinlocks, etc. > > slab just happens to contain a test that complains about illegal calls. > > ok. Nice. > > > > > >>Trace; c0127e0f > > >>Trace; c01d3cac > > >>Trace; d081ecc7 > > >>Trace; c01d5265 > > >>Trace; d0820600 > > >>Trace; c01d27e4 > > >>Trace; c01d0605 <__neigh_event_send+89/1b4> > > >>Trace; c01d7cd4 > > >>Trace; c01d7730 > > >>Trace; c01d7b73 > > >>Trace; c01c79d5 > > >>Trace; c01c8b48 > > >>Trace; c0120010 > > >> > > >> > > >> > > >> > > I don't understand the backtrace. Were any modules loaded? Perhaps > > 0xd081ecc7 is a module. > > > > Probably a module. Again Catalin, run no modules. It's a production machine. I cannot test this. We plan to replace the machine, so I can test then. > > I'd add a > > if(in_interrupt()) show_stack(NULL); > > into qdisc_create_dflt(), and try to reproduce the bug without modules. > > > > Catalin - again instead of your fix can you please add this call? See above. I cannot test now. I'm very sorry! > cheers, > jamal > --- Catalin(ux) BOIE catab@deuroconsult.ro From hadi@cyberus.ca Thu Apr 17 03:56:11 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 17 Apr 2003 03:56:15 -0700 (PDT) Received: from mx03.cyberus.ca (mx03.cyberus.ca [216.191.240.24]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3HAuAFu017235 for ; Thu, 17 Apr 2003 03:56:10 -0700 Received: from shell.cyberus.ca ([216.191.240.114]) by mx03.cyberus.ca with esmtp (Exim 4.14) id 19673p-0005CT-Nq; Thu, 17 Apr 2003 06:56:09 -0400 Received: from shell.cyberus.ca (localhost.cyberus.ca [127.0.0.1]) by shell.cyberus.ca (8.12.6/8.12.6) with ESMTP id h3HAtPqu007807; Thu, 17 Apr 2003 06:55:25 -0400 (EDT) (envelope-from hadi@cyberus.ca) Received: from localhost (hadi@localhost) by shell.cyberus.ca (8.12.6/8.12.6/Submit) with ESMTP id h3HAtJpe007804; Thu, 17 Apr 2003 06:55:20 -0400 (EDT) (envelope-from hadi@cyberus.ca) X-Authentication-Warning: shell.cyberus.ca: hadi owned process doing -bs Date: Thu, 17 Apr 2003 06:55:19 -0400 (EDT) From: jamal To: Catalin BOIE cc: Manfred Spraul , Tomas Szepe , "" , "" , "" Subject: Re: [PATCH] qdisc oops fix In-Reply-To: Message-ID: <20030417065352.S6710@shell.cyberus.ca> References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> <3E9D755A.8060601@colorfullife.com> <20030416142802.E5912@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2267 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Content-Length: 2100 Lines: 72 Ok, I stand corrected. Tomas is right- same problem. You had htb loaded as a module, the other person had it compiled in ;-> Get yourself upgraded ;-> cheers, jamal On Thu, 17 Apr 2003, Catalin BOIE wrote: > > Catalin, Can you what kernel that is? > > 2.4.20pre10 works ok but 2.4.20 crash. > With traffic -> no crash with 2.4.20. Without traffic, on other machine, > no crash. > > > > > It's triggered, because someone does something like > > > spin_lock_bh(&my_lock); > > > p = kmalloc(,GFP_KERNEL); > > > > > > I don't like the proposed fix: usually code that calls > > > kmalloc(,GFP_KERNEL) assumes that it runs at process space, e.g. uses > > > semaphores, or non-bh spinlocks, etc. > > > slab just happens to contain a test that complains about illegal calls. > > > > ok. Nice. > > > > > > > > >>Trace; c0127e0f > > > >>Trace; c01d3cac > > > >>Trace; d081ecc7 > > > >>Trace; c01d5265 > > > >>Trace; d0820600 > > > >>Trace; c01d27e4 > > > >>Trace; c01d0605 <__neigh_event_send+89/1b4> > > > >>Trace; c01d7cd4 > > > >>Trace; c01d7730 > > > >>Trace; c01d7b73 > > > >>Trace; c01c79d5 > > > >>Trace; c01c8b48 > > > >>Trace; c0120010 > > > >> > > > >> > > > >> > > > >> > > > I don't understand the backtrace. Were any modules loaded? Perhaps > > > 0xd081ecc7 is a module. > > > > > > > Probably a module. Again Catalin, run no modules. > It's a production machine. I cannot test this. We plan to replace the > machine, so I can test then. > > > > I'd add a > > > if(in_interrupt()) show_stack(NULL); > > > into qdisc_create_dflt(), and try to reproduce the bug without modules. > > > > > > > Catalin - again instead of your fix can you please add this call? > See above. I cannot test now. I'm very sorry! > > > cheers, > > jamal > > > > --- > Catalin(ux) BOIE > catab@deuroconsult.ro > > From util@hosting.rdsbv.ro Thu Apr 17 23:47:39 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 17 Apr 2003 23:47:45 -0700 (PDT) Received: from hosting.rdsbv.ro (webhosting.rdsbv.ro [213.157.185.164]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3I6lbFu002416 for ; Thu, 17 Apr 2003 23:47:38 -0700 Received: from hosting.rdsbv.ro (hosting.rdsbv.ro [213.157.185.164]) by hosting.rdsbv.ro (8.12.9/8.12.8) with ESMTP id h3I6lL0A012759; Fri, 18 Apr 2003 09:47:24 +0300 Date: Fri, 18 Apr 2003 09:47:21 +0300 (EEST) From: Catalin BOIE To: jamal cc: Catalin BOIE , Manfred Spraul , Tomas Szepe , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: [PATCH] qdisc oops fix In-Reply-To: <20030417065352.S6710@shell.cyberus.ca> Message-ID: References: <20030415084706.O1131@shell.cyberus.ca> <20030416072952.E4013@shell.cyberus.ca> <3E9D755A.8060601@colorfullife.com> <20030416142802.E5912@shell.cyberus.ca> <20030417065352.S6710@shell.cyberus.ca> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2268 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: util@deuroconsult.ro Precedence: bulk X-list: netdev Content-Length: 2297 Lines: 77 > Ok, I stand corrected. Tomas is right- same problem. You had htb loaded > as a module, the other person had it compiled in ;-> > Get yourself upgraded ;-> I surely will! > > cheers, > jamal > > On Thu, 17 Apr 2003, Catalin BOIE wrote: > > > > Catalin, Can you what kernel that is? > > > > 2.4.20pre10 works ok but 2.4.20 crash. > > With traffic -> no crash with 2.4.20. Without traffic, on other machine, > > no crash. > > > > > > > > It's triggered, because someone does something like > > > > spin_lock_bh(&my_lock); > > > > p = kmalloc(,GFP_KERNEL); > > > > > > > > I don't like the proposed fix: usually code that calls > > > > kmalloc(,GFP_KERNEL) assumes that it runs at process space, e.g. uses > > > > semaphores, or non-bh spinlocks, etc. > > > > slab just happens to contain a test that complains about illegal calls. > > > > > > ok. Nice. > > > > > > > > > > > >>Trace; c0127e0f > > > > >>Trace; c01d3cac > > > > >>Trace; d081ecc7 > > > > >>Trace; c01d5265 > > > > >>Trace; d0820600 > > > > >>Trace; c01d27e4 > > > > >>Trace; c01d0605 <__neigh_event_send+89/1b4> > > > > >>Trace; c01d7cd4 > > > > >>Trace; c01d7730 > > > > >>Trace; c01d7b73 > > > > >>Trace; c01c79d5 > > > > >>Trace; c01c8b48 > > > > >>Trace; c0120010 > > > > >> > > > > >> > > > > >> > > > > >> > > > > I don't understand the backtrace. Were any modules loaded? Perhaps > > > > 0xd081ecc7 is a module. > > > > > > > > > > Probably a module. Again Catalin, run no modules. > > It's a production machine. I cannot test this. We plan to replace the > > machine, so I can test then. > > > > > > I'd add a > > > > if(in_interrupt()) show_stack(NULL); > > > > into qdisc_create_dflt(), and try to reproduce the bug without modules. > > > > > > > > > > Catalin - again instead of your fix can you please add this call? > > See above. I cannot test now. I'm very sorry! > > > > > cheers, > > > jamal > > > > > > > --- > > Catalin(ux) BOIE > > catab@deuroconsult.ro > > > > > --- Catalin(ux) BOIE catab@deuroconsult.ro From latten@austin.ibm.com Fri Apr 18 13:08:19 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 18 Apr 2003 13:08:26 -0700 (PDT) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3IK8IFu019441 for ; Fri, 18 Apr 2003 13:08:19 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e33.co.us.ibm.com (8.12.9/8.12.2) with ESMTP id h3IK8CXD022582; Fri, 18 Apr 2003 16:08:12 -0400 Received: from austin.ibm.com (d03av02.boulder.ibm.com [9.17.193.82]) by westrelay04.boulder.ibm.com (8.12.8/NCO/VER6.5) with ESMTP id h3IK8AUh027058; Fri, 18 Apr 2003 14:08:11 -0600 Received: from faith.austin.ibm.com (faith.austin.ibm.com [9.41.94.16]) by austin.ibm.com (8.12.9/8.12.9) with ESMTP id h3IK8AHQ057990; Fri, 18 Apr 2003 15:08:10 -0500 Received: from faith.austin.ibm.com (localhost.localdomain [127.0.0.1]) by faith.austin.ibm.com (8.12.5/8.12.8) with ESMTP id h3IKH5IY019823; Fri, 18 Apr 2003 15:17:05 -0500 Received: (from jml@localhost) by faith.austin.ibm.com (8.12.5/8.12.5/Submit) id h3IKH4ng019821; Fri, 18 Apr 2003 15:17:04 -0500 Date: Fri, 18 Apr 2003 15:17:04 -0500 From: latten@austin.ibm.com Message-Id: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> To: davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com Subject: IPsecv6 integrity failures not dropped Cc: linux-kernel@vger.kernel.org X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2269 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: latten@austin.ibm.com Precedence: bulk X-list: netdev Content-Length: 1405 Lines: 43 I am running IPSecv6 on 2.5.67 with patch-2.5.67-bk8. If AH authentication or ESP encryption integrity check for an incoming packet fails, result is an ICMPv6 Parameter problem of Unknown-Next-Header, instead of just dropping packet. This is because xfrm6_rcv() expects an unsigned-8-bit return value from the input handler, i.e. ah6_input() or esp6_input(). But handler returns a signed int (-EINVAL) that seems to be getting converted into a "u8" via 2's complement, because ah6_input() says it is returning -EINVAL/-22, but xfrm6_rcv() says it got a return value of 234, which it believes to be valid and passes to ip6_input() who thinks it is the next header. I modified ah6_input() and esp6_input() to return zero instead of -EINVAL in the fix below. I tested it and it works. Please let me know if this is ok. Joy ------------------------------------------------------------------------- --- ah6.c.orig 2003-04-17 16:04:07.000000000 -0500 +++ ah6.c 2003-04-18 14:15:37.000000000 -0500 @@ -212,7 +212,7 @@ free_out: kfree(tmp_hdr); out: - return -EINVAL; + return 0; } void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, --- esp6.c.orig 2003-04-17 17:07:25.000000000 -0500 +++ esp6.c 2003-04-17 17:08:17.000000000 -0500 @@ -346,7 +346,7 @@ return ret_nexthdr; out: - return -EINVAL; + return 0; } static u32 esp6_get_max_size(struct xfrm_state *x, int mtu) From davem@redhat.com Fri Apr 18 14:18:09 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 18 Apr 2003 14:18:14 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3ILI8Fu020531 for ; Fri, 18 Apr 2003 14:18:09 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id OAA19359; Fri, 18 Apr 2003 14:10:14 -0700 Date: Fri, 18 Apr 2003 14:10:14 -0700 (PDT) Message-Id: <20030418.141014.17269641.davem@redhat.com> To: latten@austin.ibm.com Cc: kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: IPsecv6 integrity failures not dropped From: "David S. Miller" In-Reply-To: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> References: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2270 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 445 Lines: 15 From: latten@austin.ibm.com Date: Fri, 18 Apr 2003 15:17:04 -0500 I modified ah6_input() and esp6_input() to return zero instead of -EINVAL in the fix below. I tested it and it works. Please let me know if this is ok. I think it would be better if ipv6's upper-layer interface worked like ipv4's. ie. a < 0 return value means: next_proto =- ret; goto resubmit; The less that is different between ipv4/ipv6 the better. From yoshfuji@wide.ad.jp Fri Apr 18 19:12:17 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 18 Apr 2003 19:12:36 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3J2CGFu023789 for ; Fri, 18 Apr 2003 19:12:17 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3J2CeDG002144; Sat, 19 Apr 2003 11:12:40 +0900 Date: Sat, 19 Apr 2003 11:12:38 +0900 (JST) Message-Id: <20030419.111238.07385967.yoshfuji@wide.ad.jp> To: davem@redhat.com Cc: latten@austin.ibm.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: IPsecv6 integrity failures not dropped From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030418.141014.17269641.davem@redhat.com> References: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> <20030418.141014.17269641.davem@redhat.com> X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2271 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@wide.ad.jp Precedence: bulk X-list: netdev Content-Length: 1614 Lines: 46 In article <20030418.141014.17269641.davem@redhat.com> (at Fri, 18 Apr 2003 14:10:14 -0700 (PDT)), "David S. Miller" says: > I think it would be better if ipv6's upper-layer interface worked > like ipv4's. ie. a < 0 return value means: > > next_proto =- ret; > goto resubmit; NO! Please, don't do this again (for now, at least). This idea is what we had introduced the bug, that was fixed by "[IPV6]: Fixed multiple mistake extension header handling." We need to get the offset of the next header, in addition to the value itself. inet6_protocol function will return: > 0: more header(s) follows; next header is pointed by skb->nh.raw[nhoff] = 0: stop parsing on success; increment the statistics (nhoff is undefined) < 0: stop parsing on failure (nhoff is undefined) If upper-layer returns positive value, we continue parsing. Then, if the skb->nh.raw[nhoff] is unknown, we send back the parameter problem message with the offset to the unrecognized next header field. > The less that is different between ipv4/ipv6 the better. Agreed, but please note that IPv4 side would be required to be changed in general. Well... 1) May we have a new member to point the offset of the next header in ipv6_pinfo{}? Then, we can remove *nhoffp from argument of inet6_protocol function. (We will be cleaner handing of HbH option, too.) 2) change IPv4 upperlayer function to take struct sk_buff **. If you are not in hurry, I'll take care of this. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From yoshfuji@wide.ad.jp Fri Apr 18 19:50:29 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 18 Apr 2003 19:50:32 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3J2oSFu024537 for ; Fri, 18 Apr 2003 19:50:28 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3J2orDG002349; Sat, 19 Apr 2003 11:50:53 +0900 Date: Sat, 19 Apr 2003 11:50:53 +0900 (JST) Message-Id: <20030419.115053.123574563.yoshfuji@wide.ad.jp> To: latten@austin.ibm.com Cc: davem@redhat.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: IPsecv6 integrity failures not dropped From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> References: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2272 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@wide.ad.jp Precedence: bulk X-list: netdev Content-Length: 1035 Lines: 21 In article <200304182017.h3IKH4ng019821@faith.austin.ibm.com> (at Fri, 18 Apr 2003 15:17:04 -0500), latten@austin.ibm.com says: > incoming packet fails, result is an ICMPv6 Parameter problem > of Unknown-Next-Header, instead of just dropping packet. This > is because xfrm6_rcv() expects an unsigned-8-bit return value > from the input handler, i.e. ah6_input() or esp6_input(). But handler > returns a signed int (-EINVAL) that seems to be getting converted into > a "u8" via 2's complement, because ah6_input() says it is returning > -EINVAL/-22, but xfrm6_rcv() says it got a return value of 234, > which it believes to be valid and passes to ip6_input() who thinks it is > the next header. > > I modified ah6_input() and esp6_input() to return zero instead of -EINVAL > in the fix below. I tested it and it works. just change u8 nexthdr = 0 to int nexthdr = 0, in xfrm6_rcv() is fine, isn't it? -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From yoshfuji@wide.ad.jp Fri Apr 18 19:54:29 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 18 Apr 2003 19:54:35 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3J2sSFu024867 for ; Fri, 18 Apr 2003 19:54:28 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3J2HJDG002169; Sat, 19 Apr 2003 11:17:20 +0900 Date: Sat, 19 Apr 2003 11:17:19 +0900 (JST) Message-Id: <20030419.111719.51896623.yoshfuji@wide.ad.jp> To: davem@redhat.com Cc: latten@austin.ibm.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: IPsecv6 integrity failures not dropped From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030419.111238.07385967.yoshfuji@wide.ad.jp> References: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> <20030418.141014.17269641.davem@redhat.com> <20030419.111238.07385967.yoshfuji@wide.ad.jp> X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2273 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@wide.ad.jp Precedence: bulk X-list: netdev Content-Length: 486 Lines: 8 In article <20030419.111238.07385967.yoshfuji@wide.ad.jp> (at Sat, 19 Apr 2003 11:12:38 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > > 0: more header(s) follows; next header is pointed by skb->nh.raw[nhoff] next header is pointed by nhoff (which means, the next header is skb->nh.raw[nhoff]) -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From acme@conectiva.com.br Sat Apr 19 09:15:01 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 19 Apr 2003 09:15:09 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3JGExFu002445 for ; Sat, 19 Apr 2003 09:15:00 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 196v4f-0004Cp-00; Sat, 19 Apr 2003 13:20:21 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 8F0B51966C; Sat, 19 Apr 2003 16:14:58 +0000 (UTC) Date: Sat, 19 Apr 2003 13:14:57 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] new module infrastructure for net_proto_family Message-ID: <20030419161457.GA6164@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2274 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 3718 Lines: 125 Hi David, Please consider pulling from: bk://kernel.bkbits.net/acme/net-2.5 Waiting for OK so that I can submit the conversion for the protocols. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1119, 2003-04-19 13:07:08-03:00, acme@conectiva.com.br o net: new module infrastructure for net_proto_family Next batch of changesets will fix the legacy protocols (IPX, LLC, etc). Tested with LLC and IPX already. include/linux/net.h | 13 ++++++++----- net/socket.c | 16 +++++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff -Nru a/include/linux/net.h b/include/linux/net.h --- a/include/linux/net.h Sat Apr 19 13:10:22 2003 +++ b/include/linux/net.h Sat Apr 19 13:10:22 2003 @@ -127,14 +127,17 @@ int offset, size_t size, int flags); }; +struct module; + struct net_proto_family { - int family; - int (*create)(struct socket *sock, int protocol); + int family; + int (*create)(struct socket *sock, int protocol); /* These are counters for the number of different methods of each we support */ - short authentication; - short encryption; - short encrypt_net; + short authentication; + short encryption; + short encrypt_net; + struct module *owner; }; struct iovec; diff -Nru a/net/socket.c b/net/socket.c --- a/net/socket.c Sat Apr 19 13:10:22 2003 +++ b/net/socket.c Sat Apr 19 13:10:22 2003 @@ -506,8 +506,10 @@ void sock_release(struct socket *sock) { - if (sock->ops) + if (sock->ops) { sock->ops->release(sock); + module_put(net_families[sock->ops->family]->owner); + } if (sock->fasync_list) printk(KERN_ERR "sock_release: fasync list not empty!\n"); @@ -1058,11 +1060,12 @@ sock->type = type; + i = -EBUSY; + if (!try_module_get(net_families[family]->owner)) + goto out_release; + if ((i = net_families[family]->create(sock, protocol)) < 0) - { - sock_release(sock); - goto out; - } + goto out_release; *res = sock; security_socket_post_create(sock, family, type, protocol); @@ -1070,6 +1073,9 @@ out: net_family_read_unlock(); return i; +out_release: + sock_release(sock); + goto out; } asmlinkage long sys_socket(int family, int type, int protocol) =================================================================== This BitKeeper patch contains the following changesets: 1.1119 ## Wrapped with gzip_uu ## M'XL( .YTH3X ^56;6_;-A#^+/Z*&_K%SF*9I%YMPT&:I-B"!EV0+L"&;3 8 MBK:$RJ)!47&,:?^])\EUG"2/SSUW#ZTW<%LJ,W:$7"KR!G[6 MI1T[4A=*VNQ>N%(OW3N# S=:X\ PU4LU/'L_+)0=<#<@.'(MK$SA7IER[##7 MVUGL9J7&SLV[GVZOWMX0,IW">2J*A?JH+$RGQ&IS+_*D/!4VS77A6B.*]FUIS2CE> 8L\&H0U"ZD?U9(EC F?J81R/PY]\K9(3*9*]\SH:JW,J5QG M;I$_=N-1GXTH9;$_JGD4FF3);&6WU;"Z6 M6;[!=7A_4 \6[EKF]1QDNWFI; GK+,]AGCV 317D:B'D!MKE4N X]&'B?77_-)!B_\$4(% M)2?/,(B!#DLM/RGKRGT21T%4AWX4!;6D\XB'8AX$T?R.C^3AA/W+45L)F ;. MPCH( _8\E*R0>96H89X5U4-3_6[Z")%/:S[""W&-* L]G\6"BE"I;R#ZAK]' MP(+8"UO=')C\O()>C9B\%#$-F4>]P*\#[K&X$Y7W6%)\S,+_EE0,@^ [EE27 M[%]@8-;MC1*Y/I3W5RCMDO$1<-(%O.5@0OXD%\QC:+]D'L?&R0KK.%WTDVVO M=R01H%7]WG9QIR$X:MICA&=W4?%-)O50=L,(VV,^X"=([TNE)FT>MB7\_-">/DI0LI4+9<99MN M[!(T^ _,PK&(H]KVC&.4#,+^TFTC;N!^63SY^K$F4R4_E=5RFC OGL=^0CX# (H=]Z"@<* From davem@redhat.com Sat Apr 19 15:24:33 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 19 Apr 2003 15:24:39 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3JMOWFu005923 for ; Sat, 19 Apr 2003 15:24:33 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id PAA21020; Sat, 19 Apr 2003 15:17:06 -0700 Date: Sat, 19 Apr 2003 15:17:06 -0700 (PDT) Message-Id: <20030419.151706.86912986.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCH] new module infrastructure for net_proto_family From: "David S. Miller" In-Reply-To: <20030419161457.GA6164@conectiva.com.br> References: <20030419161457.GA6164@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2275 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 797 Lines: 26 From: Arnaldo Carvalho de Melo Date: Sat, 19 Apr 2003 13:14:57 -0300 Have a look at this: diff -Nru a/net/socket.c b/net/socket.c --- a/net/socket.c Sat Apr 19 13:10:22 2003 +++ b/net/socket.c Sat Apr 19 13:10:22 2003 @@ -506,8 +506,10 @@ void sock_release(struct socket *sock) { - if (sock->ops) + if (sock->ops) { sock->ops->release(sock); + module_put(net_families[sock->ops->family]->owner); + } Maybe you want to cache sock->ops->family before calling sock->ops->release, maybe nobody does it but it could be legal to NULL sock->ops during sock->ops->release() If anything this code should NULL'ify it because any reference to sock->ops after the release and module_put() is a BUG() that should be trapped. From acme@conectiva.com.br Sat Apr 19 15:58:02 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 19 Apr 2003 15:58:09 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3JMw0Fu006353 for ; Sat, 19 Apr 2003 15:58:01 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1971Mj-0004UT-00; Sat, 19 Apr 2003 20:03:26 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id A62B21966C; Sat, 19 Apr 2003 22:58:00 +0000 (UTC) Date: Sat, 19 Apr 2003 19:57:59 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH] new module infrastructure for net_proto_family Message-ID: <20030419225759.GB6251@conectiva.com.br> References: <20030419161457.GA6164@conectiva.com.br> <20030419.151706.86912986.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030419.151706.86912986.davem@redhat.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2276 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 736 Lines: 24 Em Sat, Apr 19, 2003 at 03:17:06PM -0700, David S. Miller escreveu: > From: Arnaldo Carvalho de Melo > Date: Sat, 19 Apr 2003 13:14:57 -0300 > > Have a look at this: > - if (sock->ops) > + if (sock->ops) { > sock->ops->release(sock); > + module_put(net_families[sock->ops->family]->owner); > + } > Maybe you want to cache sock->ops->family before calling > sock->ops->release, maybe nobody does it but it could be > legal to NULL sock->ops during sock->ops->release() > If anything this code should NULL'ify it because any reference to sock->ops > after the release and module_put() is a BUG() that should be trapped. Ok, agreed, new changeset in the making. - Arnaldo From acme@conectiva.com.br Sat Apr 19 16:34:10 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 19 Apr 2003 16:34:15 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3JNY8Fu006882 for ; Sat, 19 Apr 2003 16:34:09 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 1971vh-0004VS-00; Sat, 19 Apr 2003 20:39:33 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id D78AA1966C; Sat, 19 Apr 2003 23:34:08 +0000 (UTC) Date: Sat, 19 Apr 2003 20:34:08 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] take2: new module infrastructure for net_proto_family Message-ID: <20030419233408.GG6251@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2277 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 3853 Lines: 131 Hi David, Please consider pulling from: bk://kernel.bkbits.net/acme/net-2.5 It has your suggestions implemented. Waiting for OK so that I can submit the conversion for the protocols. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1119, 2003-04-19 20:26:12-03:00, acme@conectiva.com.br o net: new module infrastructure for net_proto_family Next batch of changesets will fix the legacy protocols (IPX, LLC, etc). Tested with LLC and IPX already. include/linux/net.h | 13 ++++++++----- net/socket.c | 19 ++++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff -Nru a/include/linux/net.h b/include/linux/net.h --- a/include/linux/net.h Sat Apr 19 20:30:08 2003 +++ b/include/linux/net.h Sat Apr 19 20:30:08 2003 @@ -127,14 +127,17 @@ int offset, size_t size, int flags); }; +struct module; + struct net_proto_family { - int family; - int (*create)(struct socket *sock, int protocol); + int family; + int (*create)(struct socket *sock, int protocol); /* These are counters for the number of different methods of each we support */ - short authentication; - short encryption; - short encrypt_net; + short authentication; + short encryption; + short encrypt_net; + struct module *owner; }; struct iovec; diff -Nru a/net/socket.c b/net/socket.c --- a/net/socket.c Sat Apr 19 20:30:08 2003 +++ b/net/socket.c Sat Apr 19 20:30:08 2003 @@ -506,8 +506,13 @@ void sock_release(struct socket *sock) { - if (sock->ops) + if (sock->ops) { + const int family = sock->ops->family; + sock->ops->release(sock); + sock->ops = NULL; + module_put(net_families[family]->owner); + } if (sock->fasync_list) printk(KERN_ERR "sock_release: fasync list not empty!\n"); @@ -1058,11 +1063,12 @@ sock->type = type; + i = -EBUSY; + if (!try_module_get(net_families[family]->owner)) + goto out_release; + if ((i = net_families[family]->create(sock, protocol)) < 0) - { - sock_release(sock); - goto out; - } + goto out_release; *res = sock; security_socket_post_create(sock, family, type, protocol); @@ -1070,6 +1076,9 @@ out: net_family_read_unlock(); return i; +out_release: + sock_release(sock); + goto out; } asmlinkage long sys_socket(int family, int type, int protocol) =================================================================== This BitKeeper patch contains the following changesets: 1.1119 ## Wrapped with gzip_uu ## M'XL( #NX?6*[BME$D<(>>*O()? M=&431^I229O?"5?JN3LQN'"C-2[T,CU7O?-WO5+9+G<#@BO7PLH,[I2I$H>Y MWF[&KAO+T=O;XA9#B$BTR4,_5!61@.B=7F3A1I=29L5NC2M4:4U5S9 M9L_-SG3#*>5X!2SR:!!N6$C]:"-9RICPF4HI]_NA3UZ7JI5Y"*=2LG'W+ M!OS,H4O).?R[*5P0"1J0V 1O*YCK=%DHR,NI$94U2VF71L%4F]IDO##:ZO%4 MS/-BC7X >'NO[BU,&N[U%&2S?:5L!:N\*&":WX/-%!1J)N0:&@"IBPHZ5]>_ MG\!H='$"RLHC%Y%^4Y55*?K9K%X 4:: 5B *HT2Z=LD[X%'LA>3Z:TU)]YD? M0JB@Y/0)%C'97J7E)V5=N4]D'$2;T(^B8"/I-.*AF 9!-)WP6!XNVC^ FF[@ M'F<,@:@7AD^&DI>R6*:J5^3E\KY6@)L]BLBG&Q[CA7'%E(6>S_J"BE"I[T3T M';S]P(*@CRS7VCE@_+2*7APQ>6[$-&0>]0)_$W"/]5MA>8]EQ1(6_5A6?>@& M_W%9M07_%;IFU7Q1)M>':O\"M5TQCH4@;=);'@;D([ED'L/Y*^9Q')R\M([3 M,C#8/G6.)09HU5%GZ]SJ"([K\03#L[N\CP8U7@!>C1>!3YPJTP8QQ!)9*FTN MA+@W!@SK2?W W:.]:I49M!H8E_23XOA^2<)J3(UG^=8;W.F MJ[1PM9D=/$?Z-0P--C[FW/ZK!.RYS<_\_[N_/8>_Z?Y]PE_0]I$8+2&<':K:/G^=C3" M)G5:9L>+I>W45#9>^$+R9^O^%YK7?8OR<#ZC-&A(:VWD"-!]XZ0[Y!+^W8J$*):JMG&G)$KW<),/-#5K@6<; Sat, 19 Apr 2003 18:48:49 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id SAA21396; Sat, 19 Apr 2003 18:41:22 -0700 Date: Sat, 19 Apr 2003 18:41:22 -0700 (PDT) Message-Id: <20030419.184122.74731778.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCH] take2: new module infrastructure for net_proto_family From: "David S. Miller" In-Reply-To: <20030419233408.GG6251@conectiva.com.br> References: <20030419233408.GG6251@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2278 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 604 Lines: 18 From: Arnaldo Carvalho de Melo Date: Sat, 19 Apr 2003 20:34:08 -0300 Please consider pulling from: bk://kernel.bkbits.net/acme/net-2.5 It has your suggestions implemented. Pulled, thanks. Note that, eventually we'll need to handle the struct sock side of this equation. Consider that struct sock's can exist long after the user struct socket is closed (TCP is the best example), yet they reference internals to the protocol module (via sk and skb callbacks, hash table linkage, etc.). We can deal with this later, let's merge your stuff in first. From davem@redhat.com Sat Apr 19 20:43:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Sat, 19 Apr 2003 20:43:53 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3K3hiFu009252 for ; Sat, 19 Apr 2003 20:43:44 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id UAA21600; Sat, 19 Apr 2003 20:35:43 -0700 Date: Sat, 19 Apr 2003 20:35:43 -0700 (PDT) Message-Id: <20030419.203543.112604079.davem@redhat.com> To: yoshfuji@wide.ad.jp Cc: latten@austin.ibm.com, kuznet@ms2.inr.ac.ru, netdev@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: IPsecv6 integrity failures not dropped From: "David S. Miller" In-Reply-To: <20030419.115053.123574563.yoshfuji@wide.ad.jp> References: <200304182017.h3IKH4ng019821@faith.austin.ibm.com> <20030419.115053.123574563.yoshfuji@wide.ad.jp> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2279 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 268 Lines: 8 From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Sat, 19 Apr 2003 11:50:53 +0900 (JST) just change u8 nexthdr = 0 to int nexthdr = 0, in xfrm6_rcv() is fine, isn't it? That's exactly the most correct fix, applied to my tree. Thanks. From acme@conectiva.com.br Sun Apr 20 09:02:17 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 20 Apr 2003 09:02:24 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3KG2FFu021852 for ; Sun, 20 Apr 2003 09:02:16 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 197HM0-0004zK-00; Sun, 20 Apr 2003 13:07:44 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 4F29D1966C; Sun, 20 Apr 2003 16:02:19 +0000 (UTC) Date: Sun, 20 Apr 2003 13:02:18 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH] take2: new module infrastructure for net_proto_family Message-ID: <20030420160218.GB8399@conectiva.com.br> References: <20030419233408.GG6251@conectiva.com.br> <20030419.184122.74731778.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030419.184122.74731778.davem@redhat.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2280 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 548 Lines: 13 Em Sat, Apr 19, 2003 at 06:41:22PM -0700, David S. Miller escreveu: > Note that, eventually we'll need to handle the struct sock side of this > equation. Consider that struct sock's can exist long after the user struct > socket is closed (TCP is the best example), yet they reference internals to > the protocol module (via sk and skb callbacks, hash table linkage, etc.). humm, I'll work on this later today, tweaking sk_alloc/sk_free. > We can deal with this later, let's merge your stuff in first. Thanks, now to easter lunch :-) - Arnaldo From acme@conectiva.com.br Sun Apr 20 09:10:07 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 20 Apr 2003 09:10:12 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3KGA5Fu022211 for ; Sun, 20 Apr 2003 09:10:06 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 197HTa-0004zb-00; Sun, 20 Apr 2003 13:15:34 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 4355A1966C; Sun, 20 Apr 2003 16:10:09 +0000 (UTC) Date: Sun, 20 Apr 2003 13:10:08 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH] take2: new module infrastructure for net_proto_family Message-ID: <20030420161008.GC8399@conectiva.com.br> References: <20030419233408.GG6251@conectiva.com.br> <20030419.184122.74731778.davem@redhat.com> <20030420160218.GB8399@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030420160218.GB8399@conectiva.com.br> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2281 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 769 Lines: 17 Em Sun, Apr 20, 2003 at 01:02:18PM -0300, Arnaldo C. Melo escreveu: > Em Sat, Apr 19, 2003 at 06:41:22PM -0700, David S. Miller escreveu: > > Note that, eventually we'll need to handle the struct sock side of this > > equation. Consider that struct sock's can exist long after the user struct > > socket is closed (TCP is the best example), yet they reference internals to > > the protocol module (via sk and skb callbacks, hash table linkage, etc.). > > humm, I'll work on this later today, tweaking sk_alloc/sk_free. as net_families is static in net/socket.c we'll need npf_get and npf_put (net proto family get/put), is the naming OK for you? > > We can deal with this later, let's merge your stuff in first. > > Thanks, now to easter lunch :-) > > - Arnaldo From markzzzsmith@ozemail.com.au Sun Apr 20 09:36:08 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 20 Apr 2003 09:36:14 -0700 (PDT) Received: from mail.nosense.org (1Cust63.tnt4.adl1.da.uu.net [63.34.231.63]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3KGa4Fu022717 for ; Sun, 20 Apr 2003 09:36:07 -0700 Received: from localhost.localdomain (localhost [127.0.0.1]) by mail.nosense.org (Postfix) with ESMTP id 5448C3B306 for ; Mon, 21 Apr 2003 02:05:32 +0930 (CST) Subject: [2.4.20] Frustrating DNS / UDP Socket flakeyness From: Mark Smith To: netdev@oss.sgi.com Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.5 Date: 21 Apr 2003 02:05:32 +0930 Message-Id: <1050856532.1816.22.camel@dupy> Mime-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2282 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: markzzzsmith@ozemail.com.au Precedence: bulk X-list: netdev Content-Length: 1974 Lines: 74 Hi, I'm having trouble with UDP based DNS queries when my 33.6 Kbps ppp link is under load eg while performing a TCP file transfer / HTTP etc. While a TCP download is running, the UDP / DNS queries are sent, a response comes back from the DNS server, but for some reason, in the kernel appears to have closed the UDP socket, and therefore generates an ICMP destination unreachable, port unreachable message back to the DNS server. The problem happens irrespective of whether I trigger the DNS lookup via phoenix, wget or the djb utility dnsip. There are no problems with these UDP / DNS queries if the link is not busy. I've stored some packet traces here : Full packet dump, including HTTP transfer : http://members.ozemail.com.au/~markzzzsmith/flakey-udpsocket.libpcap.gz Just the UDP DNS query, response, and corresponding ICMP dest unreachable. http://members.ozemail.com.au/~markzzzsmith/flakey-udpsocket-nontcp.libpcap.gz My system is running up-to-date debian 3.0, with a pure 2.4.20 kernel, with the following networking options : -- # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_MMAP=y # CONFIG_NETLINK_DEV is not set # CONFIG_NETFILTER is not set # CONFIG_FILTER is not set CONFIG_UNIX=y CONFIG_INET=y # CONFIG_IP_MULTICAST is not set # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set # CONFIG_ARPD is not set CONFIG_INET_ECN=y # CONFIG_SYN_COOKIES is not set # CONFIG_IPV6 is not set # CONFIG_KHTTPD is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set -- Just in case it is useful, the full kernel config is here : http://www.nosense.org/2.4.20-dupy.netslim I normally compile about all the networking options into the kernel, the same problem was occurring. It also seemed to be present in 2.4.19. Please let me know if I can be of further assistance in diagnosing this problem. Thanks, Mark. From jamesm@samba.org Sun Apr 20 09:40:43 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 20 Apr 2003 09:40:46 -0700 (PDT) Received: from lists.samba.org (dp.samba.org [66.70.73.150]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3KGegFu023055 for ; Sun, 20 Apr 2003 09:40:43 -0700 Received: by lists.samba.org (Postfix, from userid 537) id 564452C017; Sun, 20 Apr 2003 16:40:42 +0000 (GMT) Received: from localhost (localhost [127.0.0.1]) by lists.samba.org (Postfix) with ESMTP id 52CFB30127; Sun, 20 Apr 2003 16:40:42 +0000 (GMT) Date: Sun, 20 Apr 2003 16:40:42 +0000 (GMT) From: jamesm@samba.org To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH][TG3] fix tx timeout after setting mtu Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2283 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jamesm@samba.org Precedence: bulk X-list: netdev Content-Length: 401 Lines: 18 This patch against recent bk stops a tx timeout when setting the mtu. - James -- James Morris --- bk.orig/drivers/net/tg3.c Thu Apr 10 08:37:14 2003 +++ bk.w1/drivers/net/tg3.c Mon Apr 21 02:22:48 2003 @@ -2769,6 +2769,7 @@ tg3_init_rings(tp); tg3_init_hw(tp); + netif_wake_queue(tp->dev); spin_unlock(&tp->tx_lock); spin_unlock_irq(&tp->lock); tg3_netif_start(tp); From jgarzik@pobox.com Sun Apr 20 10:19:49 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 20 Apr 2003 10:19:53 -0700 (PDT) Received: from www.linux.org.uk (parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3KHJlFu023867 for ; Sun, 20 Apr 2003 10:19:48 -0700 Received: from rdu57-8-131.nc.rr.com ([66.57.8.131] helo=pobox.com) by www.linux.org.uk with esmtp (Exim 4.14) id 197ITi-0004R7-5U; Sun, 20 Apr 2003 18:19:46 +0100 Message-ID: <3EA2D6A6.6070809@pobox.com> Date: Sun, 20 Apr 2003 13:19:34 -0400 From: Jeff Garzik Organization: none User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021213 Debian/1.2.1-2.bunk X-Accept-Language: en MIME-Version: 1.0 To: jamesm@samba.org CC: netdev@oss.sgi.com Subject: Re: [PATCH][TG3] fix tx timeout after setting mtu References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2285 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 298 Lines: 12 jamesm@samba.org wrote: > This patch against recent bk stops a tx timeout when setting the mtu. hmmm, gonna have to think on this a bit... tg3_netif_start calls netif_wake_queue, which _should_ take care of this problem. According to you it doesn't, so we need to figure out why... Jeff From davem@redhat.com Sun Apr 20 12:49:33 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 20 Apr 2003 12:49:41 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3KJnWFu025402 for ; Sun, 20 Apr 2003 12:49:33 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id MAA29349; Sun, 20 Apr 2003 12:41:57 -0700 Date: Sun, 20 Apr 2003 12:41:56 -0700 (PDT) Message-Id: <20030420.124156.41659216.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCH] take2: new module infrastructure for net_proto_family From: "David S. Miller" In-Reply-To: <20030420161008.GC8399@conectiva.com.br> References: <20030419.184122.74731778.davem@redhat.com> <20030420160218.GB8399@conectiva.com.br> <20030420161008.GC8399@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2286 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 413 Lines: 10 From: Arnaldo Carvalho de Melo Date: Sun, 20 Apr 2003 13:10:08 -0300 Em Sun, Apr 20, 2003 at 01:02:18PM -0300, Arnaldo C. Melo escreveu: > humm, I'll work on this later today, tweaking sk_alloc/sk_free. as net_families is static in net/socket.c we'll need npf_get and npf_put (net proto family get/put), is the naming OK for you? I'd prefer net_family_{get,put}(). From kaos@ocs.com.au Sun Apr 20 17:33:38 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 20 Apr 2003 17:33:44 -0700 (PDT) Received: from mail.ocs.com.au (mail.ocs.com.au [203.34.97.2]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3L0XZFu027811 for ; Sun, 20 Apr 2003 17:33:37 -0700 Received: (qmail 8015 invoked from network); 21 Apr 2003 00:33:33 -0000 Received: from ocs3.intra.ocs.com.au (192.168.255.3) by mail.ocs.com.au with SMTP; 21 Apr 2003 00:33:33 -0000 Received: by ocs3.intra.ocs.com.au (Postfix, from userid 16331) id A50983000B8; Mon, 21 Apr 2003 10:33:30 +1000 (EST) Received: from ocs3.intra.ocs.com.au (localhost [127.0.0.1]) by ocs3.intra.ocs.com.au (Postfix) with ESMTP id 17F19266; Mon, 21 Apr 2003 10:33:30 +1000 (EST) X-Mailer: exmh version 2.4 06/23/2000 with nmh-1.0.4 From: Keith Owens To: Mark Smith Cc: netdev@oss.sgi.com Subject: Re: [2.4.20] Frustrating DNS / UDP Socket flakeyness In-reply-to: Your message of "21 Apr 2003 02:05:32 +0930." <1050856532.1816.22.camel@dupy> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Mon, 21 Apr 2003 10:33:23 +1000 Message-ID: <17626.1050885203@ocs3.intra.ocs.com.au> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2287 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaos@ocs.com.au Precedence: bulk X-list: netdev Content-Length: 662 Lines: 14 On 21 Apr 2003 02:05:32 +0930, Mark Smith wrote: >While a TCP download is running, the UDP / DNS queries are sent, a >response comes back from the DNS server, but for some reason, in the >kernel appears to have closed the UDP socket, and therefore generates an >ICMP destination unreachable, port unreachable message back to the DNS >server. The response takes too long so the resolver is timing out the request and trying another server. When the delayed response arrives, the resolver has closed the socket so the icmp reject is correct. The default timeout is 5 seconds, try adding 'options timeout:10' to /etc/resolv.conf. From steve@gw.chygwyn.com Mon Apr 21 03:20:36 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 21 Apr 2003 03:20:44 -0700 (PDT) Received: from gw.chygwyn.com (IDENT:root@gw.chygwyn.com [62.172.158.50]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3LAKYFu004179 for ; Mon, 21 Apr 2003 03:20:35 -0700 Received: (from steve@localhost) by gw.chygwyn.com (8.9.3/8.9.3) id LAA21942; Mon, 21 Apr 2003 11:21:59 +0100 From: Steven Whitehouse Message-Id: <200304211021.LAA21942@gw.chygwyn.com> Subject: ip_gre.c:ipgre_tunnel_xmit() duplicated code ? To: davem@redhat.com (David S. Miller) Date: Mon, 21 Apr 2003 11:21:59 +0100 (BST) Cc: netdev@oss.sgi.com In-Reply-To: <20030418.034241.38698733.davem@redhat.com> from "David S. Miller" at Apr 18, 2003 03:42:41 AM Organization: ChyGywn Limited X-RegisteredOffice: 7, New Yatt Road, Witney, Oxfordshire. OX28 1NU England X-RegisteredNumber: 03887683 Reply-To: Steve Whitehouse X-Mailer: ELM [version 2.5 PL1] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2288 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: steve@gw.chygwyn.com Precedence: bulk X-list: netdev Content-Length: 650 Lines: 21 Hi, I found some code in ip_gre.c which looks to be duplicated. Is the attached the right fix or did I miss something? Steve. ----------------------------------------------------------------------------- diff -Nru linux-2.5.68/net/ipv4/ip_gre.c linux/net/ipv4/ip_gre.c --- linux-2.5.68/net/ipv4/ip_gre.c Sun Apr 20 03:28:01 2003 +++ linux/net/ipv4/ip_gre.c Mon Apr 21 03:05:23 2003 @@ -777,9 +777,6 @@ skb->dst->ops->update_pmtu(skb->dst, mtu); if (skb->protocol == htons(ETH_P_IP)) { - if (skb->dst) - skb->dst->ops->update_pmtu(skb->dst, mtu); - df |= (old_iph->frag_off&htons(IP_DF)); if ((old_iph->frag_off&htons(IP_DF)) && From markzzzsmith@ozemail.com.au Mon Apr 21 19:35:41 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 21 Apr 2003 19:35:48 -0700 (PDT) Received: from mta04.mail.mel.aone.net.au (mta04.mail.au.uu.net [203.2.192.84]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3M2ZeFu015942 for ; Mon, 21 Apr 2003 19:35:41 -0700 Received: from localhost.localdomain ([63.34.231.50]) by mta04.mail.mel.aone.net.au with ESMTP id <20030422023538.EUEV9300.mta04.mail.mel.aone.net.au@localhost.localdomain>; Tue, 22 Apr 2003 12:35:38 +1000 Subject: Re: [2.4.20] Frustrating DNS / UDP Socket flakeyness From: Mark Smith To: Keith Owens Cc: netdev@oss.sgi.com In-Reply-To: <17626.1050885203@ocs3.intra.ocs.com.au> References: <17626.1050885203@ocs3.intra.ocs.com.au> Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.5 Date: 22 Apr 2003 12:05:07 +0930 Message-Id: <1050978909.1755.2.camel@dupy> Mime-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2289 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: markzzzsmith@ozemail.com.au Precedence: bulk X-list: netdev Content-Length: 1466 Lines: 39 Hi Keith, Thanks for that, I'll give it a try. I've never come across this option before, and after all the years of using dialup links with 1. and 2. series kernels, have never had this problem before. It seemed to be a 2.4 series problem. It also was strange that it only appeared to happen when the link was full of incoming TCP traffic. It was as though the TCP traffic was some how getting priority over the UDP traffic in the incoming queue, which then cause the socket timeout. It has just occurred to me that maybe my ISP is prioritising incoming TCP traffic over UDP, which is why I only have this problem when performing incoming (and maybe outgoing) TCP transfers. I'll see how I go. Thanks, Mark. On Mon, 2003-04-21 at 10:03, Keith Owens wrote: > On 21 Apr 2003 02:05:32 +0930, > Mark Smith wrote: > >While a TCP download is running, the UDP / DNS queries are sent, a > >response comes back from the DNS server, but for some reason, in the > >kernel appears to have closed the UDP socket, and therefore generates an > >ICMP destination unreachable, port unreachable message back to the DNS > >server. > > The response takes too long so the resolver is timing out the request > and trying another server. When the delayed response arrives, the > resolver has closed the socket so the icmp reject is correct. The > default timeout is 5 seconds, try adding 'options timeout:10' to > /etc/resolv.conf. > > From jmorris@intercode.com.au Mon Apr 21 23:58:29 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 21 Apr 2003 23:58:36 -0700 (PDT) Received: from blackbird.intercode.com.au (IDENT:QFHoxyCPgF78jhDTfdO/L3sNMwfbta+R@blackbird.intercode.com.au [203.32.101.10]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3M6wQFu019186 for ; Mon, 21 Apr 2003 23:58:28 -0700 Received: from excalibur.intercode.com.au (excalibur.intercode.com.au [203.32.101.12]) by blackbird.intercode.com.au (8.11.6p2/8.9.3) with ESMTP id h3M6w8r27257; Tue, 22 Apr 2003 16:58:09 +1000 Date: Tue, 22 Apr 2003 16:58:08 +1000 (EST) From: James Morris To: J Sloan cc: linux-kernel , , Subject: Re: 2.5.68 comments - [udp broadcast reception broken] In-Reply-To: <3EA382F1.205@tmsusa.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2290 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@intercode.com.au Precedence: bulk X-list: netdev Content-Length: 446 Lines: 19 On Sun, 20 Apr 2003, J Sloan wrote: > Looks good for the most part, but the rwhod > problem is still with us. (The system is unable > to receive udp broadcasts since early in the > 2.5.67-bk release series) This is being caused by the call to ip_mc_sf_allow() during packet delivery, which is not needed for broadcasts. (Broadcast & multicast packets share the same delivery path here). - James -- James Morris From greearb@candelatech.com Tue Apr 22 00:10:54 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 22 Apr 2003 00:10:59 -0700 (PDT) Received: from grok.yi.org (IDENT:kl6R/0QuIqx4+EV4Vo+sG/Yn5r4iRWAq@dhcp93-dsl-usw3.w-link.net [206.129.84.93]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3M7ArFu020497 for ; Tue, 22 Apr 2003 00:10:54 -0700 Received: from candelatech.com (IDENT:mgdSLXv+/hjO2FxvC2P6HyFDICbIXTz3@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.6) with ESMTP id h3M7Ar522564 for ; Tue, 22 Apr 2003 00:10:53 -0700 Message-ID: <3EA4EAFD.5020808@candelatech.com> Date: Tue, 22 Apr 2003 00:10:53 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "'netdev@oss.sgi.com'" Subject: How to enable more than ~256 routing tables? Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2291 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 703 Lines: 28 I would like to have a routing table per interface, and would like to support 1k interfaces or so (virtual interfaces like vlans, for instance). I notice in rtnetlink.h there is this code: enum rt_class_t { RT_TABLE_UNSPEC=0, /* User defined values */ RT_TABLE_DEFAULT=253, RT_TABLE_MAIN=254, RT_TABLE_LOCAL=255 }; #define RT_TABLE_MAX RT_TABLE_LOCAL Is it possible to just change the RT_TABLE_MAX to be higher and have 256-???? be more /* User defined values */ ? Thanks, Ben -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From yoshfuji@linux-ipv6.org Tue Apr 22 00:16:49 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 22 Apr 2003 00:16:52 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3M7GmFu020849 for ; Tue, 22 Apr 2003 00:16:48 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3M7GjBo016626; Tue, 22 Apr 2003 16:16:45 +0900 Date: Tue, 22 Apr 2003 16:16:45 +0900 (JST) Message-Id: <20030422.161645.80924947.yoshfuji@linux-ipv6.org> To: greearb@candelatech.com Cc: netdev@oss.sgi.com Subject: Re: How to enable more than ~256 routing tables? From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <3EA4EAFD.5020808@candelatech.com> References: <3EA4EAFD.5020808@candelatech.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2292 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Content-Length: 414 Lines: 10 In article <3EA4EAFD.5020808@candelatech.com> (at Tue, 22 Apr 2003 00:10:53 -0700), Ben Greear says: > Is it possible to just change the RT_TABLE_MAX to be higher and have 256-???? > be more /* User defined values */ ? No. rtm_table in rtmsg{} is unsigned char. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From greearb@candelatech.com Tue Apr 22 00:45:41 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 22 Apr 2003 00:45:53 -0700 (PDT) Received: from grok.yi.org (IDENT:AFfBuyuBpD84AZfWgUIj6zJwrBl9aGqu@dhcp93-dsl-usw3.w-link.net [206.129.84.93]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3M7jeFu021453 for ; Tue, 22 Apr 2003 00:45:41 -0700 Received: from candelatech.com (IDENT:8qveN5D0aUaFJ9TvRFXf5oAuVY5HxvVg@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.6) with ESMTP id h3M7jd526988 for ; Tue, 22 Apr 2003 00:45:40 -0700 Message-ID: <3EA4F323.7010805@candelatech.com> Date: Tue, 22 Apr 2003 00:45:39 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: Re: How to enable more than ~256 routing tables? References: <3EA4EAFD.5020808@candelatech.com> <20030422.161645.80924947.yoshfuji@linux-ipv6.org> In-Reply-To: <20030422.161645.80924947.yoshfuji@linux-ipv6.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2293 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Content-Length: 888 Lines: 28 YOSHIFUJI Hideaki / ???? wrote: > In article <3EA4EAFD.5020808@candelatech.com> (at Tue, 22 Apr 2003 00:10:53 -0700), Ben Greear says: > > >>Is it possible to just change the RT_TABLE_MAX to be higher and have 256-???? >>be more /* User defined values */ ? > > > No. rtm_table in rtmsg{} is unsigned char. Thanks for the response...but I was definately hoping for some better news! I'm guesing that to change this would mean at least a recompile of the user-space 'ip' utility, (and who knows what else!) Why o why did someone think that 256 was all anyone would ever want! Think we could at least increase this to 16 bits for 2.5? Ben -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From davem@redhat.com Tue Apr 22 00:48:10 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 22 Apr 2003 00:48:19 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3M7m9Fu021780 for ; Tue, 22 Apr 2003 00:48:09 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA03652; Mon, 21 Apr 2003 23:43:04 -0700 Date: Mon, 21 Apr 2003 23:43:03 -0700 (PDT) Message-Id: <20030421.234303.59654654.davem@redhat.com> To: Steve@ChyGwyn.com, steve@gw.chygwyn.com Cc: netdev@oss.sgi.com Subject: Re: ip_gre.c:ipgre_tunnel_xmit() duplicated code ? From: "David S. Miller" In-Reply-To: <200304211021.LAA21942@gw.chygwyn.com> References: <20030418.034241.38698733.davem@redhat.com> <200304211021.LAA21942@gw.chygwyn.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2294 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 268 Lines: 7 From: Steven Whitehouse Date: Mon, 21 Apr 2003 11:21:59 +0100 (BST) I found some code in ip_gre.c which looks to be duplicated. Is the attached the right fix or did I miss something? You're right, I've integrated your fix thanks. From maxk@qualcomm.com Wed Apr 23 15:51:34 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 23 Apr 2003 15:51:40 -0700 (PDT) Received: from numenor.qualcomm.com (numenor.qualcomm.com [129.46.51.58]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3NMpYFu011816 for ; Wed, 23 Apr 2003 15:51:34 -0700 Received: from neophyte.qualcomm.com (neophyte.qualcomm.com [129.46.61.149]) by numenor.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3NMpE7t000856 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Wed, 23 Apr 2003 15:51:23 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by neophyte.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3NMpCjq019473; Wed, 23 Apr 2003 15:51:12 -0700 (PDT) Message-Id: <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Wed, 23 Apr 2003 15:51:11 -0700 To: Arnaldo Carvalho de Melo From: Max Krasnyansky Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family Cc: linux-kernel@vger.kernel.org, davem@redhat.com, netdev@oss.sgi.com In-Reply-To: <20030423192640.GD26052@conectiva.com.br> References: <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2295 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev Content-Length: 4026 Lines: 88 At 12:26 PM 4/23/2003, Arnaldo Carvalho de Melo wrote: >Em Wed, Apr 23, 2003 at 12:13:37PM -0700, Max Krasnyansky escreveu: >> Hi Folks, >> >> Can somebody (DaveM perhaps) please explain to me what the hell the following >> changset is doing in 2.5.68 >> http://linux.bkbits.net:8080/linux-2.5/cset@1.1118.1.1?nav=index.html|ChangeSet@-7d >> ?? >> >> I've spent quite a bit of time looking into what's needed to fix socket module refcounting >> issues and convicting DaveM and Alex that we need to fix them. >> Here is the original thread >> http://marc.theaimsgroup.com/?l=linux-kernel&m=104308300808557&w=2 > >I was not aware of this thread, will read it Please do. >> My patch was rejected without giving any technical explanation. I was waiting for Rusty's >> __module_get() patch to get in, to release a new patch which addresses some issues that >> came up during discussion. >> Next thing you know, incomplete patch (changeset mentioned above) shows up in the BK and >> 2.5.68. Without even a simple note on the lkm. And completely ignoring discussion that >> we had about this very issue just a few weeks ago. > >This is just the first part, DaveM already merged the second part, that deals with struct sock That's exactly what surprised me. He rejected complete patch and accepted something incomplete and broken. >> I don't mind of course if some other (better) patch is accepted instead of mine. But patch >> that went in is incomplete and buggy. It doesn't handle accept case properly and doesn't >> address the issue of the 'struct sock' ownership (read original thread for more details). > >This is dealt with the following patch, and these patches were discussed on the netdev >mailing list. Considerations ? I'll be sending today patches converting the net protocols >that I maintain and then for some others that are ummaintained, etc. I thought changes like that are always discussed on the lkml. They are directly related to the new module interface changes. It least CC lkml. (I've subscribed to netdev list) The latest patches that I've seen from you on netdev list and in main BK tree still don't handle accept() properly net/socket.c:sys_accept() ... if (!(newsock = sock_alloc())) goto out_put; newsock->type = sock->type; newsock->ops = sock->ops; ... newsock is not accounted for (sock_alloc() doesn't bump module refcount). > struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab) > { >- struct sock *sk; >- >+ struct sock *sk = NULL; >+ >+ if (!net_family_get(family)) >+ goto out; Ok. This is wrong. Which should be clear from reading the thread that I mentioned. Owner of the net_proto_family is not necessarily the owner of the 'struct sock'. Example: af_inet module registers net_proto_family but udp module owns the socket. (not that IPv4 code is modular but just an example). Another example would be Bluetooth. We have Bluetooth core that registers Bluetooth proto_family and several modules that handle specific protocols (l2cap, rfcomm, etc). Also net_proto_family has pretty much nothing to do with the struct sock. The only reason we would want to hold reference to the module is if the module has replaced default callbacks (i.e. sk->data_ready(), etc). So my point is we need sk->owner field. I'd also prefer to see sock->owner which gives more flexibility (i.e. net_proto_family can be unregistered while struct socket still exist, etc). net_family_get/put() makes no sense net_proto_family has only one function npf->create() which is referenced only from net/socket.c. struct socket should inherit owner field from struct net_proto_family by default but protocol should be able to assign ownership to a different module if it needs to. So I'd suggest reverting the patches that went in and applying my patch instead. Not because its mine but because IMO it's a better starting point. Dave, comments ? Thanks Max From davem@redhat.com Wed Apr 23 17:36:13 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 23 Apr 2003 17:36:19 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3O0aCFu013294 for ; Wed, 23 Apr 2003 17:36:12 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id QAA07862; Wed, 23 Apr 2003 16:30:43 -0700 Date: Wed, 23 Apr 2003 16:30:43 -0700 (PDT) Message-Id: <20030423.163043.41633133.davem@redhat.com> To: maxk@qualcomm.com Cc: acme@conectiva.com.br, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family From: "David S. Miller" In-Reply-To: <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> References: <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <20030423192640.GD26052@conectiva.com.br> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2296 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 794 Lines: 21 From: Max Krasnyansky Date: Wed, 23 Apr 2003 15:51:11 -0700 >This is just the first part, DaveM already merged the second part, >that deals with struct sock That's exactly what surprised me. He rejected complete patch and accepted something incomplete and broken. No, it was not broken, because he told me completely where he was going with his changes. He was building infrastructure piece by piece, and that's always an acceptable way to do things as long as it is explained where one is going with the changes. Your stuff was unacceptable from the start because you didn't put the ->owner into the protocol ops. I thought changes like that are always discussed on the lkml. No, networking patches can go solely to netdev or linux-net. From maxk@qualcomm.com Wed Apr 23 18:42:57 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 23 Apr 2003 18:43:06 -0700 (PDT) Received: from ithilien.qualcomm.com (ithilien.qualcomm.com [129.46.51.59]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3O1guFu014135 for ; Wed, 23 Apr 2003 18:42:57 -0700 Received: from magus.qualcomm.com (magus.qualcomm.com [129.46.61.148]) by ithilien.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3O1goJo028923; Wed, 23 Apr 2003 18:42:50 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by magus.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3O1glhg020602; Wed, 23 Apr 2003 18:42:47 -0700 (PDT) Message-Id: <5.1.0.14.2.20030423182014.07ec6140@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Wed, 23 Apr 2003 18:41:56 -0700 To: "David S. Miller" From: Max Krasnyansky Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family Cc: acme@conectiva.com.br, linux-kernel@vger.kernel.org, netdev@oss.sgi.com In-Reply-To: <20030423.163043.41633133.davem@redhat.com> References: <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <20030423192640.GD26052@conectiva.com.br> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2297 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev Content-Length: 2910 Lines: 64 At 04:30 PM 4/23/2003, David S. Miller wrote: > From: Max Krasnyansky > Date: Wed, 23 Apr 2003 15:51:11 -0700 > > >This is just the first part, DaveM already merged the second part, > >that deals with struct sock > > That's exactly what surprised me. He rejected complete patch and > accepted something incomplete and broken. > >No, it was not broken, because he told me completely where he >was going with his changes. Of course it was and still is. New socket is allocated without incrementing modules ref count in sys_accept(). >He was building infrastructure piece by piece, and that's always an acceptable >way to do things as long as it is explained where one is going with the changes. Oh, I see. And I just sent a patch without any explanation. Ok. (you might want to reread our original discussion again). >Your stuff was unacceptable from the start because you didn't put >the ->owner into the protocol ops. But you didn't tell me that. You just said that it's "an ugly hack" without giving any other feedback. ->owner field in protocol ops did come up during discussion (I think Rusty brought that up) and I explained why it shouldn't be there. But again there was no feed back from you. You just ignored that thread at some point. btw I still don't see ->owner in protocol ops. I read archives of netdev. You guys didn't even talk about that. Anyway it's not important who said what now. You chose to ignore stuff that I did, fine. What about this though >>struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab) >>{ >>- struct sock *sk; >>- >>+ struct sock *sk = NULL; >>+ >>+ if (!net_family_get(family)) >>+ goto out; >Ok. This is wrong. Which should be clear from reading the thread that I mentioned. >Owner of the net_proto_family is not necessarily the owner of the 'struct sock'. >Example: af_inet module registers net_proto_family but udp module owns the socket. >(not that IPv4 code is modular but just an example). Another example would be Bluetooth. >We have Bluetooth core that registers Bluetooth proto_family and several modules >that handle specific protocols (l2cap, rfcomm, etc). > >Also net_proto_family has pretty much nothing to do with the struct sock. The only reason >we would want to hold reference to the module is if the module has replaced default >callbacks (i.e. sk->data_ready(), etc). >So my point is we need sk->owner field. > >I'd also prefer to see sock->owner which gives more flexibility (i.e. net_proto_family can >be unregistered while struct socket still exist, etc). >net_family_get/put() makes no sense net_proto_family has only one function npf->create() >which is referenced only from net/socket.c. struct socket should inherit owner field from >struct net_proto_family by default but protocol should be able to assign ownership to a >different module if it needs to. Max From davem@redhat.com Wed Apr 23 21:35:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 23 Apr 2003 21:35:32 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3O4ZNFu016517 for ; Wed, 23 Apr 2003 21:35:24 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id UAA08250; Wed, 23 Apr 2003 20:29:55 -0700 Date: Wed, 23 Apr 2003 20:29:54 -0700 (PDT) Message-Id: <20030423.202954.85407627.davem@redhat.com> To: maxk@qualcomm.com Cc: acme@conectiva.com.br, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family From: "David S. Miller" In-Reply-To: <5.1.0.14.2.20030423182014.07ec6140@unixmail.qualcomm.com> References: <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <20030423.163043.41633133.davem@redhat.com> <5.1.0.14.2.20030423182014.07ec6140@unixmail.qualcomm.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2298 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 548 Lines: 16 From: Max Krasnyansky Date: Wed, 23 Apr 2003 18:41:56 -0700 At 04:30 PM 4/23/2003, David S. Miller wrote: >Your stuff was unacceptable from the start because you didn't put >the ->owner into the protocol ops. But you didn't tell me that. You just said that it's "an ugly hack" without giving any other feedback. As you mention, Rusty said this. What about this though I'm sure Arnaldo will deal with the sys_accept() issues. But this is a minor issue, Arnaldo's stuff is architectually solid. From acme@conectiva.com.br Wed Apr 23 23:44:42 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 23 Apr 2003 23:44:47 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3O6idFu025803 for ; Wed, 23 Apr 2003 23:44:41 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 198aYu-0005ek-00; Thu, 24 Apr 2003 03:50:28 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id EBB9E1966C; Thu, 24 Apr 2003 06:44:53 +0000 (UTC) Date: Thu, 24 Apr 2003 03:44:53 -0300 From: Arnaldo Carvalho de Melo To: Max Krasnyansky Cc: linux-kernel@vger.kernel.org, davem@redhat.com, netdev@oss.sgi.com Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family Message-ID: <20030424064453.GA29078@conectiva.com.br> Mail-Followup-To: Arnaldo Carvalho de Melo , Max Krasnyansky , linux-kernel@vger.kernel.org, davem@redhat.com, netdev@oss.sgi.com References: <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2299 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 5003 Lines: 105 Em Wed, Apr 23, 2003 at 03:51:11PM -0700, Max Krasnyansky escreveu: > At 12:26 PM 4/23/2003, Arnaldo Carvalho de Melo wrote: > >Em Wed, Apr 23, 2003 at 12:13:37PM -0700, Max Krasnyansky escreveu: > >> Hi Folks, > >> > >> Can somebody (DaveM perhaps) please explain to me what the hell the following > >> changset is doing in 2.5.68 > >> http://linux.bkbits.net:8080/linux-2.5/cset@1.1118.1.1?nav=index.html|ChangeSet@-7d > >> ?? > >> > >> I've spent quite a bit of time looking into what's needed to fix socket module refcounting > >> issues and convicting DaveM and Alex that we need to fix them. > >> Here is the original thread > >> http://marc.theaimsgroup.com/?l=linux-kernel&m=104308300808557&w=2 > > > >I was not aware of this thread, will read it > Please do. I did, there are several valid points, I forgot the sys_accept case, I'm studying the code to see how to properly fix it, but one thing I want covered is keeping the net_families registered while there is still a struct sock associated with the proto family, while not allowing the criation of new sockets till the last struct sock is sk_freed. Think about protecting the module with the top level network protocol family ->create code on sock_create level and the modules with specific protocols at _sock_create level. > >> I don't mind of course if some other (better) patch is accepted instead of mine. But patch > >> that went in is incomplete and buggy. It doesn't handle accept case properly and doesn't > >> address the issue of the 'struct sock' ownership (read original thread for more details). > > > >This is dealt with the following patch, and these patches were discussed on the netdev > >mailing list. Considerations ? I'll be sending today patches converting the net protocols > >that I maintain and then for some others that are ummaintained, etc. > I thought changes like that are always discussed on the lkml. They are directly related to the > new module interface changes. It least CC lkml. > > (I've subscribed to netdev list) > > The latest patches that I've seen from you on netdev list and in main BK tree still don't > handle accept() properly > > net/socket.c:sys_accept() > ... > if (!(newsock = sock_alloc())) > goto out_put; > > newsock->type = sock->type; > newsock->ops = sock->ops; > ... > > newsock is not accounted for (sock_alloc() doesn't bump module refcount). > > > struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab) > > { > >- struct sock *sk; > >- > >+ struct sock *sk = NULL; > >+ > >+ if (!net_family_get(family)) > >+ goto out; > > Ok. This is wrong. Which should be clear from reading the thread that I mentioned. > Owner of the net_proto_family is not necessarily the owner of the 'struct sock'. > Example: af_inet module registers net_proto_family but udp module owns the socket. > (not that IPv4 code is modular but just an example). Another example would be Bluetooth. > We have Bluetooth core that registers Bluetooth proto_family and several modules > that handle specific protocols (l2cap, rfcomm, etc). I'm think that this can be handled at this protocol family code level, i.e. if the net_proto_family wants to further modularise based on specific protocol type this has to be refcounted at this level, example, at bt_sock_create. > Also net_proto_family has pretty much nothing to do with the struct sock. The only reason > we would want to hold reference to the module is if the module has replaced default > callbacks (i.e. sk->data_ready(), etc). > So my point is we need sk->owner field. That is a way to solve it, yes, but I don't think the only one, net_proto_family has to do with the struct sock as those data structures are related to the network protocol family. > I'd also prefer to see sock->owner which gives more flexibility (i.e. > net_proto_family can be unregistered while struct socket still exist, etc). > net_family_get/put() makes no sense net_proto_family has only one function > npf->create() which is referenced only from net/socket.c. struct socket > should inherit owner field from struct net_proto_family by default but > protocol should be able to assign ownership to a different module if it needs > to. I'm studying how to signal that the net_proto_family was unregistered while still having the entry in net_families available, that is a problem with the current infrastructure in Linus tree. Sorry, today I didn't had time to work on this at night at home, but tomorrow I'll be working on this, thing is, as I'm working only on having the infrastructure in place and no protocols have ->owner set there is no way to trigger the problems discussed in this message in any way. Ah, and thanks for raising these issues and pointing me to the previous discussion that I had not read before, just too much e-mail on lkml, netdev is more manageable :-) - Arnaldo From maxk@qualcomm.com Thu Apr 24 09:44:17 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 09:44:23 -0700 (PDT) Received: from ithilien.qualcomm.com (ithilien.qualcomm.com [129.46.51.59]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OGiGFu002868 for ; Thu, 24 Apr 2003 09:44:17 -0700 Received: from magus.qualcomm.com (magus.qualcomm.com [129.46.61.148]) by ithilien.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3OGi3Jo026115; Thu, 24 Apr 2003 09:44:03 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by magus.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3OGi0hg016700; Thu, 24 Apr 2003 09:44:00 -0700 (PDT) Message-Id: <5.1.0.14.2.20030424093305.08115dc8@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Thu, 24 Apr 2003 09:43:42 -0700 To: "David S. Miller" From: Max Krasnyansky Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family Cc: acme@conectiva.com.br, linux-kernel@vger.kernel.org, netdev@oss.sgi.com In-Reply-To: <20030423.202954.85407627.davem@redhat.com> References: <5.1.0.14.2.20030423182014.07ec6140@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <20030423.163043.41633133.davem@redhat.com> <5.1.0.14.2.20030423182014.07ec6140@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2300 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev Content-Length: 872 Lines: 28 At 08:29 PM 4/23/2003, David S. Miller wrote: > From: Max Krasnyansky > Date: Wed, 23 Apr 2003 18:41:56 -0700 > > At 04:30 PM 4/23/2003, David S. Miller wrote: > >Your stuff was unacceptable from the start because you didn't put > >the ->owner into the protocol ops. > But you didn't tell me that. You just said that it's "an ugly hack" without > giving any other feedback. > >As you mention, Rusty said this. > > What about this though > >I'm sure Arnaldo will deal with the sys_accept() issues. >But this is a minor issue, Arnaldo's stuff is architectually >solid. :) Ok Dave. I'm not sure why you're _completely_ ignoring my arguments. You should have just said from the beginning that you were going to ignore what I have to say regarding that issue. At least I wouldn't have wasted my time. Sorry for bugging you. Max From maxk@qualcomm.com Thu Apr 24 12:33:51 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 12:33:58 -0700 (PDT) Received: from ithilien.qualcomm.com (ithilien.qualcomm.com [129.46.51.59]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OJXpFu012747 for ; Thu, 24 Apr 2003 12:33:51 -0700 Received: from neophyte.qualcomm.com (neophyte.qualcomm.com [129.46.61.149]) by ithilien.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3OJXcJo005634; Thu, 24 Apr 2003 12:33:39 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by neophyte.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3OJXZjq016851; Thu, 24 Apr 2003 12:33:36 -0700 (PDT) Message-Id: <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Thu, 24 Apr 2003 12:33:35 -0700 To: Arnaldo Carvalho de Melo From: Max Krasnyansky Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com In-Reply-To: <20030424064453.GA29078@conectiva.com.br> References: <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2301 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev Content-Length: 9517 Lines: 222 Hi Arnaldo, >I did, there are several valid points, I forgot the sys_accept case, I'm >studying the code to see how to properly fix it, It's pretty easy if we have sock->owner. Take a look how my patch does it (try_module_get should be replaced with __module_get()). It also covers the case when net_family_owner transferred ownership to the other module. >but one thing I want covered >is keeping the net_families registered while there is still a struct sock >associated with the proto family, while not allowing the criation of new sockets >till the last struct sock is sk_freed. Why ? Like I said all we care about is if non default callbacks in struct sock are valid. Please read below. >Think about protecting the module with the top level network protocol family >->create code on sock_create level and the modules with specific protocols at >_sock_create level. With the current infrastructure you'd need some kind of callback from sk_free() for that to work. I think it's simpler with sk->owner. >> > struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab) >> > { >> >- struct sock *sk; >> >- >> >+ struct sock *sk = NULL; >> >+ >> >+ if (!net_family_get(family)) >> >+ goto out; >> >> Ok. This is wrong. Which should be clear from reading the thread that I mentioned. >> Owner of the net_proto_family is not necessarily the owner of the 'struct sock'. >> Example: af_inet module registers net_proto_family but udp module owns the socket. >> (not that IPv4 code is modular but just an example). Another example would be Bluetooth. >> We have Bluetooth core that registers Bluetooth proto_family and several modules >> that handle specific protocols (l2cap, rfcomm, etc). > >I'm think that this can be handled at this protocol family code level, i.e. if >the net_proto_family wants to further modularise based on specific protocol >type this has to be refcounted at this level, example, at bt_sock_create. Sure. Transfer of the ownership has to be done on that level. What I'm saying is that everything else can be done in generic code. >> Also net_proto_family has pretty much nothing to do with the struct sock. The only reason >> we would want to hold reference to the module is if the module has replaced default >> callbacks (i.e. sk->data_ready(), etc). >> So my point is we need sk->owner field. > >That is a way to solve it, yes, but I don't think the only one, >net_proto_family has to do with the struct sock as those data structures are >related to the network protocol family. By the same logic all things are related in the kernel :). struct socket uses net_proto_family ops and stuff and therefor is related. But struct sock is just a callbacks. >> I'd also prefer to see sock->owner which gives more flexibility (i.e. >> net_proto_family can be unregistered while struct socket still exist, etc). >> net_family_get/put() makes no sense net_proto_family has only one function >> npf->create() which is referenced only from net/socket.c. struct socket >> should inherit owner field from struct net_proto_family by default but >> protocol should be able to assign ownership to a different module if it needs >> to. > >I'm studying how to signal that the net_proto_family was unregistered while >still having the entry in net_families available, that is a problem with the >current infrastructure in Linus tree. Why do you need that ? Let's just get rid of the net_family_get/put thing. Each socket will have owner field so we know who owns it and there is no need to access global net_family table. >Sorry, today I didn't had time to work on this at night at home, but tomorrow >I'll be working on this, thing is, as I'm working only on having the >infrastructure in place and no protocols have ->owner set there is no way to >trigger the problems discussed in this message in any way. I actually had it all working with the patch that I mentioned. I can go ahead and add support to Bluetooth stuff, that's the reason I started that effort in first place. However current code in main BK tree doesn't cover scenario when owner of net_proto_family != owner of the socket. Here is how I think it should work. sock_create() if (!try_module_get(npf->owner)) goto fail; sock->owner = npf->owner; if (family_sock_create() < 0) { sock_release(sock); goto fail; } From this point on we don't care if net_proto_family is still registered or not, we know who owns the socket. sock_accept() __module_get(sock->owner); newsock->owner = sock->owner; sock_release() module_put(sock->owner); family_sock_create() (i.e. bt_sock_create(), etc) #ifdef SPECIAL_FAMILY_THAT_HANDLES_PROTOCOLS_IN_SEPARATE_MODULES if (!try_module_get(proto_module)) goto fail; prev_owner = sock->owner; sock->owner = proto_module; module_put(prev_owner); #else /* Other families do not have to do anything */ #endif That's it for 'struct socket'. And I mean that is _it_. Family can be unregistered and stuff, we don't care, and why should we. Now 'struct sock'. It can exist independently from 'struct socket' and therefor is a separate issue. We only care about callbacks (sk->data_ready(), etc) and private sk slab caches. Some protocols simply use default callback which belong to non modular part of the kernel. Those don't have to do anything. They will just work. Other protocols replace callbacks and therefor have to make sure that module is still loaded while sk exists. For those modules we need the following void sk_set_owner(struct module *owner) { /* Module must already hold reference when it call this function. */ __module_get(owner); sk->owner = owner; } sk_free() ... module_put(sk->owner); ... proto_set_sk_callbacks() sk_set_owner(THIS_MODULE); sk->destroy = proto_destroy; ... That's it. There is no need to modify sk_alloc() or anything else. So it's not going to introduce any overhead during socket creation from protocols that aren't modules or use default callback. And it gives us a flexibility of being able to pass ownership of the socket to another module or release module without having to access global family array. For example if protocol wants to be unloaded by socket is still being used by net code it could do something like write_lock(&sk->callback_lock); sk->data_ready = default_data_ready; ... other non default callbacks ... module_put(sk->owner); sk_set_owner(NULL); write_unlock(&sk->callback_lock); Here is my original explanation. >>>Here is the list of sk callbacks >>> void (*state_change)(struct sock *sk); >>> void (*data_ready)(struct sock *sk, int bytes); >>> void (*write_space)(struct sock *sk); >>> void (*error_report)(struct sock *sk); >>> int (*backlog_rcv) (struct sock *sk, struct sk_buff *skb); >>> void (*destruct)(struct sock *sk); >>>Net core doesn't make any other calls into the protocol module. >>> >>>In any case if protocol module wants, for some reason, to be around until sk is destroyed >>>it can call sk_set_owner() right after sk_alloc(), even if it uses default callbacks. >>> >>>While looking at the net families that we support I realized that there is one more reason >>>why protocol may have to call sk_set_owner(). Is if protocol uses private slab cache for its >>>sks. Otherwise cache will be destroyed during module unloading but sk may still be alive. >>> >>>Here is a little summary about families that I looked at: >>> Netlink - Global sk cache, replaces sk->destruct() callback. >>> Must call sk_set_owner() >>> >>> Unix - Private sk cache, replaces sk->destruct() and sk->write_space() callbacks >>> Must call sk_set_owner() >>> >>> IPv4/6 - Private cache, non-default callbacks. >>> Must call sk_set_owner() (cannot be a module, so we don't really care) >>> >>> IPX - Global cache, default callbacks. >>> >>> ATM - Global cache, default callbacks. >>> >>> IRDA - Global cache, default callbacks. >>> >>> Bluetooth - Private cache (don't really need it, will change to global), non-default callbacks >>> Must call sk_set_owner() >>> >>> AX25 - Global cache, non-default sk->destroy() >>> Must call sk_set_owner() >>> >>> Rose - Global cache, default callbacks. >>> >>> DecNet - Private cache, non-default callbacks. >>> Must call sk_set_owner() >>> >>> LLC - Global cache, default callbacks. And here is the patch that implements it http://marc.theaimsgroup.com/?l=linux-kernel&m=104308300808557&w=2 (try_module_get() should be replaced with __module_get() in some places). >Ah, and thanks for raising these issues and pointing me to the previous >discussion that I had not read before, >just too much e-mail on lkml, netdev is more manageable :-) You're very welcome. I'm very interested to get this thing fixed. (I wish Dave and Alexey were involved in this discussion and expressed their thoughts/ideas/concerns instead of ignoring it.) Max From shemminger@osdl.org Thu Apr 24 13:48:33 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 13:48:39 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OKmWFu014338 for ; Thu, 24 Apr 2003 13:48:33 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3OKmVW05912; Thu, 24 Apr 2003 13:48:31 -0700 Date: Thu, 24 Apr 2003 13:48:31 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH 2.5.68] [BRIDGE] Get write lock config PDU processing Message-Id: <20030424134831.5619fa68.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2302 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 3678 Lines: 147 All received packets are being processed with only read lock held. Since processing a Spanning Tree Protocol (STP) packet can cause changes in bridge configuration; a write lock should be acquired. Must also check for state transistions during that interval. Also, keep comments in sync with locking, and don't retest same state variables already checked in the call chain. diff -Nru a/net/bridge/br_input.c b/net/bridge/br_input.c --- a/net/bridge/br_input.c Thu Apr 24 13:40:23 2003 +++ b/net/bridge/br_input.c Thu Apr 24 13:40:23 2003 @@ -167,13 +167,8 @@ return 0; handle_special_frame: - if (!dest[5]) { - br_stp_handle_bpdu(skb); - read_unlock(&br->lock); - return 0; - } - - kfree_skb(skb); read_unlock(&br->lock); - return 0; + if (!dest[5]) + br_stp_handle_bpdu(skb); + goto err_nolock; } diff -Nru a/net/bridge/br_stp.c b/net/bridge/br_stp.c --- a/net/bridge/br_stp.c Thu Apr 24 13:40:23 2003 +++ b/net/bridge/br_stp.c Thu Apr 24 13:40:23 2003 @@ -22,7 +22,7 @@ -/* called under ioctl_lock or bridge lock */ +/* called under bridge lock */ int br_is_root_bridge(struct net_bridge *br) { return !memcmp(&br->bridge_id, &br->designated_root, 8); @@ -35,7 +35,7 @@ (p->designated_port == p->port_id); } -/* called under ioctl_lock or bridge lock */ +/* called under bridge lock */ struct net_bridge_port *br_get_port(struct net_bridge *br, int port_no) { struct net_bridge_port *p; @@ -419,18 +419,13 @@ br_transmit_config(p); } -/* lock-safe */ +/* called under bridge lock */ void br_received_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *bpdu) { struct net_bridge *br; int was_root; - if (p->state == BR_STATE_DISABLED) - return; - br = p->br; - read_lock(&br->lock); - was_root = br_is_root_bridge(br); if (br_supersedes_port_info(p, bpdu)) { br_record_config_information(p, bpdu); @@ -455,21 +450,16 @@ } else if (br_is_designated_port(p)) { br_reply(p); } - - read_unlock(&br->lock); } -/* lock-safe */ +/* called under bridge lock */ void br_received_tcn_bpdu(struct net_bridge_port *p) { - read_lock(&p->br->lock); - if (p->state != BR_STATE_DISABLED && - br_is_designated_port(p)) { + if (br_is_designated_port(p)) { printk(KERN_INFO "%s: received tcn bpdu on port %i(%s)\n", p->br->dev.name, p->port_no, p->dev->name); br_topology_change_detection(p->br); br_topology_change_acknowledge(p); } - read_unlock(&p->br->lock); } diff -Nru a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c --- a/net/bridge/br_stp_bpdu.c Thu Apr 24 13:40:23 2003 +++ b/net/bridge/br_stp_bpdu.c Thu Apr 24 13:40:23 2003 @@ -132,18 +132,23 @@ static unsigned char header[6] = {0x42, 0x42, 0x03, 0x00, 0x00, 0x00}; -/* called under bridge lock */ +/* NO locks */ void br_stp_handle_bpdu(struct sk_buff *skb) { unsigned char *buf; struct net_bridge_port *p; + struct net_bridge *br; buf = skb->mac.raw + 14; p = skb->dev->br_port; - if (!p->br->stp_enabled || memcmp(buf, header, 6)) { - kfree_skb(skb); - return; - } + br = p->br; + + write_lock_bh(&br->lock); + if (p->state == BR_STATE_DISABLED + || !(br->dev.flags & IFF_UP) + || !br->stp_enabled + || memcmp(buf, header, 6)) + goto out; if (buf[6] == BPDU_TYPE_CONFIG) { struct br_config_bpdu bpdu; @@ -178,16 +183,14 @@ bpdu.hello_time = br_get_ticks(buf+34); bpdu.forward_delay = br_get_ticks(buf+36); - kfree_skb(skb); br_received_config_bpdu(p, &bpdu); - return; + goto out; } if (buf[6] == BPDU_TYPE_TCN) { br_received_tcn_bpdu(p); - kfree_skb(skb); - return; + goto out; } - - kfree_skb(skb); + out: + write_unlock_bh(&br->lock); } From shemminger@osdl.org Thu Apr 24 13:51:05 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 13:51:08 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OKp4Fu014658 for ; Thu, 24 Apr 2003 13:51:04 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3OKp3W06400; Thu, 24 Apr 2003 13:51:03 -0700 Date: Thu, 24 Apr 2003 13:51:03 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH 2.5.68] [BRIDGE] Possible race with timer on shutdown Message-Id: <20030424135103.494998f0.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2303 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 1370 Lines: 50 I added del_timer_sync() in one of my earlier fixes, which was a good idea but introduced a possible small race where timer was trying to acquire lock while del_timer_sync() was waiting for other CPU's to complete timers and holding the bridge lock. This fixes that by calling del_timer_sync() with no locks held at last stage of cleanup. diff -Nru a/net/bridge/br_device.c b/net/bridge/br_device.c --- a/net/bridge/br_device.c Thu Apr 24 13:41:15 2003 +++ b/net/bridge/br_device.c Thu Apr 24 13:41:15 2003 @@ -105,12 +105,7 @@ static int br_dev_stop(struct net_device *dev) { - struct net_bridge *br; - - br = dev->priv; - write_lock(&br->lock); - br_stp_disable_bridge(br); - write_unlock(&br->lock); + br_stp_disable_bridge(dev->priv); netif_stop_queue(dev); diff -Nru a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c --- a/net/bridge/br_stp_if.c Thu Apr 24 13:41:15 2003 +++ b/net/bridge/br_stp_if.c Thu Apr 24 13:41:15 2003 @@ -64,11 +64,12 @@ br_timer_set(&br->gc_timer, jiffies); } -/* called under bridge lock */ +/* NO locks held */ void br_stp_disable_bridge(struct net_bridge *br) { struct net_bridge_port *p; + write_lock(&br->lock); br->topology_change = 0; br->topology_change_detected = 0; br_timer_clear(&br->hello_timer); @@ -84,6 +85,7 @@ p = p->next; } + write_unlock(&br->lock); del_timer_sync(&br->tick); } From shemminger@osdl.org Thu Apr 24 13:54:33 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 13:54:37 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OKsWFu014973 for ; Thu, 24 Apr 2003 13:54:33 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3OKsVW06803; Thu, 24 Apr 2003 13:54:31 -0700 Date: Thu, 24 Apr 2003 13:54:31 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH 2.5.68] [BRIDGE] Use list_ macros for bridge port list. Message-Id: <20030424135431.11cf3fe6.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2304 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 12007 Lines: 485 This replaces the singly linked list in net_bridge structure with the list_ macro's (doubly linked). It makes deleting an interface easier since no lookup required; but the real motivation is to setup for the next step where bridge rwlock is replaced with spin_lock and RCU. # This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.1130 -> 1.1131 # net/bridge/br_stp.c 1.3 -> 1.4 # net/bridge/br_private.h 1.8 -> 1.9 # net/bridge/br_forward.c 1.7 -> 1.8 # net/bridge/br_stp_timer.c 1.1 -> 1.2 # net/bridge/br_stp_if.c 1.4 -> 1.5 # net/bridge/br_if.c 1.8 -> 1.9 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 03/04/24 shemminger@dev4-009.pdx.osdl.net 1.1131 # ebr-port-list.patch # -------------------------------------------- # diff -Nru a/net/bridge/br_forward.c b/net/bridge/br_forward.c --- a/net/bridge/br_forward.c Thu Apr 24 13:41:28 2003 +++ b/net/bridge/br_forward.c Thu Apr 24 13:41:28 2003 @@ -99,7 +99,7 @@ static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone, void (*__packet_hook)(struct net_bridge_port *p, struct sk_buff *skb)) { - struct net_bridge_port *p; + struct list_head *l; struct net_bridge_port *prev; if (clone) { @@ -115,8 +115,10 @@ prev = NULL; - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); + if (should_deliver(p, skb)) { if (prev != NULL) { struct sk_buff *skb2; @@ -132,8 +134,6 @@ prev = p; } - - p = p->next; } if (prev != NULL) { diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c --- a/net/bridge/br_if.c Thu Apr 24 13:41:28 2003 +++ b/net/bridge/br_if.c Thu Apr 24 13:41:28 2003 @@ -39,42 +39,31 @@ } /* called under BR_NETPROTO_LOCK and bridge lock */ -static int __br_del_if(struct net_bridge *br, struct net_device *dev) +static void del_nbp(struct net_bridge_port *p) { - struct net_bridge_port *p; - struct net_bridge_port **pptr; - - if ((p = dev->br_port) == NULL) - return -EINVAL; + struct net_device *dev = p->dev; br_stp_disable_port(p); dev_set_promiscuity(dev, -1); dev->br_port = NULL; - pptr = &br->port_list; - while (*pptr != NULL) { - if (*pptr == p) { - *pptr = p->next; - break; - } - - pptr = &((*pptr)->next); - } + list_del(&p->list); - br_fdb_delete_by_port(br, p); + br_fdb_delete_by_port(p->br, p); kfree(p); dev_put(dev); - - return 0; } static void del_ifs(struct net_bridge *br) { + struct list_head *p, *n; + br_write_lock_bh(BR_NETPROTO_LOCK); write_lock(&br->lock); - while (br->port_list != NULL) - __br_del_if(br, br->port_list->dev); + list_for_each_safe(p, n, &br->port_list) { + del_nbp(list_entry(p, struct net_bridge_port, list)); + } write_unlock(&br->lock); br_write_unlock_bh(BR_NETPROTO_LOCK); } @@ -99,6 +88,7 @@ br_dev_setup(dev); br->lock = RW_LOCK_UNLOCKED; + INIT_LIST_HEAD(&br->port_list); br->hash_lock = RW_LOCK_UNLOCKED; br->bridge_id.prio[0] = 0x80; @@ -155,8 +145,7 @@ br_init_port(p); p->state = BR_STATE_DISABLED; - p->next = br->port_list; - br->port_list = p; + list_add(&p->list, &br->port_list); return p; } @@ -238,12 +227,17 @@ int br_del_if(struct net_bridge *br, struct net_device *dev) { - int retval; + struct net_bridge_port *p; + int retval = 0; br_write_lock_bh(BR_NETPROTO_LOCK); write_lock(&br->lock); - retval = __br_del_if(br, dev); - br_stp_recalculate_bridge_id(br); + if ((p = dev->br_port) == NULL || p->br != br) + retval = -EINVAL; + else { + del_nbp(p); + br_stp_recalculate_bridge_id(br); + } write_unlock(&br->lock); br_write_unlock_bh(BR_NETPROTO_LOCK); @@ -267,13 +261,13 @@ void br_get_port_ifindices(struct net_bridge *br, int *ifindices) { - struct net_bridge_port *p; + struct list_head *l; read_lock(&br->lock); - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); ifindices[p->port_no] = p->dev->ifindex; - p = p->next; } read_unlock(&br->lock); } diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h Thu Apr 24 13:41:28 2003 +++ b/net/bridge/br_private.h Thu Apr 24 13:41:28 2003 @@ -55,9 +55,9 @@ struct net_bridge_port { - struct net_bridge_port *next; struct net_bridge *br; struct net_device *dev; + struct list_head list; int port_no; /* STP */ @@ -80,7 +80,7 @@ struct net_bridge { rwlock_t lock; - struct net_bridge_port *port_list; + struct list_head port_list; struct net_device dev; struct net_device_stats statistics; rwlock_t hash_lock; diff -Nru a/net/bridge/br_stp.c b/net/bridge/br_stp.c --- a/net/bridge/br_stp.c Thu Apr 24 13:41:28 2003 +++ b/net/bridge/br_stp.c Thu Apr 24 13:41:28 2003 @@ -38,14 +38,14 @@ /* called under bridge lock */ struct net_bridge_port *br_get_port(struct net_bridge *br, int port_no) { - struct net_bridge_port *p; + struct list_head *l; + + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); - p = br->port_list; - while (p != NULL) { if (p->port_no == port_no) return p; - - p = p->next; } return NULL; @@ -104,17 +104,18 @@ /* called under bridge lock */ static void br_root_selection(struct net_bridge *br) { + struct list_head *l; struct net_bridge_port *p; int root_port; root_port = 0; - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + p = list_entry(l, struct net_bridge_port, list); + if (br_should_become_root_port(p, root_port)) root_port = p->port_no; - p = p->next; } br->root_port = root_port; @@ -239,15 +240,16 @@ /* called under bridge lock */ static void br_designated_port_selection(struct net_bridge *br) { - struct net_bridge_port *p; + struct list_head *l; + + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); - p = br->port_list; - while (p != NULL) { if (p->state != BR_STATE_DISABLED && br_should_become_designated_port(p)) br_become_designated_port(p); - p = p->next; } } @@ -311,15 +313,15 @@ /* called under bridge lock */ void br_config_bpdu_generation(struct net_bridge *br) { - struct net_bridge_port *p; + struct list_head *l; + + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); - p = br->port_list; - while (p != NULL) { if (p->state != BR_STATE_DISABLED && br_is_designated_port(p)) br_transmit_config(p); - - p = p->next; } } @@ -389,10 +391,12 @@ /* called under bridge lock */ void br_port_state_selection(struct net_bridge *br) { - struct net_bridge_port *p; + struct list_head *l; + + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); - p = br->port_list; - while (p != NULL) { if (p->state != BR_STATE_DISABLED) { if (p->port_no == br->root_port) { p->config_pending = 0; @@ -407,8 +411,6 @@ br_make_blocking(p); } } - - p = p->next; } } diff -Nru a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c --- a/net/bridge/br_stp_if.c Thu Apr 24 13:41:28 2003 +++ b/net/bridge/br_stp_if.c Thu Apr 24 13:41:28 2003 @@ -41,7 +41,7 @@ /* called under bridge lock */ void br_stp_enable_bridge(struct net_bridge *br) { - struct net_bridge_port *p; + struct list_head *l; struct timer_list *timer = &br->tick; init_timer(timer); @@ -53,12 +53,12 @@ br_timer_set(&br->hello_timer, jiffies); br_config_bpdu_generation(br); - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); + if (p->dev->flags & IFF_UP) br_stp_enable_port(p); - - p = p->next; } br_timer_set(&br->gc_timer, jiffies); @@ -67,7 +67,7 @@ /* NO locks held */ void br_stp_disable_bridge(struct net_bridge *br) { - struct net_bridge_port *p; + struct list_head *l; write_lock(&br->lock); br->topology_change = 0; @@ -78,12 +78,12 @@ br_timer_clear(&br->gc_timer); br_fdb_cleanup(br); - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); + if (p->state != BR_STATE_DISABLED) br_stp_disable_port(p); - - p = p->next; } write_unlock(&br->lock); @@ -126,7 +126,7 @@ static void br_stp_change_bridge_id(struct net_bridge *br, unsigned char *addr) { unsigned char oldaddr[6]; - struct net_bridge_port *p; + struct list_head *l; int wasroot; wasroot = br_is_root_bridge(br); @@ -135,15 +135,16 @@ memcpy(br->bridge_id.addr, addr, ETH_ALEN); memcpy(br->dev.dev_addr, addr, ETH_ALEN); - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); + if (!memcmp(p->designated_bridge.addr, oldaddr, ETH_ALEN)) memcpy(p->designated_bridge.addr, addr, ETH_ALEN); if (!memcmp(p->designated_root.addr, oldaddr, ETH_ALEN)) memcpy(p->designated_root.addr, addr, ETH_ALEN); - p = p->next; } br_configuration_update(br); @@ -158,17 +159,18 @@ void br_stp_recalculate_bridge_id(struct net_bridge *br) { unsigned char *addr; - struct net_bridge_port *p; + struct list_head *l; addr = br_mac_zero; - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); + if (addr == br_mac_zero || memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0) addr = p->dev->dev_addr; - p = p->next; } if (memcmp(br->bridge_id.addr, addr, ETH_ALEN)) @@ -178,20 +180,21 @@ /* called under bridge lock */ void br_stp_set_bridge_priority(struct net_bridge *br, int newprio) { - struct net_bridge_port *p; + struct list_head *l; int wasroot; wasroot = br_is_root_bridge(br); - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); + if (p->state != BR_STATE_DISABLED && br_is_designated_port(p)) { p->designated_bridge.prio[0] = (newprio >> 8) & 0xFF; p->designated_bridge.prio[1] = newprio & 0xFF; } - p = p->next; } br->bridge_id.prio[0] = (newprio >> 8) & 0xFF; diff -Nru a/net/bridge/br_stp_timer.c b/net/bridge/br_stp_timer.c --- a/net/bridge/br_stp_timer.c Thu Apr 24 13:41:28 2003 +++ b/net/bridge/br_stp_timer.c Thu Apr 24 13:41:28 2003 @@ -30,15 +30,14 @@ /* called under bridge lock */ static int br_is_designated_for_some_port(struct net_bridge *br) { - struct net_bridge_port *p; + struct list_head *l; - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); if (p->state != BR_STATE_DISABLED && !memcmp(&p->designated_bridge, &br->bridge_id, 8)) return 1; - - p = p->next; } return 0; @@ -140,7 +139,7 @@ /* called under bridge lock */ static void br_check_timers(struct net_bridge *br) { - struct net_bridge_port *p; + struct list_head *l; if (br_timer_has_expired(&br->gc_timer, br->gc_interval)) { br_timer_set(&br->gc_timer, jiffies); @@ -162,12 +161,11 @@ br_topology_change_timer_expired(br); } - p = br->port_list; - while (p != NULL) { + list_for_each(l, &br->port_list) { + struct net_bridge_port *p + = list_entry(l, struct net_bridge_port, list); if (p->state != BR_STATE_DISABLED) br_check_port_timers(p); - - p = p->next; } } From toml@us.ibm.com Thu Apr 24 14:29:37 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 14:29:48 -0700 (PDT) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OLTUFu015656 for ; Thu, 24 Apr 2003 14:29:37 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e6.ny.us.ibm.com (8.12.9/8.12.2) with ESMTP id h3OLSc9d154210; Thu, 24 Apr 2003 17:28:38 -0400 Received: from tomlt2.austin.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.8/NCO/VER6.5) with ESMTP id h3OLSZf7027348; Thu, 24 Apr 2003 17:28:35 -0400 Subject: IPSec: 2.5.68 test results From: Tom Lendacky To: netdev@oss.sgi.com Cc: davem@redhat.com, kuznet@ms2.inr.ac.ru, toml@us.ibm.com Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.8 (1.0.8-10) Date: 24 Apr 2003 16:29:51 -0500 Message-Id: <1051219792.5206.52.camel@tomlt2.tomloffice.austin.ibm.com> Mime-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2305 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: toml@us.ibm.com Precedence: bulk X-list: netdev Content-Length: 1415 Lines: 36 We've been running the TAHI IPSec test suites against the 2.5 kernel and a TAHI based IKE test suite that I created. I just wanted to post the results so far (up through 2.5.68) for anyone who may be interested. Test Successful Attempted ipsec4-udp (IPv4) 48 (*) 48 ipsec4 (IPv4) 95 (*) 95 ipsec (IPv6) 114 (*) 118 ike4 (IPv4) 111 (**) 111 ike (IPv6) 111 (**) 111 (*) Two warnings were issued during these tests. The warnings related receiving and processing ESP data with padding that was not sequentially numbered (ie. three pad bytes of 000000 vs. 010203). However, RFC 2406 states only that the receiver SHOULD, not MUST, inspect the padding so there isn't anything to worry about here. (**) These results are based on a racoon patch that I have submitted to KAME to resolve three minor RFC related issues: - Do not accept or generate transforms that specify ESP NULL encryption without ESP authentication - Do not accept or generate multiple proposal payloads during phase 1 processing - Do not accept multiple transform payloads in response to the SA negotiation during phase 1 processing. The four test cases that fail for the ipsec test are related to fragment header processing and will need to be debugged and fixed. Overall, these are very excellent results. Thanks, Tom From davem@redhat.com Thu Apr 24 14:33:21 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 14:33:25 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OLXLFu016010 for ; Thu, 24 Apr 2003 14:33:21 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id NAA10427; Thu, 24 Apr 2003 13:27:55 -0700 Date: Thu, 24 Apr 2003 13:27:55 -0700 (PDT) Message-Id: <20030424.132755.116355234.davem@redhat.com> To: toml@us.ibm.com Cc: netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: IPSec: 2.5.68 test results From: "David S. Miller" In-Reply-To: <1051219792.5206.52.camel@tomlt2.tomloffice.austin.ibm.com> References: <1051219792.5206.52.camel@tomlt2.tomloffice.austin.ibm.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2306 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 330 Lines: 8 From: Tom Lendacky Date: 24 Apr 2003 16:29:51 -0500 We've been running the TAHI IPSec test suites against the 2.5 kernel and a TAHI based IKE test suite that I created. I just wanted to post the results so far (up through 2.5.68) for anyone who may be interested. Thanks for the report Tom. From davem@redhat.com Thu Apr 24 14:37:21 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 14:37:24 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3OLbKFu016336 for ; Thu, 24 Apr 2003 14:37:20 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id NAA10482; Thu, 24 Apr 2003 13:31:54 -0700 Date: Thu, 24 Apr 2003 13:31:54 -0700 (PDT) Message-Id: <20030424.133154.98867715.davem@redhat.com> To: shemminger@osdl.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.5.68] [BRIDGE] Use list_ macros for bridge port list. From: "David S. Miller" In-Reply-To: <20030424135431.11cf3fe6.shemminger@osdl.org> References: <20030424135431.11cf3fe6.shemminger@osdl.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2307 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 542 Lines: 13 From: Stephen Hemminger Date: Thu, 24 Apr 2003 13:54:31 -0700 This replaces the singly linked list in net_bridge structure with the list_ macro's (doubly linked). It makes deleting an interface easier since no lookup required; but the real motivation is to setup for the next step where bridge rwlock is replaced with spin_lock and RCU. Maybe use list_for_each_entry where appropriate? If those were not used because *_rcu variants do not exist, just add the rcu versions to linux/list.h Thanks. From acme@conectiva.com.br Thu Apr 24 16:01:53 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 16:02:02 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3ON1oFu019628 for ; Thu, 24 Apr 2003 16:01:52 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 198poZ-0007lL-00; Thu, 24 Apr 2003 20:07:40 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id CA1221966C; Thu, 24 Apr 2003 23:02:02 +0000 (UTC) Date: Thu, 24 Apr 2003 20:02:02 -0300 From: Arnaldo Carvalho de Melo To: Max Krasnyansky Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family Message-ID: <20030424230202.GB2931@conectiva.com.br> Mail-Followup-To: Arnaldo Carvalho de Melo , Max Krasnyansky , linux-kernel@vger.kernel.org, netdev@oss.sgi.com References: <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2308 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 7666 Lines: 186 Em Thu, Apr 24, 2003 at 12:33:35PM -0700, Max Krasnyansky escreveu: > Hi Arnaldo, > > >I did, there are several valid points, I forgot the sys_accept case, I'm > >studying the code to see how to properly fix it, > It's pretty easy if we have sock->owner. Take a look how my patch does it > (try_module_get should be replaced with __module_get()). > It also covers the case when net_family_owner transferred ownership to the > other module. Yes, this gives us more flexibility, but as well some more overhead in the common struct sock, I have worked in 2.5 to reduce its size, and want to reduce it further, if possible. But read on, other reasons below. > >but one thing I want covered > >is keeping the net_families registered while there is still a struct sock > >associated with the proto family, while not allowing the criation of new sockets > >till the last struct sock is sk_freed. > Why ? > Like I said all we care about is if non default callbacks in struct sock are valid. > Please read below. > > >Think about protecting the module with the top level network protocol family > >->create code on sock_create level and the modules with specific protocols at > >_sock_create level. > With the current infrastructure you'd need some kind of callback from > sk_free() for that to work. I think it's simpler with sk->owner. not a callback, it'd be in sk_free itself (talking from the top of my head, just arrived home and will be further studying this now), I pretty much want to have protocol family maintainers not worrying about module refcounting at all in the default case of no further modularisation per specific prococol, that would save, for instance, Steven Whitehouse some work on DecNET :) > >> > struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab) > >> > { > >> >- struct sock *sk; > >> >- > >> >+ struct sock *sk = NULL; > >> >+ > >> >+ if (!net_family_get(family)) > >> >+ goto out; > >> Ok. This is wrong. Which should be clear from reading the thread that I > >> mentioned. Owner of the net_proto_family is not necessarily the owner of > >> the 'struct sock'. Example: af_inet module registers net_proto_family but > >> udp module owns the socket. (not that IPv4 code is modular but just an > >> example). Another example would be Bluetooth. We have Bluetooth core that > >> registers Bluetooth proto_family and several modules that handle specific > >> protocols (l2cap, rfcomm, etc). > >I'm think that this can be handled at this protocol family code level, i.e. > >if the net_proto_family wants to further modularise based on specific > >protocol type this has to be refcounted at this level, example, at > >bt_sock_create. > Sure. Transfer of the ownership has to be done on that level. What I'm saying > is that everything else can be done in generic code. So we're in agreement on having most of this infrastructure in generic code :) > >> Also net_proto_family has pretty much nothing to do with the struct sock. > >> The only reason we would want to hold reference to the module is if the > >> module has replaced default callbacks (i.e. sk->data_ready(), etc). So my > >> point is we need sk->owner field. > >That is a way to solve it, yes, but I don't think the only one, > >net_proto_family has to do with the struct sock as those data structures are > >related to the network protocol family. > By the same logic all things are related in the kernel :). :-) > struct socket uses net_proto_family ops and stuff and therefor is related. > But struct sock is just a callbacks. But I want to avoid having another thing to worry about for net protocol family writers, i.e. not having to add a sk_set_owner if one decides it has to change one of the default callbacks. > >> I'd also prefer to see sock->owner which gives more flexibility (i.e. > >> net_proto_family can be unregistered while struct socket still exist, > >> etc). net_family_get/put() makes no sense net_proto_family has only one > >> function npf->create() which is referenced only from net/socket.c. struct > >> socket should inherit owner field from struct net_proto_family by default > >> but protocol should be able to assign ownership to a different module if > >> it needs to. > >I'm studying how to signal that the net_proto_family was unregistered while > >still having the entry in net_families available, that is a problem with the > >current infrastructure in Linus tree. > Why do you need that ? > Let's just get rid of the net_family_get/put thing. Each socket will have > owner field so we know who owns it and there is no need to access global > net_family table. I'm trying to avoid adding a pointer to struct sock, if it is not possible at all to avoid, ok, we do it, but I think we can have this at just one place, the net_family table. > >Sorry, today I didn't had time to work on this at night at home, but > >tomorrow I'll be working on this, thing is, as I'm working only on having > >the infrastructure in place and no protocols have ->owner set there is no > >way to trigger the problems discussed in this message in any way. > I actually had it all working with the patch that I mentioned. I can go ahead > and add support to Bluetooth stuff, that's the reason I started that effort > in first place. However current code in main BK tree doesn't cover scenario > when owner of net_proto_family != owner of the socket. > Here is how I think it should work. > > sock_create() > if (!try_module_get(npf->owner)) > goto fail; > sock->owner = npf->owner; > > if (family_sock_create() < 0) { > sock_release(sock); > goto fail; > } > From this point on we don't care if net_proto_family is still registered or > not, we know who owns the socket. > sock_accept() > __module_get(sock->owner); > newsock->owner = sock->owner; > > sock_release() > module_put(sock->owner); > > family_sock_create() (i.e. bt_sock_create(), etc) > > #ifdef SPECIAL_FAMILY_THAT_HANDLES_PROTOCOLS_IN_SEPARATE_MODULES > if (!try_module_get(proto_module)) > goto fail; > > prev_owner = sock->owner; > sock->owner = proto_module; > module_put(prev_owner); > #else > /* Other families do not have to do anything */ > #endif > That's it for 'struct socket'. And I mean that is _it_. Family can be > unregistered and stuff, we don't care, and why should we. > Now 'struct sock'. It can exist independently from 'struct socket' and > therefor is a separate issue. > We only care about callbacks (sk->data_ready(), etc) and private sk slab > caches. Some protocols simply use default callback which belong to non > modular part of the kernel. Those don't have to do anything. They will just > work. Other protocols replace callbacks and therefor have to make sure that > module is still loaded while sk exists. For those modules we need the > following > void sk_set_owner(struct module *owner) > { > /* Module must already hold reference when it call this function. */ > __module_get(owner); > sk->owner = owner; > } This is the additional rule I'm trying to avoid. > sk_free() > ... > module_put(sk->owner); > ... this is already in BK tree. > >>> IPv4/6 - Private cache, non-default callbacks. > >>> Must call sk_set_owner() (cannot be a module, so we don't really care) Well, I care, I wish to have this as a module at some point, if allowed by DaveM, of course 8) - Arnaldo From maxk@qualcomm.com Thu Apr 24 17:40:38 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 17:40:45 -0700 (PDT) Received: from numenor.qualcomm.com (numenor.qualcomm.com [129.46.51.58]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3P0ebFu027348 for ; Thu, 24 Apr 2003 17:40:38 -0700 Received: from neophyte.qualcomm.com (neophyte.qualcomm.com [129.46.61.149]) by numenor.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3P0eV7t000350 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 24 Apr 2003 17:40:31 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by neophyte.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3P0eTr4002533; Thu, 24 Apr 2003 17:40:29 -0700 (PDT) Message-Id: <5.1.0.14.2.20030424170208.102ee6c8@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Thu, 24 Apr 2003 17:40:28 -0700 To: Arnaldo Carvalho de Melo From: Max Krasnyansky Subject: Re: [BK ChangeSet@1.1118.1.1] new module infrastructure for net_proto_family Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com In-Reply-To: <20030424230202.GB2931@conectiva.com.br> References: <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2309 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev Content-Length: 4507 Lines: 107 At 04:02 PM 4/24/2003, Arnaldo Carvalho de Melo wrote: >Em Thu, Apr 24, 2003 at 12:33:35PM -0700, Max Krasnyansky escreveu: >> Hi Arnaldo, >> >> >I did, there are several valid points, I forgot the sys_accept case, I'm >> >studying the code to see how to properly fix it, > >> It's pretty easy if we have sock->owner. Take a look how my patch does it >> (try_module_get should be replaced with __module_get()). >> It also covers the case when net_family_owner transferred ownership to the >> other module. > >Yes, this gives us more flexibility, but as well some more overhead in the >common struct sock, I have worked in 2.5 to reduce its size, and want to >reduce it further, if possible. Easy. struct sock { ... struct sock *next; struct sock **pprev; struct sock *bind_next; struct sock **bind_pprev; struct sock *prev; At least one of the prev can go. >> >Think about protecting the module with the top level network protocol family >> >->create code on sock_create level and the modules with specific protocols at >> >_sock_create level. > >> With the current infrastructure you'd need some kind of callback from >> sk_free() for that to work. I think it's simpler with sk->owner. > >not a callback, it'd be in sk_free itself (talking from the top of my head, >just arrived home and will be further studying this now), I pretty much want to >have protocol family maintainers not worrying about module refcounting at all >in the default case of no further modularisation per specific prococol, that >would save, for instance, Steven Whitehouse some work on DecNET :) sk_free() doesn't know which module owns the socket in "net_proto_family owner != socket owner" case. BTW Let's call that case "NOnSO" I'm referring to it way too often :) >> Sure. Transfer of the ownership has to be done on that level. What I'm saying >> is that everything else can be done in generic code. > >So we're in agreement on having most of this infrastructure in generic code :) I guess so :). But haven't seen a generic solution for the NOnSO from you yet ;-). >> struct socket uses net_proto_family ops and stuff and therefor is related. >> But struct sock is just a callbacks. > >But I want to avoid having another thing to worry about for net protocol >family writers, i.e. not having to add a sk_set_owner if one decides it has >to change one of the default callbacks. Well, that means that refcounting overhead will affect even the protocols that don't have to keep track of 'struct sock'. It also means that those protocols will not unloadable until all sk's are killed. Even though sk's have no references whatsoever to the module that created them. >> Let's just get rid of the net_family_get/put thing. Each socket will have >> owner field so we know who owns it and there is no need to access global >> net_family table. > >I'm trying to avoid adding a pointer to struct sock, if it is not possible >at all to avoid, ok, we do it, but I think we can have this at just one >place, the net_family table. Killing one of the list pointers from 'struct sock' shouldn't be a problem (see above). One net_family table won't handle NOnSO. Even if it will, protocol writers will have to worry about proper initialization of the tables anyway. Especially if someone comes up with something like: Family X (module X.ko) Proto X1 (module X1.ko) Subproto X1-A (module X1-A.ko) not that it makes a lot of sense right now but why restrict it if we don't have to. >> void sk_set_owner(struct module *owner) >> { >> /* Module must already hold reference when it call this function. */ >> __module_get(owner); >> sk->owner = owner; >> } > >This is the additional rule I'm trying to avoid. It's not a big deal rule. All protocols do hold reference when they allocate sk. >> sk_free() >> ... >> module_put(sk->owner); >> ... > >this is already in BK tree. No. I mean NOnSO ;-). What's in BK is net_family_put(family) which is by no means the same. >> >>> IPv4/6 - Private cache, non-default callbacks. >> >>> Must call sk_set_owner() (cannot be a module, so we don't really care) > >Well, I care, I wish to have this as a module at some point, if allowed by >DaveM, of course 8) If I remember correctly DaveM was one of those are strongly against that. Max From bmariamu@bigpond.com Thu Apr 24 22:15:50 2003 Received: with ECARTIS (v1.0.0; list netdev); Thu, 24 Apr 2003 22:15:56 -0700 (PDT) Received: from mailout2.bigpond.com (juicer12.bigpond.com [139.134.6.19]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3P5FmFu011721 for ; Thu, 24 Apr 2003 22:15:49 -0700 Received: from bigpond.com ([192.168.115.90]) by mailout2.bigpond.com (Netscape Messaging Server 4.15) with ESMTP id HDVVQ501.M0Y; Fri, 25 Apr 2003 15:10:53 +1000 From: bmariamu To: adamartins@eboarding@.net Message-ID: <1d59ef1d0a76.1d0a761d59ef@bigpond.com> Date: Fri, 25 Apr 2003 07:10:51 +0200 X-Mailer: Netscape Webmail MIME-Version: 1.0 Content-Language: en Subject: am/ab-12 X-Accept-Language: en Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id h3P5FmFu011721 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2310 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bmariamu@telstra.com Precedence: bulk X-list: netdev Content-Length: 3145 Lines: 75 Hajia Mariam Abacha Abacha court, 11 Gidado Crescent, Kano State, Nigeria. Dear Sir, I am Hajia Mariam Abacha the wife of Late Genaral Sani Abacha the former head of States Federal Republic of Nigeria. Following the sudden death of my husband in August 1998, I have been thrown into a state of utter confusion, frustration and hopelessness by the present civilian administration, I have been subjected to physical and psychological torture by the security agents in the country. I have lost confidence with anybody within the country. You must have heard over the media reports and the internet on the recovery of various huge sums of money deposited by my late husband in different security firms abroad, some companies willingly gave up their secrets and disclosed our money confidently lodged there or many out right blackmail. In fact the total sum discovered by the Government so far is in the tune of $700 Million dollars. And they are not relenting to make me poor for life. I got your contacts through my personal research and out of desperation and decided to reach you. I will give you more information as to this regard as soon as you reply through my lawyer with his details below. I repose great confidence in you hence my approach to you due to security network placed on my daily affairs. I cannot afford to visit the embassy hence I decided to contact you and I hope you will not betray my confidence in you. I have deposited the sum of 38.5 million dollars with a security firm abroad whose name is withheld for now until we open up communication. I shall be grateful if you could receive these funds into your account for a safe keeping. My son, Mustapha Abacha has just been released by the Federal Government, so my lawyer will deal directly with you as security is up my whole being. If you decided to assist us, contact my lawyer; Br. Martins Sul Adamu. M. S. Adamu & Co. 19B, Kingsway Road, Ikoyi, Lagos-Nigeria. E-mail:adamartins@eboarding@.net This code: (am/ab-12) must be referred to in your letter to him to enable him know that you are from me, and he will furnish you with more details. I have mandated him to relate with you while the business last for security reasons. If you have any questions or anything that you would like to know, please you are free to ask for explanation. I am seriously considering relocation in abroad in a more friendly environment like yours as soon as these funds are secured in your account. You will be compensated for your efforts and assistance for the diversion of the funds into your account. By so doing, you will be entitled to 35% of the total sum while I retain 65%. Please honesty is the watch word in this transaction. In case you don’t accept this offer, please do not let me out to the security Agents in Nigeria as I am giving you this information in total trust and confidence. I will greatly appreciate your acceptance of this offer in good faith. Please expedite action by getting in touch with my lawyer immediately. Sincerely Yours Hajia Mariam Abacha. ---------------- Powered by telstra.com From kazunori@miyazawa.org Fri Apr 25 06:20:17 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 25 Apr 2003 06:20:37 -0700 (PDT) Received: from miyazawa.org (usen-43x235x12x234.ap-USEN.usen.ad.jp [43.235.12.234]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3PDKCFu023143 for ; Fri, 25 Apr 2003 06:20:17 -0700 Received: from monza.miyazawa.org (softdnserr [3ffe:501:41c:3:2d0:59ff:feab:4ac0]) (AUTH: LOGIN kazunori, ) by miyazawa.org with esmtp; Fri, 25 Apr 2003 09:46:27 +0900 Date: Fri, 25 Apr 2003 10:10:12 +0900 From: Kazunori Miyazawa To: Tom Lendacky Cc: netdev@oss.sgi.com, davem@redhat.com, kuznet@ms2.inr.ac.ru, toml@us.ibm.com Subject: Re: IPSec: 2.5.68 test results Message-Id: <20030425101012.05e172bb.kazunori@miyazawa.org> In-Reply-To: <1051219792.5206.52.camel@tomlt2.tomloffice.austin.ibm.com> References: <1051219792.5206.52.camel@tomlt2.tomloffice.austin.ibm.com> X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i386-debian-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2311 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kazunori@miyazawa.org Precedence: bulk X-list: netdev Content-Length: 842 Lines: 21 On 24 Apr 2003 16:29:51 -0500 Tom Lendacky wrote: > The four test cases that fail for the ipsec test are related to > fragment header processing and will need to be debugged and fixed. I have already posted the patch to netdev on 15, April, whose subject is [PACTH][IPV6] Introduce ip6_append_data. It change the style of the process like ip_append_data and fixes outbound fragment header processing. However this patch will not be applied soon because there is locking problem. The bugs is in both ipv4 and ipv6 corking architecture of datagram output. It may be applied when the bugs is removed. About inbound processing, we can fix it with removing fragment header from the packet. Please see function ip6_frag_reasm in linux25/net/ipv6/reassembly.c. Thank you, --Kazunori Miyazawa (Yokogawa Electric Corporation) From shemminger@osdl.org Fri Apr 25 13:30:52 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 25 Apr 2003 13:31:00 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3PKUpFu006152 for ; Fri, 25 Apr 2003 13:30:52 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3PKUnW26857; Fri, 25 Apr 2003 13:30:49 -0700 Date: Fri, 25 Apr 2003 13:30:49 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH 2.5.68] [BRIDGE] Use RCU for port table Message-Id: <20030425133049.52238301.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2312 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 16768 Lines: 655 Use RCU instead of reader/writer lock for the port table. This is cleaner and simpler, and eliminates dependency on brlock. This patch assumes earlier patch that uses list_* macros. Also, fixes issues with timer not getting write lock. Introduced a little bit of use of 'const' in the receive side path, just because paranoid that receive code was only doing read's. Moved locking from dev_open into br_stp_enable_bridge because then disable/enable are symmetrical. Tested with stresstest on 8-way SMP. diff -Nru a/include/linux/list.h b/include/linux/list.h --- a/include/linux/list.h Fri Apr 25 13:19:34 2003 +++ b/include/linux/list.h Fri Apr 25 13:19:34 2003 @@ -320,6 +320,21 @@ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, ({ smp_read_barrier_depends(); 0;}), n = pos->next) +/** + * list_for_each_entry_rcu - iterate over rcu list of given type + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_rcu(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + prefetch(pos->member.next); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member), \ + ({ smp_read_barrier_depends(); 0;}), \ + prefetch(pos->member.next)) + + /* * Double linked lists with a single pointer list head. * Mostly useful for hash tables where the two pointer list head is diff -Nru a/net/bridge/br_device.c b/net/bridge/br_device.c --- a/net/bridge/br_device.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_device.c Fri Apr 25 13:19:34 2003 @@ -74,27 +74,20 @@ int br_dev_xmit(struct sk_buff *skb, struct net_device *dev) { - struct net_bridge *br; int ret; - br = dev->priv; - read_lock(&br->lock); + rcu_read_lock(); ret = __br_dev_xmit(skb, dev); - read_unlock(&br->lock); + rcu_read_unlock(); return ret; } static int br_dev_open(struct net_device *dev) { - struct net_bridge *br; - netif_start_queue(dev); - br = dev->priv; - write_lock(&br->lock); - br_stp_enable_bridge(br); - write_unlock(&br->lock); + br_stp_enable_bridge(dev->priv); return 0; } diff -Nru a/net/bridge/br_forward.c b/net/bridge/br_forward.c --- a/net/bridge/br_forward.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_forward.c Fri Apr 25 13:19:34 2003 @@ -21,7 +21,8 @@ #include #include "br_private.h" -static inline int should_deliver(struct net_bridge_port *p, struct sk_buff *skb) +static inline int should_deliver(const struct net_bridge_port *p, + const struct sk_buff *skb) { if (skb->dev == p->dev || p->state != BR_STATE_FORWARDING) @@ -52,7 +53,7 @@ return 0; } -static void __br_deliver(struct net_bridge_port *to, struct sk_buff *skb) +static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) { skb->dev = to->dev; #ifdef CONFIG_NETFILTER_DEBUG @@ -62,7 +63,7 @@ br_forward_finish); } -static void __br_forward(struct net_bridge_port *to, struct sk_buff *skb) +static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb) { struct net_device *indev; @@ -73,8 +74,8 @@ br_forward_finish); } -/* called under bridge lock */ -void br_deliver(struct net_bridge_port *to, struct sk_buff *skb) +/* called with rcu_read_lock */ +void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) { if (should_deliver(to, skb)) { __br_deliver(to, skb); @@ -84,8 +85,8 @@ kfree_skb(skb); } -/* called under bridge lock */ -void br_forward(struct net_bridge_port *to, struct sk_buff *skb) +/* called with rcu_read_lock */ +void br_forward(const struct net_bridge_port *to, struct sk_buff *skb) { if (should_deliver(to, skb)) { __br_forward(to, skb); @@ -97,7 +98,8 @@ /* called under bridge lock */ static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone, - void (*__packet_hook)(struct net_bridge_port *p, struct sk_buff *skb)) + void (*__packet_hook)(const struct net_bridge_port *p, + struct sk_buff *skb)) { struct net_bridge_port *p; struct net_bridge_port *prev; @@ -115,7 +117,7 @@ prev = NULL; - list_for_each_entry(p, &br->port_list, list) { + list_for_each_entry_rcu(p, &br->port_list, list) { if (should_deliver(p, skb)) { if (prev != NULL) { struct sk_buff *skb2; @@ -141,7 +143,8 @@ kfree_skb(skb); } -/* called under bridge lock */ + +/* called with rcu_read_lock */ void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb, int clone) { br_flood(br, skb, clone, __br_deliver); diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c --- a/net/bridge/br_if.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_if.c Fri Apr 25 13:19:34 2003 @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include "br_private.h" @@ -38,7 +37,14 @@ return 100; } -/* called under BR_NETPROTO_LOCK and bridge lock */ +static void destroy_nbp(void *arg) +{ + struct net_bridge_port *p = arg; + dev_put(p->dev); + kfree(p); +} + +/* called under bridge lock */ static void del_nbp(struct net_bridge_port *p) { struct net_device *dev = p->dev; @@ -48,24 +54,22 @@ dev_set_promiscuity(dev, -1); dev->br_port = NULL; - list_del(&p->list); + list_del_rcu(&p->list); br_fdb_delete_by_port(p->br, p); - kfree(p); - dev_put(dev); + + call_rcu(&p->rcu, destroy_nbp, p); } static void del_ifs(struct net_bridge *br) { struct list_head *p, *n; - br_write_lock_bh(BR_NETPROTO_LOCK); - write_lock(&br->lock); + spin_lock_bh(&br->lock); list_for_each_safe(p, n, &br->port_list) { del_nbp(list_entry(p, struct net_bridge_port, list)); } - write_unlock(&br->lock); - br_write_unlock_bh(BR_NETPROTO_LOCK); + spin_unlock_bh(&br->lock); } static struct net_bridge *new_nb(const char *name) @@ -87,7 +91,7 @@ ether_setup(dev); br_dev_setup(dev); - br->lock = RW_LOCK_UNLOCKED; + br->lock = SPIN_LOCK_UNLOCKED; INIT_LIST_HEAD(&br->port_list); br->hash_lock = RW_LOCK_UNLOCKED; @@ -145,7 +149,7 @@ br_init_port(p); p->state = BR_STATE_DISABLED; - list_add(&p->list, &br->port_list); + list_add_rcu(&p->list, &br->port_list); return p; } @@ -207,9 +211,9 @@ return -ELOOP; dev_hold(dev); - write_lock_bh(&br->lock); + spin_lock_bh(&br->lock); if ((p = new_nbp(br, dev)) == NULL) { - write_unlock_bh(&br->lock); + spin_unlock_bh(&br->lock); dev_put(dev); return -EXFULL; } @@ -220,7 +224,7 @@ br_fdb_insert(br, p, dev->dev_addr, 1); if ((br->dev.flags & IFF_UP) && (dev->flags & IFF_UP)) br_stp_enable_port(p); - write_unlock_bh(&br->lock); + spin_unlock_bh(&br->lock); return 0; } @@ -230,16 +234,14 @@ struct net_bridge_port *p; int retval = 0; - br_write_lock_bh(BR_NETPROTO_LOCK); - write_lock(&br->lock); + spin_lock_bh(&br->lock); if ((p = dev->br_port) == NULL || p->br != br) retval = -EINVAL; else { del_nbp(p); br_stp_recalculate_bridge_id(br); } - write_unlock(&br->lock); - br_write_unlock_bh(BR_NETPROTO_LOCK); + spin_unlock_bh(&br->lock); return retval; } @@ -263,11 +265,11 @@ { struct net_bridge_port *p; - read_lock(&br->lock); - list_for_each_entry(p, &br->port_list, list) { + rcu_read_lock(); + list_for_each_entry_rcu(p, &br->port_list, list) { ifindices[p->port_no] = p->dev->ifindex; } - read_unlock(&br->lock); + rcu_read_unlock(); } diff -Nru a/net/bridge/br_input.c b/net/bridge/br_input.c --- a/net/bridge/br_input.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_input.c Fri Apr 25 13:19:34 2003 @@ -59,15 +59,16 @@ dest = skb->mac.ethernet->h_dest; + rcu_read_lock(); p = skb->dev->br_port; - if (p == NULL) - goto err_nolock; + smp_read_barrier_depends(); - br = p->br; - read_lock(&br->lock); - if (skb->dev->br_port == NULL) - goto err; + if (p == NULL || p->state == BR_STATE_DISABLED) { + kfree(skb); + goto out; + } + br = p->br; passedup = 0; if (br->dev.flags & IFF_PROMISC) { struct sk_buff *skb2; @@ -105,35 +106,20 @@ br_flood_forward(br, skb, 0); out: - read_unlock(&br->lock); - return 0; - -err: - read_unlock(&br->lock); -err_nolock: - kfree_skb(skb); + rcu_read_unlock(); return 0; } int br_handle_frame(struct sk_buff *skb) { - struct net_bridge *br; unsigned char *dest; struct net_bridge_port *p; dest = skb->mac.ethernet->h_dest; + rcu_read_lock(); p = skb->dev->br_port; - if (p == NULL) - goto err_nolock; - - br = p->br; - read_lock(&br->lock); - if (skb->dev->br_port == NULL) - goto err; - - if (!(br->dev.flags & IFF_UP) || - p->state == BR_STATE_DISABLED) + if (p == NULL || p->state == BR_STATE_DISABLED) goto err; if (skb->mac.ethernet->h_source[0] & 1) @@ -141,34 +127,30 @@ if (p->state == BR_STATE_LEARNING || p->state == BR_STATE_FORWARDING) - br_fdb_insert(br, p, skb->mac.ethernet->h_source, 0); + br_fdb_insert(p->br, p, skb->mac.ethernet->h_source, 0); - if (br->stp_enabled && + if (p->br->stp_enabled && !memcmp(dest, bridge_ula, 5) && - !(dest[5] & 0xF0)) - goto handle_special_frame; + !(dest[5] & 0xF0)) { + if (!dest[5]) + br_stp_handle_bpdu(skb); + goto err; + } if (p->state == BR_STATE_FORWARDING) { if (br_should_route_hook && br_should_route_hook(&skb)) { - read_unlock(&br->lock); + rcu_read_unlock(); return -1; } NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL, br_handle_frame_finish); - read_unlock(&br->lock); + rcu_read_unlock(); return 0; } err: - read_unlock(&br->lock); -err_nolock: + rcu_read_unlock(); kfree_skb(skb); return 0; - -handle_special_frame: - read_unlock(&br->lock); - if (!dest[5]) - br_stp_handle_bpdu(skb); - goto err_nolock; } diff -Nru a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c --- a/net/bridge/br_ioctl.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_ioctl.c Fri Apr 25 13:19:34 2003 @@ -71,8 +71,8 @@ { struct __bridge_info b; - read_lock(&br->lock); memset(&b, 0, sizeof(struct __bridge_info)); + rcu_read_lock(); memcpy(&b.designated_root, &br->designated_root, 8); memcpy(&b.bridge_id, &br->bridge_id, 8); b.root_path_cost = br->root_path_cost; @@ -92,7 +92,7 @@ b.tcn_timer_value = timer_residue(&br->tcn_timer); b.topology_change_timer_value = timer_residue(&br->topology_change_timer); b.gc_timer_value = timer_residue(&br->gc_timer); - read_unlock(&br->lock); + rcu_read_unlock(); if (copy_to_user((void *)arg0, &b, sizeof(b))) return -EFAULT; @@ -119,27 +119,27 @@ } case BRCTL_SET_BRIDGE_FORWARD_DELAY: - write_lock(&br->lock); + spin_lock_bh(&br->lock); br->bridge_forward_delay = user_to_ticks(arg0); if (br_is_root_bridge(br)) br->forward_delay = br->bridge_forward_delay; - write_unlock(&br->lock); + spin_unlock_bh(&br->lock); return 0; case BRCTL_SET_BRIDGE_HELLO_TIME: - write_lock(&br->lock); + spin_lock_bh(&br->lock); br->bridge_hello_time = user_to_ticks(arg0); if (br_is_root_bridge(br)) br->hello_time = br->bridge_hello_time; - write_unlock(&br->lock); + spin_unlock_bh(&br->lock); return 0; case BRCTL_SET_BRIDGE_MAX_AGE: - write_lock(&br->lock); + spin_lock_bh(&br->lock); br->bridge_max_age = user_to_ticks(arg0); if (br_is_root_bridge(br)) br->max_age = br->bridge_max_age; - write_unlock(&br->lock); + spin_unlock_bh(&br->lock); return 0; case BRCTL_SET_AGEING_TIME: @@ -155,9 +155,9 @@ struct __port_info p; struct net_bridge_port *pt; - read_lock(&br->lock); + rcu_read_lock(); if ((pt = br_get_port(br, arg1)) == NULL) { - read_unlock(&br->lock); + rcu_read_unlock(); return -EINVAL; } @@ -175,7 +175,7 @@ p.forward_delay_timer_value = timer_residue(&pt->forward_delay_timer); p.hold_timer_value = timer_residue(&pt->hold_timer); - read_unlock(&br->lock); + rcu_read_unlock(); if (copy_to_user((void *)arg0, &p, sizeof(p))) return -EFAULT; @@ -188,9 +188,9 @@ return 0; case BRCTL_SET_BRIDGE_PRIORITY: - write_lock(&br->lock); + spin_lock_bh(&br->lock); br_stp_set_bridge_priority(br, arg0); - write_unlock(&br->lock); + spin_unlock_bh(&br->lock); return 0; case BRCTL_SET_PORT_PRIORITY: @@ -198,12 +198,12 @@ struct net_bridge_port *p; int ret = 0; - write_lock(&br->lock); + spin_lock_bh(&br->lock); if ((p = br_get_port(br, arg0)) == NULL) ret = -EINVAL; else br_stp_set_port_priority(p, arg1); - write_unlock(&br->lock); + spin_unlock_bh(&br->lock); return ret; } @@ -212,12 +212,12 @@ struct net_bridge_port *p; int ret = 0; - write_lock(&br->lock); + spin_lock_bh(&br->lock); if ((p = br_get_port(br, arg0)) == NULL) ret = -EINVAL; else br_stp_set_path_cost(p, arg1); - write_unlock(&br->lock); + spin_unlock_bh(&br->lock); return ret; } diff -Nru a/net/bridge/br_notify.c b/net/bridge/br_notify.c --- a/net/bridge/br_notify.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_notify.c Fri Apr 25 13:19:34 2003 @@ -41,10 +41,10 @@ switch (event) { case NETDEV_CHANGEADDR: - write_lock_bh(&br->lock); + spin_lock_bh(&br->lock); br_fdb_changeaddr(p, dev->dev_addr); br_stp_recalculate_bridge_id(br); - write_unlock_bh(&br->lock); + spin_unlock_bh(&br->lock); break; case NETDEV_GOING_DOWN: @@ -53,17 +53,17 @@ case NETDEV_DOWN: if (br->dev.flags & IFF_UP) { - write_lock_bh(&br->lock); + spin_lock_bh(&br->lock); br_stp_disable_port(p); - write_unlock_bh(&br->lock); + spin_unlock_bh(&br->lock); } break; case NETDEV_UP: if (!(br->dev.flags & IFF_UP)) { - write_lock_bh(&br->lock); + spin_lock_bh(&br->lock); br_stp_enable_port(p); - write_unlock_bh(&br->lock); + spin_unlock_bh(&br->lock); } break; diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_private.h Fri Apr 25 13:19:34 2003 @@ -75,11 +75,13 @@ struct br_timer forward_delay_timer; struct br_timer hold_timer; struct br_timer message_age_timer; + + struct rcu_head rcu; }; struct net_bridge { - rwlock_t lock; + spinlock_t lock; struct list_head port_list; struct net_device dev; struct net_device_stats statistics; @@ -137,10 +139,10 @@ int is_local); /* br_forward.c */ -extern void br_deliver(struct net_bridge_port *to, +extern void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb); extern int br_dev_queue_push_xmit(struct sk_buff *skb); -extern void br_forward(struct net_bridge_port *to, +extern void br_forward(const struct net_bridge_port *to, struct sk_buff *skb); extern int br_forward_finish(struct sk_buff *skb); extern void br_flood_deliver(struct net_bridge *br, diff -Nru a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c --- a/net/bridge/br_stp_bpdu.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_stp_bpdu.c Fri Apr 25 13:19:34 2003 @@ -143,7 +143,7 @@ p = skb->dev->br_port; br = p->br; - write_lock_bh(&br->lock); + spin_lock_bh(&br->lock); if (p->state == BR_STATE_DISABLED || !(br->dev.flags & IFF_UP) || !br->stp_enabled @@ -192,5 +192,5 @@ goto out; } out: - write_unlock_bh(&br->lock); + spin_unlock_bh(&br->lock); } diff -Nru a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c --- a/net/bridge/br_stp_if.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_stp_if.c Fri Apr 25 13:19:34 2003 @@ -44,6 +44,7 @@ struct net_bridge_port *p; struct timer_list *timer = &br->tick; + spin_lock_bh(&br->lock); init_timer(timer); timer->data = (unsigned long) br; timer->function = br_tick; @@ -59,6 +60,7 @@ } br_timer_set(&br->gc_timer, jiffies); + spin_unlock_bh(&br->lock); } /* NO locks held */ @@ -66,7 +68,7 @@ { struct net_bridge_port *p; - write_lock(&br->lock); + spin_lock_bh(&br->lock); br->topology_change = 0; br->topology_change_detected = 0; br_timer_clear(&br->hello_timer); @@ -79,7 +81,7 @@ if (p->state != BR_STATE_DISABLED) br_stp_disable_port(p); } - write_unlock(&br->lock); + spin_unlock_bh(&br->lock); del_timer_sync(&br->tick); } diff -Nru a/net/bridge/br_stp_timer.c b/net/bridge/br_stp_timer.c --- a/net/bridge/br_stp_timer.c Fri Apr 25 13:19:34 2003 +++ b/net/bridge/br_stp_timer.c Fri Apr 25 13:19:34 2003 @@ -169,10 +169,10 @@ { struct net_bridge *br = (struct net_bridge *)__data; - read_lock(&br->lock); - br_check_timers(br); - read_unlock(&br->lock); - + if (spin_trylock_bh(&br->lock)) { + br_check_timers(br); + spin_unlock_bh(&br->lock); + } br->tick.expires = jiffies + 1; add_timer(&br->tick); } From davem@redhat.com Fri Apr 25 22:30:50 2003 Received: with ECARTIS (v1.0.0; list netdev); Fri, 25 Apr 2003 22:31:01 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3Q5UnFu012537 for ; Fri, 25 Apr 2003 22:30:50 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id VAA14425; Fri, 25 Apr 2003 21:25:05 -0700 Date: Fri, 25 Apr 2003 21:25:05 -0700 (PDT) Message-Id: <20030425.212505.59664567.davem@redhat.com> To: shemminger@osdl.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.5.68] [BRIDGE] Use RCU for port table From: "David S. Miller" In-Reply-To: <20030425133049.52238301.shemminger@osdl.org> References: <20030425133049.52238301.shemminger@osdl.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2313 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 67 Lines: 4 I've applied all of your bridging patches Stephen. Thanks a lot. From acme@conectiva.com.br Sun Apr 27 06:57:01 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 27 Apr 2003 06:57:42 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3RDuJFu010606 for ; Sun, 27 Apr 2003 06:57:01 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 199mjV-0000H6-00; Sun, 27 Apr 2003 11:02:22 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 173631966C; Sun, 27 Apr 2003 13:56:40 +0000 (UTC) Date: Sun, 27 Apr 2003 10:56:40 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] make sys_accept bump the net proto family module usage count Message-ID: <20030427135640.GD14821@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2314 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 2737 Lines: 96 Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 I'll be shortly submitting the changes for LLC and IPX, etc. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1123, 2003-04-27 10:34:17-03:00, acme@conectiva.com.br o net/socket: make sys_accept bump the net proto family module usage count Thanks to Max Krasnyansky for spotting this. socket.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff -Nru a/net/socket.c b/net/socket.c --- a/net/socket.c Sun Apr 27 10:46:55 2003 +++ b/net/socket.c Sun Apr 27 10:46:55 2003 @@ -1288,24 +1288,28 @@ if (err) goto out_release; + err = -EBUSY; + if (!net_family_get(sock->ops->family)) + goto out_release; + err = sock->ops->accept(sock, newsock, sock->file->f_flags); if (err < 0) - goto out_release; + goto out_family_put; if (upeer_sockaddr) { if(newsock->ops->getname(newsock, (struct sockaddr *)address, &len, 2)<0) { err = -ECONNABORTED; - goto out_release; + goto out_family_put; } err = move_addr_to_user(address, len, upeer_sockaddr, upeer_addrlen); if (err < 0) - goto out_release; + goto out_family_put; } /* File flags are not inherited via accept() unlike another OSes. */ if ((err = sock_map_fd(newsock)) < 0) - goto out_release; + goto out_family_put; security_socket_post_accept(sock, newsock); @@ -1313,7 +1317,8 @@ sockfd_put(sock); out: return err; - +out_family_put: + net_family_put(sock->ops->family); out_release: sock_release(newsock); goto out_put; =================================================================== This BitKeeper patch contains the following changesets: 1.1123 ## Wrapped with gzip_uu ## M'XL( $_?JSX ]U4VVK;0!!]UG[%E+PD%,E[T=THI+F0%K?4.,U#H6#6ZY5M M;&F%=N76H(_O6@ZQT[H)*7VJ)#2P)/:)D9*V41OK@K9NQST2FE3F3=]) EB&CZC5?3?4%-_.5*CU3\U(7TG0UVT=H2S&F M]@U(Q' 0MB3$?M0*,B6$^T1.,?7CT-^S;04^Q\6P3R-LN6C0,A8E!%T#\0BA M###K8;]'(R X97Y*(A>S%&/8CN;BUY' 6P(N1I?P;_NX0@(4V.GVM!)+:5(H M^%*"WN@Q%T)6!B9-48&9RRT(JEH9!3DO%JL-%&K:K"0TFL\D"-64QI(!V-\7 MJV*IK53XQ'_ H.:ZW%B5RPWDJ@9=*6,6Y^7AR:\K4L+LK&:*] Cc: Linux Networking Development Mailing List Subject: [PATCH] ipx: remove MOD_{INC,DEC}_USE_COUNT Message-ID: <20030427150302.GC15637@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2315 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 3960 Lines: 152 Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 Now there are two outstanding changesets in this tree. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1124, 2003-04-27 11:03:43-03:00, acme@conectiva.com.br o ipx: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. af_ipx.c | 28 ++++------------------------ 1 files changed, 4 insertions(+), 24 deletions(-) diff -Nru a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c --- a/net/ipx/af_ipx.c Sun Apr 27 11:56:18 2003 +++ b/net/ipx/af_ipx.c Sun Apr 27 11:56:18 2003 @@ -95,18 +95,6 @@ atomic_t ipx_sock_nr; #endif -static void ipxcfg_set_auto_create(char val) -{ - if (ipxcfg_auto_create_interfaces != val) { - if (val) - MOD_INC_USE_COUNT; - else - MOD_DEC_USE_COUNT; - - ipxcfg_auto_create_interfaces = val; - } -} - static void ipxcfg_set_auto_select(char val) { ipxcfg_auto_select_primary = val; @@ -373,7 +361,6 @@ if (intrfc->if_dev) dev_put(intrfc->if_dev); kfree(intrfc); - MOD_DEC_USE_COUNT; } static void ipxitf_down(struct ipx_interface *intrfc) @@ -949,7 +936,6 @@ intrfc->if_sklist = NULL; atomic_set(&intrfc->refcnt, 1); spin_lock_init(&intrfc->if_sklist_lock); - MOD_INC_USE_COUNT; } return intrfc; @@ -1272,7 +1258,7 @@ case SIOCAIPXITFCRT: if (get_user(val, (unsigned char *) arg)) return -EFAULT; - ipxcfg_set_auto_create(val); + ipxcfg_auto_create_interfaces = val; break; case SIOCAIPXPRISLT: @@ -1690,13 +1676,12 @@ struct ipx_opt *ipx = NULL; struct sock *sk; - MOD_INC_USE_COUNT; switch (sock->type) { case SOCK_DGRAM: sk = sk_alloc(PF_IPX, GFP_KERNEL, 1, NULL); ret = -ENOMEM; if (!sk) - goto decmod; + goto out; ipx = ipx_sk(sk) = kmalloc(sizeof(*ipx), GFP_KERNEL); if (!ipx) goto outsk; @@ -1713,7 +1698,7 @@ */ case SOCK_STREAM: /* Allow higher levels to piggyback */ default: - goto decmod; + goto out; } #ifdef IPX_REFCNT_DEBUG atomic_inc(&ipx_sock_nr); @@ -1727,8 +1712,6 @@ return ret; outsk: sk_free(sk); -decmod: - MOD_DEC_USE_COUNT; goto out; } @@ -1745,10 +1728,6 @@ __set_bit(SOCK_DEAD, &sk->flags); sock->sk = NULL; ipx_destroy_socket(sk); - - if (sock->type == SOCK_DGRAM) - MOD_DEC_USE_COUNT; - out: return 0; } @@ -2252,6 +2231,7 @@ static struct net_proto_family ipx_family_ops = { .family = PF_IPX, .create = ipx_create, + .owner = THIS_MODULE, }; static struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = { =================================================================== This BitKeeper patch contains the following changesets: 1.1124 ## Wrapped with gzip_uu ## M'XL( )+OJSX ^U5VT[;0!!]]G[%2+RT*G'VYENJ(-HD*A$4$)!G:W'6B8OM M1?8F*:K[[QT[%5":%A7Q6'OED7?N.^?8>S"K=35P5%)HL@='IK8#)S&E3FRV M5FYB"O>Z0L6%,:CH+TVA^Q^/^Z6V/>YZ!#7GRB9+6.NJ'CC,%?<[]NY6#YR+ MR:?9R8<+0H9#&"U5N="7VL)P2*RIUBJ?UX?*+G-3NK9295UHV^5L[DT;3BG' MVV.!H)[?,)_*H$G8G#$EF9Y3+D-?DK;\PZ=E_QI%4,D#)H1D02-$Z'$R!N8R MQB50T:>RSP-@;$#%0(H>/BF%G5'A'8,>)1_A=3L8D00,9+=?!U#IPJPU?#X; MQ]^FIZ/]\63T/9Y=3N+1V>ST"NUPG9H-V*6&Q%0:HV61Y#F_2K%1Y?O<6Y@:=E(745)TW.L)M9:Q)3(Y!4U5D>:;K?&0F6TL<#[JLT1N$F MCR<3>2%.)A)^$X@@O:9*:3\(H]#W=J-@9[ MQ"05G#<4(T8=[)]:/H_^EQ7Z M!Q+L+E0(Q@+*>-@(R?VHXP(2X D3./\[$R3TN/Q/A=>C0@>:,^A5FVXALL]_ MP\\+V#&.0F#XP1.!#PS?/-X*Q@,/Y?2G=!P'XR?I(E8KK#&IM+(ZSDKL(E6) MKF$(..3WZ(?PZ_S]*.K\MQ+]G05V!V9E6ZN ^9UV*Y\J!07>2AF")%/./=D: CN=U1.L[P\<'L/_QFDJ5.;NI5,?2BB&J=2O(#7'#HQ,$& From acme@conectiva.com.br Sun Apr 27 08:18:03 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 27 Apr 2003 08:18:09 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3RFI0Fu011669 for ; Sun, 27 Apr 2003 08:18:02 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 199o0e-0000Pv-00; Sun, 27 Apr 2003 12:24:08 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id A8F111966C; Sun, 27 Apr 2003 15:18:26 +0000 (UTC) Date: Sun, 27 Apr 2003 12:18:25 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] llc: remove MOD_{INC,DEC}_USE_COUNT Message-ID: <20030427151825.GD15637@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2316 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 3284 Lines: 126 Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 Now there are three outstanding changesets in this tree. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1125, 2003-04-27 12:04:25-03:00, acme@conectiva.com.br o llc: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. llc_if.c | 9 ++------- llc_main.c | 6 +----- 2 files changed, 3 insertions(+), 12 deletions(-) diff -Nru a/net/llc/llc_if.c b/net/llc/llc_if.c --- a/net/llc/llc_if.c Sun Apr 27 12:14:09 2003 +++ b/net/llc/llc_if.c Sun Apr 27 12:14:09 2003 @@ -43,16 +43,15 @@ /* verify this SAP is not already open; if so, return error */ struct llc_sap *sap; - MOD_INC_USE_COUNT; sap = llc_sap_find(lsap); if (sap) { /* SAP already exists */ sap = NULL; - goto err; + goto out; } /* sap requested does not yet exist */ sap = llc_sap_alloc(); if (!sap) - goto err; + goto out; /* allocated a SAP; initialize it and clear out its memory pool */ sap->laddr.lsap = lsap; sap->rcv_func = func; @@ -61,9 +60,6 @@ llc_sap_save(sap); out: return sap; -err: - MOD_DEC_USE_COUNT; - goto out; } /** @@ -76,7 +72,6 @@ void llc_sap_close(struct llc_sap *sap) { llc_free_sap(sap); - MOD_DEC_USE_COUNT; } /** diff -Nru a/net/llc/llc_main.c b/net/llc/llc_main.c --- a/net/llc/llc_main.c Sun Apr 27 12:14:09 2003 +++ b/net/llc/llc_main.c Sun Apr 27 12:14:09 2003 @@ -224,9 +224,8 @@ { struct sock *sk = sk_alloc(family, priority, 1, NULL); - MOD_INC_USE_COUNT; if (!sk) - goto decmod; + goto out; if (llc_sk_init(sk)) goto outsk; sock_init_data(NULL, sk); @@ -240,8 +239,6 @@ outsk: sk_free(sk); sk = NULL; -decmod: - MOD_DEC_USE_COUNT; goto out; } @@ -279,7 +276,6 @@ } #endif sock_put(sk); - MOD_DEC_USE_COUNT; } /** =================================================================== This BitKeeper patch contains the following changesets: 1.1125 ## Wrapped with gzip_uu ## M'XL( ,'SJSX ^U674_;,!1]KG_%E7C9-)KZ,PF=BA@M&A4,$-#GRCA.FY'$ M*'%;L67_?4ZBL5'81E$?R8$V4')J4N^AVI,HUVX-B4MM]1)M?* M)DOI*9-Y-X4;N#3&#?3F)M.]PY->KFV7>@*YD0MIU1R6NBC['>*QAXB]O]/] MSN71Y\GIITN$!@,8SF4^TU?:PF" K"F6,HW* VGGJ&8<58Q%HH0C8!X MA% !F/4P[]$ ".UCWJ>BBUD?8W@6%3Y0Z&)T"-O=P1 I,)"FJ@^%SLQ2PY?S MT?3[^&RX.SH:_IA.KHZFP_/)V;6;YYXSLP([UZ!,H<%58V6*VR2?09+'A2QM ML5!VX49629K"NSC)99K>OX?(N$720FR*9K5;Z+#N"F.-,BG$,DO21)>[D-@2 MOBY*"Q(R::TNP,10:FOK'/7*[KY9Y2X<)SJ-7-8ZZ* */4M*-UU'T)*H4TR; M!-,&_=X=&UP?CZ^F;GN3TR,/G0#CF!!T\5L?J+OAA1"6&.T_7[#*4>BY@ZW? M:2:3W%-M300CF#%!><4HIZ0BD8QIC"-!@PA'FFX$U\I+8$YP)3@.Q8OH)/$S M9,A>&%8J(M'-C8I\PC!3A&T ]B<5%O* -.Y;GUF;<)L$-P$C& O:M!5WQ<>- M%2E>-R+!_S5B\&;$+1JQ$(^$#02V+7CINUT9HX) MF(7]Z.*BB8OUN,^!H5&P!T\%W/KN91+>Q/)H*?.H<$4_6"I/+1?64]_^!D8( M"2GEC+%*[#'JMR+V-Q4Q@:YX$_'V1-Q^?/\AXK:$KY$QK8M:=[4DQVWW2+%. A#4!=%]):L[_^A-1; Sun, 27 Apr 2003 08:45:58 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 199oRh-0000Ti-00; Sun, 27 Apr 2003 12:52:06 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 0A1BB1966C; Sun, 27 Apr 2003 15:46:24 +0000 (UTC) Date: Sun, 27 Apr 2003 12:46:24 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] af_llc: initialize ->owner in llc_ui_family_ops Message-ID: <20030427154624.GG15637@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2317 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 1956 Lines: 62 Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 Now there are four outstanding changesets in this tree. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1126, 2003-04-27 12:33:16-03:00, acme@conectiva.com.br o af_llc: initialize ->owner in llc_ui_family_ops The previous changeset for llc was enough when the BSD sockets interface for AF_LLC was not selected, but this changeset is needed when it is selected. af_llc.c | 1 + 1 files changed, 1 insertion(+) diff -Nru a/net/llc/af_llc.c b/net/llc/af_llc.c --- a/net/llc/af_llc.c Sun Apr 27 12:35:25 2003 +++ b/net/llc/af_llc.c Sun Apr 27 12:35:25 2003 @@ -1013,6 +1013,7 @@ static struct net_proto_family llc_ui_family_ops = { .family = PF_LLC, .create = llc_ui_create, + .owner = THIS_MODULE, }; static struct proto_ops llc_ui_ops = { =================================================================== This BitKeeper patch contains the following changesets: 1.1126 ## Wrapped with gzip_uu ## M'XL( +WXJSX ^V4;6^;,!#'7\>?XJ2^7$/\@"%!2I4^;:V:J572OD:.N114 M@BOL)&K%AY\A6[MUD:9->3DP2/A\_[OS_? 1/%BLDY[2*R1'<&6L2WK:5*A= ML5&!-JM@47O#S!AO&.1FA8.SFT&%KL\#2;SE3CF=PP9KF_18(-YFW,LS)KW9 MY9>'Z>F,D/$8SG-5/>(<'8S'Q)EZH\K,3I3+2U,%KE:57:'K8C9O2QM.*?>W M9+&@,FI81,.XT2QC3(4,,\K#8122-OW)Q[1_51$TY#&3_BT;$5+&R 6P@#$> M 14#&@YX#(PG0B0LZE.14 I[5>$3@SXE9W#8"LZ)!@-JF9:E3J"H"E>HLGA% MZ)^8;86UGP)O2M=%NE2KHGQ)S;/U/G[>=6&0<62U\_9L>P M6#OO7/PUH/(H# M7V;[I&U)@=[MN!2,"B%YV @11[[GPU',N6;A4"Y&B/@'N5TG=F+?T1&"\D;2 M*.(=SA]7ME0?-D6RT'4YJ3'+E>N@VI^&.ZOKN?IU]N+A^GE\?MYJW/4 43W:]&F<>&C7T_\; Sun, 27 Apr 2003 09:10:31 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 199opR-0000VN-00; Sun, 27 Apr 2003 13:16:38 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 26A571966C; Sun, 27 Apr 2003 16:10:56 +0000 (UTC) Date: Sun, 27 Apr 2003 13:10:56 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] appletalk: remove MOD_{INC,DEC}_USE_COUNT Message-ID: <20030427161056.GI15637@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2318 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 4560 Lines: 156 Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 Now there are five outstanding changesets in this tree. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1127, 2003-04-27 12:59:15-03:00, acme@conectiva.com.br o appletalk: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ddp.c | 29 +++++++++-------------------- 1 files changed, 9 insertions(+), 20 deletions(-) diff -Nru a/net/appletalk/ddp.c b/net/appletalk/ddp.c --- a/net/appletalk/ddp.c Sun Apr 27 13:04:11 2003 +++ b/net/appletalk/ddp.c Sun Apr 27 13:04:11 2003 @@ -190,10 +190,9 @@ struct sock *sk = (struct sock *)data; if (!atomic_read(&sk->wmem_alloc) && - !atomic_read(&sk->rmem_alloc) && test_bit(SOCK_DEAD, &sk->flags)) { + !atomic_read(&sk->rmem_alloc) && test_bit(SOCK_DEAD, &sk->flags)) sock_put(sk); - MOD_DEC_USE_COUNT; - } else { + else { sk->timer.expires = jiffies + SOCK_DESTROY_TIME; add_timer(&sk->timer); } @@ -205,10 +204,9 @@ skb_queue_purge(&sk->receive_queue); if (!atomic_read(&sk->wmem_alloc) && - !atomic_read(&sk->rmem_alloc) && test_bit(SOCK_DEAD, &sk->flags)) { + !atomic_read(&sk->rmem_alloc) && test_bit(SOCK_DEAD, &sk->flags)) sock_put(sk); - MOD_DEC_USE_COUNT; - } else { + else { init_timer(&sk->timer); sk->timer.expires = jiffies + SOCK_DESTROY_TIME; sk->timer.function = atalk_destroy_timer; @@ -249,7 +247,6 @@ *iface = tmp->next; kfree(tmp); dev->atalk_ptr = NULL; - MOD_DEC_USE_COUNT; } else iface = &tmp->next; } @@ -259,13 +256,10 @@ static struct atalk_iface *atif_add_device(struct net_device *dev, struct atalk_addr *sa) { - struct atalk_iface *iface; - - MOD_INC_USE_COUNT; + struct atalk_iface *iface = kmalloc(sizeof(*iface), GFP_KERNEL); - iface = kmalloc(sizeof(*iface), GFP_KERNEL); if (!iface) - goto out_mem; + goto out; iface->dev = dev; dev->atalk_ptr = iface; @@ -278,9 +272,6 @@ write_unlock_bh(&atalk_interfaces_lock); out: return iface; -out_mem: - MOD_DEC_USE_COUNT; - goto out; } /* Perform phase 2 AARP probing on our tentative address */ @@ -982,17 +973,16 @@ struct atalk_sock *at; int rc = -ESOCKTNOSUPPORT; - MOD_INC_USE_COUNT; /* * We permit SOCK_DGRAM and RAW is an extension. It is trivial to do * and gives you the full ELAP frame. Should be handy for CAP 8) */ if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) - goto decmod; + goto out; rc = -ENOMEM; sk = sk_alloc(PF_APPLETALK, GFP_KERNEL, 1, NULL); if (!sk) - goto decmod; + goto out; at = at_sk(sk) = kmalloc(sizeof(*at), GFP_KERNEL); if (!at) goto outsk; @@ -1005,8 +995,6 @@ return rc; outsk: sk_free(sk); -decmod: - MOD_DEC_USE_COUNT; goto out; } @@ -1785,6 +1773,7 @@ static struct net_proto_family atalk_family_ops = { .family = PF_APPLETALK, .create = atalk_create, + .owner = THIS_MODULE, }; static struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = { =================================================================== This BitKeeper patch contains the following changesets: 1.1127 ## Wrapped with gzip_uu ## M'XL( 'O_JSX ^U5;6^;.A3^C'_%N9I4)7<)L0%#R%6J;B';JO:V5;M\1JXQ M"3> (^,TZAWWOU\;IFZMNDV;^G& =,#/\?,>PV+!Z+6Z$AOD<::GN6)DU)TQO2EF[6K&ZJ83N--L' MU];#V#,W)9&/:=B2$ =1RTE&" N(R+ 73,, V?!/GH;]F,7'@1<1ZOLD;/V M1@0E0%Q"O BP/\'!Q+P0;T;C&:%C[,\PAF=9X36!,49OX65/L$ <)+#=KC0, MY78&2E3R3L#?ETGZZ?1B,4J6B__2U0U'GBC5:[;G>&^10E"4,\J)F97D_A$R:34Q#+E6WVVPT7#LEM>2RA)Q5 M15F(9@2%;N"??:.!0<6T%@ID#HW0VFK8G>-C>:C-?#QP^E-:HZW.E^ZZ Q\2@**KKYT"1K_Y(409A@=_Z P M)I3)0YHG6;9S^=K:\OEB>#_^R?&%/VQ^D,XZS-L4#N=?684J, M8!)/J?6+8QO4:6\>^<4Q[1'Z%"'8I,?F+II&%G.[-G*<^==-,?KRW^4;P;?- 2OIJ'TSCV!8O0_U5H>BW2!P From acme@conectiva.com.br Sun Apr 27 19:15:07 2003 Received: with ECARTIS (v1.0.0; list netdev); Sun, 27 Apr 2003 19:15:20 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3S2EuFu023456 for ; Sun, 27 Apr 2003 19:15:03 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 199yGJ-0000zE-00; Sun, 27 Apr 2003 23:21:01 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id AE29F1966C; Mon, 28 Apr 2003 02:15:16 +0000 (UTC) Date: Sun, 27 Apr 2003 23:15:15 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] af_unix: remove MOD_{INC,DEC}_USE_COUNT Message-ID: <20030428021515.GC17730@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2319 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 3622 Lines: 119 Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 Now there are just this outstanding changeset in this tree. Tested with af_unix as a module. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1129, 2003-04-27 23:06:26-03:00, acme@conectiva.com.br o af_unix: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. af_unix.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff -Nru a/net/unix/af_unix.c b/net/unix/af_unix.c --- a/net/unix/af_unix.c Sun Apr 27 23:09:01 2003 +++ b/net/unix/af_unix.c Sun Apr 27 23:09:01 2003 @@ -47,6 +47,9 @@ * Alexey Kuznetsov : Full scale SMP. Lot of bugs are introduced 8) * Malcolm Beattie : Set peercred for socketpair * Michal Ostrowski : Module initialization cleanup. + * Arnaldo C. Melo : Remove MOD_{INC,DEC}_USE_COUNT, + * the core infrastructure is doing that + * for all net proto families now (2.5.69+) * * * Known differences from reference BSD that was tested: @@ -360,7 +363,6 @@ #ifdef UNIX_REFCNT_DEBUG printk(KERN_DEBUG "UNIX %p is destroyed, %d are still alive.\n", sk, atomic_read(&unix_nr_socks)); #endif - MOD_DEC_USE_COUNT; } static int unix_release_sock (unix_socket *sk, int embrion) @@ -478,19 +480,16 @@ static struct sock * unix_create1(struct socket *sock) { - struct sock *sk; + struct sock *sk = NULL; struct unix_sock *u; if (atomic_read(&unix_nr_socks) >= 2*files_stat.max_files) - return NULL; + goto out; - MOD_INC_USE_COUNT; sk = sk_alloc(PF_UNIX, GFP_KERNEL, sizeof(struct unix_sock), unix_sk_cachep); - if (!sk) { - MOD_DEC_USE_COUNT; - return NULL; - } + if (!sk) + goto out; atomic_inc(&unix_nr_socks); @@ -509,7 +508,7 @@ init_MUTEX(&u->readsem); /* single task reading lock */ init_waitqueue_head(&u->peer_wait); unix_insert_socket(&unix_sockets_unbound, sk); - +out: return sk; } @@ -1928,6 +1927,7 @@ struct net_proto_family unix_family_ops = { .family = PF_UNIX, .create = unix_create, + .owner = THIS_MODULE, }; #ifdef CONFIG_SYSCTL =================================================================== This BitKeeper patch contains the following changesets: 1.1129 ## Wrapped with gzip_uu ## M'XL( #V-K#X ^U5VV[:0!!]]G[%5'G)!T<:LP<7V M5O8"C>K^>V=-1"[-18WRV,72HIV9,[-GYM@[,"Y%$1H\R@39@5-9JM"(9"XB ME:RX&7Q'2Z4!WSO.9N!8*.AVB9+'BZ;0\XFJ>RMQ4!<_+3*@Z9[5UK2Q* M+?RYS+>IZU7,HXY?16S*&'>8F%++:7L.T>4?/2_[*8I-'I-?@U&WT>MW?T_&U_U)]V(\ND%??$9R#6HN()*% .S(6A:+))]! MDL<%+U6QC-02+>LD36$W3G*>IG=[,)48Q!7$LJBC,1"Q?A12R4BF$/,L21-1 M-B!1)7Q?E@HX9%PI48",H11*Z1PZLGDHUSD>QXE(IYA5'R)4(69)B>YB"ILB M=(I)G6!2H]\A=7!S.KB>X/7&P[Y)SD!W)""7#S-"FO^X"*&AQ?P+7KRAM,ZOBW/68'T=V'+O<%N[+L_ *G!ZU-D)ZS*WLMN.TZ_'_ MV_=]'7RTW%<$\6JYU&8. @65%:!(:F4X]+DNF/NV+@)H!O]U\#K]J-W?CIC?#F&EDN52UQ:]Q @J.OKP-%C&2&':_E(N]IZXN MLS3(9L.CD Q88%.-:-:M-3J/^]1X^ Q&; Sun, 27 Apr 2003 20:07:22 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id TAA23622; Sun, 27 Apr 2003 19:01:21 -0700 Date: Sun, 27 Apr 2003 19:01:21 -0700 (PDT) Message-Id: <20030427.190121.42779151.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCH] af_unix: remove MOD_{INC,DEC}_USE_COUNT From: "David S. Miller" In-Reply-To: <20030428021515.GC17730@conectiva.com.br> References: <20030428021515.GC17730@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2320 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 265 Lines: 10 From: Arnaldo Carvalho de Melo Date: Sun, 27 Apr 2003 23:15:15 -0300 bk://kernel.bkbits.net/acme/net-2.5 Now there are just this outstanding changeset in this tree. Tested with af_unix as a module. Pulled, thanks. From acme@conectiva.com.br Mon Apr 28 08:06:01 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 08:06:09 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3SF5tFu003599 for ; Mon, 28 Apr 2003 08:05:59 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19AAIT-0000YZ-00; Mon, 28 Apr 2003 12:12:02 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 2A6C71966C; Mon, 28 Apr 2003 15:06:30 +0000 (UTC) Date: Mon, 28 Apr 2003 12:06:30 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCHES] modules: convert several net proto families Message-ID: <20030428150629.GC19677@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2321 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Content-Length: 14323 Lines: 581 Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 This one converts several net proto families to the new module infrastructure. I slipped by mistake a simple cleanup in net/core/dev.c, sorry, but it is trivial. - Arnaldo =================================================================== ChangeSet@1.1141, 2003-04-28 11:13:08-03:00, acme@conectiva.com.br o rose/rose_dev: use SET_MODULE_OWNER, removing calls to MOD_{INC,DEC}_USE_COUNT ChangeSet@1.1140, 2003-04-28 11:11:54-03:00, acme@conectiva.com.br o netrom/nr_dev: use SET_MODULE_OWNER, removing calls to MOD_{INC,DEC}_USE_COUNT ChangeSet@1.1139, 2003-04-28 11:10:11-03:00, acme@conectiva.com.br o af_x25: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1138, 2003-04-28 11:07:45-03:00, acme@conectiva.com.br o af_wanpipe: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1137, 2003-04-28 11:05:15-03:00, acme@conectiva.com.br o af_rose: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1136, 2003-04-28 11:01:16-03:00, acme@conectiva.com.br o af_packet: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1135, 2003-04-28 10:58:48-03:00, acme@conectiva.com.br o af_netrom: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1134, 2003-04-28 10:55:26-03:00, acme@conectiva.com.br o af_key: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1133, 2003-04-28 10:46:43-03:00, acme@conectiva.com.br o af_irda: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1132, 2003-04-28 10:39:41-03:00, acme@conectiva.com.br o af_econet: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ChangeSet@1.1131, 2003-04-28 10:37:20-03:00, acme@conectiva.com.br o af_ax25: remove MOD_{INC,DEC}_USE_COUNT Now the core networking infrastructure will (finally) do that for the net protocol families, its just a matter of setting the ->owner field in the registered struct net_proto_family to THIS_MODULE. ax25/af_ax25.c | 5 +---- core/dev.c | 2 +- econet/af_econet.c | 5 +---- irda/af_irda.c | 7 +------ key/af_key.c | 7 +------ netrom/af_netrom.c | 29 ++++++++++------------------- netrom/nr_dev.c | 3 +-- packet/af_packet.c | 4 +--- rose/af_rose.c | 28 ++++++++++------------------ rose/rose_dev.c | 3 +-- wanrouter/af_wanpipe.c | 9 +-------- x25/af_x25.c | 15 +++++---------- 12 files changed, 34 insertions(+), 83 deletions(-) diff -Nru a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c --- a/net/ax25/af_ax25.c Mon Apr 28 11:43:49 2003 +++ b/net/ax25/af_ax25.c Mon Apr 28 11:43:49 2003 @@ -68,8 +68,6 @@ } kfree(ax25); - - MOD_DEC_USE_COUNT; } static void ax25_free_sock(struct sock *sk) @@ -507,8 +505,6 @@ if ((ax25 = kmalloc(sizeof(*ax25), GFP_ATOMIC)) == NULL) return NULL; - MOD_INC_USE_COUNT; - memset(ax25, 0x00, sizeof(*ax25)); skb_queue_head_init(&ax25->write_queue); @@ -1912,6 +1908,7 @@ static struct net_proto_family ax25_family_ops = { .family = PF_AX25, .create = ax25_create, + .owner = THIS_MODULE, }; static struct proto_ops ax25_proto_ops = { diff -Nru a/net/core/dev.c b/net/core/dev.c --- a/net/core/dev.c Mon Apr 28 11:43:49 2003 +++ b/net/core/dev.c Mon Apr 28 11:43:49 2003 @@ -1434,7 +1434,7 @@ } #if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE) -int (*br_handle_frame_hook)(struct sk_buff *skb) = NULL; +int (*br_handle_frame_hook)(struct sk_buff *skb); static __inline__ int handle_bridge(struct sk_buff *skb, struct packet_type *pt_prev) diff -Nru a/net/econet/af_econet.c b/net/econet/af_econet.c --- a/net/econet/af_econet.c Mon Apr 28 11:43:49 2003 +++ b/net/econet/af_econet.c Mon Apr 28 11:43:49 2003 @@ -502,7 +502,6 @@ if (!atomic_read(&sk->wmem_alloc) && !atomic_read(&sk->rmem_alloc)) { sk_free(sk); - MOD_DEC_USE_COUNT; return; } @@ -547,7 +546,6 @@ } sk_free(sk); - MOD_DEC_USE_COUNT; return 0; } @@ -566,7 +564,6 @@ return -ESOCKTNOSUPPORT; sock->state = SS_UNCONNECTED; - MOD_INC_USE_COUNT; err = -ENOBUFS; sk = sk_alloc(PF_ECONET, GFP_KERNEL, 1, NULL); @@ -591,7 +588,6 @@ out_free: sk_free(sk); out: - MOD_DEC_USE_COUNT; return err; } @@ -693,6 +689,7 @@ static struct net_proto_family econet_family_ops = { .family = PF_ECONET, .create = econet_create, + .owner = THIS_MODULE, }; static struct proto_ops SOCKOPS_WRAPPED(econet_ops) = { diff -Nru a/net/irda/af_irda.c b/net/irda/af_irda.c --- a/net/irda/af_irda.c Mon Apr 28 11:43:49 2003 +++ b/net/irda/af_irda.c Mon Apr 28 11:43:49 2003 @@ -1132,9 +1132,6 @@ self->nslots = DISCOVERY_DEFAULT_SLOTS; self->daddr = DEV_ADDR_ANY; /* Until we get connected */ self->saddr = 0x0; /* so IrLMP assign us any link */ - - MOD_INC_USE_COUNT; - return 0; } @@ -1177,9 +1174,6 @@ } #endif /* CONFIG_IRDA_ULTRA */ kfree(self); - MOD_DEC_USE_COUNT; - - return; } /* @@ -2409,6 +2403,7 @@ static struct net_proto_family irda_family_ops = { .family = PF_IRDA, .create = irda_create, + .owner = THIS_MODULE, }; static struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = { diff -Nru a/net/key/af_key.c b/net/key/af_key.c --- a/net/key/af_key.c Mon Apr 28 11:43:49 2003 +++ b/net/key/af_key.c Mon Apr 28 11:43:49 2003 @@ -63,8 +63,6 @@ kfree(pfkey_sk(sk)); atomic_dec(&pfkey_socks_nr); - - MOD_DEC_USE_COUNT; } static void pfkey_table_grab(void) @@ -150,8 +148,6 @@ if (protocol != PF_KEY_V2) return -EPROTONOSUPPORT; - MOD_INC_USE_COUNT; - err = -ENOMEM; sk = sk_alloc(PF_KEY, GFP_KERNEL, 1, NULL); if (sk == NULL) @@ -176,9 +172,7 @@ pfkey_insert(sk); return 0; - out: - MOD_DEC_USE_COUNT; return err; } @@ -2792,6 +2786,7 @@ static struct net_proto_family pfkey_family_ops = { .family = PF_KEY, .create = pfkey_create, + .owner = THIS_MODULE, }; #ifdef CONFIG_PROC_FS diff -Nru a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c --- a/net/netrom/af_netrom.c Mon Apr 28 11:43:49 2003 +++ b/net/netrom/af_netrom.c Mon Apr 28 11:43:49 2003 @@ -62,34 +62,25 @@ static struct proto_ops nr_proto_ops; -static void nr_free_sock(struct sock *sk) -{ - sk_free(sk); - - MOD_DEC_USE_COUNT; -} - static struct sock *nr_alloc_sock(void) { - struct sock *sk; nr_cb *nr; + struct sock *sk = sk_alloc(PF_NETROM, GFP_ATOMIC, 1, NULL); - MOD_INC_USE_COUNT; - if ((sk = sk_alloc(PF_NETROM, GFP_ATOMIC, 1, NULL)) == NULL) - goto decmod; + if (!sk) + goto out; nr = nr_sk(sk) = kmalloc(sizeof(*nr), GFP_ATOMIC); if (!nr) goto frees; memset(nr, 0x00, sizeof(*nr)); - nr->sk = sk; - -out: return sk; -frees: sk_free(sk); +out: + return sk; +frees: + sk_free(sk); sk = NULL; -decmod: MOD_DEC_USE_COUNT; goto out; } @@ -300,9 +291,8 @@ sk->timer.function = nr_destroy_timer; sk->timer.data = (unsigned long)sk; add_timer(&sk->timer); - } else { - nr_free_sock(sk); - } + } else + sk_free(sk); } /* @@ -1232,6 +1222,7 @@ static struct net_proto_family nr_family_ops = { .family = PF_NETROM, .create = nr_create, + .owner = THIS_MODULE, }; static struct proto_ops nr_proto_ops = { diff -Nru a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c --- a/net/netrom/nr_dev.c Mon Apr 28 11:43:49 2003 +++ b/net/netrom/nr_dev.c Mon Apr 28 11:43:49 2003 @@ -170,7 +170,6 @@ static int nr_open(struct net_device *dev) { - MOD_INC_USE_COUNT; netif_start_queue(dev); ax25_listen_register((ax25_address *)dev->dev_addr, NULL); return 0; @@ -180,7 +179,6 @@ { netif_stop_queue(dev); ax25_listen_release((ax25_address *)dev->dev_addr, NULL); - MOD_DEC_USE_COUNT; return 0; } @@ -199,6 +197,7 @@ int nr_init(struct net_device *dev) { + SET_MODULE_OWNER(dev); dev->mtu = NR_MAX_PACKET_SIZE; dev->hard_start_xmit = nr_xmit; dev->open = nr_open; diff -Nru a/net/packet/af_packet.c b/net/packet/af_packet.c --- a/net/packet/af_packet.c Mon Apr 28 11:43:49 2003 +++ b/net/packet/af_packet.c Mon Apr 28 11:43:49 2003 @@ -209,7 +209,6 @@ #ifdef PACKET_REFCNT_DEBUG printk(KERN_DEBUG "PACKET socket %p is free, %d are alive\n", sk, atomic_read(&packet_socks_nr)); #endif - MOD_DEC_USE_COUNT; } @@ -939,7 +938,6 @@ return -ESOCKTNOSUPPORT; sock->state = SS_UNCONNECTED; - MOD_INC_USE_COUNT; err = -ENOBUFS; sk = sk_alloc(PF_PACKET, GFP_KERNEL, 1, NULL); @@ -992,7 +990,6 @@ out_free: sk_free(sk); out: - MOD_DEC_USE_COUNT; return err; } @@ -1752,6 +1749,7 @@ static struct net_proto_family packet_family_ops = { .family = PF_PACKET, .create = packet_create, + .owner = THIS_MODULE, }; static struct notifier_block packet_netdev_notifier = { diff -Nru a/net/rose/af_rose.c b/net/rose/af_rose.c --- a/net/rose/af_rose.c Mon Apr 28 11:43:49 2003 +++ b/net/rose/af_rose.c Mon Apr 28 11:43:49 2003 @@ -124,22 +124,13 @@ return 0; } -static void rose_free_sock(struct sock *sk) -{ - sk_free(sk); - - MOD_DEC_USE_COUNT; -} - static struct sock *rose_alloc_sock(void) { - struct sock *sk; rose_cb *rose; + struct sock *sk = sk_alloc(PF_ROSE, GFP_ATOMIC, 1, NULL); - MOD_INC_USE_COUNT; - - if ((sk = sk_alloc(PF_ROSE, GFP_ATOMIC, 1, NULL)) == NULL) - goto decmod; + if (!sk) + goto out; rose = rose_sk(sk) = kmalloc(sizeof(*rose), GFP_ATOMIC); if (!rose) @@ -147,10 +138,11 @@ memset(rose, 0x00, sizeof(*rose)); rose->sk = sk; -out: return sk; -frees: sk_free(sk); +out: + return sk; +frees: + sk_free(sk); sk = NULL; -decmod: MOD_DEC_USE_COUNT; goto out; } @@ -380,9 +372,8 @@ sk->timer.function = rose_destroy_timer; sk->timer.data = (unsigned long)sk; add_timer(&sk->timer); - } else { - rose_free_sock(sk); - } + } else + sk_free(sk); } /* @@ -1428,6 +1419,7 @@ static struct net_proto_family rose_family_ops = { .family = PF_ROSE, .create = rose_create, + .owner = THIS_MODULE, }; static struct proto_ops rose_proto_ops = { diff -Nru a/net/rose/rose_dev.c b/net/rose/rose_dev.c --- a/net/rose/rose_dev.c Mon Apr 28 11:43:49 2003 +++ b/net/rose/rose_dev.c Mon Apr 28 11:43:49 2003 @@ -135,7 +135,6 @@ static int rose_open(struct net_device *dev) { - MOD_INC_USE_COUNT; netif_start_queue(dev); rose_add_loopback_node((rose_address *)dev->dev_addr); return 0; @@ -145,7 +144,6 @@ { netif_stop_queue(dev); rose_del_loopback_node((rose_address *)dev->dev_addr); - MOD_DEC_USE_COUNT; return 0; } @@ -169,6 +167,7 @@ int rose_init(struct net_device *dev) { + SET_MODULE_OWNER(dev); dev->mtu = ROSE_MAX_PACKET_SIZE - 2; dev->hard_start_xmit = rose_xmit; dev->open = rose_open; diff -Nru a/net/wanrouter/af_wanpipe.c b/net/wanrouter/af_wanpipe.c --- a/net/wanrouter/af_wanpipe.c Mon Apr 28 11:43:49 2003 +++ b/net/wanrouter/af_wanpipe.c Mon Apr 28 11:43:49 2003 @@ -509,8 +509,6 @@ wan_opt->tx_timer.data = (unsigned long)sk; wan_opt->tx_timer.function = wanpipe_delayed_transmit; - MOD_INC_USE_COUNT; - sock_init_data(NULL, sk); return sk; } @@ -846,7 +844,6 @@ } sock_put(sk); atomic_dec(&wanpipe_socks_nr); - MOD_DEC_USE_COUNT; return; } @@ -1032,7 +1029,6 @@ } sock_put(sk); atomic_dec(&wanpipe_socks_nr); - MOD_DEC_USE_COUNT; return 0; } @@ -1197,7 +1193,6 @@ } sock_put(sk); atomic_dec(&wanpipe_socks_nr); - MOD_DEC_USE_COUNT; return; } @@ -1237,7 +1232,6 @@ } sock_put(sk); atomic_dec(&wanpipe_socks_nr); - MOD_DEC_USE_COUNT; return; } @@ -1262,8 +1256,6 @@ } sock_put(sk); atomic_dec(&wanpipe_socks_nr); - MOD_DEC_USE_COUNT; - return; } @@ -2579,6 +2571,7 @@ static struct net_proto_family wanpipe_family_ops = { .family = PF_WANPIPE, .create = wanpipe_create, + .owner = THIS_MODULE, }; struct notifier_block wanpipe_netdev_notifier = { diff -Nru a/net/x25/af_x25.c b/net/x25/af_x25.c --- a/net/x25/af_x25.c Mon Apr 28 11:43:49 2003 +++ b/net/x25/af_x25.c Mon Apr 28 11:43:49 2003 @@ -359,10 +359,8 @@ sk->timer.function = x25_destroy_timer; sk->timer.data = (unsigned long)sk; add_timer(&sk->timer); - } else { + } else sk_free(sk); - MOD_DEC_USE_COUNT; - } release_sock(sk); sock_put(sk); } @@ -442,13 +440,11 @@ static struct sock *x25_alloc_socket(void) { - struct sock *sk; struct x25_opt *x25; + struct sock *sk = sk_alloc(AF_X25, GFP_ATOMIC, 1, NULL); - MOD_INC_USE_COUNT; - - if ((sk = sk_alloc(AF_X25, GFP_ATOMIC, 1, NULL)) == NULL) - goto decmod; + if (!sk) + goto out; x25 = x25_sk(sk) = kmalloc(sizeof(*x25), GFP_ATOMIC); if (!x25) @@ -469,8 +465,6 @@ frees: sk_free(sk); sk = NULL; -decmod: - MOD_DEC_USE_COUNT; goto out; } @@ -1324,6 +1318,7 @@ struct net_proto_family x25_family_ops = { .family = AF_X25, .create = x25_create, + .owner = THIS_MODULE, }; static struct proto_ops SOCKOPS_WRAPPED(x25_proto_ops) = { From davem@redhat.com Mon Apr 28 08:47:30 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 08:47:34 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3SFlTFu004559 for ; Mon, 28 Apr 2003 08:47:30 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id HAA25300; Mon, 28 Apr 2003 07:41:16 -0700 Date: Mon, 28 Apr 2003 07:41:16 -0700 (PDT) Message-Id: <20030428.074116.35807782.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCHES] modules: convert several net proto families From: "David S. Miller" In-Reply-To: <20030428150629.GC19677@conectiva.com.br> References: <20030428150629.GC19677@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2323 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Content-Length: 393 Lines: 12 From: Arnaldo Carvalho de Melo Date: Mon, 28 Apr 2003 12:06:30 -0300 Please pull from: bk://kernel.bkbits.net/acme/net-2.5 This one converts several net proto families to the new module infrastructure. I slipped by mistake a simple cleanup in net/core/dev.c, sorry, but it is trivial. Pulled, thanks a lot for all of this work Arnaldo. From shemminger@osdl.org Mon Apr 28 13:46:41 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 13:46:49 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3SKkeFu007855 for ; Mon, 28 Apr 2003 13:46:41 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3SKkdW28332; Mon, 28 Apr 2003 13:46:39 -0700 Date: Mon, 28 Apr 2003 13:46:39 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH 2.5.68+] [BRIDGE] Inline and _rcu change. Message-Id: <20030428134639.0011347c.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2324 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 2944 Lines: 87 Two small changes: * Need _rcu on the list_for_each_entry in br_get_port because called in read path for some ioctl's * Move two small functions is_root_bridge and is_designated_port into inline's because they are so short. diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h Mon Apr 28 13:43:22 2003 +++ b/net/bridge/br_private.h Mon Apr 28 13:43:22 2003 @@ -116,6 +116,13 @@ extern struct notifier_block br_device_notifier; extern unsigned char bridge_ula[6]; +/* called under bridge lock */ +static inline int br_is_root_bridge(const struct net_bridge *br) +{ + return !memcmp(&br->bridge_id, &br->designated_root, 8); +} + + /* br_device.c */ extern void br_dev_setup(struct net_device *dev); extern int br_dev_xmit(struct sk_buff *skb, struct net_device *dev); @@ -182,7 +189,6 @@ extern void br_netfilter_fini(void); /* br_stp.c */ -extern int br_is_root_bridge(struct net_bridge *br); extern struct net_bridge_port *br_get_port(struct net_bridge *br, int port_no); extern void br_init_port(struct net_bridge_port *p); diff -Nru a/net/bridge/br_private_stp.h b/net/bridge/br_private_stp.h --- a/net/bridge/br_private_stp.h Mon Apr 28 13:43:22 2003 +++ b/net/bridge/br_private_stp.h Mon Apr 28 13:43:22 2003 @@ -32,12 +32,18 @@ int forward_delay; }; +/* called under bridge lock */ +static inline int br_is_designated_port(const struct net_bridge_port *p) +{ + return !memcmp(&p->designated_bridge, &p->br->bridge_id, 8) && + (p->designated_port == p->port_id); +} + + /* br_stp.c */ extern void br_become_root_bridge(struct net_bridge *br); extern void br_config_bpdu_generation(struct net_bridge *); extern void br_configuration_update(struct net_bridge *); -extern int br_is_designated_port(struct net_bridge_port *p); -extern int br_is_root_bridge(struct net_bridge *br); extern void br_port_state_selection(struct net_bridge *); extern void br_received_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *bpdu); extern void br_received_tcn_bpdu(struct net_bridge_port *p); diff -Nru a/net/bridge/br_stp.c b/net/bridge/br_stp.c --- a/net/bridge/br_stp.c Mon Apr 28 13:43:22 2003 +++ b/net/bridge/br_stp.c Mon Apr 28 13:43:22 2003 @@ -20,27 +20,12 @@ #include "br_private.h" #include "br_private_stp.h" - - -/* called under bridge lock */ -int br_is_root_bridge(struct net_bridge *br) -{ - return !memcmp(&br->bridge_id, &br->designated_root, 8); -} - -/* called under bridge lock */ -int br_is_designated_port(struct net_bridge_port *p) -{ - return !memcmp(&p->designated_bridge, &p->br->bridge_id, 8) && - (p->designated_port == p->port_id); -} - /* called under bridge lock */ struct net_bridge_port *br_get_port(struct net_bridge *br, int port_no) { struct net_bridge_port *p; - list_for_each_entry(p, &br->port_list, list) { + list_for_each_entry_rcu(p, &br->port_list, list) { if (p->port_no == port_no) return p; } From shemminger@osdl.org Mon Apr 28 13:48:55 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 13:48:59 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3SKmtFu008063 for ; Mon, 28 Apr 2003 13:48:55 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3SKmsW29280; Mon, 28 Apr 2003 13:48:54 -0700 Date: Mon, 28 Apr 2003 13:48:54 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH 2.5.68] [BRIDGE] More user hz conversions Message-Id: <20030428134854.21622b2b.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2325 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Content-Length: 3168 Lines: 84 Several more places need USER/KERNEL HZ conversion. Without these the timer values in 'brctl showmacs' and 'brctl showstp' are off. diff -Nru a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c --- a/net/bridge/br_fdb.c Mon Apr 28 13:42:51 2003 +++ b/net/bridge/br_fdb.c Mon Apr 28 13:42:51 2003 @@ -41,15 +41,15 @@ return 0; } -static __inline__ void copy_fdb(struct __fdb_entry *ent, struct net_bridge_fdb_entry *f) +static __inline__ void copy_fdb(struct __fdb_entry *ent, + const struct net_bridge_fdb_entry *f) { memset(ent, 0, sizeof(struct __fdb_entry)); memcpy(ent->mac_addr, f->addr.addr, ETH_ALEN); ent->port_no = f->dst?f->dst->port_no:0; ent->is_local = f->is_local; - ent->ageing_timer_value = 0; - if (!f->is_static) - ent->ageing_timer_value = jiffies - f->ageing_timer; + ent->ageing_timer_value = f->is_static ? 0 + : ((jiffies - f->ageing_timer) * USER_HZ) / HZ; } static __inline__ int br_mac_hash(unsigned char *mac) diff -Nru a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c --- a/net/bridge/br_ioctl.c Mon Apr 28 13:43:08 2003 +++ b/net/bridge/br_ioctl.c Mon Apr 28 13:43:08 2003 @@ -19,19 +19,22 @@ #include #include "br_private.h" +/* import values in USER_HZ */ +static inline unsigned long user_to_ticks(unsigned long utick) +{ + return (utick * HZ) / USER_HZ; +} -/* Report time remaining in user HZ for compatibility. */ -static inline unsigned long timer_residue(const struct br_timer *timer) +/* export values in USER_HZ */ +static inline unsigned long ticks_to_user(unsigned long tick) { - return timer->running - ? ((jiffies - timer->expires) * USER_HZ)/HZ - : 0; + return (tick * USER_HZ) / HZ; } -/* Convert API times in USER_HZ to kernel */ -static inline unsigned long user_to_ticks(unsigned long utick) +/* Report time remaining in user HZ */ +static unsigned long timer_residue(const struct br_timer *timer) { - return (utick * HZ) / USER_HZ; + return ticks_to_user(timer->running ? (jiffies - timer->expires) : 0); } static int br_ioctl_device(struct net_bridge *br, @@ -73,18 +76,18 @@ memcpy(&b.designated_root, &br->designated_root, 8); memcpy(&b.bridge_id, &br->bridge_id, 8); b.root_path_cost = br->root_path_cost; - b.max_age = br->max_age; - b.hello_time = br->hello_time; + b.max_age = ticks_to_user(br->max_age); + b.hello_time = ticks_to_user(br->hello_time); b.forward_delay = br->forward_delay; b.bridge_max_age = br->bridge_max_age; b.bridge_hello_time = br->bridge_hello_time; - b.bridge_forward_delay = br->bridge_forward_delay; + b.bridge_forward_delay = ticks_to_user(br->bridge_forward_delay); b.topology_change = br->topology_change; b.topology_change_detected = br->topology_change_detected; b.root_port = br->root_port; b.stp_enabled = br->stp_enabled; - b.ageing_time = br->ageing_time; - b.gc_interval = br->gc_interval; + b.ageing_time = ticks_to_user(br->ageing_time); + b.gc_interval = ticks_to_user(br->gc_interval); b.hello_timer_value = timer_residue(&br->hello_timer); b.tcn_timer_value = timer_residue(&br->tcn_timer); b.topology_change_timer_value = timer_residue(&br->topology_change_timer); From maxk@qualcomm.com Mon Apr 28 14:10:34 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 14:10:37 -0700 (PDT) Received: from ithilien.qualcomm.com (ithilien.qualcomm.com [129.46.51.59]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3SLAXFu008620 for ; Mon, 28 Apr 2003 14:10:34 -0700 Received: from sabrina.qualcomm.com (sabrina.qualcomm.com [129.46.61.150]) by ithilien.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3SLAEJo024247; Mon, 28 Apr 2003 14:10:14 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by sabrina.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3SLACtf019940; Mon, 28 Apr 2003 14:10:12 -0700 (PDT) Message-Id: <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Mon, 28 Apr 2003 14:10:11 -0700 To: Arnaldo Carvalho de Melo From: Max Krasnyansky Subject: Re: New module infrastructure for net_proto_family Cc: netdev@oss.sgi.com In-Reply-To: <5.1.0.14.2.20030424170208.102ee6c8@unixmail.qualcomm.com> References: <20030424230202.GB2931@conectiva.com.br> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2326 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev Content-Length: 3319 Lines: 120 Hi Arnaldo, Hmm, no comments on my last email (http://marc.theaimsgroup.com/?l=linux-netdev&m=105123134301565&w=2) Are you trying to ignore me too ? ;-) Anyway, here is another idea. How about this (untested, uncompiled, just rfc). --- 1.14/include/linux/net.h Tue Apr 22 22:48:58 2003 +++ edited/include/linux/net.h Mon Apr 28 13:59:16 2003 @@ -81,6 +81,7 @@ struct sock *sk; wait_queue_head_t wait; short type; + short protocol; unsigned char passcred; }; @@ -132,6 +133,10 @@ struct net_proto_family { int family; int (*create)(struct socket *sock, int protocol); + + int (*get)(int protocol); + void (*put)(int protocol); + /* These are counters for the number of different methods of each we support */ short authentication; @@ -140,8 +145,8 @@ struct module *owner; }; -extern int net_family_get(int family); -extern void net_family_put(int family); +extern int net_family_get(int family, int protocol); +extern void net_family_put(int family, int protocol); struct iovec; --- 1.53/net/socket.c Tue Apr 22 23:13:31 2003 +++ edited/net/socket.c Mon Apr 28 13:55:30 2003 @@ -147,27 +147,31 @@ BUG(); } -int net_family_get(int family) +int net_family_get(int family, int protocol) { struct net_proto_family *prot = net_families[family]; int rc = 1; barrier(); - if (likely(prot != NULL)) + if (likely(prot != NULL)) { rc = try_module_get(prot->owner); - else + if (!rc && prot->get && (rc = prot->get(protocol)) != 0) + module_put(prot->owner); + } else net_family_bug(family); return rc; } -void net_family_put(int family) +void net_family_put(int family, int protocol) { struct net_proto_family *prot = net_families[family]; barrier(); - if (likely(prot != NULL)) + if (likely(prot != NULL)) { module_put(prot->owner); - else + if (prot->put) + prot->put(protocol); + } else net_family_bug(family); } @@ -539,7 +543,7 @@ sock->ops->release(sock); sock->ops = NULL; - net_family_put(family); + net_family_put(family, sock->protocol); } if (sock->fasync_list) @@ -1089,10 +1093,11 @@ goto out; } - sock->type = type; + sock->type = type; + sock->protocol = protocol; i = -EBUSY; - if (!net_family_get(family)) + if (!net_family_get(family, protocol)) goto out_release; if ((i = net_families[family]->create(sock, protocol)) < 0) @@ -1910,6 +1915,7 @@ net_families[ops->family]=ops; err = 0; } + net_family_write_unlock(); return err; } ----- So families that handle protos in separate modules would have their own family->put/get() methods that net core calls. I still think that sock->owner is a better (more flexible) solution though. Max From jgarzik@pobox.com Mon Apr 28 15:49:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 15:49:33 -0700 (PDT) Received: from www.linux.org.uk (parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3SMnMFu009836 for ; Mon, 28 Apr 2003 15:49:23 -0700 Received: from rdu57-8-131.nc.rr.com ([66.57.8.131] helo=pobox.com) by www.linux.org.uk with esmtp (Exim 4.14) id 19AHR2-0003Pg-LC; Mon, 28 Apr 2003 23:49:20 +0100 Message-ID: <3EADAFE5.2000504@pobox.com> Date: Mon, 28 Apr 2003 18:49:09 -0400 From: Jeff Garzik Organization: none User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021213 Debian/1.2.1-2.bunk X-Accept-Language: en MIME-Version: 1.0 To: LKML CC: Linus Torvalds , netdev@oss.sgi.com Subject: [BK+PATCHES] net drivers Content-Type: multipart/mixed; boundary="------------020906060704070900050001" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2327 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Content-Length: 6796 Lines: 168 This is a multi-part message in MIME format. --------------020906060704070900050001 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit By popular demand, and something I should have done a while ago, GNU patches are being generated for net driver goings-on now. This is mostly of interest to people who want to see the new 10gige driver now now now :) ftp://ftp.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.5/2.5.68-bk8-netdrvr1.bz2 --------------020906060704070900050001 Content-Type: text/plain; name="net-drivers-2.5.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="net-drivers-2.5.txt" bk pull bk://kernel.bkbits.net/jgarzik/net-drivers-2.5 This will update the following files: Documentation/networking/ixgb.txt | 226 ++ MAINTAINERS | 7 drivers/net/3c523.c | 12 drivers/net/3c527.c | 8 drivers/net/68360enet.c | 8 drivers/net/7990.c | 6 drivers/net/8139cp.c | 7 drivers/net/Kconfig | 48 drivers/net/Makefile | 1 drivers/net/a2065.c | 7 drivers/net/am79c961a.c | 19 drivers/net/appletalk/cops.c | 6 drivers/net/appletalk/ltpc.c | 7 drivers/net/ariadne.c | 25 drivers/net/atarilance.c | 9 drivers/net/au1000_eth.c | 7 drivers/net/bagetlance.c | 10 drivers/net/declance.c | 4 drivers/net/e1000/e1000.h | 2 drivers/net/e1000/e1000_main.c | 12 drivers/net/eth16i.c | 10 drivers/net/ewrk3.c | 5 drivers/net/gt96100eth.c | 14 drivers/net/hamradio/baycom_ser_fdx.c | 7 drivers/net/hamradio/baycom_ser_hdx.c | 7 drivers/net/hamradio/dmascc.c | 5 drivers/net/hamradio/yam.c | 3 drivers/net/ibmlana.c | 5 drivers/net/ioc3-eth.c | 3 drivers/net/isa-skeleton.c | 11 drivers/net/ixgb/Makefile | 35 drivers/net/ixgb/ixgb.h | 331 ++- drivers/net/ixgb/ixgb_ee.c | 1521 ++++++++++++----- drivers/net/ixgb/ixgb_ee.h | 212 +- drivers/net/ixgb/ixgb_ethtool.c | 1405 +++++++++++---- drivers/net/ixgb/ixgb_hw.c | 2583 ++++++++++++++++++++--------- drivers/net/ixgb/ixgb_hw.h | 1387 +++++++++++---- drivers/net/ixgb/ixgb_ids.h | 52 drivers/net/ixgb/ixgb_main.c | 2992 ++++++++++++++++++++++++++++++---- drivers/net/ixgb/ixgb_osdep.h | 104 + drivers/net/ixgb/ixgb_param.c | 598 ++++++ drivers/net/lasi_82596.c | 10 drivers/net/mac89x0.c | 8 drivers/net/pci-skeleton.c | 7 drivers/net/pcmcia/3c574_cs.c | 52 drivers/net/pcmcia/3c589_cs.c | 34 drivers/net/pcmcia/axnet_cs.c | 27 drivers/net/pcmcia/com20020_cs.c | 29 drivers/net/pcmcia/fmvj18x_cs.c | 27 drivers/net/pcmcia/ibmtr_cs.c | 27 drivers/net/pcmcia/nmclan_cs.c | 30 drivers/net/pcmcia/smc91c92_cs.c | 28 drivers/net/pcmcia/xirc2ps_cs.c | 39 drivers/net/rrunner.c | 5 drivers/net/rrunner.h | 5 drivers/net/saa9730.c | 4 drivers/net/sb1000.c | 10 drivers/net/sb1250-mac.c | 12 drivers/net/sgiseeq.c | 3 drivers/net/sk_g16.c | 5 drivers/net/sk_mca.c | 5 drivers/net/skfp/skfddi.c | 12 drivers/net/sonic.c | 5 drivers/net/sonic.h | 2 drivers/net/sun3_82586.c | 7 drivers/net/tc35815.c | 10 drivers/net/tokenring/3c359.c | 15 drivers/net/tokenring/ibmtr.c | 13 drivers/net/tokenring/madgemc.c | 12 drivers/net/tokenring/olympic.c | 13 drivers/net/tokenring/smctr.c | 12 drivers/net/wan/comx-hw-comx.c | 7 drivers/net/wan/comx-hw-mixcom.c | 6 drivers/net/wan/comx-hw-munich.c | 4 drivers/net/wan/cosa.c | 5 drivers/net/wan/cycx_main.c | 7 drivers/net/wan/dscc4.c | 11 drivers/net/wan/farsync.c | 3 drivers/net/wan/pc300_drv.c | 9 drivers/net/wan/sbni.c | 5 drivers/net/wan/sdla.c | 7 drivers/net/wan/sdlamain.c | 21 drivers/pci/pci.ids | 3 83 files changed, 9449 insertions(+), 2828 deletions(-) through these ChangeSets: (03/04/28 1.1122.1.19) [netdrvr ixgb] more cleanups - support new 2.5 irqreturn_t - s/usec_delay/udelay/ - remove two stored-but-never-used members of struct ixgb_hw - read PCI vendor/device ids from struct pci_dev, not h/w - remove some unused wrappers from ixgb_osdep.h (03/04/28 1.1122.1.18) [netdrvr ixgb] use standard kernel u8/u16/u32 types (03/04/28 1.1122.1.17) [netdrvr ixgb] Lindent, then fix up obvious indent uglies by hand (03/04/28 1.1122.1.16) [netdrvr ixgb] add new driver for Intel's 10 gig ethernet (03/04/27 1.1122.1.15) [netdrvr e1000] add a bit of source cross-version compat * Wrap TSO support with NETIF_F_TSO to keep same driver source between 2.4 and 2.5. (03/04/27 1.1122.1.14) [netdrvr e1000] mark e1000 NAPI feature not-experimental (03/04/27 1.1122.2.4) net driver cleanup, volume 7 100% irqreturn_t cleanups Affected drivers: 3c523, 527, 68360enet, 7990, a2065, am79c961a, appletalk/{ltpc,cops}, ariadne, {lotsa}lance, au1000_eth, eth16i, ewrk3, gt96100eth, hamradio/several, ibmlana, ioc3-eth, *-skeleton, lasi_82596, mac89x0, pcmcia/3c574_cs, rrunner, sb1000, sb1250-mac, sgiseeq, sk_g16, sk_mca, skfddi, sonic, sun3_82586, tc35815, tokenring/several, wan/several (03/04/27 1.1122.2.3) [wan dscc4] irqreturn_t update (03/04/27 1.1122.2.2) [netdrvr pcmcia] switch drivers to using pcmcia_register_driver Affected drivers: 3c574_cs, 3c589_cs, axnet_cs, com20020_cs, fmvj18x_cs, ibmtr_cs, nmclan_cs, smc91c92_cs, xir2ps_cs (03/04/27 1.1122.2.1) [netdrvr 8139cp] enable MWI via pci_set_mwi, rather than manually --------------020906060704070900050001-- From borkdude@cs.utwente.nl Mon Apr 28 17:01:18 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 17:01:23 -0700 (PDT) Received: from netlx014.civ.utwente.nl (netlx014.civ.utwente.nl [130.89.1.88]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T01GFu011876 for ; Mon, 28 Apr 2003 17:01:18 -0700 Received: from borkdude.kabel.utwente.nl (borkdude.kabel.utwente.nl [130.89.200.137]) by netlx014.civ.utwente.nl (8.11.4/HKD) with ESMTP id h3T015i13533; Tue, 29 Apr 2003 02:01:05 +0200 From: Michiel Borkent Reply-To: borkdude@cs.utwente.nl To: linux-kernel@vger.kernel.org, andrewm@uow.edu.au, netdev@oss.sgi.com Subject: 3c59x support Date: Tue, 29 Apr 2003 02:02:02 +0200 User-Agent: KMail/1.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200304290202.02811.borkdude@cs.utwente.nl> X-UTwente-MailScanner: Found to be clean X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2328 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: borkdude@cs.utwente.nl Precedence: bulk X-list: netdev Hello, I am trying to make a 2.4.20 kernel with 3c59x support. My card is a: 3Com 3c900 Cyclone 10Mbps TPO card and it only works with the 3c59x-scyld module, I found with Debian Woody with a linux v2.2 kernel. It does NOT work with the normal 3c59x module and as I am trying to make a 2.4.20 kernel, it still doesn't work. I chose support for "Vortex/Boomerang" and normally my card would be supported I think. Can someone help me with this? Greetings, Michiel Borkent From acme@conectiva.com.br Mon Apr 28 18:42:48 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 18:43:20 -0700 (PDT) Received: from perninha.conectiva.com.br (perninha.conectiva.com.br [200.250.58.156]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T1gjFu013340 for ; Mon, 28 Apr 2003 18:42:47 -0700 Received: from brinquendo.conectiva.com.br (dhcp182.distro.conectiva [10.0.20.182]) by perninha.conectiva.com.br (Postfix) with ESMTP id B60F6472E6; Mon, 28 Apr 2003 22:42:40 -0300 (BRT) Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 3E0371966C; Tue, 29 Apr 2003 01:43:27 +0000 (UTC) Date: Mon, 28 Apr 2003 22:43:26 -0300 From: Arnaldo Carvalho de Melo To: Max Krasnyansky Cc: netdev@oss.sgi.com Subject: Re: New module infrastructure for net_proto_family Message-ID: <20030429014326.GA24835@conectiva.com.br> References: <20030424230202.GB2931@conectiva.com.br> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2329 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Em Mon, Apr 28, 2003 at 02:10:11PM -0700, Max Krasnyansky escreveu: > Hi Arnaldo, > > Hmm, no comments on my last email (http://marc.theaimsgroup.com/?l=linux-netdev&m=105123134301565&w=2) > Are you trying to ignore me too ? ;-) Nope, I was working on the higher layer first, to then come to the net families that are already modular and have per-protocol modules, and I'm starting to look into the only, AFAIK, network family that has this in place: bluetooth :-) Having said that I haven't fully studied this I see two scenarios (brainstorming): 1. the net family that wants per protocol "sub" modules "duplicates" the infrastructure having PROTO_sk_alloc and PROTO_destruct (the sk_free sk->destruct hook call), PROTO_sk_alloc uses its net_families equivalent (bt_proto in bluetooth) to find the owner (the "sub" module, i.e. per protocol module) and PROTO_net_family_gets it, then calls sk_alloc proper, and when the last reference to the sock is released the sk->destruct is called (PROTO_destruct) does the PROTO_net_family_put. Ditto for the socket case, where PROTO_create, before calling the ->create of the "sub" module does the PROTO_net_family_get, and at release time its PROTO_release does the same thing that sock_release does. Something like this may well need extra info to be kept at the private area of the proto family in struct sock protinfo or private slab cache. That is, we have a higher layer for net families, with locking for the whole family done like it is on the tree now and a lower layer at the specific net family, both having the same behaviour at its layers. This option seems to be easy to implement with the current bluetooth infrastructure (i.e. it has a net_families equivalent, it does the switching at bt_create time, etc). 2. use the sk->prot (struct proto) infrastructure in some way. Comments? > Anyway, here is another idea. How about this (untested, uncompiled, just rfc). I didn't liked it, kind of layering violation that I'm trying to avoid. - Arnaldo From acme@conectiva.com.br Mon Apr 28 23:11:51 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 23:12:03 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T6BnFu017184 for ; Mon, 28 Apr 2003 23:11:50 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19AORF-0004uA-00; Tue, 29 Apr 2003 03:18:01 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 903D61966C; Tue, 29 Apr 2003 06:12:28 +0000 (UTC) Date: Tue, 29 Apr 2003 03:12:27 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" , Michal Ostrowski Cc: Linux Networking Development Mailing List , Max Krasnyansky Subject: [PATCH] af_pppox: create module infrastructure for protocol modules Message-ID: <20030429061227.GJ25361@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2330 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Hi David, Please consider pulling from: bk://kernel.bkbits.net/acme/net-2.5 There is just this outstanding changeset in this tree. Max, take a look and see if this same approach can be used in bluetooth, I bet it can, its just a matter of not using struct net_proto_family for bt_proto, just like pppox already was doing before my changes :-) - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1147, 2003-04-29 02:55:39-03:00, acme@conectiva.com.br o af_pppox: create module infrastructure for protocol modules With this the pppox module is protected by the networking core and the pppox "core" protects modules for specific pppox protocols (pppoe, for instance), while doing it removed some not needed struct sock member initializations in pppoe_create that are done by sock_init_data. drivers/net/pppoe.c | 30 ++++++++++-------------------- drivers/net/pppox.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- include/linux/if_pppox.h | 14 +++++++++++--- 3 files changed, 67 insertions(+), 24 deletions(-) diff -Nru a/drivers/net/pppoe.c b/drivers/net/pppoe.c --- a/drivers/net/pppoe.c Tue Apr 29 02:58:32 2003 +++ b/drivers/net/pppoe.c Tue Apr 29 02:58:32 2003 @@ -471,16 +471,15 @@ /*********************************************************************** * - * Really kill the socket. (Called from sock_put if refcnt == 0.) + * Really kill the socket. (Called from pppox_sk_free if refcnt == 0.) * **********************************************************************/ -void pppoe_sock_destruct(struct sock *sk) +static void pppoe_sk_free(struct sock *sk) { struct pppox_opt *po = pppox_sk(sk); if (po) kfree(po); - MOD_DEC_USE_COUNT; } @@ -495,26 +494,16 @@ struct sock *sk; struct pppox_opt *po; - MOD_INC_USE_COUNT; - - sk = sk_alloc(PF_PPPOX, GFP_KERNEL, 1, NULL); + sk = pppox_sk_alloc(sock, PX_PROTO_OE, GFP_KERNEL, 1, NULL); if (!sk) - goto decmod; - - sock_init_data(sock, sk); + goto out; sock->state = SS_UNCONNECTED; sock->ops = &pppoe_ops; - sk->protocol = PX_PROTO_OE; - sk->family = PF_PPPOX; - sk->backlog_rcv = pppoe_rcv_core; - sk->next = NULL; - sk->pprev = NULL; sk->state = PPPOX_NONE; sk->type = SOCK_STREAM; - sk->destruct = pppoe_sock_destruct; po = pppox_sk(sk) = kmalloc(sizeof(*po), GFP_KERNEL); if (!po) @@ -522,10 +511,8 @@ memset(po, 0, sizeof(*po)); po->sk = sk; error = 0; - sock->sk = sk; out: return error; frees: sk_free(sk); -decmod: MOD_DEC_USE_COUNT; goto out; } @@ -1075,16 +1062,16 @@ }; #endif /* CONFIG_PROC_FS */ +/* ->release and ->ioctl are set at pppox_create */ + struct proto_ops pppoe_ops = { .family = AF_PPPOX, - .release = pppoe_release, .bind = sock_no_bind, .connect = pppoe_connect, .socketpair = sock_no_socketpair, .accept = sock_no_accept, .getname = pppoe_getname, .poll = datagram_poll, - .ioctl = pppoe_ioctl, .listen = sock_no_listen, .shutdown = sock_no_shutdown, .setsockopt = sock_no_setsockopt, @@ -1096,7 +1083,10 @@ struct pppox_proto pppoe_proto = { .create = pppoe_create, - .ioctl = pppoe_ioctl + .ioctl = pppoe_ioctl, + .release = pppoe_release, + .sk_free = pppoe_sk_free, + .owner = THIS_MODULE, }; diff -Nru a/drivers/net/pppox.c b/drivers/net/pppox.c --- a/drivers/net/pppox.c Tue Apr 29 02:58:32 2003 +++ b/drivers/net/pppox.c Tue Apr 29 02:58:32 2003 @@ -64,9 +64,45 @@ } } +static int pppox_release(struct socket *sock) +{ + struct sock *sk = sock->sk; + int rc = pppox_protos[sk->protocol]->release(sock); + + module_put(pppox_protos[sk->protocol]->owner); + return rc; +} + +static void pppox_sk_free(struct sock *sk) +{ + pppox_protos[sk->protocol]->sk_free(sk); + module_put(pppox_protos[sk->protocol]->owner); +} + +struct sock *pppox_sk_alloc(struct socket *sock, int protocol, int priority, + int zero_it, kmem_cache_t *slab) +{ + struct sock *sk = NULL; + + if (!try_module_get(pppox_protos[protocol]->owner)) + goto out; + + sk = sk_alloc(PF_PPPOX, priority, zero_it, slab); + if (sk) { + sock_init_data(sock, sk); + sk->family = PF_PPPOX; + sk->protocol = protocol; + sk->destruct = pppox_sk_free; + } else + module_put(pppox_protos[protocol]->owner); +out: + return sk; +} + EXPORT_SYMBOL(register_pppox_proto); EXPORT_SYMBOL(unregister_pppox_proto); EXPORT_SYMBOL(pppox_unbind_sock); +EXPORT_SYMBOL(pppox_sk_alloc); static int pppox_ioctl(struct socket* sock, unsigned int cmd, unsigned long arg) @@ -116,11 +152,19 @@ if (!pppox_protos[protocol]) goto out; + rc = -EBUSY; + if (!try_module_get(pppox_protos[protocol]->owner)) + goto out; + rc = pppox_protos[protocol]->create(sock); - if (!rc) + if (!rc) { /* We get to set the ioctl handler. */ + /* And the release handler, for module refcounting */ /* For everything else, pppox is just a shell. */ sock->ops->ioctl = pppox_ioctl; + sock->ops->release = pppox_release; + } else + module_put(pppox_protos[protocol]->owner); out: return rc; } @@ -128,6 +172,7 @@ static struct net_proto_family pppox_proto_family = { .family = PF_PPPOX, .create = pppox_create, + .owner = THIS_MODULE, }; static int __init pppox_init(void) diff -Nru a/include/linux/if_pppox.h b/include/linux/if_pppox.h --- a/include/linux/if_pppox.h Tue Apr 29 02:58:32 2003 +++ b/include/linux/if_pppox.h Tue Apr 29 02:58:32 2003 @@ -134,10 +134,15 @@ #define pppox_sk(__sk) ((struct pppox_opt *)(__sk)->protinfo) +struct module; + struct pppox_proto { - int (*create)(struct socket *sock); - int (*ioctl)(struct socket *sock, unsigned int cmd, - unsigned long arg); + int (*create)(struct socket *sock); + int (*ioctl)(struct socket *sock, unsigned int cmd, + unsigned long arg); + int (*release)(struct socket *sock); + void (*sk_free)(struct sock *sk); + struct module *owner; }; extern int register_pppox_proto(int proto_num, struct pppox_proto *pp); @@ -145,6 +150,9 @@ extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ extern int pppox_channel_ioctl(struct ppp_channel *pc, unsigned int cmd, unsigned long arg); +extern struct sock *pppox_sk_alloc(struct socket *sock, int protocol, + int priority, int zero_it, + kmem_cache_t *slab); /* PPPoX socket states */ enum { =================================================================== This BitKeeper patch contains the following changesets: 1.1147 ## Wrapped with gzip_uu ## M'XL( (@4KCX ^U86W/:.!1^MG^%MGTA+!?)\A6&3C>%MIFFA4F:V7:V.QXC MB^#!V(PM$M*E_WV/9'-+(&G2OG2FD(EB'9VC<]/WR7F.+G*>M;2 3;G^'+U- M<]'26)IP)J*KH,'2:6.8@> L34'0'*=3WCQ^UTRXJ!L-2P?)(!!LC*YXEKCBS2["N(P?QF(<9PF#9$% M23[E0NVY7"]=&A@;\+6(0[%E+XF-36?)2$A(8!(>8L-T;5.7[K^\[?:N%8I- MP\/4,JB[I([E&'H7D08AIH,P;6*S:7@(&RW+:E&OCFD+8[37*OJ3HCK6C]'/ MC>"5SE"*@I$_F\W210NQC >"HVD:SF..HF24!;G(YDS,,XY&:89F62I2EL;E MDASTX>?O2$#JQU$.OSA2MM8VOMI+.9#/.(M&$2N7KOS)445.\!H8DLNB)!=!POA1#5V/(_ C3.5V MD4 9GZ97X$L.38625( W/)3/*DZ89A.P,>73(9=F(A$%Y++3\,H";Z.T1=8F)]L.E#O?[(CZ[C .LO'BA]E+!X M'O)F'"7S13,J2]H8;W>"9YI+[% ++UUS:)DFYRQP.&6.N[_K[C5:M+9E68:S M))9%W ==#+-(GEAYCILJC0VVY9T))I>&01VZ).'08LQU V9MV#*<^V&+8%0W?@/7+PA!#'-V@2Q;'*IG2&BP:JO()Y"'&4 MI=,B;WX^\4<9A_*,("$CEDA:1[AQ)(TZA5$Y0!(%Y/HJC<(R\%*QLI4N5,TG M4M&EH-$U/1=1_<2"7B:ZED]09[,EN)&RBM2IH<$G?W#6_]CW^[T:>O-ZX+_K MG7WHG=80J:$/%Z>G1VV]:V&CL"4#U+1+J#5*YT))/)!T+4*1(0?I;-G M&#VOL JCJ2/X-)0=K5-F1CW5"DFYWUI6/I?2,H=K:?E<2M/KA&<@^_CVY-Q_ MW^]>G/9J>Q%N\12$^VY,/G MNQ>3Y04-+[%MFUYY07LLSIDVJI/?,/?KP5Q! MQ _@W.)).'=BVV!^A451LCJOY:':AB(XSE4Y'NG_ ?;L0A0 D?RS_B*?M'5- MFLG8&IQ4@O-_?=&UHD;^;"XJ]RFJ,PP:6L:AIQ+8J:U_ M _W;>+HXC*<0P'T[K/6D8X]UJW!E:\/;"'TWH[4B\:6MU5.49I&XJ0$V:Q*[ MY.17GJ5^)&IH LWELX"-N2]MQ,'P0%4DVJOD AE5_A#9C5^&<\EOA7,GE*,= M5OA2\LTZCL%K?S 8]#_5-JYN_%,>M8M=(8L(?--V^[IDJB+%FLSE*)A&P+ ( M-EG97HG6D-%99VDE"GD9=&>WZ"#_AGB<QMM:=)9M9EO/$EO34 M^S3HGWWTSS^_/^Z?5G:K"IHGA+A 7IIJ_'KO^.+\<_MGI+U+#*S(40V%P8S) ME,(44=P--/P7D*]$OQ49 XB',<]J"LE*')67D72>"(EB0,2@3H'GB\+ [K-\ MP^6=71AX8C)/"%4^'Z;=0R]O#W/OC[U+'B#@!]XE,87W9)=X2\OS<,'"[J-? M-@BJT]\D_.N1LA6W*IIE6KA M]]%>?FZO5ZEK\]Y%-31/\N@R@81)8F'34!&-MIF&IKR$E%QNF2O1X."NBGJW M/I5J"<9'=RBXO2:K(E*MJC!"8H;I0+A\(;A$X!\BTB(BM,NG.T2Z6K&'3]N; 9_^'"-)OD\VEGQ)B)+8_H_P,X$HUJ'A8 From davem@redhat.com Mon Apr 28 23:33:43 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 23:33:46 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T6XgFu018307 for ; Mon, 28 Apr 2003 23:33:43 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id WAA26594; Mon, 28 Apr 2003 22:27:29 -0700 Date: Mon, 28 Apr 2003 22:27:28 -0700 (PDT) Message-Id: <20030428.222728.48508327.davem@redhat.com> To: acme@conectiva.com.br Cc: mostrows@speakeasy.net, netdev@oss.sgi.com, maxk@qualcomm.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules From: "David S. Miller" In-Reply-To: <20030429061227.GJ25361@conectiva.com.br> References: <20030429061227.GJ25361@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2331 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Arnaldo Carvalho de Melo Date: Tue, 29 Apr 2003 03:12:27 -0300 Max, take a look and see if this same approach can be used in bluetooth, I bet it can, its just a matter of not using struct net_proto_family for bt_proto, just like pppox already was doing before my changes :-) Something similar can be done for ipv4/ipv6 by adding a struct module *owner member to struct inet_protosw etc. etc. Although the idea is conceptually sound, you miss one crucial thing. Such struct sock's reference _TWO_ modules, the "PPPOE" module and the "PPPOX" module. So in the TCP/UDP/SCTP example case, a struct sock references the TCP/UDP/SCTP module _AND_ the ipv4/ipv6 module. So what we'll need to do is use two owner pointers in struct sock, one for propagating the "struct socket" owner, and one for the "sub-protocol". struct module *owner; struct module *sub_owner; From yoshfuji@wide.ad.jp Mon Apr 28 23:47:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 23:47:27 -0700 (PDT) Received: from yue.hongo.wide.ad.jp (yue.hongo.wide.ad.jp [203.178.139.94]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T6lMFu018678 for ; Mon, 28 Apr 2003 23:47:23 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (8.12.3+3.5Wbeta/8.12.3/Debian-5) with ESMTP id h3T6kpBo029364; Tue, 29 Apr 2003 15:46:53 +0900 Date: Tue, 29 Apr 2003 15:46:51 +0900 (JST) Message-Id: <20030429.154651.108798316.yoshfuji@wide.ad.jp> To: davem@redhat.com Cc: acme@conectiva.com.br, mostrows@speakeasy.net, netdev@oss.sgi.com, maxk@qualcomm.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20030428.222728.48508327.davem@redhat.com> References: <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 90 22 65 EB 1E CF 3A D1 0B DF 80 D8 48 07 F8 94 E0 62 0E EA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2332 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@wide.ad.jp Precedence: bulk X-list: netdev In article <20030428.222728.48508327.davem@redhat.com> (at Mon, 28 Apr 2003 22:27:28 -0700 (PDT)), "David S. Miller" says: > So in the TCP/UDP/SCTP example case, a struct sock references the > TCP/UDP/SCTP module _AND_ the ipv4/ipv6 module. We probably need to refer IPv4 module as well as IPv6 module because of the IPv4-Mapped address feature for IPv6 sockets. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From acme@conectiva.com.br Mon Apr 28 23:53:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Mon, 28 Apr 2003 23:53:38 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T6rXFu019463 for ; Mon, 28 Apr 2003 23:53:34 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19AP5f-0004um-00; Tue, 29 Apr 2003 03:59:48 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 6836F1966C; Tue, 29 Apr 2003 06:54:19 +0000 (UTC) Date: Tue, 29 Apr 2003 03:54:19 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: mostrows@speakeasy.net, netdev@oss.sgi.com, maxk@qualcomm.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules Message-ID: <20030429065419.GN25361@conectiva.com.br> References: <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030428.222728.48508327.davem@redhat.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2333 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Em Mon, Apr 28, 2003 at 10:27:28PM -0700, David S. Miller escreveu: > From: Arnaldo Carvalho de Melo > Date: Tue, 29 Apr 2003 03:12:27 -0300 > > Max, take a look and see if this same approach can be used in > bluetooth, I bet it can, its just a matter of not using struct > net_proto_family for bt_proto, just like pppox already was doing > before my changes :-) > > Something similar can be done for ipv4/ipv6 by adding a struct module > *owner member to struct inet_protosw etc. etc. yes > Although the idea is conceptually sound, you miss one crucial thing. > Such struct sock's reference _TWO_ modules, the "PPPOE" module > and the "PPPOX" module. But what is the problem? at pppox_sk_alloc time I bump the PPPOE module refcnt, making it safe, then it calls sk_alloc where it bumps the PPPOX module, making it safe as well, so I'm taking care of both PPPOE and PPPOX. > So in the TCP/UDP/SCTP example case, a struct sock references the > TCP/UDP/SCTP module _AND_ the ipv4/ipv6 module. ditto > So what we'll need to do is use two owner pointers in struct sock, > one for propagating the "struct socket" owner, and one for the > "sub-protocol". > > struct module *owner; This one is the net_families[net_family]->owner > struct module *sub_owner; this one is the pppox_protos[protocol]->owner I thought about it, but I don't see why the current scheme doesn't handle it, care to elaborate a bit more? I don't doubt that I may be missing some subtlety :-) - Arnaldo From davem@redhat.com Tue Apr 29 00:07:16 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 00:07:19 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T77EFu020093 for ; Tue, 29 Apr 2003 00:07:15 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA26627; Mon, 28 Apr 2003 23:00:45 -0700 Date: Mon, 28 Apr 2003 23:00:45 -0700 (PDT) Message-Id: <20030428.230045.21906184.davem@redhat.com> To: yoshfuji@wide.ad.jp Cc: acme@conectiva.com.br, mostrows@speakeasy.net, netdev@oss.sgi.com, maxk@qualcomm.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules From: "David S. Miller" In-Reply-To: <20030429.154651.108798316.yoshfuji@wide.ad.jp> References: <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> <20030429.154651.108798316.yoshfuji@wide.ad.jp> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2335 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: YOSHIFUJI Hideaki / $B5HF#1QL@(B Date: Tue, 29 Apr 2003 15:46:51 +0900 (JST) We probably need to refer IPv4 module as well as IPv6 module because of the IPv4-Mapped address feature for IPv6 sockets. Right. From davem@redhat.com Tue Apr 29 00:06:50 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 00:06:57 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T76nFu020036 for ; Tue, 29 Apr 2003 00:06:49 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA26621; Mon, 28 Apr 2003 23:00:34 -0700 Date: Mon, 28 Apr 2003 23:00:34 -0700 (PDT) Message-Id: <20030428.230034.08345606.davem@redhat.com> To: acme@conectiva.com.br Cc: mostrows@speakeasy.net, netdev@oss.sgi.com, maxk@qualcomm.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules From: "David S. Miller" In-Reply-To: <20030429065419.GN25361@conectiva.com.br> References: <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> <20030429065419.GN25361@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2334 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Arnaldo Carvalho de Melo Date: Tue, 29 Apr 2003 03:54:19 -0300 Em Mon, Apr 28, 2003 at 10:27:28PM -0700, David S. Miller escreveu: > Although the idea is conceptually sound, you miss one crucial thing. > Such struct sock's reference _TWO_ modules, the "PPPOE" module > and the "PPPOX" module. But what is the problem? at pppox_sk_alloc time I bump the PPPOE module refcnt, making it safe, then it calls sk_alloc where it bumps the PPPOX module, making it safe as well, so I'm taking care of both PPPOE and PPPOX. You're absolutely correct, I missed this. I'll pull your changes, thanks. From acme@conectiva.com.br Tue Apr 29 00:11:40 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 00:11:52 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T7BcFu020700 for ; Tue, 29 Apr 2003 00:11:39 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19APNA-0004vy-00; Tue, 29 Apr 2003 04:17:52 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 9641C1966C; Tue, 29 Apr 2003 07:12:20 +0000 (UTC) Date: Tue, 29 Apr 2003 04:12:19 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: yoshfuji@wide.ad.jp, mostrows@speakeasy.net, netdev@oss.sgi.com, maxk@qualcomm.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules Message-ID: <20030429071218.GP25361@conectiva.com.br> References: <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> <20030429.154651.108798316.yoshfuji@wide.ad.jp> <20030428.230045.21906184.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030428.230045.21906184.davem@redhat.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2336 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Em Mon, Apr 28, 2003 at 11:00:45PM -0700, David S. Miller escreveu: > From: YOSHIFUJI Hideaki / ?$B5HF#1QL@ > Date: Tue, 29 Apr 2003 15:46:51 +0900 (JST) > > We probably need to refer IPv4 module as well as IPv6 module > because of the IPv4-Mapped address feature for IPv6 sockets. > > Right. This kind of subtlety is perfectly solved with the scheme now in DaveM's tree for pppox, as the net family layer is where this kinds of special cases are better handled. I'll take a look at this and will try to come up with a patch. - Arnaldo From acme@conectiva.com.br Tue Apr 29 01:01:01 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 01:01:10 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T80xFu021276 for ; Tue, 29 Apr 2003 01:01:00 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19AQ8w-0004x1-00; Tue, 29 Apr 2003 05:07:14 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id DF1661966C; Tue, 29 Apr 2003 08:01:43 +0000 (UTC) Date: Tue, 29 Apr 2003 05:01:43 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] vlan: fix misunderstanding at struct packet_type initialization Message-ID: <20030429080142.GS25361@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2337 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1148, 2003-04-29 04:48:17-03:00, acme@conectiva.com.br o vlan: fix misunderstanding at struct packet_type initialization packet_type->data != 0 means that the net family understand shared skbs and is fully multithreaded, so if vlan really is an "old one" it should set this to 0, not to -1. vlan.c | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) diff -Nru a/net/8021q/vlan.c b/net/8021q/vlan.c --- a/net/8021q/vlan.c Tue Apr 29 04:57:16 2003 +++ b/net/8021q/vlan.c Tue Apr 29 04:57:16 2003 @@ -66,9 +66,8 @@ static struct packet_type vlan_packet_type = { .type = __constant_htons(ETH_P_8021Q), - .dev =NULL, .func = vlan_skb_recv, /* VLAN receive method */ - .data = (void *)(-1), /* Set here '(void *)1' when this code can SHARE SKBs */ + .data = (void *)0, /* Set here '(void *)1' when this code can SHARE SKBs */ }; /* End of global variables definitions. */ =================================================================== This BitKeeper patch contains the following changesets: 1.1148 ## Wrapped with gzip_uu ## M'XL( %PPKCX ^U4WT_;,!!^KO^*&SRP,9J<$R=-(A7Q4V-BTE 1SY-Q7&*1 MQ"QVRYCRQ^_2:K"Q3M,F'I=8CNR[?/[N[CMOPY7373&2JM%L&\ZL\\5(V58K M;Y8R4+8)KCLRS*PE0UC91H='YV&K_3@*$D:6"^E5!4O=N6+$@_AQQS_%PQMAT"L>5;&_TI?8PG3)ONZ6L2W<@?57;-O"=;%VC_>K,_M&UCQ C M>A,^B3%)>YZBF/2*EYQ+P76)D(L!$5WG(8(SN"EXW@F"FPL*QE6\#,'^WB_E%["JRD@ M-)KX@:\(R%<:J(0PEXVI'^#I('"5[#1];J\=#&OC"'"^J,FK6=3>^*K3LM3E M'C@+9KXB#+0U.)CA%]BR=0F4LRTPQ+BR"UHZ/9Q)=F\)#O>@M;1A8%&Z88<0_AP/E0#V6)2)E(/8\X7G2YSS7 M$YDK@6DN,.>;); 1;*VOB<@P[44:I]%*\\\]!^F_.$OF*MTT)!+='5A7UH'M M;G['D6>DPQQ%+R9QE*Q[('G> 9C^L0.B_QWP[X=/UKRJM;MVBFI^P;*\\5\ED& From davem@redhat.com Tue Apr 29 01:07:08 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 01:07:15 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T877Fu021637 for ; Tue, 29 Apr 2003 01:07:08 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id AAA26743; Tue, 29 Apr 2003 00:00:53 -0700 Date: Tue, 29 Apr 2003 00:00:53 -0700 (PDT) Message-Id: <20030429.000053.102551564.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCH] vlan: fix misunderstanding at struct packet_type initialization From: "David S. Miller" In-Reply-To: <20030429080142.GS25361@conectiva.com.br> References: <20030429080142.GS25361@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2338 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev VLAN understands shared SKBs Arnaldo. :-) See vlan_skb_recv() and vlan_check_reorder_header(). From acme@conectiva.com.br Tue Apr 29 01:09:40 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 01:09:43 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T89cFu021961 for ; Tue, 29 Apr 2003 01:09:39 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19AQHI-0004xY-00; Tue, 29 Apr 2003 05:15:53 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id BAB501966C; Tue, 29 Apr 2003 08:10:19 +0000 (UTC) Date: Tue, 29 Apr 2003 05:10:18 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH] vlan: fix misunderstanding at struct packet_type initialization Message-ID: <20030429081018.GT25361@conectiva.com.br> References: <20030429080142.GS25361@conectiva.com.br> <20030429.000053.102551564.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030429.000053.102551564.davem@redhat.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2339 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Em Tue, Apr 29, 2003 at 12:00:53AM -0700, David S. Miller escreveu: > > VLAN understands shared SKBs Arnaldo. :-) > > See vlan_skb_recv() and vlan_check_reorder_header(). Oh well, so the comment has to be changed 8) - Arnaldo From acme@conectiva.com.br Tue Apr 29 02:01:41 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 02:01:53 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T91dFu023362 for ; Tue, 29 Apr 2003 02:01:40 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19AR5c-0004yr-00; Tue, 29 Apr 2003 06:07:53 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id E6FF11966C; Tue, 29 Apr 2003 09:02:16 +0000 (UTC) Date: Tue, 29 Apr 2003 06:02:15 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] af_pppox: return -EPROTONOSUPPORT if try_module_get fails at pppox_create Message-ID: <20030429090215.GY25361@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2340 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 That changeset was properly removed with bk undo, thanks. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1148, 2003-04-29 05:53:59-03:00, acme@conectiva.com.br o af_pppox: return -EPROTONOSUPPORT if try_module_get fails at pppox_create Thanks to Rusty for spotting this one, if the protocol module is not there anymore (or is going away at that time) it is not supported, not busy. pppox.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-) diff -Nru a/drivers/net/pppox.c b/drivers/net/pppox.c --- a/drivers/net/pppox.c Tue Apr 29 05:57:32 2003 +++ b/drivers/net/pppox.c Tue Apr 29 05:57:32 2003 @@ -149,11 +149,8 @@ goto out; rc = -EPROTONOSUPPORT; - if (!pppox_protos[protocol]) - goto out; - - rc = -EBUSY; - if (!try_module_get(pppox_protos[protocol]->owner)) + if (!pppox_protos[protocol] || + !try_module_get(pppox_protos[protocol]->owner)) goto out; rc = pppox_protos[protocol]->create(sock); =================================================================== This BitKeeper patch contains the following changesets: 1.1148 ## Wrapped with gzip_uu ## M'XL( 'P^KCX ^U474_;,!1]KG_%1;P4C:3^;--(18P/;1/36A5XFJ;*==TF MHHDKVX55RH^?DPH8J(#&]CC'BI3=4ON(Q@*%R$AZE<&MMBYMD9@]_/&;E4Y; MX_-/UU\_CA$:#. TD^5"7VH/@P'RQM[*Y@R+;D6ZF/=#FJZ1\_I_T4A6%.^U@(P?H52PC'Z Q( M3 A/ +,.YAW:!RQ2P5+1CS!+,8:=J/"!0(31"?S;"DZ1 @-R/EFM5N9G"E;[ MM2TA.A^-AU?#;\/+Z]%H.+Z"? [>;B:%F:V7>K((S9S+?.E >FA63I35TNN M%N95(''C E,8KYW?P-Q8<"OC?5XNP&>Y@U#<88.9:5A9XXTR2]B"0PB7QM2[A/,.?YP104&@+T1T@:)6**R]MVU+ M4YS[?E_C#Z@JU((P]IZVL[T[/3HR=Z6V!P>/=[_*M+IQZV+ :2(TZ27H%\8= &:E]6!@ From acme@conectiva.com.br Tue Apr 29 02:10:52 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 02:10:56 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T9AoFu023771 for ; Tue, 29 Apr 2003 02:10:51 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19AREV-0004zJ-00; Tue, 29 Apr 2003 06:17:04 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id CA2811966C; Tue, 29 Apr 2003 09:11:27 +0000 (UTC) Date: Tue, 29 Apr 2003 06:11:26 -0300 From: Arnaldo Carvalho de Melo To: "David S. Miller" Cc: Linux Networking Development Mailing List Subject: [PATCH] net/socket: return -EAFNOSUPPORT if net_family_get fails at sock_create and sys_accept Message-ID: <20030429091126.GZ25361@conectiva.com.br> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2341 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Hi David, Please pull from: bk://kernel.bkbits.net/acme/net-2.5 Now there are two outstanding changesets in this tree. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1149, 2003-04-29 06:06:37-03:00, acme@conectiva.com.br o net/socket: return -EAFNOSUPPORT if net_family_get fails at sock_create and sys_accept Thanks to Rusty for spotting this one, if the net family module is not there anymore (or is going away at that time) it is not supported, not busy. socket.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff -Nru a/net/socket.c b/net/socket.c --- a/net/socket.c Tue Apr 29 06:08:28 2003 +++ b/net/socket.c Tue Apr 29 06:08:28 2003 @@ -1091,7 +1091,7 @@ sock->type = type; - i = -EBUSY; + i = -EAFNOSUPPORT; if (!net_family_get(family)) goto out_release; @@ -1288,7 +1288,7 @@ if (err) goto out_release; - err = -EBUSY; + err = -EAFNOSUPPORT; if (!net_family_get(sock->ops->family)) goto out_release; =================================================================== This BitKeeper patch contains the following changesets: 1.1149 ## Wrapped with gzip_uu ## M'XL( Q!KCX ^U476^;,!1]CG_%E?JR:878!D-@RM3/?:C3&J7M<^0ZEX : M<&0[K9#X\3/)UN^MZM3'@86!>WSN\;T'=N#"HLD'4M5(=N"KMBX?*-V@OSE MXOO^E)#Q& Y+V2SP#!V,Q\1IB,;&R-;I.SNX5VG%+N3\'2 MB(JD8PF-TTZQ.6,R9CBG/!XE,>GE[SV6_9 EHC'/Z$A$(NNB$8LY.0(6,A9G M0*,AC8?I_3CWBJZLEPW3M74M%-J 76GGJF8!KJPL^)WN]AE[F\?+ MM6U#<@)],Q(RN;,'"5YY$$(E)9]>Z,A=;4-UORF92+LD3E/1*5JD/)&%$&EQ MR3/UO &>$&V=E=&$BRZ*!$TV;K^/>MGPKQ?W!\\_)RYE$4\\4<1COK6]$(]- MS\7?3<\AX/]-_W:FW_CD% )SLQG>Q),'EOF'C^"(T2P&1K[]F@<5C!]6\J/' C\(QM,-MY@,8\1=W^Q%6)ZLJNZ['$$:JLD.0G4.(7&C$& From davem@redhat.com Tue Apr 29 02:14:34 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 02:14:37 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T9EXFu024107 for ; Tue, 29 Apr 2003 02:14:34 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id BAA26920; Tue, 29 Apr 2003 01:08:19 -0700 Date: Tue, 29 Apr 2003 01:08:19 -0700 (PDT) Message-Id: <20030429.010819.15245354.davem@redhat.com> To: acme@conectiva.com.br Cc: netdev@oss.sgi.com Subject: Re: [PATCH] net/socket: return -EAFNOSUPPORT if net_family_get fails at sock_create and sys_accept From: "David S. Miller" In-Reply-To: <20030429091126.GZ25361@conectiva.com.br> References: <20030429091126.GZ25361@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2342 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Arnaldo Carvalho de Melo Date: Tue, 29 Apr 2003 06:11:26 -0300 Please pull from: bk://kernel.bkbits.net/acme/net-2.5 Now there are two outstanding changesets in this tree. Both pulled, thanks. From davem@redhat.com Tue Apr 29 02:36:58 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 02:37:07 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T9avFu026135 for ; Tue, 29 Apr 2003 02:36:58 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id BAA27036; Tue, 29 Apr 2003 01:30:43 -0700 Date: Tue, 29 Apr 2003 01:30:43 -0700 (PDT) Message-Id: <20030429.013043.98882273.davem@redhat.com> To: shemminger@osdl.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.5.68+] [BRIDGE] Inline and _rcu change. From: "David S. Miller" In-Reply-To: <20030428134639.0011347c.shemminger@osdl.org> References: <20030428134639.0011347c.shemminger@osdl.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2343 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Stephen Hemminger Date: Mon, 28 Apr 2003 13:46:39 -0700 Two small changes: * Need _rcu on the list_for_each_entry in br_get_port because called in read path for some ioctl's * Move two small functions is_root_bridge and is_designated_port into inline's because they are so short. Applied, thanks. From davem@redhat.com Tue Apr 29 02:37:59 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 02:38:02 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3T9bwFu026326 for ; Tue, 29 Apr 2003 02:37:58 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id BAA27049; Tue, 29 Apr 2003 01:31:47 -0700 Date: Tue, 29 Apr 2003 01:31:46 -0700 (PDT) Message-Id: <20030429.013146.26985806.davem@redhat.com> To: shemminger@osdl.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.5.68] [BRIDGE] More user hz conversions From: "David S. Miller" In-Reply-To: <20030428134854.21622b2b.shemminger@osdl.org> References: <20030428134854.21622b2b.shemminger@osdl.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2344 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Stephen Hemminger Date: Mon, 28 Apr 2003 13:48:54 -0700 Several more places need USER/KERNEL HZ conversion. Without these the timer values in 'brctl showmacs' and 'brctl showstp' are off. Applied, thanks. From bogdan.costescu@iwr.uni-heidelberg.de Tue Apr 29 04:46:35 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 04:46:42 -0700 (PDT) Received: from mail.iwr.uni-heidelberg.de (mail.iwr.uni-heidelberg.de [129.206.104.30]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TBkWFu029888 for ; Tue, 29 Apr 2003 04:46:34 -0700 Received: from kenzo.iwr.uni-heidelberg.de (IDENT:80rZEOxW25Uc5vNVE4O20WPnWwsz7lZI@kenzo.iwr.uni-heidelberg.de [129.206.120.29]) by mail.iwr.uni-heidelberg.de (8.11.2/8.11.1) with ESMTP id h3TBkPF22558; Tue, 29 Apr 2003 13:46:25 +0200 (MET DST) Received: from kenzo.iwr.uni-heidelberg.de (localhost.localdomain [127.0.0.1]) by kenzo.iwr.uni-heidelberg.de (8.12.8/8.12.8) with ESMTP id h3TBkOf0003096; Tue, 29 Apr 2003 13:46:24 +0200 Received: from localhost (bogdan@localhost) by kenzo.iwr.uni-heidelberg.de (8.12.8/8.12.8/Submit) with ESMTP id h3TBkO1W003091; Tue, 29 Apr 2003 13:46:24 +0200 Date: Tue, 29 Apr 2003 13:46:23 +0200 (CEST) From: Bogdan Costescu To: Michiel Borkent cc: andrewm@uow.edu.au, Subject: Re: 3c59x support In-Reply-To: <200304290202.02811.borkdude@cs.utwente.nl> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2345 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bogdan.costescu@iwr.uni-heidelberg.de Precedence: bulk X-list: netdev [ dropped linux-kernel ] On Tue, 29 Apr 2003, Michiel Borkent wrote: > card and it only works with the 3c59x-scyld module, I found with Debian > Woody with a linux v2.2 kernel. What version of the Scyld driver are you using ? Please note that the Scyld driver works with the 2.4 kernels too. > It does NOT work with the normal 3c59x module Well, "does NOT work" is not really a good starting point for a diagnosis. You should find in Documentation/networking/vortex.txt in your kernel tree details about how to create a useful report. -- Bogdan Costescu IWR - Interdisziplinaeres Zentrum fuer Wissenschaftliches Rechnen Universitaet Heidelberg, INF 368, D-69120 Heidelberg, GERMANY Telephone: +49 6221 54 8869, Telefax: +49 6221 54 8868 E-mail: Bogdan.Costescu@IWR.Uni-Heidelberg.De From hch@verein.lst.de Tue Apr 29 04:55:10 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 04:55:16 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [212.34.181.86]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TBt8Fu030401 for ; Tue, 29 Apr 2003 04:55:09 -0700 Received: (from hch@localhost) by verein.lst.de (8.11.6/8.11.6) id h3TBt6Z22434; Tue, 29 Apr 2003 13:55:06 +0200 Date: Tue, 29 Apr 2003 13:55:06 +0200 From: Christoph Hellwig To: davem@redhat.com Cc: netdev@oss.sgi.com Subject: purpose of the skb head pool Message-ID: <20030429135506.A22411@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2346 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev [sorry, wrong Cc: the first time] net/core/skbuf.c has a small per-cpu pool to keep some hot skbufs around instead of returning them to the system allocator. But if you loook at the slab allocator we'll have exactly that same code duplicated in there (see functions ac_data, __cache_alloc and kmem_cache_alloc in slab.c). So is there some other reason why this pool is needed? From ak@suse.de Tue Apr 29 06:03:24 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 06:03:28 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TD3NFu005342 for ; Tue, 29 Apr 2003 06:03:24 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id 6791414C5D; Tue, 29 Apr 2003 15:03:17 +0200 (MEST) Date: Tue, 29 Apr 2003 15:03:17 +0200 From: Andi Kleen To: Christoph Hellwig Cc: davem@redhat.com, netdev@oss.sgi.com Subject: Re: purpose of the skb head pool Message-ID: <20030429130317.GA32212@Wotan.suse.de> References: <20030429135506.A22411@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030429135506.A22411@lst.de> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2347 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 01:55:06PM +0200, Christoph Hellwig wrote: > [sorry, wrong Cc: the first time] > > net/core/skbuf.c has a small per-cpu pool to keep some hot skbufs around > instead of returning them to the system allocator. But if you loook > at the slab allocator we'll have exactly that same code duplicated in > there (see functions ac_data, __cache_alloc and kmem_cache_alloc in > slab.c). So is there some other reason why this pool is needed? The code was added before slab grew an own per cpu allocator. AFAIK it wasn't removed because the "extreme routing" people like Jamal and Robert O. still saw small advantages, but it's probably worth rebenchmarking. -Andi From Robert.Olsson@data.slu.se Tue Apr 29 06:05:48 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 06:05:55 -0700 (PDT) Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TD5iFu005712 for ; Tue, 29 Apr 2003 06:05:47 -0700 Received: (from robert@localhost) by robur.slu.se (8.9.3p2/8.9.3) id PAA07825; Tue, 29 Apr 2003 15:05:40 +0200 From: Robert Olsson MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="VOhjG1twcL" Content-Transfer-Encoding: 7bit Message-ID: <16046.30879.738356.495523@robur.slu.se> Date: Tue, 29 Apr 2003 15:05:35 +0200 To: Christoph Hellwig Cc: davem@redhat.com, netdev@oss.sgi.com Subject: purpose of the skb head pool In-Reply-To: <20030429135506.A22411@lst.de> References: <20030429135506.A22411@lst.de> X-Mailer: VM 6.92 under Emacs 19.34.1 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2348 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev --VOhjG1twcL Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit Hello! Christoph Hellwig writes: > net/core/skbuf.c has a small per-cpu pool to keep some hot skbufs around > instead of returning them to the system allocator. But if you loook > at the slab allocator we'll have exactly that same code duplicated in > there (see functions ac_data, __cache_alloc and kmem_cache_alloc in > slab.c). So is there some other reason why this pool is needed? Well just happened test without it yesterday... Manfred is working on some improvements of the slab (magazine layer) so I tested this. It seems to do improve performance. I also removed the skb_head_pool for a test run. 2.6.66 IP. Forwarding of two input simplex flows. eth0->eth1, eth2->eth3 Fixed affinity CPU0: eth0, eth3. CPU1: eth1, eth2. Which common for routing and should be "worst case" for other use. The test should give a very high load on the packet memory system. As seen at least we don't see any improvement from skb_head_pool code. Vanilla 2.5.66 381 kpps Magazine 431 kpps Magazine + no skb_head_pool 435 kpps Cheers. --ro --VOhjG1twcL Content-Type: application/octet-stream Content-Disposition: attachment; filename="rem_skb_head_pool.pat" Content-Transfer-Encoding: base64 LS0tIGxpbnV4L25ldC9jb3JlL3NrYnVmZi5jLjAzMDQyOAkyMDAzLTA0LTAxIDEzOjI0OjE0 LjAwMDAwMDAwMCArMDIwMAorKysgbGludXgvbmV0L2NvcmUvc2tidWZmLmMJMjAwMy0wNC0y OCAxNjo1Mzo1NC4wMDAwMDAwMDAgKzAyMDAKQEAgLTIwLDcgKzIwLDcgQEAKICAqCQlSYXkg VmFuVGFzc2xlCToJRml4ZWQgLS1za2ItPmxvY2sgaW4gZnJlZQogICoJCUFsYW4gQ294CToJ c2tiX2NvcHkgY29weSBhcnAgZmllbGQKICAqCQlBbmRpIEtsZWVuCToJc2xhYmlmaWVkIGl0 LgorICoJCVJvYmVydCBPbHNzb24JOglSZW1vdmVkIHNrYl9oZWFkX3Bvb2wKICAqCiAgKglO T1RFOgogICoJCVRoZSBfX3NrYl8gcm91dGluZXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGlu dGVycnVwdHMKQEAgLTY0LDE1ICs2NCw4IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4K ICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLWludCBzeXNjdGxfaG90X2xpc3RfbGVuID0g MTI4OwotCiBzdGF0aWMga21lbV9jYWNoZV90ICpza2J1ZmZfaGVhZF9jYWNoZTsKIAotc3Rh dGljIHVuaW9uIHsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWxpc3Q7Ci0JY2hhcgkJCXBhZFtT TVBfQ0FDSEVfQllURVNdOwotfSBza2JfaGVhZF9wb29sW05SX0NQVVNdOwotCiAvKgogICoJ S2VlcCBvdXQtb2YtbGluZSB0byBwcmV2ZW50IGtlcm5lbCBibG9hdC4KICAqCV9fYnVpbHRp bl9yZXR1cm5fYWRkcmVzcyBpcyBub3QgdXNlZCBiZWNhdXNlIGl0IGlzIG5vdCBhbHdheXMK QEAgLTExMCw0NCArMTAzLDYgQEAKIAlCVUcoKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18g c3RydWN0IHNrX2J1ZmYgKnNrYl9oZWFkX2Zyb21fcG9vbCh2b2lkKQotewotCXN0cnVjdCBz a19idWZmX2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JdW5z aWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWxpc3Qg PSAmc2tiX2hlYWRfcG9vbFtzbXBfcHJvY2Vzc29yX2lkKCldLmxpc3Q7Ci0KLQlpZiAoc2ti X3F1ZXVlX2xlbihsaXN0KSkKLQkJc2tiID0gX19za2JfZGVxdWV1ZShsaXN0KTsKLQotCWxv Y2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gc2tiOwotfQotCi1zdGF0aWMgX19p bmxpbmVfXyB2b2lkIHNrYl9oZWFkX3RvX3Bvb2woc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsK LQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0K LQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlsaXN0ID0gJnNrYl9oZWFkX3Bvb2xbc21w X3Byb2Nlc3Nvcl9pZCgpXS5saXN0OwotCi0JaWYgKHNrYl9xdWV1ZV9sZW4obGlzdCkgPCBz eXNjdGxfaG90X2xpc3RfbGVuKSB7Ci0JCV9fc2tiX3F1ZXVlX2hlYWQobGlzdCwgc2tiKTsK LQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JCXJldHVybjsKLQl9Ci0KLQlsb2Nh bF9pcnFfcmVzdG9yZShmbGFncyk7Ci0Ja21lbV9jYWNoZV9mcmVlKHNrYnVmZl9oZWFkX2Nh Y2hlLCBza2IpOwotfQotCi0KIC8qIAlBbGxvY2F0ZSBhIG5ldyBza2J1ZmYuIFdlIGRvIHRo aXMgb3Vyc2VsdmVzIHNvIHdlIGNhbiBmaWxsIGluIGEgZmV3CiAgKgkncHJpdmF0ZScgZmll bGRzIGFuZCBhbHNvIGRvIG1lbW9yeSBzdGF0aXN0aWNzIHRvIGZpbmQgYWxsIHRoZQogICoJ W0JFRVBdIGxlYWtzLgpAQCAtMTgyLDEzICsxMzcsMTAgQEAKIAl9CiAKIAkvKiBHZXQgdGhl IEhFQUQgKi8KLQlza2IgPSBza2JfaGVhZF9mcm9tX3Bvb2woKTsKLQlpZiAoIXNrYikgewot CQlza2IgPSBrbWVtX2NhY2hlX2FsbG9jKHNrYnVmZl9oZWFkX2NhY2hlLAorCXNrYiA9IGtt ZW1fY2FjaGVfYWxsb2Moc2tidWZmX2hlYWRfY2FjaGUsCiAJCQkJICAgICAgIGdmcF9tYXNr ICYgfl9fR0ZQX0RNQSk7CiAJCWlmICghc2tiKQogCQkJZ290byBvdXQ7Ci0JfQogCiAJLyog R2V0IHRoZSBEQVRBLiBTaXplIG11c3QgbWF0Y2ggc2tiX2FkZF9tdHUoKS4gKi8KIAlzaXpl ID0gU0tCX0RBVEFfQUxJR04oc2l6ZSk7CkBAIC0yMDcsNyArMTU5LDcgQEAKIG91dDoKIAly ZXR1cm4gc2tiOwogbm9kYXRhOgotCXNrYl9oZWFkX3RvX3Bvb2woc2tiKTsKKwlrbWVtX2Nh Y2hlX2ZyZWUoc2tidWZmX2hlYWRfY2FjaGUsIHNrYik7CiAJc2tiID0gTlVMTDsKIAlnb3Rv IG91dDsKIH0KQEAgLTI1Nyw3ICsyMDksNyBAQAogdm9pZCBrZnJlZV9za2JtZW0oc3RydWN0 IHNrX2J1ZmYgKnNrYikKIHsKIAlza2JfcmVsZWFzZV9kYXRhKHNrYik7Ci0Jc2tiX2hlYWRf dG9fcG9vbChza2IpOworCWttZW1fY2FjaGVfZnJlZShza2J1ZmZfaGVhZF9jYWNoZSwgc2ti KTsKIH0KIAogLyoqCkBAIC0zMjcsMTMgKzI3OSwxMCBAQAogCiBzdHJ1Y3Qgc2tfYnVmZiAq c2tiX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsIGludCBnZnBfbWFzaykKIHsKLQlzdHJ1 Y3Qgc2tfYnVmZiAqbiA9IHNrYl9oZWFkX2Zyb21fcG9vbCgpOworCXN0cnVjdCBza19idWZm ICpuID0ga21lbV9jYWNoZV9hbGxvYyhza2J1ZmZfaGVhZF9jYWNoZSwgZ2ZwX21hc2spOwog Ci0JaWYgKCFuKSB7Ci0JCW4gPSBrbWVtX2NhY2hlX2FsbG9jKHNrYnVmZl9oZWFkX2NhY2hl LCBnZnBfbWFzayk7Ci0JCWlmICghbikKLQkJCXJldHVybiBOVUxMOwotCX0KKwlpZiAoIW4p IAorCQlyZXR1cm4gTlVMTDsKIAogI2RlZmluZSBDKHgpIG4tPnggPSBza2ItPngKIApAQCAt MTI0MCw3ICsxMTg5LDQgQEAKIAkJCQkJICAgICAgTlVMTCwgTlVMTCk7CiAJaWYgKCFza2J1 ZmZfaGVhZF9jYWNoZSkKIAkJcGFuaWMoImNhbm5vdCBjcmVhdGUgc2tidWZmIGNhY2hlIik7 Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQotCQlza2JfcXVldWVfaGVhZF9p bml0KCZza2JfaGVhZF9wb29sW2ldLmxpc3QpOwogfQotLS0gbGludXgvbmV0L2NvcmUvc3lz Y3RsX25ldF9jb3JlLmMuMDMwNDI4CTIwMDMtMDMtMjQgMjM6MDA6MTguMDAwMDAwMDAwICsw MTAwCisrKyBsaW51eC9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYwkyMDAzLTA0LTI4IDE2 OjU5OjA1LjAwMDAwMDAwMCArMDIwMApAQCAtMjgsNyArMjgsNiBAQAogCiBleHRlcm4gaW50 IHN5c2N0bF9jb3JlX2Rlc3Ryb3lfZGVsYXk7CiBleHRlcm4gaW50IHN5c2N0bF9vcHRtZW1f bWF4OwotZXh0ZXJuIGludCBzeXNjdGxfaG90X2xpc3RfbGVuOwogCiAjaWZkZWYgQ09ORklH X05FVF9ESVZFUlQKIGV4dGVybiBjaGFyIHN5c2N0bF9kaXZlcnRfdmVyc2lvbltdOwpAQCAt MTUwLDE0ICsxNDksNiBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0g JnByb2NfZG9pbnR2ZWMKIAl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfSE9UX0xJ U1RfTEVOR1RILAotCQkucHJvY25hbWUJPSAiaG90X2xpc3RfbGVuZ3RoIiwKLQkJLmRhdGEJ CT0gJnN5c2N0bF9ob3RfbGlzdF9sZW4sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0J CS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwotCX0s CiAjaWZkZWYgQ09ORklHX05FVF9ESVZFUlQKIAl7CiAJCS5jdGxfbmFtZQk9IE5FVF9DT1JF X0RJVkVSVF9WRVJTSU9OLAo= --VOhjG1twcL Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit Vanilla slab. Input streams 2*534 kpps ====================================== CPU0 CPU1 24: 9 65 IO-APIC-level eth2 25: 54545 13 IO-APIC-level eth3 26: 78 0 IO-APIC-level eth0 27: 23 62315 IO-APIC-level eth1 Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags eth0 1500 0 3339339 8828613 8828613 6660669 33 0 0 0 BRU eth1 1500 0 57 0 0 0 3339340 0 0 0 BRU eth2 1500 0 3800145 8670213 8670213 6199858 27 0 0 0 BRU eth3 1500 0 1 0 0 0 3800144 0 0 0 BRU 0032f44f 00000000 00002ffa 00000000 00000000 00000000 00000000 00000000 00000000 0039fc87 00000000 00003373 00000000 00000000 00000000 00000000 00000000 00000000 With slab magazine patch. Input streams 2*534 kpps ================================================== Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags eth0 1500 0 3936399 8370562 8370562 6063606 31 0 0 0 BRU eth1 1500 0 58 0 0 0 3936403 0 0 0 BRU eth2 1500 0 4142687 8308862 8308862 5857316 27 0 0 0 BRU eth3 1500 0 1 0 0 0 4142686 0 0 0 BRU 003c1090 00000000 000034d1 00000000 00000000 00000000 00000000 00000000 00000000 003f3699 00000000 00003722 00000000 00000000 00000000 00000000 00000000 00000000 CPU0 CPU1 24: 9 81 IO-APIC-level eth2 25: 64461 14 IO-APIC-level eth3 26: 94 0 IO-APIC-level eth0 27: 20 67759 IO-APIC-level eth1 Daemon started. Profiler running. Stopping profiling. Cpu type: P4 / Xeon Cpu speed was (MHz estimation) : 1799.59 Counter 0 counted GLOBAL_POWER_EVENTS events (time during which processor is not stopped) with a unit mask of 0x01 (count cycles when processor is active) count 180000 vma samples %-age symbol name c02152c0 89894 13.7456 alloc_skb c022af44 69317 10.5992 ip_output c021fd90 64410 9.84889 qdisc_restart c01c8608 60224 9.20882 e1000_clean_tx_irq c021fbb8 48501 7.41626 eth_type_trans c021558c 42143 6.44406 skb_release_data c02156e4 36162 5.52951 __kfree_skb c01378b8 26285 4.01922 kmalloc c022645c 25858 3.95393 ip_route_input c01c87c0 23820 3.6423 e1000_clean_rx_irq c01c76c8 23261 3.55683 e1000_xmit_frame c0218a60 17677 2.70298 dev_queue_xmit c01374e0 12685 1.93966 cache_alloc_refill c0137a00 11319 1.73078 kfree c010fda0 11077 1.69378 do_gettimeofday c0228314 10202 1.55998 ip_rcv c0114050 8899 1.36074 get_offset_tsc c021567c 8394 1.28352 kfree_skbmem c0229700 6794 1.03887 ip_forward c01c8bf0 6531 0.998651 e1000_alloc_rx_buffers c01c8554 6379 0.975409 e1000_clean c021cadc 5234 0.800328 neigh_resolve_output c02190f0 5106 0.780755 netif_receive_skb c01c8468 4658 0.712252 e1000_intr c0114068 3542 0.541605 mark_offset_tsc c0222320 2156 0.329673 pfifo_dequeue Cpu type: P4 / Xeon Cpu speed was (MHz estimation) : 1799.59 Counter 7 counted MISPRED_BRANCH_RETIRED events (retired mispredicted branches) with a unit mask of 0x01 (retired instruction is non-bogus) count 18000 vma samples %-age symbol name c022af44 718 27.7113 ip_output c021fd90 513 19.7993 qdisc_restart c02156e4 360 13.8942 __kfree_skb c01c8608 261 10.0733 e1000_clean_tx_irq c0218a60 85 3.28059 dev_queue_xmit c01c8bf0 85 3.28059 e1000_alloc_rx_buffers c0137a00 53 2.04554 kfree c01c87c0 50 1.92976 e1000_clean_rx_irq c021558c 48 1.85257 skb_release_data c01378b8 46 1.77538 kmalloc c021fbb8 41 1.5824 eth_type_trans c0222320 36 1.38942 pfifo_dequeue c0228314 31 1.19645 ip_rcv c01c76c8 30 1.15785 e1000_xmit_frame c02152c0 24 0.926283 alloc_skb c022645c 19 0.733308 ip_route_input c01377d0 19 0.733308 cache_flusharray c010c750 17 0.656117 do_IRQ c01c8554 15 0.578927 e1000_clean c01168b8 13 0.501737 end_level_ioapic_irq c02190f0 12 0.463142 netif_receive_skb c01374e0 12 0.463142 cache_alloc_refill c0120eb0 11 0.424547 do_softirq c0229700 10 0.385951 ip_forward c01c8468 10 0.385951 e1000_intr c01245e8 9 0.347356 run_timer_softirq With slab magazine patch and skb_head_pool removed. Input streams 2*533 kpps ============================================================================ Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags eth0 1500 0 4070842 8257568 8257568 5929162 32 0 0 0 BRU eth1 1500 0 60 0 0 0 4070844 0 0 0 BRU eth2 1500 0 4097594 8285413 8285413 5902409 27 0 0 0 BRU eth3 1500 0 1 0 0 0 4097593 0 0 0 BRU 003e1dc4 00000000 000036e4 00000000 00000000 00000000 00000000 00000000 00000000 003e866f 00000000 00003711 00000000 00000000 00000000 00000000 00000000 00000000 CPU0 CPU1 24: 9 156 IO-APIC-level eth2 25: 66506 8 IO-APIC-level eth3 26: 170 0 IO-APIC-level eth0 27: 23 66807 IO-APIC-level eth1 NMI: 0 0 LOC: 357638 357637 ERR: 0 MIS: 0 Daemon started. Profiler running. Stopping profiling. Cpu type: P4 / Xeon Cpu speed was (MHz estimation) : 1799.55 Counter 0 counted GLOBAL_POWER_EVENTS events (time during which processor is not stopped) with a unit mask of 0x01 (count cycles when processor is active) count 180000 vma samples %-age symbol name c02152c0 90698 12.1819 alloc_skb c022adf4 81812 10.9884 ip_output c021fc40 74295 9.97875 qdisc_restart c01c8608 67518 9.06852 e1000_clean_tx_irq c021fa68 55350 7.4342 eth_type_trans c02154ec 45940 6.17032 skb_release_data c02155f8 41834 5.61883 __kfree_skb c01c87c0 31218 4.19297 e1000_clean_rx_irq c022630c 29209 3.92314 ip_route_input c01c76c8 27768 3.72959 e1000_xmit_frame c01378b8 20298 2.72628 kmalloc c0218910 19762 2.65428 dev_queue_xmit c01374e0 14245 1.91328 cache_alloc_refill c0137a00 13807 1.85445 kfree c010fda0 13406 1.80059 do_gettimeofday c0137874 12601 1.69247 kmem_cache_alloc c02281c4 11403 1.53157 ip_rcv c0114050 9854 1.32352 get_offset_tsc c01379b8 8743 1.17429 kmem_cache_free c01c8bf0 8369 1.12406 e1000_alloc_rx_buffers c02295b0 7607 1.02172 ip_forward c01c8554 6912 0.928368 e1000_clean c01c8468 5636 0.756986 e1000_intr c0218fa0 5413 0.727034 netif_receive_skb c01d2194 4363 0.586006 ide_insw c0114068 3972 0.533489 mark_offset_tsc Cpu type: P4 / Xeon Cpu speed was (MHz estimation) : 1799.55 Counter 7 counted MISPRED_BRANCH_RETIRED events (retired mispredicted branches) with a unit mask of 0x01 (retired instruction is non-bogus) count 18000 vma samples %-age symbol name c022adf4 766 26.3049 ip_output c021fc40 617 21.1882 qdisc_restart c02155f8 378 12.9808 __kfree_skb c01c8608 298 10.2335 e1000_clean_tx_irq c01c8bf0 120 4.12088 e1000_alloc_rx_buffers c0218910 114 3.91484 dev_queue_xmit c01c87c0 85 2.91896 e1000_clean_rx_irq c0137a00 71 2.43819 kfree c021fa68 42 1.44231 eth_type_trans c02154ec 40 1.37363 skb_release_data c01c76c8 39 1.33929 e1000_xmit_frame c01378b8 31 1.06456 kmalloc c02221d0 27 0.927198 pfifo_dequeue c02295b0 23 0.789835 ip_forward c02281c4 22 0.755495 ip_rcv c02152c0 20 0.686813 alloc_skb c01c8468 17 0.583791 e1000_intr c01377d0 17 0.583791 cache_flusharray c01c8554 16 0.549451 e1000_clean c022630c 15 0.51511 ip_route_input c01374e0 14 0.480769 cache_alloc_refill c01168b8 13 0.446429 end_level_ioapic_irq c010c750 10 0.343407 do_IRQ c0114050 9 0.309066 get_offset_tsc c0110074 9 0.309066 timer_interrupt c02191f4 8 0.274725 net_rx_action --VOhjG1twcL-- From Robert.Olsson@data.slu.se Tue Apr 29 06:11:43 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 06:11:47 -0700 (PDT) Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TDBgFu006099 for ; Tue, 29 Apr 2003 06:11:43 -0700 Received: (from robert@localhost) by robur.slu.se (8.9.3p2/8.9.3) id PAA07914; Tue, 29 Apr 2003 15:11:39 +0200 From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16046.31242.923044.59711@robur.slu.se> Date: Tue, 29 Apr 2003 15:11:38 +0200 To: Andi Kleen Cc: Christoph Hellwig , davem@redhat.com, netdev@oss.sgi.com Subject: Re: purpose of the skb head pool In-Reply-To: <20030429130317.GA32212@Wotan.suse.de> References: <20030429135506.A22411@lst.de> <20030429130317.GA32212@Wotan.suse.de> X-Mailer: VM 6.92 under Emacs 19.34.1 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2349 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Andi Kleen writes: > AFAIK it wasn't removed because the "extreme routing" people > like Jamal and Robert O. still saw small advantages, but it's > probably worth rebenchmarking. :-) Do we need a test run without Manfreds (soon coming) magazine patch too? Cheers. --ro From davem@redhat.com Tue Apr 29 07:15:11 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 07:15:17 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TEF6Fu008018 for ; Tue, 29 Apr 2003 07:15:09 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id GAA27743; Tue, 29 Apr 2003 06:08:34 -0700 Date: Tue, 29 Apr 2003 06:08:34 -0700 (PDT) Message-Id: <20030429.060834.48374026.davem@redhat.com> To: Robert.Olsson@data.slu.se Cc: ak@suse.de, hch@lst.de, netdev@oss.sgi.com Subject: Re: purpose of the skb head pool From: "David S. Miller" In-Reply-To: <16046.31242.923044.59711@robur.slu.se> References: <20030429135506.A22411@lst.de> <20030429130317.GA32212@Wotan.suse.de> <16046.31242.923044.59711@robur.slu.se> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2350 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Robert Olsson Date: Tue, 29 Apr 2003 15:11:38 +0200 Do we need a test run without Manfreds (soon coming) magazine patch too? Nope. I'm personally convinced, someone send me a patch to kill it off and I'll apply it. From hch@verein.lst.de Tue Apr 29 07:16:14 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 07:16:17 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [212.34.181.86]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TEGBFu008246 for ; Tue, 29 Apr 2003 07:16:13 -0700 Received: (from hch@localhost) by verein.lst.de (8.11.6/8.11.6) id h3TEG8B23715; Tue, 29 Apr 2003 16:16:08 +0200 Date: Tue, 29 Apr 2003 16:16:08 +0200 From: Christoph Hellwig To: "David S. Miller" Cc: Robert.Olsson@data.slu.se, ak@suse.de, netdev@oss.sgi.com Subject: Re: purpose of the skb head pool Message-ID: <20030429161608.A23708@lst.de> References: <20030429135506.A22411@lst.de> <20030429130317.GA32212@Wotan.suse.de> <16046.31242.923044.59711@robur.slu.se> <20030429.060834.48374026.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20030429.060834.48374026.davem@redhat.com>; from davem@redhat.com on Tue, Apr 29, 2003 at 06:08:34AM -0700 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2351 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 06:08:34AM -0700, David S. Miller wrote: > From: Robert Olsson > Date: Tue, 29 Apr 2003 15:11:38 +0200 > > Do we need a test run without Manfreds (soon coming) magazine patch too? > > Nope. I'm personally convinced, someone send me a patch to > kill it off and I'll apply it. Robert's first reply on this subject had it attached.. From davem@redhat.com Tue Apr 29 07:19:31 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 07:19:34 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TEJQFu009920 for ; Tue, 29 Apr 2003 07:19:29 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id GAA27818; Tue, 29 Apr 2003 06:12:49 -0700 Date: Tue, 29 Apr 2003 06:12:49 -0700 (PDT) Message-Id: <20030429.061249.123996896.davem@redhat.com> To: hch@lst.de Cc: Robert.Olsson@data.slu.se, ak@suse.de, netdev@oss.sgi.com Subject: Re: purpose of the skb head pool From: "David S. Miller" In-Reply-To: <20030429161608.A23708@lst.de> References: <16046.31242.923044.59711@robur.slu.se> <20030429.060834.48374026.davem@redhat.com> <20030429161608.A23708@lst.de> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2352 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Christoph Hellwig Date: Tue, 29 Apr 2003 16:16:08 +0200 On Tue, Apr 29, 2003 at 06:08:34AM -0700, David S. Miller wrote: > Nope. I'm personally convinced, someone send me a patch to > kill it off and I'll apply it. Robert's first reply on this subject had it attached.. I deleted it, can someone resend me a copy? When I ask for a patch, it usually means that I've /dev/null'd the entire thread already. From hch@verein.lst.de Tue Apr 29 07:26:10 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 07:26:23 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [212.34.181.86]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TEQ7Fu013510 for ; Tue, 29 Apr 2003 07:26:09 -0700 Received: (from hch@localhost) by verein.lst.de (8.11.6/8.11.6) id h3TEL2K23925; Tue, 29 Apr 2003 16:21:02 +0200 Date: Tue, 29 Apr 2003 16:21:02 +0200 From: Christoph Hellwig To: "David S. Miller" Cc: Robert.Olsson@data.slu.se, ak@suse.de, netdev@oss.sgi.com Subject: Re: purpose of the skb head pool Message-ID: <20030429162102.A23898@lst.de> References: <16046.31242.923044.59711@robur.slu.se> <20030429.060834.48374026.davem@redhat.com> <20030429161608.A23708@lst.de> <20030429.061249.123996896.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20030429.061249.123996896.davem@redhat.com>; from davem@redhat.com on Tue, Apr 29, 2003 at 06:12:49AM -0700 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2353 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 06:12:49AM -0700, David S. Miller wrote: > Robert's first reply on this subject had it attached.. > > I deleted it, can someone resend me a copy? > > When I ask for a patch, it usually means that I've > /dev/null'd the entire thread already. Lazy bastard.. ;) --- linux/net/core/skbuff.c.030428 2003-04-01 13:24:14.000000000 +0200 +++ linux/net/core/skbuff.c 2003-04-28 16:53:54.000000000 +0200 @@ -20,7 +20,7 @@ * Ray VanTassle : Fixed --skb->lock in free * Alan Cox : skb_copy copy arp field * Andi Kleen : slabified it. + * Robert Olsson : Removed skb_head_pool * * NOTE: * The __skb_ routines should be called with interrupts @@ -64,15 +64,8 @@ #include #include -int sysctl_hot_list_len = 128; - static kmem_cache_t *skbuff_head_cache; -static union { - struct sk_buff_head list; - char pad[SMP_CACHE_BYTES]; -} skb_head_pool[NR_CPUS]; - /* * Keep out-of-line to prevent kernel bloat. * __builtin_return_address is not used because it is not always @@ -110,44 +103,6 @@ BUG(); } -static __inline__ struct sk_buff *skb_head_from_pool(void) -{ - struct sk_buff_head *list; - struct sk_buff *skb = NULL; - unsigned long flags; - - local_irq_save(flags); - - list = &skb_head_pool[smp_processor_id()].list; - - if (skb_queue_len(list)) - skb = __skb_dequeue(list); - - local_irq_restore(flags); - return skb; -} - -static __inline__ void skb_head_to_pool(struct sk_buff *skb) -{ - struct sk_buff_head *list; - unsigned long flags; - - local_irq_save(flags); - - list = &skb_head_pool[smp_processor_id()].list; - - if (skb_queue_len(list) < sysctl_hot_list_len) { - __skb_queue_head(list, skb); - local_irq_restore(flags); - - return; - } - - local_irq_restore(flags); - kmem_cache_free(skbuff_head_cache, skb); -} - - /* Allocate a new skbuff. We do this ourselves so we can fill in a few * 'private' fields and also do memory statistics to find all the * [BEEP] leaks. @@ -182,13 +137,10 @@ } /* Get the HEAD */ - skb = skb_head_from_pool(); - if (!skb) { - skb = kmem_cache_alloc(skbuff_head_cache, + skb = kmem_cache_alloc(skbuff_head_cache, gfp_mask & ~__GFP_DMA); if (!skb) goto out; - } /* Get the DATA. Size must match skb_add_mtu(). */ size = SKB_DATA_ALIGN(size); @@ -207,7 +159,7 @@ out: return skb; nodata: - skb_head_to_pool(skb); + kmem_cache_free(skbuff_head_cache, skb); skb = NULL; goto out; } @@ -257,7 +209,7 @@ void kfree_skbmem(struct sk_buff *skb) { skb_release_data(skb); - skb_head_to_pool(skb); + kmem_cache_free(skbuff_head_cache, skb); } /** @@ -327,13 +279,10 @@ struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask) { - struct sk_buff *n = skb_head_from_pool(); + struct sk_buff *n = kmem_cache_alloc(skbuff_head_cache, gfp_mask); - if (!n) { - n = kmem_cache_alloc(skbuff_head_cache, gfp_mask); - if (!n) - return NULL; - } + if (!n) + return NULL; #define C(x) n->x = skb->x @@ -1240,7 +1189,4 @@ NULL, NULL); if (!skbuff_head_cache) panic("cannot create skbuff cache"); - - for (i = 0; i < NR_CPUS; i++) - skb_queue_head_init(&skb_head_pool[i].list); } --- linux/net/core/sysctl_net_core.c.030428 2003-03-24 23:00:18.000000000 +0100 +++ linux/net/core/sysctl_net_core.c 2003-04-28 16:59:05.000000000 +0200 @@ -28,7 +28,6 @@ extern int sysctl_core_destroy_delay; extern int sysctl_optmem_max; -extern int sysctl_hot_list_len; #ifdef CONFIG_NET_DIVERT extern char sysctl_divert_version[]; @@ -150,14 +149,6 @@ .mode = 0644, .proc_handler = &proc_dointvec }, - { - .ctl_name = NET_CORE_HOT_LIST_LENGTH, - .procname = "hot_list_length", - .data = &sysctl_hot_list_len, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_dointvec - }, #ifdef CONFIG_NET_DIVERT { .ctl_name = NET_CORE_DIVERT_VERSION, From daniel@osdl.org Tue Apr 29 09:21:19 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 09:21:26 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TGLIFu031001 for ; Tue, 29 Apr 2003 09:21:19 -0700 Received: from ibm-c.pdx.osdl.net (ibm-c.pdx.osdl.net [172.20.1.54]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id h3TGLIW03111 for ; Tue, 29 Apr 2003 09:21:18 -0700 Subject: [PATCH 2.5.68] net/ipv6 missing kmem_cache_destroy From: Daniel McNeil To: "netdev@oss.sgi.com" Content-Type: multipart/mixed; boundary="=-0IQSK81vzug9fKned0fJ" Organization: Message-Id: <1051633278.2446.103.camel@ibm-c.pdx.osdl.net> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.1 Date: 29 Apr 2003 09:21:18 -0700 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2354 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: daniel@osdl.org Precedence: bulk X-list: netdev --=-0IQSK81vzug9fKned0fJ Content-Type: text/plain Content-Transfer-Encoding: 7bit While trying to get ipv6 to work as a module with the new module reference code, I notice that ipv6 is missing the kmem_cache_destroy() calls that the init functions created. Another problem with ipv6 is that it creates sockets in the init routine, so there are reference to the module which will prevent it from being unloaded. I tried adding a module_put for every socket created in the init routines, but ran into a problem with inet6_exit() calling sock_unregister(PF_INET6) as the very first thing. This caused a problem when the cleanup routines were called and the did a sock_release(). Any ideas on how to fix this so ipv6 can be a module? init routines creating sockets makes things difficult. I've attached a patch to 2.5.68 to add the missing kmem_cache_destroy calls. BTW, how does one get on the netdev mailing list? Thanks, -- Daniel McNeil --=-0IQSK81vzug9fKned0fJ Content-Disposition: attachment; filename=patch.2.5.68-ipv6.kmem Content-Type: text/x-patch; name=patch.2.5.68-ipv6.kmem; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit diff -rupN -X /home/daniel/dontdiff linux-2.5.68/net/ipv6/af_inet6.c linux-2.5.68-sock/net/ipv6/af_inet6.c --- linux-2.5.68/net/ipv6/af_inet6.c Sat Apr 19 19:49:56 2003 +++ linux-2.5.68-sock/net/ipv6/af_inet6.c Tue Apr 29 09:03:08 2003 @@ -871,6 +871,9 @@ static void inet6_exit(void) ipv6_sysctl_unregister(); #endif cleanup_ipv6_mibs(); + kmem_cache_destroy(tcp6_sk_cachep); + kmem_cache_destroy(udp6_sk_cachep); + kmem_cache_destroy(raw6_sk_cachep); } module_exit(inet6_exit); #endif /* MODULE */ diff -rupN -X /home/daniel/dontdiff linux-2.5.68/net/ipv6/ip6_fib.c linux-2.5.68-sock/net/ipv6/ip6_fib.c --- linux-2.5.68/net/ipv6/ip6_fib.c Sat Apr 19 19:50:37 2003 +++ linux-2.5.68-sock/net/ipv6/ip6_fib.c Tue Apr 29 09:03:30 2003 @@ -1241,6 +1241,8 @@ void __init fib6_init(void) void fib6_gc_cleanup(void) { del_timer(&ip6_fib_timer); + if (fib6_node_kmem) + kmem_cache_destroy(fib6_node_kmem); } #endif diff -rupN -X /home/daniel/dontdiff linux-2.5.68/net/ipv6/route.c linux-2.5.68-sock/net/ipv6/route.c --- linux-2.5.68/net/ipv6/route.c Sat Apr 19 19:50:34 2003 +++ linux-2.5.68-sock/net/ipv6/route.c Tue Apr 29 09:04:29 2003 @@ -1897,5 +1897,6 @@ void ip6_route_cleanup(void) xfrm6_fini(); rt6_ifdown(NULL); fib6_gc_cleanup(); + kmem_cache_destroy(ip6_dst_ops.kmem_cachep); } #endif /* MODULE */ --=-0IQSK81vzug9fKned0fJ-- From shemminger@osdl.org Tue Apr 29 10:15:37 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 10:15:46 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3THFbFu031780 for ; Tue, 29 Apr 2003 10:15:37 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3THFZW14476; Tue, 29 Apr 2003 10:15:35 -0700 Date: Tue, 29 Apr 2003 10:15:35 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: Race with netdevice unregister and dst_dev_event Message-Id: <20030429101535.17d97c23.shemminger@osdl.org> In-Reply-To: <20030429091023.3a73beda.shemminger@osdl.org> References: <20030428163557.60896645.shemminger@osdl.org> <20030428.175719.104057922.davem@redhat.com> <20030429091023.3a73beda.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2355 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Tue, 29 Apr 2003 09:10:23 -0700 Stephen Hemminger wrote: > On Mon, 28 Apr 2003 17:57:19 -0700 (PDT) > "David S. Miller" wrote: > > > From: Stephen Hemminger > > Date: Mon, 28 Apr 2003 16:35:57 -0700 > > > > So unless dst.c is fixed, there needs to be a rule NEVER use > > dev->destructor in network modules. > > > > I don't understand what the problem is. > > > > Look, this code in the DST cache merely puts the device (which is > > legal from any context) if the device lacks a destructor. > > > > If it has a destructor, it keeps the reference and once the DST entry > > dies the dst->dev is dev_put(). So it does in fact do the "cleanup" > > contrary to what you say, this happens during dst entry garbage > > collection. > > > > If the dst has a dst->dev attached, the device has a reference > > and thus so does your module which created the device and thus > > your module cannot be unloaded. > > > > So to reiterate, what exactly is the problem? :-) > > The problem is that the destructor points to code that is in the module, > and it doesn't get run during unregister but later when the dst cache > GC timer expores. > So it is possible for the module to go away before the DST entry is > released by dev_put() in the garbage collection (by timer). At that > point the destructor points to dead memory. > How about this solution, it resolves the problem when I unload bridge. It causes the cache to release immediately, if the device is a module. diff -Nru a/net/core/dst.c b/net/core/dst.c --- a/net/core/dst.c Tue Apr 29 10:12:10 2003 +++ b/net/core/dst.c Tue Apr 29 10:12:10 2003 @@ -228,7 +228,7 @@ _race_ _condition_. */ if (event!=NETDEV_DOWN && - dev->destructor == NULL && + (dev->destructor == NULL || dev->owner) && dst->output == dst_blackhole) { dst->dev = &loopback_dev; dev_put(dev); From shemminger@osdl.org Tue Apr 29 10:35:26 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 10:35:29 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3THZPFu032194 for ; Tue, 29 Apr 2003 10:35:26 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3THZOW27270; Tue, 29 Apr 2003 10:35:24 -0700 Date: Tue, 29 Apr 2003 10:35:24 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] [BRIDGE] Change bridge forwarding table to use hlist Message-Id: <20030429103524.15f56cbf.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2356 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Switch bridge functional table to using hlist_macros. The code was using the same form of hash list already, this just uses the convient macros. Needed to add one more macro for hlist_for_each_safe in the same style as list_for_each_safe. Thought about doing hlist_for_each_entry, but it gets too ugly. diff -urNp -X dontdiff linux-2.5/include/linux/list.h linux-2.5-bridge/include/linux/list.h --- linux-2.5/include/linux/list.h 2003-04-29 09:57:41.000000000 -0700 +++ linux-2.5-bridge/include/linux/list.h 2003-04-29 10:13:03.000000000 -0700 @@ -437,6 +437,10 @@ static __inline__ void hlist_add_before( for (pos = (head)->first; pos; \ pos = pos->next) +#define hlist_for_each_safe(pos, n, head) \ + for (pos = (head)->first; n = pos ? pos->next : 0, pos; \ + pos = n) + #else #warning "don't include kernel headers in userspace" #endif /* __KERNEL__ */ diff -urNp -X dontdiff linux-2.5/net/bridge/br_fdb.c linux-2.5-bridge/net/bridge/br_fdb.c --- linux-2.5/net/bridge/br_fdb.c 2003-04-29 09:57:41.000000000 -0700 +++ linux-2.5-bridge/net/bridge/br_fdb.c 2003-04-29 10:13:03.000000000 -0700 @@ -68,28 +68,6 @@ static __inline__ int br_mac_hash(unsign return x & (BR_HASH_SIZE - 1); } -static __inline__ void __hash_link(struct net_bridge *br, - struct net_bridge_fdb_entry *ent, - int hash) -{ - ent->next_hash = br->hash[hash]; - if (ent->next_hash != NULL) - ent->next_hash->pprev_hash = &ent->next_hash; - br->hash[hash] = ent; - ent->pprev_hash = &br->hash[hash]; -} - -static __inline__ void __hash_unlink(struct net_bridge_fdb_entry *ent) -{ - *(ent->pprev_hash) = ent->next_hash; - if (ent->next_hash != NULL) - ent->next_hash->pprev_hash = ent->pprev_hash; - ent->next_hash = NULL; - ent->pprev_hash = NULL; -} - - - void br_fdb_changeaddr(struct net_bridge_port *p, unsigned char *newaddr) { struct net_bridge *br; @@ -99,22 +77,24 @@ void br_fdb_changeaddr(struct net_bridge br = p->br; write_lock_bh(&br->hash_lock); for (i=0;ihash[i]) { + struct net_bridge_fdb_entry *f + = hlist_entry(h, struct net_bridge_fdb_entry, hlist); - f = br->hash[i]; - while (f != NULL) { if (f->dst == p && f->is_local) { memcpy(f->addr.addr, newaddr, ETH_ALEN); if (newhash != i) { - __hash_unlink(f); - __hash_link(br, f, newhash); + hlist_del(&f->hlist); + hlist_add_head(&f->hlist, + &br->hash[newhash]); } - write_unlock_bh(&br->hash_lock); - return; + goto out; } - f = f->next_hash; } } + out: write_unlock_bh(&br->hash_lock); } @@ -127,19 +107,16 @@ void br_fdb_cleanup(struct net_bridge *b write_lock_bh(&br->hash_lock); for (i=0;ihash[i]; - while (f != NULL) { - struct net_bridge_fdb_entry *g; - - g = f->next_hash; + struct hlist_node *h, *g; + + hlist_for_each_safe(h, g, &br->hash[i]) { + struct net_bridge_fdb_entry *f + = hlist_entry(h, struct net_bridge_fdb_entry, hlist); if (!f->is_static && time_before_eq(f->ageing_timer, timeout)) { - __hash_unlink(f); + hlist_del(&f->hlist); br_fdb_put(f); } - f = g; } } write_unlock_bh(&br->hash_lock); @@ -151,18 +128,15 @@ void br_fdb_delete_by_port(struct net_br write_lock_bh(&br->hash_lock); for (i=0;ihash[i]; - while (f != NULL) { - struct net_bridge_fdb_entry *g; - - g = f->next_hash; + struct hlist_node *h, *g; + + hlist_for_each_safe(h, g, &br->hash[i]) { + struct net_bridge_fdb_entry *f + = hlist_entry(h, struct net_bridge_fdb_entry, hlist); if (f->dst == p) { - __hash_unlink(f); + hlist_del(&f->hlist); br_fdb_put(f); } - f = g; } } write_unlock_bh(&br->hash_lock); @@ -170,25 +144,24 @@ void br_fdb_delete_by_port(struct net_br struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br, unsigned char *addr) { - struct net_bridge_fdb_entry *fdb; + struct hlist_node *h; read_lock_bh(&br->hash_lock); - fdb = br->hash[br_mac_hash(addr)]; - while (fdb != NULL) { + + hlist_for_each(h, &br->hash[br_mac_hash(addr)]) { + struct net_bridge_fdb_entry *fdb + = hlist_entry(h, struct net_bridge_fdb_entry, hlist); + if (!memcmp(fdb->addr.addr, addr, ETH_ALEN)) { - if (!has_expired(br, fdb)) { - atomic_inc(&fdb->use_count); - read_unlock_bh(&br->hash_lock); - return fdb; - } + if (has_expired(br, fdb)) + goto ret_null; + atomic_inc(&fdb->use_count); read_unlock_bh(&br->hash_lock); - return NULL; + return fdb; } - - fdb = fdb->next_hash; } - + ret_null: read_unlock_bh(&br->hash_lock); return NULL; } @@ -213,12 +186,16 @@ int br_fdb_get_entries(struct net_bridge read_lock_bh(&br->hash_lock); for (i=0;ihash[i]; f != NULL && num < maxnum; - f = f->next_hash) { + struct hlist_node *h; + + hlist_for_each(h, &br->hash[i]) { + struct net_bridge_fdb_entry *f + = hlist_entry(h, struct net_bridge_fdb_entry, hlist); struct __fdb_entry ent; + if (num >= maxnum) + goto out; + if (has_expired(br, f)) continue; @@ -277,14 +254,15 @@ void br_fdb_insert(struct net_bridge *br unsigned char *addr, int is_local) { + struct hlist_node *h; struct net_bridge_fdb_entry *fdb; int hash; hash = br_mac_hash(addr); write_lock_bh(&br->hash_lock); - fdb = br->hash[hash]; - while (fdb != NULL) { + hlist_for_each(h, &br->hash[hash]) { + fdb = hlist_entry(h, struct net_bridge_fdb_entry, hlist); if (!fdb->is_local && !memcmp(fdb->addr.addr, addr, ETH_ALEN)) { __fdb_possibly_replace(fdb, source, is_local); @@ -292,7 +270,6 @@ void br_fdb_insert(struct net_bridge *br return; } - fdb = fdb->next_hash; } fdb = kmalloc(sizeof(*fdb), GFP_ATOMIC); @@ -308,7 +285,7 @@ void br_fdb_insert(struct net_bridge *br fdb->is_static = is_local; fdb->ageing_timer = jiffies; - __hash_link(br, fdb, hash); + hlist_add_head(&fdb->hlist, &br->hash[hash]); write_unlock_bh(&br->hash_lock); } diff -urNp -X dontdiff linux-2.5/net/bridge/br_private.h linux-2.5-bridge/net/bridge/br_private.h --- linux-2.5/net/bridge/br_private.h 2003-04-29 09:57:41.000000000 -0700 +++ linux-2.5-bridge/net/bridge/br_private.h 2003-04-29 10:13:03.000000000 -0700 @@ -43,8 +43,7 @@ struct mac_addr struct net_bridge_fdb_entry { - struct net_bridge_fdb_entry *next_hash; - struct net_bridge_fdb_entry **pprev_hash; + struct hlist_node hlist; atomic_t use_count; mac_addr addr; struct net_bridge_port *dst; @@ -86,7 +85,7 @@ struct net_bridge struct net_device dev; struct net_device_stats statistics; rwlock_t hash_lock; - struct net_bridge_fdb_entry *hash[BR_HASH_SIZE]; + struct hlist_head hash[BR_HASH_SIZE]; struct timer_list tick; /* STP */ From modica@sgi.com Tue Apr 29 11:45:23 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 11:45:56 -0700 (PDT) Received: from tolkor.sgi.com ([198.149.18.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TIjMFu000584 for ; Tue, 29 Apr 2003 11:45:23 -0700 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by tolkor.sgi.com (8.12.9/8.12.2/linux-outbound_gateway-1.2) with ESMTP id h3TIx6Ve024323 for ; Tue, 29 Apr 2003 13:59:06 -0500 Received: from sgi.com (eagdhcp-232-154.americas.sgi.com [128.162.232.154]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id h3TIiF4O5604208 for ; Tue, 29 Apr 2003 11:44:16 -0700 (PDT) Message-ID: <3EAEC7FF.4040504@sgi.com> Date: Tue, 29 Apr 2003 13:44:15 -0500 From: Steve Modica Organization: SGI User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030425 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: Zero copy transmit Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2357 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: modica@sgi.com Precedence: bulk X-list: netdev Hi All, We are doing some experiementing with Altix systems (Itanium II with NUMA) and we're taking a big hit from __copy_user traffic. We would like to modify the write, writev, send and sendto interfaces such that we can avoid the __copy_user call by marking pages copy-on-write (COW) and handing them off to be transmitted. Since this requires TLB updates, we would only implement this code on platforms that defined themselves as capable of fast TLB updates. There was a lot of concern expressed on the l-k alias about COW being difficult to support becaue of the TLB update issues, but NUMA systems have to be especially quick at TLB updates, so it's something we want to take advantage of. I'm looking for comments and suggestions as to how we could do this without impacting other system types. Best Regards! Steve -- Steve Modica Manager - Networking Drivers Group "Give a man a fish, and he will eat for a day, hit him with a fish and he leaves you alone" - me From ak@suse.de Tue Apr 29 12:20:48 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 12:20:51 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TJKkFu004894 for ; Tue, 29 Apr 2003 12:20:47 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id 513A514BF7; Tue, 29 Apr 2003 21:20:41 +0200 (MEST) Date: Tue, 29 Apr 2003 21:20:41 +0200 From: Andi Kleen To: Steve Modica Cc: netdev@oss.sgi.com Subject: Re: Zero copy transmit Message-ID: <20030429192041.GC17413@Wotan.suse.de> References: <3EAEC7FF.4040504@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3EAEC7FF.4040504@sgi.com> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2358 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 01:44:15PM -0500, Steve Modica wrote: > We are doing some experiementing with Altix systems (Itanium II with > NUMA) and we're taking a big hit from __copy_user traffic. We would > like to modify the write, writev, send and sendto interfaces such that > we can avoid the __copy_user call by marking pages copy-on-write (COW) > and handing them off to be transmitted. Since this requires TLB > updates, we would only implement this code on platforms that defined > themselves as capable of fast TLB updates. A much better way would be to use the POSIX aio interfaces. They support zero copy transmit, but don't require COW. Instead they just tell the user process when it is safe to touch the buffer again. There was already some code to do aio TCP sending, but it didn't do zero copy and was not merged for some reason. Also you can already do zero copy transmit using sendfile() Linux basically has all the infrastructure you need for this already; just the high level interface to the AIO system calls is still missing. -Andi From maxk@qualcomm.com Tue Apr 29 12:22:30 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 12:22:34 -0700 (PDT) Received: from ithilien.qualcomm.com (ithilien.qualcomm.com [129.46.51.59]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TJMUFu005641 for ; Tue, 29 Apr 2003 12:22:30 -0700 Received: from sabrina.qualcomm.com (sabrina.qualcomm.com [129.46.61.150]) by ithilien.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3TJLqJo015570; Tue, 29 Apr 2003 12:21:52 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by sabrina.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3TJLotf019888; Tue, 29 Apr 2003 12:21:50 -0700 (PDT) Message-Id: <5.1.0.14.2.20030429103638.10bf0a00@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Tue, 29 Apr 2003 12:21:49 -0700 To: Arnaldo Carvalho de Melo From: Max Krasnyansky Subject: Re: New module infrastructure for net_proto_family Cc: netdev@oss.sgi.com In-Reply-To: <20030429014326.GA24835@conectiva.com.br> References: <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> <20030424230202.GB2931@conectiva.com.br> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2359 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev At 06:43 PM 4/28/2003, Arnaldo Carvalho de Melo wrote: >Em Mon, Apr 28, 2003 at 02:10:11PM -0700, Max Krasnyansky escreveu: >> Hi Arnaldo, >> >> Hmm, no comments on my last email (http://marc.theaimsgroup.com/?l=linux-netdev&m=105123134301565&w=2) >> Are you trying to ignore me too ? ;-) > >Nope, I was working on the higher layer first, to then come to the net families >that are already modular and have per-protocol modules, and I'm starting to look >into the only, AFAIK, network family that has this in place: bluetooth :-) > >Having said that I haven't fully studied this I see two scenarios (brainstorming): > >1. the net family that wants per protocol "sub" modules "duplicates" the >infrastructure having PROTO_sk_alloc and PROTO_destruct (the sk_free >sk->destruct hook call), PROTO_sk_alloc uses its net_families equivalent >(bt_proto in bluetooth) to find the owner (the "sub" module, i.e. per protocol >module) and PROTO_net_family_gets it, then calls sk_alloc proper, and when the >last reference to the sock is released the sk->destruct is called >(PROTO_destruct) does the PROTO_net_family_put. Ditto for the socket case, >where PROTO_create, before calling the ->create of the "sub" module does the >PROTO_net_family_get, and at release time its PROTO_release does the same thing >that sock_release does. Something like this may well need extra info to be kept >at the private area of the proto family in struct sock protinfo or private slab >cache. That can probably be done. But what happened to "protocol writers don't have to worry about this issues" ideas though ;-) ? The other thing that I don't like is that to create one socket we'd have to call whole bunch of functions to take care of the module refcounting. So I want to bring these questions again: - Why do we have to bump module refcount for 'struct sock' with _default_ callbacks ? My answer is that we don't have to. I'd even say that we shouldn't. Module is not referenced from struct sock in that case. - Why are we not allowing net_family unregistration until all family sockets are gone ? From what I see it's only because current code does 'module_put(net_families[family]->owner)'. I'm saying that we don't care whether net_family is registered or not if we know who owns the socket (i.e. sock->owner). So my point is yes we can make families to implement their own infrastructure for module refcounting. But the solution is going to be more complicated than just having sock->owner and sk->owner fields and allowing for ownership transfers. >That is, we have a higher layer for net families, with locking for the whole >family done like it is on the tree now and a lower layer at the specific >net family, both having the same behaviour at its layers. > >This option seems to be easy to implement with the current bluetooth >infrastructure (i.e. it has a net_families equivalent, it does the switching at >bt_create time, etc). Well, we already use sk->destruct call back in Bluetooth protocols (each proto has its own call back that does different things). I think we should not use existing sk call backs for module refcounting. Max From holt@sgi.com Tue Apr 29 12:33:54 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 12:33:57 -0700 (PDT) Received: from rj.sgi.com (rj.SGI.COM [192.82.208.96]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TJXpFu006288 for ; Tue, 29 Apr 2003 12:33:53 -0700 Received: from ledzep.americas.sgi.com (ledzep.americas.sgi.com [192.48.203.134]) by rj.sgi.com (8.12.9/8.12.2/linux-outbound_gateway-1.2) with ESMTP id h3TJXkE0010184 for ; Tue, 29 Apr 2003 12:33:46 -0700 Received: from thistle-e236.americas.sgi.com (thistle-e236.americas.sgi.com [128.162.236.204]) by ledzep.americas.sgi.com (8.12.9/americas-smart-nospam1.1) with ESMTP id h3TJXda221895772; Tue, 29 Apr 2003 14:33:39 -0500 (CDT) Received: from mandrake.americas.sgi.com (mandrake.americas.sgi.com [128.162.232.96]) by thistle-e236.americas.sgi.com (8.12.9/SGI-server-1.8) with ESMTP id h3TJXc0L4818681; Tue, 29 Apr 2003 14:33:38 -0500 (CDT) Received: from mandrake.americas.sgi.com (localhost.localdomain [127.0.0.1]) by mandrake.americas.sgi.com (8.12.5/8.11.6/erikj-RedHat-7.2-Eagan) with ESMTP id h3TJXcmF032492; Tue, 29 Apr 2003 14:33:38 -0500 Received: (from holt@localhost) by mandrake.americas.sgi.com (8.12.5/8.12.5/Submit) id h3TJXajm032490; Tue, 29 Apr 2003 14:33:36 -0500 Date: Tue, 29 Apr 2003 14:33:36 -0500 From: Robin Holt To: Andi Kleen Cc: Steve Modica , netdev@oss.sgi.com Subject: Re: Zero copy transmit Message-ID: <20030429193336.GA32270@sgi.com> References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030429192041.GC17413@Wotan.suse.de> User-Agent: Mutt/1.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2360 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: holt@sgi.com Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 09:20:41PM +0200, Andi Kleen wrote: > A much better way would be to use the POSIX aio interfaces. They support > zero copy transmit, but don't require COW. Instead they just tell > the user process when it is safe to touch the buffer again. > > There was already some code to do aio TCP sending, but it didn't > do zero copy and was not merged for some reason. > > Also you can already do zero copy transmit using sendfile() Users would need to rewrite all their apps to use either the async or sendfile method. That assumption seems a little broad. I don't disagree that implementing the remainder of the AIO system calls would also be good, but is there something wrong with getting write et. al. to work with zero copy? Robin Holt From ak@suse.de Tue Apr 29 12:41:38 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 12:41:43 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TJfbFu006623 for ; Tue, 29 Apr 2003 12:41:38 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id 6180F150C4; Tue, 29 Apr 2003 21:41:32 +0200 (MEST) Date: Tue, 29 Apr 2003 21:41:31 +0200 From: Andi Kleen To: Robin Holt Cc: Andi Kleen , Steve Modica , netdev@oss.sgi.com Subject: Re: Zero copy transmit Message-ID: <20030429194131.GA349@Wotan.suse.de> References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> <20030429193336.GA32270@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030429193336.GA32270@sgi.com> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2361 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 02:33:36PM -0500, Robin Holt wrote: > On Tue, Apr 29, 2003 at 09:20:41PM +0200, Andi Kleen wrote: > > A much better way would be to use the POSIX aio interfaces. They support > > zero copy transmit, but don't require COW. Instead they just tell > > the user process when it is safe to touch the buffer again. > > > > There was already some code to do aio TCP sending, but it didn't > > do zero copy and was not merged for some reason. > > > > Also you can already do zero copy transmit using sendfile() > > Users would need to rewrite all their apps to use either the async or > sendfile method. That assumption seems a little broad. In my experience only a few programs are performance critical in this way; and their developers/users usually do not mind changing their programs a bit to get the best performance. In fact they are always happy when they get such knobs from you ;) > > I don't disagree that implementing the remainder of the AIO system > calls would also be good, but is there something wrong with getting > write et. al. to work with zero copy? You have to ask DaveM/Alexey - they had it, but rejected it, apparently also based on some bad experiences on other operating systems. I can see their point - e.g. in the worst case each write could trigger two TLB flush IPIs to all CPUs in the system (one to COW it and another to un COW it). You can copy a lot of data in the time it takes to process all of them, especially on a big machine. -Andi From modica@sgi.com Tue Apr 29 12:42:33 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 12:42:37 -0700 (PDT) Received: from zok.sgi.com (zok.SGI.COM [204.94.215.101]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TJgXFu006866 for ; Tue, 29 Apr 2003 12:42:33 -0700 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by zok.sgi.com (8.12.9/8.12.2/linux-outbound_gateway-1.2) with ESMTP id h3TJgSVV023242 for ; Tue, 29 Apr 2003 12:42:28 -0700 Received: from sgi.com (eagdhcp-232-154.americas.sgi.com [128.162.232.154]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id h3TJfR4O5605996 for ; Tue, 29 Apr 2003 12:41:27 -0700 (PDT) Message-ID: <3EAED567.2090006@sgi.com> Date: Tue, 29 Apr 2003 14:41:27 -0500 From: Steve Modica Organization: SGI User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030425 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: Re: Zero copy transmit References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> In-Reply-To: <20030429192041.GC17413@Wotan.suse.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2362 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: modica@sgi.com Precedence: bulk X-list: netdev Andi Kleen wrote: > On Tue, Apr 29, 2003 at 01:44:15PM -0500, Steve Modica wrote: > >>We are doing some experiementing with Altix systems (Itanium II with >>NUMA) and we're taking a big hit from __copy_user traffic. We would >>like to modify the write, writev, send and sendto interfaces such that >>we can avoid the __copy_user call by marking pages copy-on-write (COW) >>and handing them off to be transmitted. Since this requires TLB >>updates, we would only implement this code on platforms that defined >>themselves as capable of fast TLB updates. > > > A much better way would be to use the POSIX aio interfaces. They support > zero copy transmit, but don't require COW. Instead they just tell > the user process when it is safe to touch the buffer again. > > There was already some code to do aio TCP sending, but it didn't > do zero copy and was not merged for some reason. > > Also you can already do zero copy transmit using sendfile() > > Linux basically has all the infrastructure you need for this already; > just the high level interface to the AIO system calls is still missing. > > -Andi Hi Andi, We are aware of sendfile() and used it for the purposes of proving that zero copy would make a big difference for us. At issue is really application capture and customer adoption. There are tons of apps and lots of engineers that know socket operations and write/writev. Asking all ISVs to recode for linux would leave them with two separate APIs to deal with. They would have send/sendto or write/writev on Solaris, HPUX and whatever else, and linux would have sendfile. We really want to do this in such a way that it doesn't create a huge footprint (and we think we can) and we want to make sure we don't impact systems that can't take advantage of fast TLB updates. Steve -- Steve Modica work: 651-683-3224 mobile: 651-261-3201 Manager - Networking Drivers Group "Give a man a fish, and he will eat for a day, hit him with a fish and he leaves you alone" - me From ak@suse.de Tue Apr 29 12:59:31 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 12:59:34 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TJxUFu007354 for ; Tue, 29 Apr 2003 12:59:30 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id 22748150C4; Tue, 29 Apr 2003 21:59:25 +0200 (MEST) Date: Tue, 29 Apr 2003 21:59:24 +0200 From: Andi Kleen To: Steve Modica Cc: netdev@oss.sgi.com Subject: Re: Zero copy transmit Message-ID: <20030429195924.GC349@Wotan.suse.de> References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> <3EAED567.2090006@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3EAED567.2090006@sgi.com> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2363 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev > At issue is really application capture and customer adoption. There are > tons of apps and lots of engineers that know socket operations and > write/writev. Asking all ISVs to recode for linux would leave them with > two separate APIs to deal with. They would have send/sendto or > write/writev on Solaris, HPUX and whatever else, and linux would have > sendfile. aio_write / lio_listio exists on Solaris and HP/UX too. (and even Windows; their completion port interfaces are very similar) > > We really want to do this in such a way that it doesn't create a huge > footprint (and we think we can) and we want to make sure we don't impact > systems that can't take advantage of fast TLB updates. So how do you avoid the two TLB flush IPIs to all CPUs that have the current mm mapped ? -Andi From modica@sgi.com Tue Apr 29 13:10:19 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 13:10:23 -0700 (PDT) Received: from zok.sgi.com (zok.SGI.COM [204.94.215.101]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TKAIFu007910 for ; Tue, 29 Apr 2003 13:10:19 -0700 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by zok.sgi.com (8.12.9/8.12.2/linux-outbound_gateway-1.2) with ESMTP id h3TKADVV025787 for ; Tue, 29 Apr 2003 13:10:13 -0700 Received: from sgi.com (eagdhcp-232-154.americas.sgi.com [128.162.232.154]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id h3TK9D4O4703918 for ; Tue, 29 Apr 2003 13:09:13 -0700 (PDT) Message-ID: <3EAEDBE9.1060405@sgi.com> Date: Tue, 29 Apr 2003 15:09:13 -0500 From: Steve Modica Reply-To: netdev@oss.sgi.com Organization: SGI User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030425 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: Re: Zero copy transmit References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> <3EAED567.2090006@sgi.com> <20030429195924.GC349@Wotan.suse.de> In-Reply-To: <20030429195924.GC349@Wotan.suse.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2364 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: modica@sgi.com Precedence: bulk X-list: netdev Andi Kleen wrote: >>At issue is really application capture and customer adoption. There are >>tons of apps and lots of engineers that know socket operations and >>write/writev. Asking all ISVs to recode for linux would leave them with >>two separate APIs to deal with. They would have send/sendto or >>write/writev on Solaris, HPUX and whatever else, and linux would have >>sendfile. > > > aio_write / lio_listio exists on Solaris and HP/UX too. > > (and even Windows; their completion port interfaces are very similar) Right.. although some might say that aio_write is used a lot less often than write or send. It's hard to convince thousands of application writers to revisit stuff like this. It's a lot easier to bring the hardware feature in to the APIs that people just commonly use. > > >>We really want to do this in such a way that it doesn't create a huge >>footprint (and we think we can) and we want to make sure we don't impact >>systems that can't take advantage of fast TLB updates. > > > So how do you avoid the two TLB flush IPIs to all CPUs that have the current mm > mapped ? > > -Andi I could speculate about how we might avoid that, or I could speculate that even with those operations, it would still be faster, but I'd rather just demonstrate it with a patch. Don't get me wrong, we would certainly drop any notions of this if we found that it was slower and I will be glad to post any results. The goal is to take advantage of the hardware to make things faster. Going back to your example above, don't solaris and hpux also do COW for write and send? (I don't have their sources) If so, why would they do it if it's slower? Steve -- Steve Modica work: 651-683-3224 mobile: 651-261-3201 Manager - Networking Drivers Group "Give a man a fish, and he will eat for a day, hit him with a fish and he leaves you alone" - me From maxk@qualcomm.com Tue Apr 29 13:15:31 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 13:15:49 -0700 (PDT) Received: from warlock.qualcomm.com (warlock.qualcomm.com [129.46.50.49]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TKFUFu008563 for ; Tue, 29 Apr 2003 13:15:31 -0700 Received: from numenor.qualcomm.com (numenor.qualcomm.com [129.46.51.58]) by warlock.qualcomm.com (8.12.9/8.12.3/1.0) with ESMTP id h3TKFSSR007374 for ; Tue, 29 Apr 2003 13:15:29 -0700 (PDT) Received: from crowley.qualcomm.com (crowley.qualcomm.com [129.46.61.151]) by numenor.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3TK5x7t025126 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Tue, 29 Apr 2003 13:06:00 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by crowley.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3TK5vkR021980; Tue, 29 Apr 2003 13:05:57 -0700 (PDT) Message-Id: <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Tue, 29 Apr 2003 13:05:08 -0700 To: Arnaldo Carvalho de Melo , "David S. Miller" From: Max Krasnyansky Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules Cc: mostrows@speakeasy.net, netdev@oss.sgi.com In-Reply-To: <20030429065419.GN25361@conectiva.com.br> References: <20030428.222728.48508327.davem@redhat.com> <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2365 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev At 11:54 PM 4/28/2003, Arnaldo Carvalho de Melo wrote: >Em Mon, Apr 28, 2003 at 10:27:28PM -0700, David S. Miller escreveu: >> From: Arnaldo Carvalho de Melo >> Date: Tue, 29 Apr 2003 03:12:27 -0300 >> >> Max, take a look and see if this same approach can be used in >> bluetooth, I bet it can, its just a matter of not using struct >> net_proto_family for bt_proto, just like pppox already was doing >> before my changes :-) >> >> Something similar can be done for ipv4/ipv6 by adding a struct module >> *owner member to struct inet_protosw etc. etc. > >yes > >> Although the idea is conceptually sound, you miss one crucial thing. >> Such struct sock's reference _TWO_ modules, the "PPPOE" module >> and the "PPPOX" module. This is not a problem. PPPOX (or ipv4/ipv6) module is not going to go away simply because PPPOE (or TCP/UDP) uses symbols from it. There is no need to bump refcounters here. I think it's safe to say that protocols within the family always use symbols from main family module (they have to at list register/unregister). So this is naturally taken care of. >But what is the problem? at pppox_sk_alloc time I bump the PPPOE module refcnt, >making it safe, then it calls sk_alloc where it bumps the PPPOX module, making >it safe as well, so I'm taking care of both PPPOE and PPPOX. Bumping refcount for PPPOX is an overhead without any benefits. Read above. >> struct module *owner; > >This one is the net_families[net_family]->owner > >> struct module *sub_owner; > >this one is the pppox_protos[protocol]->owner > >I thought about it, but I don't see why the current scheme doesn't handle >it, care to elaborate a bit more? I don't doubt that I may be missing some >subtlety :-) Ok. I'm going to ask this here again (to make sure that it's answered :)) - Why do we have to bump module refcount for 'struct sock' with _default_ callbacks ? My answer is that we don't have to. I'd even say that we shouldn't. Module is not referenced from 'struct sock' in that case. - Why are we not allowing net_family unregistration until all family sockets are gone ? From what I see it's only because current code does 'module_put(net_families[family]->owner)'. But we don't care whether net_family is registered or not if we know who owns the socket (i.e. sock->owner). So far nobody gave me a clear answer to those questions. If we don't have to meet those two restriction I don't see the point in creating all this net_family_get()/xxx_family_get(), etc, infrastructure. Patches and BK stuff that I've seen so far added more code (and a bit more overhead) than my original patch with sock->owner/sk->owner/sk_set_owner(). Yet they provide no additional flexibility or functionality. I hate to repeat myself and please forgive me for that. But how is the current infrastructure better than following ? ---- sock_create() { ... if (!try_module_get(npf->owner)) goto fail; sock->owner = npf->owner; if (family_sock_create() < 0) { sock_release(sock); goto fail; } ... } From this point on we don't care if net_proto_family is still registered or not, we know who owns the socket. sock_accept() { ... __module_get(sock->owner); newsock->owner = sock->owner; ... } sock_release() { ... module_put(sock->owner); ... } family_sock_create() (i.e. bt_sock_create(), etc) { ... #ifdef SPECIAL_FAMILY_THAT_HANDLES_PROTOCOLS_IN_SEPARATE_MODULES if (!try_module_get(proto_module)) goto fail; prev_owner = sock->owner; sock->owner = proto_module; module_put(prev_owner); #else /* Other families do not have to do anything */ #endif ... } That's it for 'struct socket'. And I mean that is _it_. Family can be unregistered and stuff, we don't care, and why should we. Now 'struct sock'. It can exist independently from 'struct socket' and therefor is a separate issue. We only care about callbacks (sk->data_ready(), etc) and private sk slab caches. Some protocols simply use default callback which belong to non modular part of the kernel. Those don't have to do anything. They will just work. Other protocols replace callbacks and therefor have to make sure that module is still loaded while sk exists. For those modules we need the following void sk_set_owner(struct module *owner) { /* Module must already hold reference when it calls this function. */ __module_get(owner); sk->owner = owner; } sk_free() { ... module_put(sk->owner); ... } xxx_proto_set_sk_callbacks() { ... sk_set_owner(THIS_MODULE); sk->destroy = proto_destroy; ... } That's it. There is no need to modify sk_alloc() or anything else. So it's not going to introduce any overhead during socket creation from protocols that aren't modules or use default callback. And it gives us a flexibility of being able to pass ownership of the socket to another module or release module without having to access global family array. For example if protocol wants to be unloaded but socket is still being used by net code it could do something like write_lock(&sk->callback_lock); sk->data_ready = default_data_ready; ... other non default callbacks ... module_put(sk->owner); sk_set_owner(NULL); write_unlock(&sk->callback_lock); --- Thanks Max From hch@infradead.org Tue Apr 29 13:17:40 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 13:17:43 -0700 (PDT) Received: from phoenix.infradead.org (phoenix.infradead.org [195.224.96.167]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TKHdFu008874 for ; Tue, 29 Apr 2003 13:17:40 -0700 Received: from hch by phoenix.infradead.org with local (Exim 4.10) id 19AbXl-0002bR-00; Tue, 29 Apr 2003 21:17:37 +0100 Date: Tue, 29 Apr 2003 21:17:37 +0100 From: Christoph Hellwig To: Steve Modica Cc: netdev@oss.sgi.com Subject: Re: Zero copy transmit Message-ID: <20030429211737.A9926@infradead.org> References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> <3EAED567.2090006@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <3EAED567.2090006@sgi.com>; from modica@sgi.com on Tue, Apr 29, 2003 at 02:41:27PM -0500 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2366 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 02:41:27PM -0500, Steve Modica wrote: > At issue is really application capture and customer adoption. There are > tons of apps and lots of engineers that know socket operations and > write/writev. Asking all ISVs to recode for linux would leave them with > two separate APIs to deal with. They would have send/sendto or > write/writev on Solaris, HPUX and whatever else, and linux would have > sendfile. Solaris and HPUX have sendfile, the HPUX one has a slightly different API, the Solaris one is modelled after Linux. From ak@suse.de Tue Apr 29 13:39:52 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 13:39:58 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TKdpFu009473 for ; Tue, 29 Apr 2003 13:39:52 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id 7337F150D1; Tue, 29 Apr 2003 22:39:46 +0200 (MEST) Date: Tue, 29 Apr 2003 22:39:46 +0200 From: Andi Kleen To: netdev@oss.sgi.com Cc: modica@sgi.com Subject: Re: Zero copy transmit Message-ID: <20030429203945.GD349@Wotan.suse.de> References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> <3EAED567.2090006@sgi.com> <20030429195924.GC349@Wotan.suse.de> <3EAEDBE9.1060405@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3EAEDBE9.1060405@sgi.com> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2367 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev > Don't get me wrong, we would certainly drop any notions of this if we > found that it was slower and I will be glad to post any results. The > goal is to take advantage of the hardware to make things faster. You have no hardware to make the remote TLB flushes fast ;) I'm sure you can show it being an advantage with a single threaded process. But when you run it on a multithreaded application just with two threads it may look very different. > Going back to your example above, don't solaris and hpux also do COW for > write and send? (I don't have their sources) If so, why would they do > it if it's slower? I don't know if they do. The only Unix I'm aware of that has zero copy sendmsg() is NetBSD and their focus does not seem to be SMP scalability. I observed the problem recently just with swapping a big (10GB) process whose working set slightly exceeded the available memory. kswapd was running on one CPU; the process on another. kswapd was aging the pages of the memory hog all the time, which requires an unmapping and a remote TLB flush in the process' page tables. The result was that two CPUs were 100% tied up in the kernel, just spinning on the page_table_lock of the mm and processing TLB IPIs (spinlock was ~50%; IPI overhead 40% or so). I predict that your proposed TLB flushing write will cause the same problem with lots of writes. It's more or less the same thing, except that kswapd has a builtin rate limit and runs only on a single CPU and write() has not. Also last time I checked most Linux ports still used an single global spinlock for the TLB flush IPI. You would add a nice new hot lock to the network path. -Andi From acme@conectiva.com.br Tue Apr 29 15:07:57 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 15:08:04 -0700 (PDT) Received: from perninha.conectiva.com.br (perninha.conectiva.com.br [200.250.58.156]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TM7sFu011109 for ; Tue, 29 Apr 2003 15:07:55 -0700 Received: from brinquendo.conectiva.com.br (dhcp182.distro.conectiva [10.0.20.182]) by perninha.conectiva.com.br (Postfix) with ESMTP id 2B66C4761B; Tue, 29 Apr 2003 19:07:43 -0300 (BRT) Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 96ADA1966D; Tue, 29 Apr 2003 22:07:46 +0000 (UTC) Date: Tue, 29 Apr 2003 19:07:46 -0300 From: Arnaldo Carvalho de Melo To: Max Krasnyansky Cc: "David S. Miller" , mostrows@speakeasy.net, netdev@oss.sgi.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules Message-ID: <20030429220746.GB30222@conectiva.com.br> References: <20030428.222728.48508327.davem@redhat.com> <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2368 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Em Tue, Apr 29, 2003 at 01:05:08PM -0700, Max Krasnyansky escreveu: > At 11:54 PM 4/28/2003, Arnaldo Carvalho de Melo wrote: > >Em Mon, Apr 28, 2003 at 10:27:28PM -0700, David S. Miller escreveu: > >> From: Arnaldo Carvalho de Melo > >> Date: Tue, 29 Apr 2003 03:12:27 -0300 > >> Max, take a look and see if this same approach can be used in bluetooth, I > >> bet it can, its just a matter of not using struct net_proto_family for > >> bt_proto, just like pppox already was doing before my changes :-) > >> Something similar can be done for ipv4/ipv6 by adding a struct module > >> *owner member to struct inet_protosw etc. etc. > >yes > >> Although the idea is conceptually sound, you miss one crucial thing. > >> Such struct sock's reference _TWO_ modules, the "PPPOE" module > >> and the "PPPOX" module. > This is not a problem. PPPOX (or ipv4/ipv6) module is not going to > go away simply because PPPOE (or TCP/UDP) uses symbols from it. > There is no need to bump refcounters here. > I think it's safe to say that protocols within the family always use > symbols from main family module (they have to at list register/unregister). > So this is naturally taken care of. Because at the core level we don't know (and perhaps don't want to know) what the specific net family module nor its protocol modules are doing > >But what is the problem? at pppox_sk_alloc time I bump the PPPOE module refcnt, > >making it safe, then it calls sk_alloc where it bumps the PPPOX module, making > >it safe as well, so I'm taking care of both PPPOE and PPPOX. > Bumping refcount for PPPOX is an overhead without any benefits. Read above. > >> struct module *owner; > >This one is the net_families[net_family]->owner > >> struct module *sub_owner; > >this one is the pppox_protos[protocol]->owner > >I thought about it, but I don't see why the current scheme doesn't handle > >it, care to elaborate a bit more? I don't doubt that I may be missing some > >subtlety :-) > Ok. I'm going to ask this here again (to make sure that it's answered :)) Hey, I answered already, but it seems you disagree with my view 8) > - Why do we have to bump module refcount for 'struct sock' with _default_ callbacks ? > My answer is that we don't have to. I'd even say that we shouldn't. Module is not > referenced from 'struct sock' in that case. We just don't assume nothing about the net protocol family implementation, but now that the infrastructure is in place we can surely study further optimizations that don't break its layering abstraction. > - Why are we not allowing net_family unregistration until all family sockets > are gone? From what I see it's only because current code does > 'module_put(net_families[family]->owner)'. But we don't care whether > net_family is registered or not if we know who owns the socket (i.e. > sock->owner). but we introduce aditional overhead in all struct sock created, why it is so important to have the net_family unregistration done early rather than after all the struct sock are freed? > So far nobody gave me a clear answer to those questions. If we don't have to > meet those two restriction I don't see the point in creating all this > net_family_get()/xxx_family_get(), etc, infrastructure. Patches and BK stuff > that I've seen so far added more code (and a bit more overhead) than my > original patch with sock->owner/sk->owner/sk_set_owner(). Yet they provide > no additional flexibility or functionality. See, its a tradeoff, we don't bloat struct sock paying a bit of overhead in other area. > I hate to repeat myself and please forgive me for that. But how is the > current infrastructure better than following ? See my views above. And I'd love, as you, to have more people discussing this, but most people I think that could help with this are damn busy with other work, so at least we have a solid infrastructure in place and can revisit this later if there is interest in further enhancing this. - Arnaldo From shemminger@osdl.org Tue Apr 29 15:49:08 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 15:49:16 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TMn7Fu012038 for ; Tue, 29 Apr 2003 15:49:08 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3TMmuW04219; Tue, 29 Apr 2003 15:48:56 -0700 Date: Tue, 29 Apr 2003 15:48:56 -0700 From: Stephen Hemminger To: "David S. Miller" , Jay Schulist , Arnaldo Carvalho de Melo Cc: netdev@oss.sgi.com Subject: [PATCH] 2.5.68 - RCU for SNAP Message-Id: <20030429154856.39c75139.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2369 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Replace br_lock() in snap with Read Copy Update. Straightforward since SNAP uses list macros already. Tested by bringing up/down Appletalk on SMP system and making sure packets get through. This is the last subsystem that depends on br_lock before IPV4,IPV6 can be converted. --- linux-2.5/net/802/psnap.c 2003-04-14 13:32:25.000000000 -0700 +++ linux-2.5-bridge/net/802/psnap.c 2003-04-29 15:42:04.000000000 -0700 @@ -21,9 +21,9 @@ #include #include #include -#include -LIST_HEAD(snap_list); +static LIST_HEAD(snap_list); +static spinlock_t snap_lock = SPIN_LOCK_UNLOCKED; static struct llc_sap *snap_sap; /* @@ -34,17 +34,13 @@ struct list_head *entry; struct datalink_proto *proto = NULL, *p; - if (list_empty(&snap_list)) - goto out; - - list_for_each(entry, &snap_list) { + list_for_each_rcu(entry, &snap_list) { p = list_entry(entry, struct datalink_proto, node); if (!memcmp(p->type, desc, 5)) { proto = p; break; } } -out: return proto; } @@ -55,11 +51,13 @@ struct packet_type *pt) { int rc = 1; - struct datalink_proto *proto = find_snap_client(skb->h.raw); + struct datalink_proto *proto; static struct packet_type snap_packet_type = { .type = __constant_htons(ETH_P_SNAP), }; + rcu_read_lock(); + proto = find_snap_client(skb->h.raw); if (proto) { /* Pass the frame on. */ skb->h.raw += 5; @@ -71,6 +69,7 @@ rc = 1; } + rcu_read_unlock(); return rc; } @@ -124,7 +123,7 @@ { struct datalink_proto *proto = NULL; - br_write_lock_bh(BR_NETPROTO_LOCK); + spin_lock_bh(&snap_lock); if (find_snap_client(desc)) goto out; @@ -135,10 +134,12 @@ proto->rcvfunc = rcvfunc; proto->header_length = 5 + 3; /* snap + 802.2 */ proto->request = snap_request; - list_add(&proto->node, &snap_list); + list_add_rcu(&proto->node, &snap_list); } out: - br_write_unlock_bh(BR_NETPROTO_LOCK); + spin_unlock_bh(&snap_lock); + + synchronize_net(); return proto; } @@ -147,12 +148,13 @@ */ void unregister_snap_client(struct datalink_proto *proto) { - br_write_lock_bh(BR_NETPROTO_LOCK); + spin_lock_bh(&snap_lock); + list_del_rcu(&proto->node); + spin_unlock_bh(&snap_lock); - list_del(&proto->node); - kfree(proto); + synchronize_net(); - br_write_unlock_bh(BR_NETPROTO_LOCK); + kfree(proto); } MODULE_LICENSE("GPL"); From acme@conectiva.com.br Tue Apr 29 16:17:47 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 16:17:52 -0700 (PDT) Received: from perninha.conectiva.com.br (perninha.conectiva.com.br [200.250.58.156]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TNHRFu015159 for ; Tue, 29 Apr 2003 16:17:31 -0700 Received: from brinquendo.conectiva.com.br (dhcp182.distro.conectiva [10.0.20.182]) by perninha.conectiva.com.br (Postfix) with ESMTP id 85F1B475B6; Tue, 29 Apr 2003 18:55:55 -0300 (BRT) Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 59B781966D; Tue, 29 Apr 2003 21:55:58 +0000 (UTC) Date: Tue, 29 Apr 2003 18:55:57 -0300 From: Arnaldo Carvalho de Melo To: Max Krasnyansky Cc: netdev@oss.sgi.com Subject: Re: New module infrastructure for net_proto_family Message-ID: <20030429215557.GA30222@conectiva.com.br> References: <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> <20030424230202.GB2931@conectiva.com.br> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> <5.1.0.14.2.20030429103638.10bf0a00@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5.1.0.14.2.20030429103638.10bf0a00@unixmail.qualcomm.com> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2370 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Em Tue, Apr 29, 2003 at 12:21:49PM -0700, Max Krasnyansky escreveu: > At 06:43 PM 4/28/2003, Arnaldo Carvalho de Melo wrote: > >Em Mon, Apr 28, 2003 at 02:10:11PM -0700, Max Krasnyansky escreveu: > >> Hmm, no comments on my last email > >> (http://marc.theaimsgroup.com/?l=linux-netdev&m=105123134301565&w=2) Are > >> you trying to ignore me too ? ;-) > >Nope, I was working on the higher layer first, to then come to the net > >families that are already modular and have per-protocol modules, and I'm > >starting to look into the only, AFAIK, network family that has this in > >place: bluetooth :-) > >Having said that I haven't fully studied this I see two scenarios (brainstorming): > >1. the net family that wants per protocol "sub" modules "duplicates" the > >infrastructure having PROTO_sk_alloc and PROTO_destruct (the sk_free > >sk->destruct hook call), PROTO_sk_alloc uses its net_families equivalent > >(bt_proto in bluetooth) to find the owner (the "sub" module, i.e. per > >protocol module) and PROTO_net_family_gets it, then calls sk_alloc proper, > >and when the last reference to the sock is released the sk->destruct is > >called (PROTO_destruct) does the PROTO_net_family_put. Ditto for the socket > >case, where PROTO_create, before calling the ->create of the "sub" module > >does the PROTO_net_family_get, and at release time its PROTO_release does > >the same thing that sock_release does. Something like this may well need > >extra info to be kept at the private area of the proto family in struct sock > >protinfo or private slab cache. > That can probably be done. But what happened to "protocol writers don't have > to worry about this issues" ideas though ;-) ? They don't, unless they want to have its own infrastructure for loading modules for each specific protocol, look at all the net families that don't do that (i.e. all, except pppox and bluetooth, and perhaps ipv4 in the future, but as you said, this is not accepted by DaveM). And look at the pppox implementation, it didn't needed any changes to the struct sock protinfo/private slab cache, and removed code in the protocol module. > The other thing that I don't like is that to create one socket we'd have to > call whole bunch of functions to take care of the module refcounting. So I > want to bring these questions again: > - Why do we have to bump module refcount for 'struct sock' with _default_ callbacks ? Because we don't assume they won't use its own callbacks. > My answer is that we don't have to. I'd even say that we shouldn't. Module is not > referenced from struct sock in that case. > - Why are we not allowing net_family unregistration until all family sockets > are gone ? From what I see it's only because current code does > 'module_put(net_families[family]->owner)'. I'm saying that we don't care > whether net_family is registered or not if we know who owns the socket (i.e. > sock->owner). but then we move the overhead to _all_ struct sock, overhead (memory) that is present at all times, not just at sock creation/destruction time. > So my point is yes we can make families to implement their own infrastructure > for module refcounting. But the solution is going to be more complicated than > just having sock->owner and sk->owner fields and allowing for ownership > transfers. Have you seen the pppox implementation? It even simplified some things at the protocol level at the expense of adding just one new exported function at the net family level and some cost at the struct sock creation/destruction time. And this by making use of the existing infrastructure to achieve its goals: to have per protocol modules. And, again, the pppoe protocol module was simplified. > >That is, we have a higher layer for net families, with locking for the whole > >family done like it is on the tree now and a lower layer at the specific net > >family, both having the same behaviour at its layers. > >This option seems to be easy to implement with the current bluetooth > >infrastructure (i.e. it has a net_families equivalent, it does the switching > >at bt_create time, etc). > Well, we already use sk->destruct call back in Bluetooth protocols (each > proto has its own call back that does different things). I think we should > not use existing sk call backs for module refcounting. Look at what I did in pppox, you will still have similar functionality. - Arnaldo From maxk@qualcomm.com Tue Apr 29 16:40:20 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 16:40:24 -0700 (PDT) Received: from numenor.qualcomm.com (numenor.qualcomm.com [129.46.51.58]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3TNeJFu015574 for ; Tue, 29 Apr 2003 16:40:20 -0700 Received: from sabrina.qualcomm.com (sabrina.qualcomm.com [129.46.61.150]) by numenor.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3TNdw7t006734 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Tue, 29 Apr 2003 16:39:58 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by sabrina.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3TNdutf005980; Tue, 29 Apr 2003 16:39:56 -0700 (PDT) Message-Id: <5.1.0.14.2.20030429162447.10da83c8@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Tue, 29 Apr 2003 16:39:55 -0700 To: Arnaldo Carvalho de Melo From: Max Krasnyansky Subject: Re: New module infrastructure for net_proto_family Cc: netdev@oss.sgi.com In-Reply-To: <20030429215557.GA30222@conectiva.com.br> References: <5.1.0.14.2.20030429103638.10bf0a00@unixmail.qualcomm.com> <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> <20030424230202.GB2931@conectiva.com.br> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423114915.10840678@unixmail.qualcomm.com> <5.1.0.14.2.20030423134636.100e5c60@unixmail.qualcomm.com> <5.1.0.14.2.20030424094431.080b5320@unixmail.qualcomm.com> <5.1.0.14.2.20030428130220.10644ee0@unixmail.qualcomm.com> <5.1.0.14.2.20030429103638.10bf0a00@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2371 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev At 02:55 PM 4/29/2003, Arnaldo Carvalho de Melo wrote: >Em Tue, Apr 29, 2003 at 12:21:49PM -0700, Max Krasnyansky escreveu: > >> That can probably be done. But what happened to "protocol writers don't have >> to worry about this issues" ideas though ;-) ? > >They don't, unless they want to have its own infrastructure for loading modules >for each specific protocol, look at all the net families that don't do that >(i.e. all, except pppox and bluetooth, and perhaps ipv4 in the future, but as >you said, this is not accepted by DaveM). Hold on. That was my argument in favor of sk_set_owner() thing. I thought the goal was to make it easier in all cases. >And look at the pppox implementation, it didn't needed any changes to the >struct sock protinfo/private slab cache, and removed code in the protocol >module. But it introduced overhead in sk allocation/deallocation (read me rsp in pppox thread). >> The other thing that I don't like is that to create one socket we'd have to >> call whole bunch of functions to take care of the module refcounting. So I >> want to bring these questions again: > >> - Why do we have to bump module refcount for 'struct sock' with _default_ callbacks ? > >Because we don't assume they won't use its own callbacks. And what I'm saying is that if we make this assumption we can save some overhead during socket allocation/deallocation because we don't have to track those sks. >> My answer is that we don't have to. I'd even say that we shouldn't. Module is not >> referenced from struct sock in that case. > >> - Why are we not allowing net_family unregistration until all family sockets >> are gone ? From what I see it's only because current code does >> 'module_put(net_families[family]->owner)'. I'm saying that we don't care >> whether net_family is registered or not if we know who owns the socket (i.e. >> sock->owner). > >but then we move the overhead to _all_ struct sock, overhead (memory) that is >present at all times, not just at sock creation/destruction time. Like I said we can easily make space for ->owner in the struct sk (kill one of the pprev, prev, bind_prev, etc fields). IMO overhead of calling more function for socket allocation/dealocation is greater. >> So my point is yes we can make families to implement their own infrastructure >> for module refcounting. But the solution is going to be more complicated than >> just having sock->owner and sk->owner fields and allowing for ownership >> transfers. > >Have you seen the pppox implementation? It even simplified some things at the >protocol level at the expense of adding just one new exported function at the >net family level and some cost at the struct sock creation/destruction time. > >And this by making use of the existing infrastructure to achieve its goals: to >have per protocol modules. And, again, the pppoe protocol module was >simplified. I'll comment on that on in pppox thread. Max From maxk@qualcomm.com Tue Apr 29 17:44:08 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 17:44:29 -0700 (PDT) Received: from numenor.qualcomm.com (numenor.qualcomm.com [129.46.51.58]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3U0i8Fu016426 for ; Tue, 29 Apr 2003 17:44:08 -0700 Received: from magus.qualcomm.com (magus.qualcomm.com [129.46.61.148]) by numenor.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3U0ht7t009527 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Tue, 29 Apr 2003 17:43:55 -0700 (PDT) Received: from MAXK.qualcomm.com (maxk.qualcomm.com [129.46.176.80]) by magus.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3U0hqhg016897; Tue, 29 Apr 2003 17:43:53 -0700 (PDT) Message-Id: <5.1.0.14.2.20030429164010.10ddb380@unixmail.qualcomm.com> X-Sender: maxk@unixmail.qualcomm.com X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Tue, 29 Apr 2003 17:43:52 -0700 To: Arnaldo Carvalho de Melo From: Max Krasnyansky Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules Cc: "David S. Miller" , mostrows@speakeasy.net, netdev@oss.sgi.com In-Reply-To: <20030429220746.GB30222@conectiva.com.br> References: <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> <20030428.222728.48508327.davem@redhat.com> <20030429061227.GJ25361@conectiva.com.br> <20030428.222728.48508327.davem@redhat.com> <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2372 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev At 03:07 PM 4/29/2003, Arnaldo Carvalho de Melo wrote: >Em Tue, Apr 29, 2003 at 01:05:08PM -0700, Max Krasnyansky escreveu: >> >> Although the idea is conceptually sound, you miss one crucial thing. >> >> Such struct sock's reference _TWO_ modules, the "PPPOE" module >> >> and the "PPPOX" module. > >> This is not a problem. PPPOX (or ipv4/ipv6) module is not going to >> go away simply because PPPOE (or TCP/UDP) uses symbols from it. >> There is no need to bump refcounters here. > >> I think it's safe to say that protocols within the family always use >> symbols from main family module (they have to at list register/unregister). >> So this is naturally taken care of. > >Because at the core level we don't know (and perhaps don't want to know) what >the specific net family module nor its protocol modules are doing We know that protocol has to at least register with the family. Which is enough to keep family module loaded. >> Ok. I'm going to ask this here again (to make sure that it's answered :)) >Hey, I answered already, but it seems you disagree with my view 8) Of course I do. I wouldn't be arguing here if I didn't :). >> - Why do we have to bump module refcount for 'struct sock' with _default_ callbacks ? >> My answer is that we don't have to. I'd even say that we shouldn't. Module is not >> referenced from 'struct sock' in that case. > >We just don't assume nothing about the net protocol family implementation, but now >that the infrastructure is in place we can surely study further optimizations that >don't break its layering abstraction. We already know which families change callbacks and which don't. I looked at that already. >> - Why are we not allowing net_family unregistration until all family sockets >> are gone? From what I see it's only because current code does >> 'module_put(net_families[family]->owner)'. But we don't care whether >> net_family is registered or not if we know who owns the socket (i.e. >> sock->owner). > >but we introduce aditional overhead in all struct sock created why it is so important >to have the net_family unregistration done early rather than after all the struct sock >are freed? I'm not saying it's important. I'm saying we don't care, if we know who owns the socket. And if we don't care we don't need net_family_get() and friends. >> So far nobody gave me a clear answer to those questions. If we don't have to >> meet those two restriction I don't see the point in creating all this >> net_family_get()/xxx_family_get(), etc, infrastructure. Patches and BK stuff >> that I've seen so far added more code (and a bit more overhead) than my >> original patch with sock->owner/sk->owner/sk_set_owner(). Yet they provide >> no additional flexibility or functionality. > >See, its a tradeoff, we don't bloat struct sock paying a bit of overhead in other area. I wouldn't call one additional pointer a bloat (btw I mentioned that we have sk->prev and sk->pprev, we should be able to easily kill one of them). >> I hate to repeat myself and please forgive me for that. But how is the >> current infrastructure better than following ? > >See my views above. And I'd love, as you, to have more people discussing this, >but most people I think that could help with this are damn busy with other >work, so at least we have a solid infrastructure in place and can revisit this >later if there is interest in further enhancing this. That's the thing, I wouldn't call current infrastructure solid :) Ok. Speaking about bloat. pppox mod refcounting. You added additional level if indirection to every 'struct socket' and 'struct sock' allocation/dealocation. For example to free pppoe sk we now have to call sk_free(sk) pppox_sk_free(sk) pppox_protos[PPPOE]->sk_free(sk) module_put(pppox_protos[PPPOE]->owner) instead of sk_free(sk) pppoe_sk_free(sk) module_put(sk->owner) Same thing for pppox_release. You also had to introduce new function pppox_sk_alloc() which is not needed otherwise. Basically this entire patch http://linux.bkbits.net:8080/linux-2.5/diffs/drivers/net/pppox.c@1.11?nav=index.html|ChangeSet@-2d|cset@1.1128.1.19 would have been pppox.c pppox_create() { ... + if (!try_module_get(pppox_protos[protocol]->owner)) + goto out; + + sock->owner = pppox_protos[protocol]->owner; ... } pppoe.c pppoe_create() { ... + sk->destruct = pppoe_sk_free; + sk_set_owner(THIS_MODULE); ... } IMO it's pretty clear which one has more bloat ;-) Max From mcr@sandelman.ottawa.on.ca Tue Apr 29 18:41:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 18:41:53 -0700 (PDT) Received: from noxmail.sandelman.ottawa.on.ca (cyphermail.sandelman.ottawa.on.ca [192.139.46.78]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3U1feFu018204 for ; Tue, 29 Apr 2003 18:41:45 -0700 Received: from sandelman.ottawa.on.ca (marajade.sandelman.ottawa.on.ca [192.139.46.20]) by noxmail.sandelman.ottawa.on.ca (8.11.6/8.11.6) with ESMTP id h3U1fWC20532 (using TLSv1/SSLv3 with cipher EDH-RSA-DES-CBC3-SHA (168 bits) verified OK) for ; Tue, 29 Apr 2003 21:41:33 -0400 (EDT) Received: from marajade.sandelman.ottawa.on.ca (marajade [127.0.0.1] (may be forged)) by sandelman.ottawa.on.ca (8.12.3/8.12.3/Debian -4) with ESMTP id h3U1fU64018282 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Tue, 29 Apr 2003 21:41:31 -0400 Received: from marajade.sandelman.ottawa.on.ca (mcr@localhost) by marajade.sandelman.ottawa.on.ca (8.12.3/8.12.3/Debian-5) with ESMTP id h3U1fSqU018278 for ; Tue, 29 Apr 2003 21:41:29 -0400 Message-Id: <200304300141.h3U1fSqU018278@marajade.sandelman.ottawa.on.ca> To: netdev@oss.sgi.com Subject: Re: Zero copy transmit In-reply-to: Your message of "Tue, 29 Apr 2003 22:39:46 +0200." <20030429203945.GD349@Wotan.suse.de> Mime-Version: 1.0 (generated by tm-edit 1.8) Content-Type: text/plain; charset=US-ASCII Date: Tue, 29 Apr 2003 21:41:28 -0400 From: Michael Richardson X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2373 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcr@sandelman.ottawa.on.ca Precedence: bulk X-list: netdev >>>>> "Andi" == Andi Kleen writes: Andi> I don't know if they do. The only Unix I'm aware of that has zero copy Andi> sendmsg() is NetBSD and their focus does not seem to be SMP scalability. NetBSD 1.6 is the first release with both zero-copy and SMP. (1.6.1 came out two weeks ago) So, the focus was on making it work. I would not read any more intent to it yet. Jason Thorpe is pretty smart. ] ON HUMILITY: to err is human. To moo, bovine. | firewalls [ ] Michael Richardson, Sandelman Software Works, Ottawa, ON |net architect[ ] mcr@sandelman.ottawa.on.ca http://www.sandelman.ottawa.on.ca/ |device driver[ ] panic("Just another Debian GNU/Linux using, kernel hacking, security guy"); [ From davem@redhat.com Tue Apr 29 20:36:09 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 20:36:13 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3U3a7Fu022845 for ; Tue, 29 Apr 2003 20:36:08 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id TAA28950; Tue, 29 Apr 2003 19:29:31 -0700 Date: Tue, 29 Apr 2003 19:29:31 -0700 (PDT) Message-Id: <20030429.192931.104061911.davem@redhat.com> To: maxk@qualcomm.com Cc: acme@conectiva.com.br, mostrows@speakeasy.net, netdev@oss.sgi.com Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules From: "David S. Miller" In-Reply-To: <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> References: <20030428.222728.48508327.davem@redhat.com> <20030429065419.GN25361@conectiva.com.br> <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2374 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Max Krasnyansky Date: Tue, 29 Apr 2003 13:05:08 -0700 - Why do we have to bump module refcount for 'struct sock' with _default_ callbacks ? Nothing says that just because a sock uses default callbacks, it can't be referenced in other ways by the implementation module, for example it can sit in the protocol hash tables and that by itself requires a module reference. From davem@redhat.com Tue Apr 29 23:46:16 2003 Received: with ECARTIS (v1.0.0; list netdev); Tue, 29 Apr 2003 23:46:21 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3U6k9Fu025945 for ; Tue, 29 Apr 2003 23:46:14 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id WAA29360; Tue, 29 Apr 2003 22:39:01 -0700 Date: Tue, 29 Apr 2003 22:39:00 -0700 (PDT) Message-Id: <20030429.223900.10320994.davem@redhat.com> To: hch@lst.de Cc: Robert.Olsson@data.slu.se, ak@suse.de, netdev@oss.sgi.com Subject: Re: purpose of the skb head pool From: "David S. Miller" In-Reply-To: <20030429162102.A23898@lst.de> References: <20030429161608.A23708@lst.de> <20030429.061249.123996896.davem@redhat.com> <20030429162102.A23898@lst.de> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2375 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Christoph Hellwig Date: Tue, 29 Apr 2003 16:21:02 +0200 On Tue, Apr 29, 2003 at 06:12:49AM -0700, David S. Miller wrote: > Robert's first reply on this subject had it attached.. > > I deleted it, can someone resend me a copy? > > When I ask for a patch, it usually means that I've > /dev/null'd the entire thread already. Lazy bastard.. ;) Hehe :-) Applied, thanks. From acme@conectiva.com.br Wed Apr 30 00:22:47 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 00:22:58 -0700 (PDT) Received: from orion.netbank.com.br (orion.netbank.com.br [200.203.199.90]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3U7MjFu026594 for ; Wed, 30 Apr 2003 00:22:46 -0700 Received: from [200.181.169.6] (helo=brinquendo.conectiva.com.br) by orion.netbank.com.br with asmtp (Exim 3.33 #1) id 19Am1T-0001ez-00; Wed, 30 Apr 2003 04:29:00 -0300 Received: by brinquendo.conectiva.com.br (Postfix, from userid 500) id 9677A1966C; Wed, 30 Apr 2003 07:22:37 +0000 (UTC) Date: Wed, 30 Apr 2003 04:22:36 -0300 From: Arnaldo Carvalho de Melo To: Stephen Hemminger Cc: "David S. Miller" , Jay Schulist , netdev@oss.sgi.com Subject: Re: [PATCH] 2.5.68 - RCU for SNAP Message-ID: <20030430072236.GE31429@conectiva.com.br> References: <20030429154856.39c75139.shemminger@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030429154856.39c75139.shemminger@osdl.org> X-Url: http://advogato.org/person/acme Organization: Conectiva S.A. User-Agent: Mutt/1.5.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2376 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: acme@conectiva.com.br Precedence: bulk X-list: netdev Hi, Looks fine, applied, David, could you please pull from: bk://kernel.bkbits.net/acme/net-2.5 Thanks Stephen. - Arnaldo You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1170, 2003-04-30 04:17:25-03:00, shemminger@osdl.org Replace br_lock() in snap with Read Copy Update. Straightforward since SNAP uses list macros already. Tested by bringing up/down Appletalk on SMP system and making sure packets get through. This is the last subsystem that depends on br_lock before IPV4,IPV6 can be converted. psnap.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-) diff -Nru a/net/802/psnap.c b/net/802/psnap.c --- a/net/802/psnap.c Wed Apr 30 04:20:09 2003 +++ b/net/802/psnap.c Wed Apr 30 04:20:09 2003 @@ -21,9 +21,9 @@ #include #include #include -#include -LIST_HEAD(snap_list); +static LIST_HEAD(snap_list); +static spinlock_t snap_lock = SPIN_LOCK_UNLOCKED; static struct llc_sap *snap_sap; /* @@ -34,17 +34,13 @@ struct list_head *entry; struct datalink_proto *proto = NULL, *p; - if (list_empty(&snap_list)) - goto out; - - list_for_each(entry, &snap_list) { + list_for_each_rcu(entry, &snap_list) { p = list_entry(entry, struct datalink_proto, node); if (!memcmp(p->type, desc, 5)) { proto = p; break; } } -out: return proto; } @@ -55,11 +51,13 @@ struct packet_type *pt) { int rc = 1; - struct datalink_proto *proto = find_snap_client(skb->h.raw); + struct datalink_proto *proto; static struct packet_type snap_packet_type = { .type = __constant_htons(ETH_P_SNAP), }; + rcu_read_lock(); + proto = find_snap_client(skb->h.raw); if (proto) { /* Pass the frame on. */ skb->h.raw += 5; @@ -71,6 +69,7 @@ rc = 1; } + rcu_read_unlock(); return rc; } @@ -124,7 +123,7 @@ { struct datalink_proto *proto = NULL; - br_write_lock_bh(BR_NETPROTO_LOCK); + spin_lock_bh(&snap_lock); if (find_snap_client(desc)) goto out; @@ -135,10 +134,12 @@ proto->rcvfunc = rcvfunc; proto->header_length = 5 + 3; /* snap + 802.2 */ proto->request = snap_request; - list_add(&proto->node, &snap_list); + list_add_rcu(&proto->node, &snap_list); } out: - br_write_unlock_bh(BR_NETPROTO_LOCK); + spin_unlock_bh(&snap_lock); + + synchronize_net(); return proto; } @@ -147,12 +148,13 @@ */ void unregister_snap_client(struct datalink_proto *proto) { - br_write_lock_bh(BR_NETPROTO_LOCK); + spin_lock_bh(&snap_lock); + list_del_rcu(&proto->node); + spin_unlock_bh(&snap_lock); - list_del(&proto->node); - kfree(proto); + synchronize_net(); - br_write_unlock_bh(BR_NETPROTO_LOCK); + kfree(proto); } MODULE_LICENSE("GPL"); =================================================================== This BitKeeper patch contains the following changesets: 1.1170 ## Wrapped with gzip_uu ## M'XL( "EYKSX ^U6;6_;-A#^+/Z* PH$[E;+I%XLVX&#I''0&LE2(V[V:8! M4W0D6*8$DH[AS3]^1\EQUS1+L6+ OBPF[HS<\7F>X]T!?@/W1NJ1Q\5:DC?P ML3)VY(E*26&+1^Z+:NTO- ;NJ@H#O;Q:R][[ZYZ2MAOX,<'(C%N1PZ/49N0Q M/SS^Q^YJ.?+NKC[PV7.U8.<2POC,;&5?N1E9LZYSO3*-D+EC'&(R8S&D2#?D2<_//GLK]&"6D44AI' M0S;S3JA?@E&K%D%,1=&HXH!9/+];I "'U>F:ST*_T M/S/H4O(>_EW]ET3 G:Q++B0L=%I68M5Y"X4"HW@-V\+F&.897%;U#N[KC%OI MXQ4\*!3=W+JJV"B[HNL91R!96"^2\S,#O,70-7&6*M7*K9: DU%RMI#8(] M8%=MKJO-0_X$GQ<&\-A<0LE1A-DL#C VYQ8R64N5&<=PJ!@6$JN0,)W]&KU# MTT<4P3$L 5N+$X9R?7(-83(6] @U[MFN"+ MO[9R&"=[.G VZL?+@12)7/:7"SID+PW-2TCM."8L88-]P(8L:E;D6>+W%^6' M-/[-NKR$Q5 H#<.0#O3CL-.W8N^/7T*FKI03GQJ MH8VZ0L8PGTUOTYM/E]?I_:US5Y-3,@D3B,@THDC@.904RTTE%WFJQ:8CE=6[ M=W#RA03^(),H<:+B@1/56,]8O1'X?AP;5*A56NO*5O!3XT[)M!^@<@\!4]?L MPRB=$J]-&\.R4%G:<(BR0,Z.62VZ9[FO^1;3IDGH.([7-^H)8,(")V7:.L_5 MW8"GB[QSJRN17M;I[$6ONH0L/!"W]-Q2_ M87BG!,Z;*GZ7*?:^51C3!@!=^)K"5E(FRV\DN>!KQ$CAGA; Wed, 30 Apr 2003 00:33:16 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA29473; Tue, 29 Apr 2003 23:26:31 -0700 Date: Tue, 29 Apr 2003 23:26:31 -0700 (PDT) Message-Id: <20030429.232631.68131803.davem@redhat.com> To: shemminger@osdl.org CC: netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: dev->destructor From: "David S. Miller" X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2377 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Stephen, you're right about the dev->destructor problem. I misread your postings, and I'm very sorry about that. We were talking about two different things, and admittedly I had forgotten how some of this stuff works. Alexey, currently dev->{open,close} are what does get/put of device module reference. However, device unregister can explode if dev->destructor is present. Unlike in dev->destructor==NULL case, we do not wait for remnant dev->refcnt to go away. Therefore we could invoke dev->destructor() after module is unloaded. I guess there are two ways to address this problem: 1) dev_get() gets module reference and dev_put() puts is. Ugly, as this means dev_get() can fail, but this does cover all the possible cases. 2) Make unregister_netdev() wait for refcount to reach 1 regardless of whether dev->destructor is NULL or not. I don't like #1. Do you see some holes in #2? As Stephen brought up, this also means we should do something about that NETDEV_UNREGISTER code in dst_dev_event() :-( From davem@redhat.com Wed Apr 30 00:41:37 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 00:41:42 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3U7faFu027400 for ; Wed, 30 Apr 2003 00:41:36 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA29499; Tue, 29 Apr 2003 23:34:28 -0700 Date: Tue, 29 Apr 2003 23:34:27 -0700 (PDT) Message-Id: <20030429.233427.77034189.davem@redhat.com> To: acme@conectiva.com.br Cc: shemminger@osdl.org, jschlst@samba.org, netdev@oss.sgi.com Subject: Re: [PATCH] 2.5.68 - RCU for SNAP From: "David S. Miller" In-Reply-To: <20030430072236.GE31429@conectiva.com.br> References: <20030429154856.39c75139.shemminger@osdl.org> <20030430072236.GE31429@conectiva.com.br> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2378 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Arnaldo Carvalho de Melo Date: Wed, 30 Apr 2003 04:22:36 -0300 Looks fine, applied, David, could you please pull from: bk://kernel.bkbits.net/acme/net-2.5 Thanks Stephen. Pulled, thanks. From davem@redhat.com Wed Apr 30 00:59:46 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 00:59:49 -0700 (PDT) Received: from pizda.ninka.net (IDENT:root@pizda.ninka.net [216.101.162.242]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3U7xWFu027816 for ; Wed, 30 Apr 2003 00:59:40 -0700 Received: from localhost (IDENT:davem@localhost.localdomain [127.0.0.1]) by pizda.ninka.net (8.9.3/8.9.3) with ESMTP id XAA29544; Tue, 29 Apr 2003 23:52:49 -0700 Date: Tue, 29 Apr 2003 23:52:48 -0700 (PDT) Message-Id: <20030429.235248.98885884.davem@redhat.com> To: shemminger@osdl.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH] [BRIDGE] Change bridge forwarding table to use hlist From: "David S. Miller" In-Reply-To: <20030429103524.15f56cbf.shemminger@osdl.org> References: <20030429103524.15f56cbf.shemminger@osdl.org> X-FalunGong: Information control. X-Mailer: Mew version 2.1 on Emacs 21.1 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2379 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev From: Stephen Hemminger Date: Tue, 29 Apr 2003 10:35:24 -0700 Switch bridge functional table to using hlist_macros. The code was using the same form of hash list already, this just uses the convient macros. Applied, thanks Stephen. From holt@sgi.com Wed Apr 30 08:05:47 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 08:05:54 -0700 (PDT) Received: from rj.sgi.com (rj.SGI.COM [192.82.208.96]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UF5kFu022380 for ; Wed, 30 Apr 2003 08:05:47 -0700 Received: from ledzep.americas.sgi.com (ledzep.americas.sgi.com [192.48.203.134]) by rj.sgi.com (8.12.9/8.12.2/linux-outbound_gateway-1.2) with ESMTP id h3UF5fE0026603 for ; Wed, 30 Apr 2003 08:05:41 -0700 Received: from thistle-e236.americas.sgi.com (thistle-e236.americas.sgi.com [128.162.236.204]) by ledzep.americas.sgi.com (8.12.9/americas-smart-nospam1.1) with ESMTP id h3UF5Ya222011291; Wed, 30 Apr 2003 10:05:35 -0500 (CDT) Received: from mandrake.americas.sgi.com (mandrake.americas.sgi.com [128.162.232.96]) by thistle-e236.americas.sgi.com (8.12.9/SGI-server-1.8) with ESMTP id h3UF5Y0L5120676; Wed, 30 Apr 2003 10:05:34 -0500 (CDT) Received: from mandrake.americas.sgi.com (localhost.localdomain [127.0.0.1]) by mandrake.americas.sgi.com (8.12.5/8.11.6/erikj-RedHat-7.2-Eagan) with ESMTP id h3UF5YmF008659; Wed, 30 Apr 2003 10:05:34 -0500 Received: (from holt@localhost) by mandrake.americas.sgi.com (8.12.5/8.12.5/Submit) id h3UF5XTV008657; Wed, 30 Apr 2003 10:05:33 -0500 Date: Wed, 30 Apr 2003 10:05:33 -0500 From: Robin Holt To: Andi Kleen Cc: netdev@oss.sgi.com, modica@sgi.com Subject: Re: Zero copy transmit Message-ID: <20030430150533.GA8158@sgi.com> References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> <3EAED567.2090006@sgi.com> <20030429195924.GC349@Wotan.suse.de> <3EAEDBE9.1060405@sgi.com> <20030429203945.GD349@Wotan.suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030429203945.GD349@Wotan.suse.de> User-Agent: Mutt/1.4i X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2380 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: holt@sgi.com Precedence: bulk X-list: netdev On Tue, Apr 29, 2003 at 10:39:46PM +0200, Andi Kleen wrote: > > Don't get me wrong, we would certainly drop any notions of this if we > > found that it was slower and I will be glad to post any results. The > > goal is to take advantage of the hardware to make things faster. > > You have no hardware to make the remote TLB flushes fast ;) > > I'm sure you can show it being an advantage with a single threaded process. > But when you run it on a multithreaded application just with two threads > it may look very different. > Last time I checked, the IA64 processor provides a ptc.g instruction for exactly this. The only hit we take from using it is Intel limits it to a single outstanding ptc.g pending machine wide. This is accomplished with a global spinlock. I would love to convince Intel to change this instruction, but that probably will not happen any time soon. I will concede that the ptc.g instruction takes a considerable period of time on our 64 processor machines, but that comes out to a lot of local TLB coherence domains that need to be updated. I believe there is a similar instruction for x86. Could someone verify this? From ak@suse.de Wed Apr 30 08:29:30 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 08:29:39 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UFTSFu023168 for ; Wed, 30 Apr 2003 08:29:29 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id B87F414710; Wed, 30 Apr 2003 17:29:22 +0200 (MEST) Date: Wed, 30 Apr 2003 17:29:22 +0200 From: Andi Kleen To: Robin Holt Cc: Andi Kleen , netdev@oss.sgi.com, modica@sgi.com Subject: Re: Zero copy transmit Message-ID: <20030430152922.GD18661@oldwotan.suse.de> References: <3EAEC7FF.4040504@sgi.com> <20030429192041.GC17413@Wotan.suse.de> <3EAED567.2090006@sgi.com> <20030429195924.GC349@Wotan.suse.de> <3EAEDBE9.1060405@sgi.com> <20030429203945.GD349@Wotan.suse.de> <20030430150533.GA8158@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20030430150533.GA8158@sgi.com> X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2381 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev > Last time I checked, the IA64 processor provides a ptc.g instruction for > exactly this. The only hit we take from using it is Intel limits it to > a single outstanding ptc.g pending machine wide. This is accomplished with > a global spinlock. I would love to convince Intel to change this instruction, > but that probably will not happen any time soon. IA64 Linux doesn't use it at least. The 2.5 flush_tlb_mm calls smp_flush_tlb_mm which ends up doing IPIs. Same for flush_tlb_page - calls flush_tlb_range which calls sn2_global_tlb_purge, which does something complicated that also looks like an global IPI. It also takes a global spinlock. > > I will concede that the ptc.g instruction takes a considerable period of > time on our 64 processor machines, but that comes out to a lot of local > TLB coherence domains that need to be updated. > > I believe there is a similar instruction for x86. Could someone verify > this? Nope. x86 has to IPI for remote TLB flushes. -Andi > From shemminger@osdl.org Wed Apr 30 09:33:06 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 09:33:12 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UGX5Fu024428 for ; Wed, 30 Apr 2003 09:33:06 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3UGX3W09828; Wed, 30 Apr 2003 09:33:03 -0700 Date: Wed, 30 Apr 2003 09:33:03 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com, kuznet@ms2.inr.ac.ru Subject: Re: dev->destructor Message-Id: <20030430093303.2e80e7ad.shemminger@osdl.org> In-Reply-To: <20030429.232631.68131803.davem@redhat.com> References: <20030429.232631.68131803.davem@redhat.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: "X*Tf$\39*#12x9f4a&W79R_GhQ^0;EZ/Gffni}&Hw2Af=i=rm\j?5D>Tn23Sw*w1x")kgRA7{BlH?R]"jIF_fOaRpEq^@k21WU u)*dUq Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2382 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Tue, 29 Apr 2003 23:26:31 -0700 (PDT) "David S. Miller" wrote: > > Stephen, you're right about the dev->destructor problem. > I misread your postings, and I'm very sorry about that. > We were talking about two different things, and admittedly > I had forgotten how some of this stuff works. > > Alexey, currently dev->{open,close} are what does get/put > of device module reference. > > However, device unregister can explode if dev->destructor is > present. Unlike in dev->destructor==NULL case, we do not > wait for remnant dev->refcnt to go away. Therefore we could > invoke dev->destructor() after module is unloaded. > > I guess there are two ways to address this problem: > > 1) dev_get() gets module reference and dev_put() puts is. > Ugly, as this means dev_get() can fail, but this does > cover all the possible cases. > > 2) Make unregister_netdev() wait for refcount to reach 1 > regardless of whether dev->destructor is NULL or not. > > I don't like #1. Do you see some holes in #2? > > As Stephen brought up, this also means we should do something > about that NETDEV_UNREGISTER code in dst_dev_event() :-( There are other (not nice possibilities). A) Require driver have a wait queue per device and wait after unregister. Ugly and requires repeated work. B) Put wait queue and wakeup logic in netdevice/unregister_netdev. Adds more to already overloaded netdevice structure, but could cleanup existing polling stuff. C) Audit unregister notifier callbacks to ensure they all dev_put, all references to device. This works for normal IPv4 except for the dst cache. The following patch causes the dst cache to do this. --- linux-2.5/net/core/dst.c 2003-04-29 11:54:39.000000000 -0700 +++ linux-2.5-bridge/net/core/dst.c 2003-04-29 10:17:15.000000000 -0700 @@ -228,7 +228,7 @@ _race_ _condition_. */ if (event!=NETDEV_DOWN && - dev->destructor == NULL && + (dev->destructor == NULL || dev->owner) && dst->output == dst_blackhole) { dst->dev = &loopback_dev; dev_put(dev); D) Your option #2 only needs to be done if device is a module otherwise, can just let destructor run later. --- linux-2.5/net/core/dev.c 2003-04-29 11:54:39.000000000 -0700 +++ linux-2.5-bridge/net/core/dev.c 2003-04-30 09:28:34.000000000 -0700 @@ -2737,7 +2737,7 @@ free_divert_blk(dev); #endif - if (dev->destructor != NULL) { + if (dev->destructor != NULL && dev->owner == NULL) { #ifdef NET_REFCNT_DEBUG if (atomic_read(&dev->refcnt) != 1) printk(KERN_DEBUG "unregister_netdevice: holding %s " From maxk@qualcomm.com Wed Apr 30 11:12:12 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 11:12:49 -0700 (PDT) Received: from ithilien.qualcomm.com (ithilien.qualcomm.com [129.46.51.59]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UICCFu030819 for ; Wed, 30 Apr 2003 11:12:12 -0700 Received: from magus.qualcomm.com (magus.qualcomm.com [129.46.61.148]) by ithilien.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3UIBiJo007517; Wed, 30 Apr 2003 11:11:44 -0700 (PDT) Received: from [10.0.0.2] (vpn-10-50-0-37.qualcomm.com [10.50.0.37]) by magus.qualcomm.com (8.12.9/8.12.5/1.0) with ESMTP id h3UIBehf000719; Wed, 30 Apr 2003 11:11:41 -0700 (PDT) Subject: Re: [PATCH] af_pppox: create module infrastructure for protocol modules From: Max Krasnyansky To: "David S. Miller" Cc: acme@conectiva.com.br, netdev@oss.sgi.com In-Reply-To: <20030429.192931.104061911.davem@redhat.com> References: <20030428.222728.48508327.davem@redhat.com> <20030429065419.GN25361@conectiva.com.br> <5.1.0.14.2.20030429123317.10d71178@unixmail.qualcomm.com> <20030429.192931.104061911.davem@redhat.com> Content-Type: text/plain Organization: Message-Id: <1051726260.13512.59.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 (1.2.2-5) Date: 30 Apr 2003 11:11:37 -0700 Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2383 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev On Tue, 2003-04-29 at 19:29, David S. Miller wrote: > From: Max Krasnyansky > Date: Tue, 29 Apr 2003 13:05:08 -0700 > > - Why do we have to bump module refcount for 'struct sock' with > _default_ callbacks ? > > Nothing says that just because a sock uses default callbacks, it can't > be referenced in other ways by the implementation module, for example > it can sit in the protocol hash tables and that by itself requires > a module reference. That's a good point. However this is protocol's local business. Netcore does not use those hashes directly. Netcore only uses things like sk->state, sk->lock, etc and callbacks. So the callback is the only reference, from netcore's point of view, into the protocol module. Most protocols that I've looked at unlink sk from its hashes in proto_sock_release(struct socket *sock) so it's enough to make sure that struct socket is accounted for. And like I said before if protocol wants for some reason to be around until sk is destroyed it will simply do sk_set_owner() right after alloc_sk(). Max From james@stev.org Wed Apr 30 16:10:52 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 16:11:00 -0700 (PDT) Received: from alpha.stev.org (mistral@jstevenson.plus.com [212.159.71.212]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UNAnFu001997 for ; Wed, 30 Apr 2003 16:10:51 -0700 Received: from god.stev.org (god.stev.org [192.168.1.5]) by alpha.stev.org (8.11.2/8.11.2) with ESMTP id h3UNHLT24779; Thu, 1 May 2003 00:17:22 +0100 Subject: Re: 3c59x support From: James Stevenson To: borkdude@cs.utwente.nl Cc: linux-kernel@vger.kernel.org, andrewm@uow.edu.au, netdev@oss.sgi.com In-Reply-To: <200304290202.02811.borkdude@cs.utwente.nl> References: <200304290202.02811.borkdude@cs.utwente.nl> Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Ximian Evolution 1.0.3 (1.0.3-6) Date: 01 May 2003 00:17:21 +0100 Message-Id: <1051744645.2308.11.camel@god.stev.org> Mime-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2384 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: james@stev.org Precedence: bulk X-list: netdev Hi i also had problems with the card in some 2.4.x releases but it seems to work for me on a 2.4.20 kernel. 3c59x: Donald Becker and others. www.scyld.com/network/vortex.html 00:0a.0: 3Com PCI 3c905C Tornado at 0xec00. Vers LK1.1.16 i do still have problems with a card in another machine when rebooting from windows into linux it fails to init properly. But since the machine boots from nfs i have not been bothered to dump the info from this. On Tue, 2003-04-29 at 01:02, Michiel Borkent wrote: > Hello, > I am trying to make a 2.4.20 kernel with 3c59x support. > My card is a: > > 3Com 3c900 Cyclone 10Mbps TPO > > card and it only works with the 3c59x-scyld module, I found with Debian Woody > with a linux v2.2 kernel. > > It does NOT work with the normal 3c59x module and as I am trying to make a > 2.4.20 kernel, it still doesn't work. I chose support for "Vortex/Boomerang" > and normally my card would be supported I think. > > Can someone help me with this? > > Greetings, > Michiel Borkent > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ From shemminger@osdl.org Wed Apr 30 16:35:45 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 16:35:48 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UNZiFu002439 for ; Wed, 30 Apr 2003 16:35:45 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3UNZgW05084; Wed, 30 Apr 2003 16:35:42 -0700 Date: Wed, 30 Apr 2003 16:35:42 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Favorite network stress tests? Message-Id: <20030430163542.4e09076f.shemminger@osdl.org> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2385 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Does any one have a favorite network stress test? There are the usual benchmarks like ttcp, netbench, are there others? NFS? From greearb@candelatech.com Wed Apr 30 16:48:10 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 16:48:18 -0700 (PDT) Received: from grok.yi.org (IDENT:8J8c6cFb0wKLIy0GCq+OtfYl1uknHIMf@dhcp93-dsl-usw3.w-link.net [206.129.84.93]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UNm9Fu002815 for ; Wed, 30 Apr 2003 16:48:10 -0700 Received: from candelatech.com (IDENT:K1zdqMrfMOZq7215+Wex44Z4i+6Ei72S@localhost.localdomain [127.0.0.1]) by grok.yi.org (8.11.6/8.11.6) with ESMTP id h3UNlw511051; Wed, 30 Apr 2003 16:47:58 -0700 Message-ID: <3EB060AE.9050708@candelatech.com> Date: Wed, 30 Apr 2003 16:47:58 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Stephen Hemminger CC: "David S. Miller" , netdev@oss.sgi.com Subject: Re: Favorite network stress tests? References: <20030430163542.4e09076f.shemminger@osdl.org> In-Reply-To: <20030430163542.4e09076f.shemminger@osdl.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2386 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Stephen Hemminger wrote: > Does any one have a favorite network stress test? > There are the usual benchmarks like ttcp, netbench, are there others? > NFS? > pktgen is good for testing/abusing drivers, below the IP stacks. -- Ben Greear President of Candela Technologies Inc http://www.candelatech.com ScryMUD: http://scry.wanfear.com http://scry.wanfear.com/~greear From rddunlap@osdl.org Wed Apr 30 16:55:01 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 16:55:05 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UNt1Fu003213 for ; Wed, 30 Apr 2003 16:55:01 -0700 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id h3UNswW17375; Wed, 30 Apr 2003 16:54:58 -0700 Date: Wed, 30 Apr 2003 16:52:44 -0700 From: "Randy.Dunlap" To: Stephen Hemminger Cc: davem@redhat.com, netdev@oss.sgi.com Subject: Re: Favorite network stress tests? Message-Id: <20030430165244.4b247318.rddunlap@osdl.org> In-Reply-To: <20030430163542.4e09076f.shemminger@osdl.org> References: <20030430163542.4e09076f.shemminger@osdl.org> Organization: OSDL X-Mailer: Sylpheed version 0.8.11 (GTK+ 1.2.10; i586-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2387 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev On Wed, 30 Apr 2003 16:35:42 -0700 Stephen Hemminger wrote: | Does any one have a favorite network stress test? | There are the usual benchmarks like ttcp, netbench, are there others? | NFS? Here are some places to look/try: http://www.colorfullife.com/~manfred/net-stress/net-stresstest.txt ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/ (is this the same pktgen that is now in 2.5 kernels?) fsx-linux from Dave Jones: http://www.codemonkey.org.uk/cruft/ or from Andrew Morton (used to be here at least): http://www.zip.com.au/~akpm/linux/ext3-tools.tar.gz This is a filesystem test and has been known to find problems, both locally and over NFS. -- ~Randy From niv@us.ibm.com Wed Apr 30 16:59:56 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 16:59:59 -0700 (PDT) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h3UNxmFu004042 for ; Wed, 30 Apr 2003 16:59:55 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e1.ny.us.ibm.com (8.12.9/8.12.2) with ESMTP id h3UNxUWn173248; Wed, 30 Apr 2003 19:59:30 -0400 Received: from us.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.9/NCO/VER6.5) with ESMTP id h3UNxQII084850; Wed, 30 Apr 2003 19:59:27 -0400 Message-ID: <3EB062C8.3000203@us.ibm.com> Date: Wed, 30 Apr 2003 16:56:56 -0700 From: Nivedita Singhvi User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2.1) Gecko/20021130 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Ben Greear CC: Stephen Hemminger , "David S. Miller" , netdev@oss.sgi.com Subject: Re: Favorite network stress tests? References: <20030430163542.4e09076f.shemminger@osdl.org> <3EB060AE.9050708@candelatech.com> In-Reply-To: <3EB060AE.9050708@candelatech.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2388 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev Ben Greear wrote: >> Does any one have a favorite network stress test? >> There are the usual benchmarks like ttcp, netbench, are there others? >> NFS? > > > pktgen is good for testing/abusing drivers, below the IP stacks. netperf is another for TCP/UDP stream and req/response kind of stuff. There is support for sendfile, IPV6, etc. thanks, Nivedita From gandalf@wlug.westbo.se Wed Apr 30 17:01:04 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 17:01:07 -0700 (PDT) Received: from tux.rsn.bth.se (postfix@tux.rsn.bth.se [194.47.143.135]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h41013Fu004445 for ; Wed, 30 Apr 2003 17:01:04 -0700 Received: by tux.rsn.bth.se (Postfix, from userid 501) id DF27C36FD1; Thu, 1 May 2003 02:00:57 +0200 (CEST) Subject: Re: Favorite network stress tests? From: Martin Josefsson To: Ben Greear Cc: Stephen Hemminger , netdev@oss.sgi.com In-Reply-To: <3EB060AE.9050708@candelatech.com> References: <20030430163542.4e09076f.shemminger@osdl.org> <3EB060AE.9050708@candelatech.com> Content-Type: text/plain Content-Transfer-Encoding: 7bit Organization: Message-Id: <1051747257.8214.195.camel@tux.rsn.bth.se> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.4 Date: 01 May 2003 02:00:57 +0200 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2389 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gandalf@wlug.westbo.se Precedence: bulk X-list: netdev On Thu, 2003-05-01 at 01:47, Ben Greear wrote: > pktgen is good for testing/abusing drivers, below the IP stacks. Since Stephen is bridge maintainer now I assume he might like esic from the isic package. It can send packets with random source/destination macaddresses. There's a bunch of other small programs in that package as well. Then there's testlvs and of course diffrent scriptkiddieprograms for syn/ack/udp/fragment floods with random ip's and ports, they stress the routingcache and conntrack a lot. -- /Martin From davej@suse.de Wed Apr 30 17:55:58 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 17:56:01 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [213.95.15.193]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h410tvFu008271 for ; Wed, 30 Apr 2003 17:55:58 -0700 Received: from Hermes.suse.de (Hermes.suse.de [213.95.15.136]) by Cantor.suse.de (Postfix) with ESMTP id D6F9015175; Thu, 1 May 2003 02:55:20 +0200 (MEST) Date: Thu, 1 May 2003 02:55:19 +0200 From: Dave Jones To: "Randy.Dunlap" Cc: Stephen Hemminger , davem@redhat.com, netdev@oss.sgi.com Subject: Re: Favorite network stress tests? Message-ID: <20030501025519.A20159@suse.de> References: <20030430163542.4e09076f.shemminger@osdl.org> <20030430165244.4b247318.rddunlap@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20030430165244.4b247318.rddunlap@osdl.org>; from rddunlap@osdl.org on Wed, Apr 30, 2003 at 04:52:44PM -0700 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2390 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davej@suse.de Precedence: bulk X-list: netdev On Wed, Apr 30, 2003 at 04:52:44PM -0700, Randy.Dunlap wrote: > fsx-linux from Dave Jones: > http://www.codemonkey.org.uk/cruft/ Actually by Apple Inc. I just made it compile under Linux. Dave -- | Dave Jones. http://www.codemonkey.org.uk | SuSE Labs From kuznet@ms2.inr.ac.ru Wed Apr 30 18:10:57 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 18:11:04 -0700 (PDT) Received: from sex.inr.ac.ru (sex.inr.ac.ru [193.233.7.165]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h411AtFu008804 for ; Wed, 30 Apr 2003 18:10:56 -0700 Received: (from kuznet@localhost) by sex.inr.ac.ru (8.6.13/ANK) id FAA08689; Thu, 1 May 2003 05:10:33 +0400 From: kuznet@ms2.inr.ac.ru Message-Id: <200305010110.FAA08689@sex.inr.ac.ru> Subject: Re: dev->destructor To: davem@redhat.com (David S. Miller) Date: Thu, 1 May 2003 05:10:33 +0400 (MSD) Cc: shemminger@osdl.org, netdev@oss.sgi.com In-Reply-To: <20030429.232631.68131803.davem@redhat.com> from "David S. Miller" at Apr 29, 3 11:26:31 pm X-Mailer: ELM [version 2.4 PL24] MIME-Version: 1.0 X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2391 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kuznet@ms2.inr.ac.ru Precedence: bulk X-list: netdev Hello! > 1) dev_get() gets module reference and dev_put() puts is. > Ugly, as this means dev_get() can fail, but this does > cover all the possible cases. Seems, you eventually _really_ understood why I histerically moan about bogosity of modules and maybe ready to recongnize that it is not just histerical moaning in some part. :-) > 2) Make unregister_netdev() wait for refcount to reach 1 > regardless of whether dev->destructor is NULL or not. > > I don't like #1. Do you see some holes in #2? It is deadlock. > As Stephen brought up, this also means we should do something > about that NETDEV_UNREGISTER code in dst_dev_event() :-( It is just one and the simplest subcase of general situation. Module must not be unloaded while device is held, that's all. Also, it is not specific to netdevices. The same applies to each object in the stack, which is under control of a module. You may like 1), you may dislike it, but people who designed modules _really_ expect we must use this idiotic module_get() each time when referencing some object. Remember about sockets? Well, my alternatives are: 0) To make module unloading right, rather then preserve creepy scheme. 3) To prohibit unloading such modules and live in peace with code not crippled with midule_get(). I hear, hear your growling, but I feel enough comfortable with this and you may fell better too after comparing to 1), which is exactly the way how all this queer engine was designed. Alexey From rddunlap@osdl.org Wed Apr 30 20:11:28 2003 Received: with ECARTIS (v1.0.0; list netdev); Wed, 30 Apr 2003 20:11:37 -0700 (PDT) Received: from mail.osdl.org (air-2.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.9/8.12.9) with SMTP id h413BQFu009983 for ; Wed, 30 Apr 2003 20:11:27 -0700 Received: from fire-2.osdl.org (air2.pdx.osdl.net [172.20.0.6]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id h413BPW28011; Wed, 30 Apr 2003 20:11:25 -0700 Received: from osdl.org (fire.osdl.org [65.172.181.4]) by fire-2.osdl.org (8.12.5/8.11.6) with SMTP id h413BO22025405; Wed, 30 Apr 2003 20:11:24 -0700 Received: from 4.64.196.31 (SquirrelMail authenticated user rddunlap) by www.osdl.org with HTTP; Wed, 30 Apr 2003 20:11:24 -0700 (PDT) Message-ID: <32873.4.64.196.31.1051758684.squirrel@www.osdl.org> Date: Wed, 30 Apr 2003 20:11:24 -0700 (PDT) Subject: Re: Favorite network stress tests? From: "Randy.Dunlap" To: In-Reply-To: <20030501025519.A20159@suse.de> References: <20030430163542.4e09076f.shemminger@osdl.org> <20030430165244.4b247318.rddunlap@osdl.org> <20030501025519.A20159@suse.de> X-Priority: 3 Importance: Normal Cc: , , , X-Mailer: SquirrelMail (version 1.2.11) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-archive-position: 2392 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev > On Wed, Apr 30, 2003 at 04:52:44PM -0700, Randy.Dunlap wrote: > > > fsx-linux from Dave Jones: > > http://www.codemonkey.org.uk/cruft/ > > Actually by Apple Inc. I just made it compile under Linux. Yes, I was just pointing to a location for it, not trying to give credits. I'm hoping (and verified) that the original source of it is in the source file. ~Randy