DragonFly submit List (threaded) for 2005-11
[
Date Prev][
Date Next]
[
Thread Prev][
Thread Next]
[
Date Index][
Thread Index]
802.11 patch
brings in new 802.11 stack from FreeBSD-current
diff -N -u -r src.preview/sbin/ifconfig/Makefile src/sbin/ifconfig/Makefile
--- src.preview/sbin/ifconfig/Makefile 2005-03-03 21:29:19.000000000 -0500
+++ src/sbin/ifconfig/Makefile 2005-09-27 15:02:10.000000000 -0400
@@ -1,25 +1,31 @@
# From: @(#)Makefile 8.1 (Berkeley) 6/5/93
-# $FreeBSD: src/sbin/ifconfig/Makefile,v 1.14.2.7 2002/02/15 03:58:37 luigi Exp $
-# $DragonFly: src/sbin/ifconfig/Makefile,v 1.3 2005/03/04 02:29:19 cpressey Exp $
+# $FreeBSD$
PROG= ifconfig
WARNS?= 6
-SRCS= ifconfig.c
-
-#comment out to exclude SIOC[GS]IFMEDIA support
-SRCS+= ifmedia.c
-CFLAGS+=-DUSE_IF_MEDIA
-CFLAGS+=-DINET6
-
-#comment out to exclude SIOC[GS]ETVLAN support
-SRCS+= ifvlan.c
-CFLAGS+=-DUSE_VLANS
-
-#comment out to exclude SIOC[GS]IEEE80211 support
-SRCS+= ifieee80211.c
-CFLAGS+=-DUSE_IEEE80211
+SRCS= ifconfig.c # base support
MAN= ifconfig.8
+#
+# NB: The order here defines the order in which the constructors
+# are called. This in turn defines the default order in which
+# status is displayed. Probably should add a priority mechanism
+# to the registration process so we don't depend on this aspect
+# of the toolchain.
+#
+SRCS+= af_link.c # LLC support
+SRCS+= af_inet.c # IPv4 support
+SRCS+= af_inet6.c # IPv6 support
+SRCS+= af_atalk.c # AppleTalk support
+
+SRCS+= ifclone.c # clone device support
+# SRCS+= ifmac.c # MAC support
+SRCS+= ifmedia.c # SIOC[GS]IFMEDIA support
+SRCS+= ifvlan.c # SIOC[GS]ETVLAN support
+SRCS+= ifieee80211.c # SIOC[GS]IEEE80211 support
+
+#SRCS+= ifcarp.c # SIOC[GS]VH support
+#SRCS+= ifpfsync.c # pfsync(4) support
.if defined(RELEASE_CRUNCH)
CFLAGS+=-DNO_IPX
diff -N -u -r src.preview/sbin/ifconfig/af_atalk.c src/sbin/ifconfig/af_atalk.c
--- src.preview/sbin/ifconfig/af_atalk.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_atalk.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h> /* for RTX_IFA */
+
+#include <netatalk/at.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <arpa/inet.h>
+
+#include "ifconfig.h"
+
+static struct netrange at_nr; /* AppleTalk net range */
+static struct ifaliasreq at_addreq;
+
+/* XXX FIXME -- should use strtoul for better parsing. */
+static void
+setatrange(const char *range, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ u_int first = 123, last = 123;
+
+ if (sscanf(range, "%u-%u", &first, &last) != 2
+ || first == 0 || first > 0xffff
+ || last == 0 || last > 0xffff || first > last)
+ errx(1, "%s: illegal net range: %u-%u", range, first, last);
+ at_nr.nr_firstnet = htons(first);
+ at_nr.nr_lastnet = htons(last);
+}
+
+static void
+setatphase(const char *phase, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ if (!strcmp(phase, "1"))
+ at_nr.nr_phase = 1;
+ else if (!strcmp(phase, "2"))
+ at_nr.nr_phase = 2;
+ else
+ errx(1, "%s: illegal phase", phase);
+}
+
+static void
+at_status(int s __unused, const struct rt_addrinfo * info)
+{
+ struct sockaddr_at *sat, null_sat;
+ struct netrange *nr;
+
+ memset(&null_sat, 0, sizeof(null_sat));
+
+ sat = (struct sockaddr_at *)info->rti_info[RTAX_IFA];
+ if (sat == NULL)
+ return;
+ nr = &sat->sat_range.r_netrange;
+ printf("\tatalk %d.%d range %d-%d phase %d",
+ ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
+ ntohs(nr->nr_firstnet), ntohs(nr->nr_lastnet), nr->nr_phase);
+ if (flags & IFF_POINTOPOINT) {
+ /* note RTAX_BRD overlap with IFF_BROADCAST */
+ sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
+ if (!sat)
+ sat = &null_sat;
+ printf("--> %d.%d",
+ ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node);
+ }
+ if (flags & IFF_BROADCAST) {
+ /* note RTAX_BRD overlap with IFF_POINTOPOINT */
+ sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
+ if (sat)
+ printf(" broadcast %d.%d",
+ ntohs(sat->sat_addr.s_net),
+ sat->sat_addr.s_node);
+ }
+
+ putchar('\n');
+}
+
+static void
+at_getaddr(const char *addr, int which)
+{
+ struct sockaddr_at *sat = (struct sockaddr_at *) &at_addreq.ifra_addr;
+ u_int net, node;
+
+ sat->sat_family = AF_APPLETALK;
+ sat->sat_len = sizeof(*sat);
+ if (which == MASK)
+ errx(1, "AppleTalk does not use netmasks");
+ if (sscanf(addr, "%u.%u", &net, &node) != 2
+ || net > 0xffff || node > 0xfe)
+ errx(1, "%s: illegal address", addr);
+ sat->sat_addr.s_net = htons(net);
+ sat->sat_addr.s_node = node;
+}
+
+static void
+at_postproc(int s, const struct afswtch *afp)
+{
+ struct sockaddr_at *sat = (struct sockaddr_at *) &at_addreq.ifra_addr;
+
+ if (at_nr.nr_phase == 0)
+ at_nr.nr_phase = 2; /* Default phase 2 */
+ if (at_nr.nr_firstnet == 0)
+ at_nr.nr_firstnet = /* Default range of one */
+ at_nr.nr_lastnet = sat->sat_addr.s_net;
+ printf("\tatalk %d.%d range %d-%d phase %d\n",
+ ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
+ ntohs(at_nr.nr_firstnet), ntohs(at_nr.nr_lastnet),
+ at_nr.nr_phase);
+ if ((u_short) ntohs(at_nr.nr_firstnet) >
+ (u_short) ntohs(sat->sat_addr.s_net)
+ || (u_short) ntohs(at_nr.nr_lastnet) <
+ (u_short) ntohs(sat->sat_addr.s_net))
+ errx(1, "AppleTalk address is not in range");
+ sat->sat_range.r_netrange = at_nr;
+}
+
+static struct cmd atalk_cmds[] = {
+ DEF_CMD_ARG("range", setatrange),
+ DEF_CMD_ARG("phase", setatphase),
+};
+
+static struct afswtch af_atalk = {
+ .af_name = "atalk",
+ .af_af = AF_APPLETALK,
+ .af_status = at_status,
+ .af_getaddr = at_getaddr,
+ .af_postproc = at_postproc,
+ .af_difaddr = SIOCDIFADDR,
+ .af_aifaddr = SIOCAIFADDR,
+ .af_ridreq = &at_addreq,
+ .af_addreq = &at_addreq,
+};
+
+static __constructor void
+atalk_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(atalk_cmds); i++)
+ cmd_register(&atalk_cmds[i]);
+ af_register(&af_atalk);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/af_inet.c src/sbin/ifconfig/af_inet.c
--- src.preview/sbin/ifconfig/af_inet.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_inet.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h> /* for RTX_IFA */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <netinet/in.h>
+#include <net/if_var.h> /* for struct ifaddr */
+#include <netinet/in_var.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include "ifconfig.h"
+
+static struct ifaliasreq in_addreq;
+static struct ifreq in_ridreq;
+
+static void
+in_status(int s __unused, const struct rt_addrinfo * info)
+{
+ struct sockaddr_in *sin, null_sin;
+
+ memset(&null_sin, 0, sizeof(null_sin));
+
+ sin = (struct sockaddr_in *)info->rti_info[RTAX_IFA];
+ if (sin == NULL)
+ return;
+
+ printf("\tinet %s ", inet_ntoa(sin->sin_addr));
+
+ if (flags & IFF_POINTOPOINT) {
+ /* note RTAX_BRD overlap with IFF_BROADCAST */
+ sin = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
+ if (!sin)
+ sin = &null_sin;
+ printf("--> %s ", inet_ntoa(sin->sin_addr));
+ }
+
+ sin = (struct sockaddr_in *)info->rti_info[RTAX_NETMASK];
+ if (!sin)
+ sin = &null_sin;
+ printf("netmask 0x%lx ", (unsigned long)ntohl(sin->sin_addr.s_addr));
+
+ if (flags & IFF_BROADCAST) {
+ /* note RTAX_BRD overlap with IFF_POINTOPOINT */
+ sin = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
+ if (sin && sin->sin_addr.s_addr != 0)
+ printf("broadcast %s", inet_ntoa(sin->sin_addr));
+ }
+ putchar('\n');
+}
+
+#define SIN(x) ((struct sockaddr_in *) &(x))
+static struct sockaddr_in *sintab[] = {
+ SIN(in_ridreq.ifr_addr), SIN(in_addreq.ifra_addr),
+ SIN(in_addreq.ifra_mask), SIN(in_addreq.ifra_broadaddr)
+};
+
+static void
+in_getaddr(const char *s, int which)
+{
+#define MIN(a,b) ((a)<(b)?(a):(b))
+ struct sockaddr_in *sin = sintab[which];
+ struct hostent *hp;
+ struct netent *np;
+
+ sin->sin_len = sizeof(*sin);
+ if (which != MASK)
+ sin->sin_family = AF_INET;
+
+ if (which == ADDR) {
+ char *p = NULL;
+
+ if((p = strrchr(s, '/')) != NULL) {
+ /* address is `name/masklen' */
+ int masklen;
+ int ret;
+ struct sockaddr_in *min = sintab[MASK];
+ *p = '\0';
+ ret = sscanf(p+1, "%u", &masklen);
+ if(ret != 1 || (masklen < 0 || masklen > 32)) {
+ *p = '/';
+ errx(1, "%s: bad value", s);
+ }
+ min->sin_len = sizeof(*min);
+ min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) &
+ 0xffffffff);
+ }
+ }
+
+ if (inet_aton(s, &sin->sin_addr))
+ return;
+ if ((hp = gethostbyname(s)) != 0)
+ bcopy(hp->h_addr, (char *)&sin->sin_addr,
+ MIN(hp->h_length, sizeof(sin->sin_addr)));
+ else if ((np = getnetbyname(s)) != 0)
+ sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
+ else
+ errx(1, "%s: bad value", s);
+#undef MIN
+}
+
+static void
+in_status_tunnel(int s)
+{
+ char src[NI_MAXHOST];
+ char dst[NI_MAXHOST];
+ struct ifreq ifr;
+ const struct sockaddr *sa = (const struct sockaddr *) &ifr.ifr_addr;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, name, IFNAMSIZ);
+
+ if (ioctl(s, SIOCGIFPSRCADDR, (caddr_t)&ifr) < 0)
+ return;
+ if (getnameinfo(sa, sa->sa_len, src, sizeof(src), 0, 0, NI_NUMERICHOST) != 0)
+ src[0] = '\0';
+
+ if (ioctl(s, SIOCGIFPDSTADDR, (caddr_t)&ifr) < 0)
+ return;
+ if (getnameinfo(sa, sa->sa_len, dst, sizeof(dst), 0, 0, NI_NUMERICHOST) != 0)
+ dst[0] = '\0';
+
+ printf("\ttunnel inet %s --> %s\n", src, dst);
+}
+
+static void
+in_set_tunnel(int s, struct addrinfo *srcres, struct addrinfo *dstres)
+{
+ struct ifaliasreq addreq;
+
+ memset(&addreq, 0, sizeof(addreq));
+ strncpy(addreq.ifra_name, name, IFNAMSIZ);
+ memcpy(&addreq.ifra_addr, srcres->ai_addr, srcres->ai_addr->sa_len);
+ memcpy(&addreq.ifra_dstaddr, dstres->ai_addr, dstres->ai_addr->sa_len);
+
+ if (ioctl(s, SIOCSIFPHYADDR, &addreq) < 0)
+ warn("SIOCSIFPHYADDR");
+}
+
+static struct afswtch af_inet = {
+ .af_name = "inet",
+ .af_af = AF_INET,
+ .af_status = in_status,
+ .af_getaddr = in_getaddr,
+ .af_status_tunnel = in_status_tunnel,
+ .af_settunnel = in_set_tunnel,
+ .af_difaddr = SIOCDIFADDR,
+ .af_aifaddr = SIOCAIFADDR,
+ .af_ridreq = &in_ridreq,
+ .af_addreq = &in_addreq,
+};
+
+static __constructor void
+inet_ctor(void)
+{
+ af_register(&af_inet);
+}
diff -N -u -r src.preview/sbin/ifconfig/af_inet6.c src/sbin/ifconfig/af_inet6.c
--- src.preview/sbin/ifconfig/af_inet6.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_inet6.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,547 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h> /* for RTX_IFA */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <ifaddrs.h>
+
+#include <arpa/inet.h>
+
+#include <netinet/in.h>
+#include <net/if_var.h> /* for struct ifaddr */
+#include <netinet/in_var.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <netinet6/nd6.h> /* Define ND6_INFINITE_LIFETIME */
+
+#include "ifconfig.h"
+
+/* wrapper for KAME-special getnameinfo() */
+#ifndef NI_WITHSCOPEID
+#define NI_WITHSCOPEID 0
+#endif
+
+static struct in6_ifreq in6_ridreq;
+static struct in6_aliasreq in6_addreq =
+ { { 0 },
+ { 0 },
+ { 0 },
+ { 0 },
+ 0,
+ { 0, 0, ND6_INFINITE_LIFETIME, ND6_INFINITE_LIFETIME } };
+static int ip6lifetime;
+
+static void in6_fillscopeid(struct sockaddr_in6 *sin6);
+static int prefix(void *, int);
+static char *sec2str(time_t);
+static int explicit_prefix = 0;
+
+static char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/
+
+static void
+setifprefixlen(const char *addr, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ if (afp->af_getprefix != NULL)
+ afp->af_getprefix(addr, MASK);
+ explicit_prefix = 1;
+}
+
+static void
+setip6flags(const char *dummyaddr __unused, int flag, int dummysoc __unused,
+ const struct afswtch *afp)
+{
+ if (afp->af_af != AF_INET6)
+ err(1, "address flags can be set only for inet6 addresses");
+
+ if (flag < 0)
+ in6_addreq.ifra_flags &= ~(-flag);
+ else
+ in6_addreq.ifra_flags |= flag;
+}
+
+static void
+setip6lifetime(const char *cmd, const char *val, int s,
+ const struct afswtch *afp)
+{
+ time_t newval, t;
+ char *ep;
+
+ t = time(NULL);
+ newval = (time_t)strtoul(val, &ep, 0);
+ if (val == ep)
+ errx(1, "invalid %s", cmd);
+ if (afp->af_af != AF_INET6)
+ errx(1, "%s not allowed for the AF", cmd);
+ if (strcmp(cmd, "vltime") == 0) {
+ in6_addreq.ifra_lifetime.ia6t_expire = t + newval;
+ in6_addreq.ifra_lifetime.ia6t_vltime = newval;
+ } else if (strcmp(cmd, "pltime") == 0) {
+ in6_addreq.ifra_lifetime.ia6t_preferred = t + newval;
+ in6_addreq.ifra_lifetime.ia6t_pltime = newval;
+ }
+}
+
+static void
+setip6pltime(const char *seconds, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ setip6lifetime("pltime", seconds, s, afp);
+}
+
+static void
+setip6vltime(const char *seconds, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ setip6lifetime("vltime", seconds, s, afp);
+}
+
+static void
+setip6eui64(const char *cmd, int dummy __unused, int s,
+ const struct afswtch *afp)
+{
+ struct ifaddrs *ifap, *ifa;
+ const struct sockaddr_in6 *sin6 = NULL;
+ const struct in6_addr *lladdr = NULL;
+ struct in6_addr *in6;
+
+ if (afp->af_af != AF_INET6)
+ errx(EXIT_FAILURE, "%s not allowed for the AF", cmd);
+ in6 = (struct in6_addr *)&in6_addreq.ifra_addr.sin6_addr;
+ if (memcmp(&in6addr_any.s6_addr[8], &in6->s6_addr[8], 8) != 0)
+ errx(EXIT_FAILURE, "interface index is already filled");
+ if (getifaddrs(&ifap) != 0)
+ err(EXIT_FAILURE, "getifaddrs");
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ if (ifa->ifa_addr->sa_family == AF_INET6 &&
+ strcmp(ifa->ifa_name, name) == 0) {
+ sin6 = (const struct sockaddr_in6 *)ifa->ifa_addr;
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
+ lladdr = &sin6->sin6_addr;
+ break;
+ }
+ }
+ }
+ if (!lladdr)
+ errx(EXIT_FAILURE, "could not determine link local address");
+
+ memcpy(&in6->s6_addr[8], &lladdr->s6_addr[8], 8);
+
+ freeifaddrs(ifap);
+}
+
+static void
+in6_fillscopeid(struct sockaddr_in6 *sin6)
+{
+#if defined(__KAME__) && defined(KAME_SCOPEID)
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
+ sin6->sin6_scope_id =
+ ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
+ sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
+ }
+#endif
+}
+
+static void
+in6_status(int s __unused, const struct rt_addrinfo * info)
+{
+ struct sockaddr_in6 *sin, null_sin;
+ struct in6_ifreq ifr6;
+ int s6;
+ u_int32_t flags6;
+ struct in6_addrlifetime lifetime;
+ time_t t = time(NULL);
+ int error;
+ u_int32_t scopeid;
+
+ memset(&null_sin, 0, sizeof(null_sin));
+
+ sin = (struct sockaddr_in6 *)info->rti_info[RTAX_IFA];
+ if (sin == NULL)
+ return;
+
+ strncpy(ifr6.ifr_name, ifr.ifr_name, sizeof(ifr.ifr_name));
+ if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
+ warn("socket(AF_INET6,SOCK_DGRAM)");
+ return;
+ }
+ ifr6.ifr_addr = *sin;
+ if (ioctl(s6, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
+ warn("ioctl(SIOCGIFAFLAG_IN6)");
+ close(s6);
+ return;
+ }
+ flags6 = ifr6.ifr_ifru.ifru_flags6;
+ memset(&lifetime, 0, sizeof(lifetime));
+ ifr6.ifr_addr = *sin;
+ if (ioctl(s6, SIOCGIFALIFETIME_IN6, &ifr6) < 0) {
+ warn("ioctl(SIOCGIFALIFETIME_IN6)");
+ close(s6);
+ return;
+ }
+ lifetime = ifr6.ifr_ifru.ifru_lifetime;
+ close(s6);
+
+ /* XXX: embedded link local addr check */
+ if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr) &&
+ *(u_short *)&sin->sin6_addr.s6_addr[2] != 0) {
+ u_short index;
+
+ index = *(u_short *)&sin->sin6_addr.s6_addr[2];
+ *(u_short *)&sin->sin6_addr.s6_addr[2] = 0;
+ if (sin->sin6_scope_id == 0)
+ sin->sin6_scope_id = ntohs(index);
+ }
+ scopeid = sin->sin6_scope_id;
+
+ error = getnameinfo((struct sockaddr *)sin, sin->sin6_len, addr_buf,
+ sizeof(addr_buf), NULL, 0,
+ NI_NUMERICHOST|NI_WITHSCOPEID);
+ if (error != 0)
+ inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
+ sizeof(addr_buf));
+ printf("\tinet6 %s ", addr_buf);
+
+ if (flags & IFF_POINTOPOINT) {
+ /* note RTAX_BRD overlap with IFF_BROADCAST */
+ sin = (struct sockaddr_in6 *)info->rti_info[RTAX_BRD];
+ /*
+ * some of the interfaces do not have valid destination
+ * address.
+ */
+ if (sin && sin->sin6_family == AF_INET6) {
+ int error;
+
+ /* XXX: embedded link local addr check */
+ if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr) &&
+ *(u_short *)&sin->sin6_addr.s6_addr[2] != 0) {
+ u_short index;
+
+ index = *(u_short *)&sin->sin6_addr.s6_addr[2];
+ *(u_short *)&sin->sin6_addr.s6_addr[2] = 0;
+ if (sin->sin6_scope_id == 0)
+ sin->sin6_scope_id = ntohs(index);
+ }
+
+ error = getnameinfo((struct sockaddr *)sin,
+ sin->sin6_len, addr_buf,
+ sizeof(addr_buf), NULL, 0,
+ NI_NUMERICHOST|NI_WITHSCOPEID);
+ if (error != 0)
+ inet_ntop(AF_INET6, &sin->sin6_addr, addr_buf,
+ sizeof(addr_buf));
+ printf("--> %s ", addr_buf);
+ }
+ }
+
+ sin = (struct sockaddr_in6 *)info->rti_info[RTAX_NETMASK];
+ if (!sin)
+ sin = &null_sin;
+ printf("prefixlen %d ", prefix(&sin->sin6_addr,
+ sizeof(struct in6_addr)));
+
+ if ((flags6 & IN6_IFF_ANYCAST) != 0)
+ printf("anycast ");
+ if ((flags6 & IN6_IFF_TENTATIVE) != 0)
+ printf("tentative ");
+ if ((flags6 & IN6_IFF_DUPLICATED) != 0)
+ printf("duplicated ");
+ if ((flags6 & IN6_IFF_DETACHED) != 0)
+ printf("detached ");
+ if ((flags6 & IN6_IFF_DEPRECATED) != 0)
+ printf("deprecated ");
+ if ((flags6 & IN6_IFF_AUTOCONF) != 0)
+ printf("autoconf ");
+ if ((flags6 & IN6_IFF_TEMPORARY) != 0)
+ printf("temporary ");
+
+ if (scopeid)
+ printf("scopeid 0x%x ", scopeid);
+
+ if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
+ printf("pltime ");
+ if (lifetime.ia6t_preferred) {
+ printf("%s ", lifetime.ia6t_preferred < t
+ ? "0" : sec2str(lifetime.ia6t_preferred - t));
+ } else
+ printf("infty ");
+
+ printf("vltime ");
+ if (lifetime.ia6t_expire) {
+ printf("%s ", lifetime.ia6t_expire < t
+ ? "0" : sec2str(lifetime.ia6t_expire - t));
+ } else
+ printf("infty ");
+ }
+
+ putchar('\n');
+}
+
+#define SIN6(x) ((struct sockaddr_in6 *) &(x))
+static struct sockaddr_in6 *sin6tab[] = {
+ SIN6(in6_ridreq.ifr_addr), SIN6(in6_addreq.ifra_addr),
+ SIN6(in6_addreq.ifra_prefixmask), SIN6(in6_addreq.ifra_dstaddr)
+};
+
+static void
+in6_getprefix(const char *plen, int which)
+{
+ struct sockaddr_in6 *sin = sin6tab[which];
+ u_char *cp;
+ int len = atoi(plen);
+
+ if ((len < 0) || (len > 128))
+ errx(1, "%s: bad value", plen);
+ sin->sin6_len = sizeof(*sin);
+ if (which != MASK)
+ sin->sin6_family = AF_INET6;
+ if ((len == 0) || (len == 128)) {
+ memset(&sin->sin6_addr, 0xff, sizeof(struct in6_addr));
+ return;
+ }
+ memset((void *)&sin->sin6_addr, 0x00, sizeof(sin->sin6_addr));
+ for (cp = (u_char *)&sin->sin6_addr; len > 7; len -= 8)
+ *cp++ = 0xff;
+ *cp = 0xff << (8 - len);
+}
+
+static void
+in6_getaddr(const char *s, int which)
+{
+ struct sockaddr_in6 *sin = sin6tab[which];
+ struct addrinfo hints, *res;
+ int error = -1;
+
+ newaddr &= 1;
+
+ sin->sin6_len = sizeof(*sin);
+ if (which != MASK)
+ sin->sin6_family = AF_INET6;
+
+ if (which == ADDR) {
+ char *p = NULL;
+ if((p = strrchr(s, '/')) != NULL) {
+ *p = '\0';
+ in6_getprefix(p + 1, MASK);
+ explicit_prefix = 1;
+ }
+ }
+
+ if (sin->sin6_family == AF_INET6) {
+ bzero(&hints, sizeof(struct addrinfo));
+ hints.ai_family = AF_INET6;
+ error = getaddrinfo(s, NULL, &hints, &res);
+ }
+ if (error != 0) {
+ if (inet_pton(AF_INET6, s, &sin->sin6_addr) != 1)
+ errx(1, "%s: bad value", s);
+ } else
+ bcopy(res->ai_addr, sin, res->ai_addrlen);
+}
+
+static int
+prefix(void *val, int size)
+{
+ u_char *name = (u_char *)val;
+ int byte, bit, plen = 0;
+
+ for (byte = 0; byte < size; byte++, plen += 8)
+ if (name[byte] != 0xff)
+ break;
+ if (byte == size)
+ return (plen);
+ for (bit = 7; bit != 0; bit--, plen++)
+ if (!(name[byte] & (1 << bit)))
+ break;
+ for (; bit != 0; bit--)
+ if (name[byte] & (1 << bit))
+ return(0);
+ byte++;
+ for (; byte < size; byte++)
+ if (name[byte])
+ return(0);
+ return (plen);
+}
+
+static char *
+sec2str(time_t total)
+{
+ static char result[256];
+ int days, hours, mins, secs;
+ int first = 1;
+ char *p = result;
+
+ if (0) {
+ days = total / 3600 / 24;
+ hours = (total / 3600) % 24;
+ mins = (total / 60) % 60;
+ secs = total % 60;
+
+ if (days) {
+ first = 0;
+ p += sprintf(p, "%dd", days);
+ }
+ if (!first || hours) {
+ first = 0;
+ p += sprintf(p, "%dh", hours);
+ }
+ if (!first || mins) {
+ first = 0;
+ p += sprintf(p, "%dm", mins);
+ }
+ sprintf(p, "%ds", secs);
+ } else
+ sprintf(result, "%lu", (unsigned long)total);
+
+ return(result);
+}
+
+static void
+in6_postproc(int s, const struct afswtch *afp)
+{
+ if (explicit_prefix == 0) {
+ /* Aggregatable address architecture defines all prefixes
+ are 64. So, it is convenient to set prefixlen to 64 if
+ it is not specified. */
+ setifprefixlen("64", 0, s, afp);
+ /* in6_getprefix("64", MASK) if MASK is available here... */
+ }
+}
+
+static void
+in6_status_tunnel(int s)
+{
+ char src[NI_MAXHOST];
+ char dst[NI_MAXHOST];
+#ifdef NI_WITHSCOPEID
+ const int niflag = NI_NUMERICHOST | NI_WITHSCOPEID;
+#else
+ const int niflag = NI_NUMERICHOST;
+#endif
+ struct in6_ifreq in6_ifr;
+ const struct sockaddr *sa = (const struct sockaddr *) &in6_ifr.ifr_addr;
+
+ memset(&in6_ifr, 0, sizeof(in6_ifr));
+ strncpy(in6_ifr.ifr_name, name, IFNAMSIZ);
+
+ if (ioctl(s, SIOCGIFPSRCADDR_IN6, (caddr_t)&in6_ifr) < 0)
+ return;
+ if (sa->sa_family == AF_INET6)
+ in6_fillscopeid(&in6_ifr.ifr_addr);
+ if (getnameinfo(sa, sa->sa_len, src, sizeof(src), 0, 0, niflag) != 0)
+ src[0] = '\0';
+
+ if (ioctl(s, SIOCGIFPDSTADDR_IN6, (caddr_t)&in6_ifr) < 0)
+ return;
+ if (sa->sa_family == AF_INET6)
+ in6_fillscopeid(&in6_ifr.ifr_addr);
+ if (getnameinfo(sa, sa->sa_len, dst, sizeof(dst), 0, 0, niflag) != 0)
+ dst[0] = '\0';
+
+ printf("\ttunnel inet6 %s --> %s\n", src, dst);
+}
+
+static void
+in6_set_tunnel(int s, struct addrinfo *srcres, struct addrinfo *dstres)
+{
+ struct in6_aliasreq in6_addreq;
+
+ memset(&in6_addreq, 0, sizeof(in6_addreq));
+ strncpy(in6_addreq.ifra_name, name, IFNAMSIZ);
+ memcpy(&in6_addreq.ifra_addr, srcres->ai_addr, srcres->ai_addr->sa_len);
+ memcpy(&in6_addreq.ifra_dstaddr, dstres->ai_addr,
+ dstres->ai_addr->sa_len);
+
+ if (ioctl(s, SIOCSIFPHYADDR_IN6, &in6_addreq) < 0)
+ warn("SIOCSIFPHYADDR_IN6");
+}
+
+static struct cmd inet6_cmds[] = {
+ DEF_CMD_ARG("prefixlen", setifprefixlen),
+ DEF_CMD("tentative", IN6_IFF_TENTATIVE, setip6flags),
+ DEF_CMD("-tentative", -IN6_IFF_TENTATIVE, setip6flags),
+ DEF_CMD("deprecated", IN6_IFF_DEPRECATED, setip6flags),
+ DEF_CMD("-deprecated", -IN6_IFF_DEPRECATED, setip6flags),
+ DEF_CMD("autoconf", IN6_IFF_AUTOCONF, setip6flags),
+ DEF_CMD("-autoconf", -IN6_IFF_AUTOCONF, setip6flags),
+ DEF_CMD_ARG("pltime", setip6pltime),
+ DEF_CMD_ARG("vltime", setip6vltime),
+ DEF_CMD("eui64", 0, setip6eui64),
+};
+
+static struct afswtch af_inet6 = {
+ .af_name = "inet6",
+ .af_af = AF_INET6,
+ .af_status = in6_status,
+ .af_getaddr = in6_getaddr,
+ .af_getprefix = in6_getprefix,
+ .af_postproc = in6_postproc,
+ .af_status_tunnel = in6_status_tunnel,
+ .af_settunnel = in6_set_tunnel,
+ .af_difaddr = SIOCDIFADDR_IN6,
+ .af_aifaddr = SIOCAIFADDR_IN6,
+ .af_ridreq = &in6_addreq,
+ .af_addreq = &in6_addreq,
+};
+
+static void
+in6_Lopt_cb(const char *optarg __unused)
+{
+ ip6lifetime++; /* print IPv6 address lifetime */
+}
+static struct option in6_Lopt = { "L", "[-L]", in6_Lopt_cb };
+
+static __constructor void
+inet6_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(inet6_cmds); i++)
+ cmd_register(&inet6_cmds[i]);
+ af_register(&af_inet6);
+ opt_register(&in6_Lopt);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/af_ipx.c src/sbin/ifconfig/af_ipx.c
--- src.preview/sbin/ifconfig/af_ipx.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_ipx.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <net/if_var.h>
+#define IPXIP
+#define IPTUNNEL
+#include <netipx/ipx.h>
+#include <netipx/ipx_if.h>
+
+#include "ifconfig.h"
+
+static struct ifaliasreq ipx_addreq;
+static struct ifreq ipx_ridreq;
+
+static void
+ipx_status(int s __unused, const struct rt_addrinfo * info)
+{
+ struct sockaddr_ipx *sipx, null_sipx;
+
+ sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_IFA];
+ if (sipx == NULL)
+ return;
+
+ printf("\tipx %s ", ipx_ntoa(sipx->sipx_addr));
+
+ if (flags & IFF_POINTOPOINT) {
+ sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_BRD];
+ if (!sipx) {
+ memset(&null_sipx, 0, sizeof(null_sipx));
+ sipx = &null_sipx;
+ }
+ printf("--> %s ", ipx_ntoa(sipx->sipx_addr));
+ }
+ putchar('\n');
+}
+
+#define SIPX(x) ((struct sockaddr_ipx *) &(x))
+struct sockaddr_ipx *sipxtab[] = {
+ SIPX(ipx_ridreq.ifr_addr), SIPX(ipx_addreq.ifra_addr),
+ SIPX(ipx_addreq.ifra_mask), SIPX(ipx_addreq.ifra_broadaddr)
+};
+
+static void
+ipx_getaddr(const char *addr, int which)
+{
+ struct sockaddr_ipx *sipx = sipxtab[which];
+
+ sipx->sipx_family = AF_IPX;
+ sipx->sipx_len = sizeof(*sipx);
+ sipx->sipx_addr = ipx_addr(addr);
+ if (which == MASK)
+ printf("Attempt to set IPX netmask will be ineffectual\n");
+}
+
+static void
+ipx_postproc(int s, const struct afswtch *afp)
+{
+ if (setipdst) {
+ struct ipxip_req rq;
+ int size = sizeof(rq);
+
+ rq.rq_ipx = ipx_addreq.ifra_addr;
+ rq.rq_ip = ipx_addreq.ifra_dstaddr;
+
+ if (setsockopt(s, 0, SO_IPXIP_ROUTE, &rq, size) < 0)
+ Perror("Encapsulation Routing");
+ }
+}
+
+static struct afswtch af_ipx = {
+ .af_name = "ipx",
+ .af_af = AF_IPX,
+ .af_status = ipx_status,
+ .af_getaddr = ipx_getaddr,
+ .af_postproc = ipx_postproc,
+ .af_difaddr = SIOCDIFADDR,
+ .af_aifaddr = SIOCAIFADDR,
+ .af_ridreq = &ipx_ridreq,
+ .af_addreq = &ipx_addreq,
+};
+
+static __constructor void
+ipx_ctor(void)
+{
+ af_register(&af_ipx);
+}
diff -N -u -r src.preview/sbin/ifconfig/af_link.c src/sbin/ifconfig/af_link.c
--- src.preview/sbin/ifconfig/af_link.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/af_link.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/route.h> /* for RTX_IFA */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/ethernet.h>
+
+#include "ifconfig.h"
+
+static struct ifreq link_ridreq;
+
+static void
+link_status(int s __unused, const struct rt_addrinfo *info)
+{
+ const struct sockaddr_dl *sdl =
+ (const struct sockaddr_dl *) info->rti_info[RTAX_IFA];
+
+ if (sdl != NULL && sdl->sdl_alen > 0) {
+ if (sdl->sdl_type == IFT_ETHER &&
+ sdl->sdl_alen == ETHER_ADDR_LEN)
+ printf("\tether %s\n",
+ ether_ntoa((const struct ether_addr *)LLADDR(sdl)));
+ else {
+ int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
+
+ printf("\tlladdr %s\n", link_ntoa(sdl) + n);
+ }
+ }
+}
+
+static void
+link_getaddr(const char *addr, int which)
+{
+ char *temp;
+ struct sockaddr_dl sdl;
+ struct sockaddr *sa = &link_ridreq.ifr_addr;
+
+ if (which != ADDR)
+ errx(1, "can't set link-level netmask or broadcast");
+ if ((temp = malloc(strlen(addr) + 1)) == NULL)
+ errx(1, "malloc failed");
+ temp[0] = ':';
+ strcpy(temp + 1, addr);
+ sdl.sdl_len = sizeof(sdl);
+ link_addr(temp, &sdl);
+ free(temp);
+ if (sdl.sdl_alen > sizeof(sa->sa_data))
+ errx(1, "malformed link-level address");
+ sa->sa_family = AF_LINK;
+ sa->sa_len = sdl.sdl_alen;
+ bcopy(LLADDR(&sdl), sa->sa_data, sdl.sdl_alen);
+}
+
+static struct afswtch af_link = {
+ .af_name = "link",
+ .af_af = AF_LINK,
+ .af_status = link_status,
+ .af_getaddr = link_getaddr,
+ .af_aifaddr = SIOCSIFLLADDR,
+ .af_addreq = &link_ridreq,
+};
+static struct afswtch af_ether = {
+ .af_name = "ether",
+ .af_af = AF_LINK,
+ .af_status = link_status,
+ .af_getaddr = link_getaddr,
+ .af_aifaddr = SIOCSIFLLADDR,
+ .af_addreq = &link_ridreq,
+};
+static struct afswtch af_lladdr = {
+ .af_name = "lladdr",
+ .af_af = AF_LINK,
+ .af_status = link_status,
+ .af_getaddr = link_getaddr,
+ .af_aifaddr = SIOCSIFLLADDR,
+ .af_addreq = &link_ridreq,
+};
+
+static __constructor void
+link_ctor(void)
+{
+ af_register(&af_link);
+ af_register(&af_ether);
+ af_register(&af_lladdr);
+}
diff -N -u -r src.preview/sbin/ifconfig/ifcarp.c src/sbin/ifconfig/ifcarp.c
--- src.preview/sbin/ifconfig/ifcarp.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifcarp.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,199 @@
+/* $FreeBSD$ */
+/* from $OpenBSD: ifconfig.c,v 1.82 2003/10/19 05:43:35 mcbride Exp $ */
+
+/*
+ * Copyright (c) 2002 Michael Shalayeff. All rights reserved.
+ * Copyright (c) 2003 Ryan McBride. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <netinet/ip_carp.h>
+#include <net/route.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <err.h>
+#include <errno.h>
+
+#include "ifconfig.h"
+
+static const char *carp_states[] = { CARP_STATES };
+
+void carp_status(int s);
+void setcarp_advbase(const char *,int, int, const struct afswtch *rafp);
+void setcarp_advskew(const char *, int, int, const struct afswtch *rafp);
+void setcarp_passwd(const char *, int, int, const struct afswtch *rafp);
+void setcarp_vhid(const char *, int, int, const struct afswtch *rafp);
+
+void
+carp_status(int s)
+{
+ const char *state;
+ struct carpreq carpr;
+
+ memset((char *)&carpr, 0, sizeof(struct carpreq));
+ ifr.ifr_data = (caddr_t)&carpr;
+
+ if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+ return;
+
+ if (carpr.carpr_vhid > 0) {
+ if (carpr.carpr_state > CARP_MAXSTATE)
+ state = "<UNKNOWN>";
+ else
+ state = carp_states[carpr.carpr_state];
+
+ printf("\tcarp: %s vhid %d advbase %d advskew %d\n",
+ state, carpr.carpr_vhid, carpr.carpr_advbase,
+ carpr.carpr_advskew);
+ }
+
+ return;
+
+}
+
+void
+setcarp_passwd(const char *val, int d, int s, const struct afswtch *afp)
+{
+ struct carpreq carpr;
+
+ memset((char *)&carpr, 0, sizeof(struct carpreq));
+ ifr.ifr_data = (caddr_t)&carpr;
+
+ if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCGVH");
+
+ /* XXX Should hash the password into the key here, perhaps? */
+ strlcpy(carpr.carpr_key, val, CARP_KEY_LEN);
+
+ if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSVH");
+
+ return;
+}
+
+void
+setcarp_vhid(const char *val, int d, int s, const struct afswtch *afp)
+{
+ int vhid;
+ struct carpreq carpr;
+
+ vhid = atoi(val);
+
+ if (vhid <= 0)
+ errx(1, "vhid must be greater than 0");
+
+ memset((char *)&carpr, 0, sizeof(struct carpreq));
+ ifr.ifr_data = (caddr_t)&carpr;
+
+ if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCGVH");
+
+ carpr.carpr_vhid = vhid;
+
+ if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSVH");
+
+ return;
+}
+
+void
+setcarp_advskew(const char *val, int d, int s, const struct afswtch *afp)
+{
+ int advskew;
+ struct carpreq carpr;
+
+ advskew = atoi(val);
+
+ memset((char *)&carpr, 0, sizeof(struct carpreq));
+ ifr.ifr_data = (caddr_t)&carpr;
+
+ if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCGVH");
+
+ carpr.carpr_advskew = advskew;
+
+ if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSVH");
+
+ return;
+}
+
+void
+setcarp_advbase(const char *val, int d, int s, const struct afswtch *afp)
+{
+ int advbase;
+ struct carpreq carpr;
+
+ advbase = atoi(val);
+
+ memset((char *)&carpr, 0, sizeof(struct carpreq));
+ ifr.ifr_data = (caddr_t)&carpr;
+
+ if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCGVH");
+
+ carpr.carpr_advbase = advbase;
+
+ if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSVH");
+
+ return;
+}
+
+static struct cmd carp_cmds[] = {
+ DEF_CMD_ARG("advbase", setcarp_advbase),
+ DEF_CMD_ARG("advskew", setcarp_advskew),
+ DEF_CMD_ARG("pass", setcarp_passwd),
+ DEF_CMD_ARG("vhid", setcarp_vhid),
+};
+static struct afswtch af_carp = {
+ .af_name = "af_carp",
+ .af_af = AF_UNSPEC,
+ .af_other_status = carp_status,
+};
+
+static __constructor void
+carp_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(carp_cmds); i++)
+ cmd_register(&carp_cmds[i]);
+ af_register(&af_carp);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifclone.c src/sbin/ifconfig/ifclone.c
--- src.preview/sbin/ifconfig/ifclone.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifclone.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "ifconfig.h"
+
+static void
+list_cloners(void)
+{
+ struct if_clonereq ifcr;
+ char *cp, *buf;
+ int idx;
+ int s;
+
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+ if (s == -1)
+ err(1, "socket(AF_INET,SOCK_DGRAM)");
+
+ memset(&ifcr, 0, sizeof(ifcr));
+
+ if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
+ err(1, "SIOCIFGCLONERS for count");
+
+ buf = malloc(ifcr.ifcr_total * IFNAMSIZ);
+ if (buf == NULL)
+ err(1, "unable to allocate cloner name buffer");
+
+ ifcr.ifcr_count = ifcr.ifcr_total;
+ ifcr.ifcr_buffer = buf;
+
+ if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
+ err(1, "SIOCIFGCLONERS for names");
+
+ /*
+ * In case some disappeared in the mean time, clamp it down.
+ */
+ if (ifcr.ifcr_count > ifcr.ifcr_total)
+ ifcr.ifcr_count = ifcr.ifcr_total;
+
+ for (cp = buf, idx = 0; idx < ifcr.ifcr_count; idx++, cp += IFNAMSIZ) {
+ if (idx > 0)
+ putchar(' ');
+ printf("%s", cp);
+ }
+
+ putchar('\n');
+ free(buf);
+}
+
+void
+clone_create(void)
+{
+ int s;
+
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+ if (s == -1)
+ err(1, "socket(AF_INET,SOCK_DGRAM)");
+
+ memset(&ifr, 0, sizeof(ifr));
+ (void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ if (ioctl(s, SIOCIFCREATE, &ifr) < 0)
+ err(1, "SIOCIFCREATE");
+
+ /*
+ * If we get a different name back then we put in, we probably
+ * want to print it out, but we might change our mind later so
+ * we just signal our intrest and leave the printout for later.
+ */
+ if (strcmp(name, ifr.ifr_name) != 0) {
+ printname = 1;
+ strlcpy(name, ifr.ifr_name, sizeof(name));
+ }
+
+ close(s);
+}
+
+static void
+clone_destroy(const char *val, int d, int s, const struct afswtch *rafp)
+{
+
+ (void) strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ if (ioctl(s, SIOCIFDESTROY, &ifr) < 0)
+ err(1, "SIOCIFDESTROY");
+ /*
+ * If we create and destroy an interface in the same command,
+ * there isn't any reason to print it's name.
+ */
+ printname = 0;
+}
+
+static struct cmd clone_cmds[] = {
+ DEF_CMD("destroy", 0, clone_destroy),
+ DEF_CMD("unplumb", 0, clone_destroy),
+};
+
+static void
+clone_Copt_cb(const char *optarg __unused)
+{
+ list_cloners();
+ exit(0);
+}
+static struct option clone_Copt = { "C", "[-C]", clone_Copt_cb };
+
+static __constructor void
+clone_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(clone_cmds); i++)
+ cmd_register(&clone_cmds[i]);
+ opt_register(&clone_Copt);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifconfig.8 src/sbin/ifconfig/ifconfig.8
--- src.preview/sbin/ifconfig/ifconfig.8 2005-04-25 13:33:26.000000000 -0400
+++ src/sbin/ifconfig/ifconfig.8 2005-09-27 15:02:10.000000000 -0400
@@ -26,10 +26,9 @@
.\" SUCH DAMAGE.
.\"
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
-.\" $FreeBSD: src/sbin/ifconfig/ifconfig.8,v 1.85 2004/07/27 09:51:49 yar Exp $
-.\" $DragonFly: src/sbin/ifconfig/ifconfig.8,v 1.7 2005/04/25 17:33:26 swildner Exp $
+.\" $FreeBSD$
.\"
-.Dd July 26, 2004
+.Dd November 2, 2004
.Dt IFCONFIG 8
.Os
.Sh NAME
@@ -56,6 +55,7 @@
.Op Fl d
.Op Fl m
.Op Fl u
+.Op Fl v
.Op Ar address_family
.Nm
.Fl l
@@ -67,6 +67,7 @@
.Op Fl d
.Op Fl m
.Op Fl u
+.Op Fl v
.Op Fl C
.Sh DESCRIPTION
The
@@ -224,6 +225,14 @@
.It Fl arp
Disable the use of the Address Resolution Protocol
.Pq Xr arp 4 .
+.It Cm staticarp
+If the Address Resolution Protocol is enabled,
+the host will only reply to requests for its addresses,
+and will never send any requests.
+.It Fl staticarp
+If the Address Resolution Protocol is enabled,
+the host will perform normally,
+sending out requests and listening for replies.
.It Cm broadcast
(Inet only.)
Specify the address to use to represent broadcasts to the
@@ -256,15 +265,18 @@
Fill interface index
(lowermost 64bit of an IPv6 address)
automatically.
-.\" .It Cm ipdst
-.\" This is used to specify an Internet host who is willing to receive
-.\" ip packets encapsulating NS packets bound for a remote network.
-.\" An apparent point to point link is constructed, and
-.\" the address specified will be taken as the NS address and network
-.\" of the destination.
-.\" IP encapsulation of
-.\" .Tn CLNP
-.\" packets is done differently.
+.It Cm ipdst
+This is used to specify an Internet host who is willing to receive
+IP packets encapsulating IPX packets bound for a remote network.
+An apparent point to point link is constructed, and
+the address specified will be taken as the IPX address and network
+of the destination.
+.\".It Cm maclabel Ar label
+.\"If Mandatory Access Control support is enabled in the kernel,
+.\"set the MAC label to
+.\".Ar label .
+.\" (see
+.\" .Xr maclabel 7 ) .
.It Cm media Ar type
If the driver supports the media selection system, set the media type
of the interface to
@@ -318,18 +330,18 @@
of each other, so setting one may also set the other.
The driver will offload as much checksum work as it can reliably
support, the exact level of offloading varies between drivers.
-.\".It Fl rxcsum , Fl txcsum
-.\"If the driver supports user-configurable checksum offloading,
-.\"disable receive (or transmit) checksum offloading on the interface.
-.\"These settings may not always be independent of each other.
-.\".It Cm polling
-.\"If the driver has user-configurable
-.\".Xr polling 4
-.\"support, select the polling mode on the interface.
-.\".It Fl polling
-.\"If the driver has user-configurable
-.\".Xr polling 4
-.\"support, select the interrupt mode on the interface.
+.It Fl rxcsum , txcsum
+If the driver supports user-configurable checksum offloading,
+disable receive (or transmit) checksum offloading on the interface.
+These settings may not always be independent of each other.
+.It Cm polling
+If the driver has user-configurable
+.Xr polling 4
+support, select the polling mode on the interface.
+.It Fl polling
+If the driver has user-configurable
+.Xr polling 4
+support, select the interrupt mode on the interface.
.It Cm tunnel Ar src_addr dest_addr
(IP tunnel devices only.)
Configure the physical source and destination address for IP tunnel
@@ -350,7 +362,10 @@
If the interface is given without a unit number, try to create a new
device with an arbitrary unit number.
If creation of an arbitrary device is successful, the new device name is
-printed to standard output.
+printed to standard output unless the interface is renamed or destroyed
+in the same
+.Nm
+invocation.
.It Cm destroy
Destroy the specified network pseudo-device.
.It Cm plumb
@@ -446,7 +461,7 @@
not on a
.Xr vlan 4
interface itself.
-.It Fl vlanmtu , Fl vlanhwtag
+.It Fl vlanmtu , vlanhwtag
If the driver offers user-configurable VLAN support, disable
reception of extended frames or tag processing in hardware,
respectively.
@@ -568,13 +583,13 @@
.It Fl link Op Cm 0 No - Cm 2
.Sm on
Disable special processing at the link level with the specified interface.
-.\".It Cm monitor
-.\"Put the interface in monitor mode.
-.\"No packets are transmitted, and received packets are discarded after
-.\".Xr bpf 4
-.\"processing.
-.\".It Fl monitor
-.\"Take the interface out of monitor mode.
+.It Cm monitor
+Put the interface in monitor mode.
+No packets are transmitted, and received packets are discarded after
+.Xr bpf 4
+processing.
+.It Fl monitor
+Take the interface out of monitor mode.
.It Cm up
Mark an interface
.Dq up .
@@ -583,64 +598,104 @@
It happens automatically when setting the first address on an interface.
If the interface was reset when previously marked down,
the hardware will be re-initialized.
-.It Cm ssid Ar ssid
-For IEEE 802.11 wireless interfaces, set the desired Service Set
-Identifier (aka network name).
-The SSID is a string up to 32 characters
-in length and may be specified as either a normal string or in
-hexadecimal when proceeded by
-.Ql 0x .
-Additionally, the SSID may be cleared by setting it to
-.Ql - .
-.It Cm nwid Ar ssid
-Another name for the
-.Cm ssid
-parameter.
-Included for
-.Nx
-compatibility.
-.It Cm stationname Ar name
-For IEEE 802.11 wireless interfaces, set the name of this station.
-It appears that the station name is not really part of the IEEE 802.11
-protocol though all interfaces seem to support it.
-As such it only
-seems to be meaningful to identical or virtually identical equipment.
-Setting the station name is identical in syntax to setting the SSID.
-.It Cm station Ar name
-Another name for the
-.Cm stationname
-parameter.
-Included for
-.Bsx
-compatibility.
-.It Cm channel Ar number
-For IEEE 802.11 wireless interfaces, set the desired channel.
-Channels range from 1 to 14, but the exact selection available
-depends on the region your adaptor was manufactured for.
-Setting
-the channel to 0 will give you the default for your adaptor.
-Many
-adaptors ignore this setting unless you are in ad-hoc mode.
+.El
+.Pp
+The following parameters are specific to IEEE 802.11 wireless interfaces:
+.Bl -tag -width indent
+.It Cm apbridge
+When operating as an access point, pass packets between
+wireless clients directly (default).
+To instead let them pass up through the
+system and be forwarded using some other mechanism, use
+.Fl apbridge .
+Disabling the internal bridging
+is useful when traffic is to be processed with
+packet filtering.
.It Cm authmode Ar mode
-For IEEE 802.11 wireless interfaces, set the desired authentication mode
-in infrastructure mode.
+Set the desired authentication mode in infrastructure mode.
Not all adaptors support all modes.
The set of
valid modes is
.Dq Li none ,
.Dq Li open ,
+.Dq Li shared
+(shared key),
+.Dq Li 8021x
+(IEEE 802.1x),
+or
+.Dq Li wpa
+(IEEE WPA/WPA2/802.11i).
+The
+.Dq Li 8021x
and
-.Dq Li shared .
+.Dq Li wpa
+modes are only useful when used an authentication service
+(a supplicant for client operation or an authenticator when
+operating as an access point).
Modes are case insensitive.
+.It Cm bssid Ar address
+Specify the MAC address of the access point to use when operating
+as a station in a BSS network.
+This overrides any automatic selection done by the system.
+To disable a previously selected access point, supply
+.Dq Li any ,
+.Dq Li none ,
+or
+.Dq Li -
+for the address.
+This option is useful when more than one access points have the same SSID.
+Another name for the
+.Cm bssid
+parameter is
+.Cm ap .
+.It Cm chanlist Ar channels
+Set the desired channels to use when scanning for access
+points, neighbors in an IBSS network, or looking for unoccupied
+channels when operating as an access point.
+The set of channels is specified as a comma-separated list with
+each element in the list representing either a single channel number or a range
+of the form
+.Dq Li a-b .
+Channel numbers must be in the range 1 to 255 and be permissible
+according to the operating characteristics of the device.
+.It Cm channel Ar number
+Set a single desired channel.
+Channels range from 1 to 255, but the exact selection available
+depends on the region your adaptor was manufactured for.
+Setting
+the channel to
+.Dq Li 0 ,
+.Dq Li any ,
+or
+.Dq Li -
+will give you the default for your adaptor.
+Many
+adaptors ignore this setting unless you are in ad-hoc mode.
+Alternatively the frequency, in megahertz, may be specified
+instead of the channel number.
+.It Cm hidessid
+When operating as an access point, do not broadcast the SSID
+in beacon frames.
+By default, the SSID is included in beacon frames.
+To re-enable the broadcast of the SSID, use
+.Fl hidessid .
.It Cm powersave
-For IEEE 802.11 wireless interfaces, enable powersave mode.
-.It Fl powersave
-For IEEE 802.11 wireless interfaces, disable powersave mode.
+Enable powersave operation.
+When operating as a client, the station will conserve power by
+periodically turning off the radio and listening for
+messages from the access point telling it there are packets waiting.
+The station must then retrieve the packets.
+When operating as an access point, the station must honor power
+save operation of associated clients.
+Not all devices support power save operation, either as a client
+or as an access point.
+Use
+.Fl powersave
+to disable powersave operation.
.It Cm powersavesleep Ar sleep
-For IEEE 802.11 wireless interfaces, set the desired max powersave sleep
-time in milliseconds.
+Set the desired max powersave sleep time in milliseconds.
.It Cm protmode Ar technique
-For IEEE 802.11 wireless interfaces operating in 11g, use the specified
+For interfaces operating in 802.11g, use the specified
.Ar technique
for protecting OFDM frames in a mixed 11b/11g network.
The set of valid techniques is
@@ -651,8 +706,26 @@
.Dq Li rtscts
(RTS/CTS).
Technique names are case insensitive.
+.It Cm roaming Ar mode
+When operating as a station, control how the system will
+behave when communication with the current access point
+is broken.
+The
+.Ar mode
+argument may be one of
+.Dq Li device
+(leave it to the hardware device to decide),
+.Dq Li auto
+(handle either in the device or the operating system\[em]as appropriate),
+.Dq Li manual
+(do nothing until explicitly instructed).
+By default, the device is left to handle this if it is
+capable; otherwise, the operating system will automatically
+attempt to reestablish communication.
+Manual mode is mostly useful when an application wants to
+control the selection of an access point.
.It Cm rtsthreshold Ar length
-For IEEE 802.11 wireless interfaces, set the threshold for which
+Set the threshold for which
transmitted frames are preceded by transmission of an
RTS
control frame.
@@ -661,8 +734,26 @@
argument
is the frame size in bytes and must be in the range 1 to 2312.
Not all adaptors support setting the RTS threshold.
+.It Cm ssid Ar ssid
+Set the desired Service Set Identifier (aka network name).
+The SSID is a string up to 32 characters
+in length and may be specified as either a normal string or in
+hexadecimal when proceeded by
+.Ql 0x .
+Additionally, the SSID may be cleared by setting it to
+.Ql - .
+.It Cm scan
+Display the current set of scanned neighbors and/or trigger a new scan.
+Only the super-user can trigger a scan.
+.It Cm stationname Ar name
+Set the name of this station.
+It appears that the station name is not really part of the IEEE 802.11
+protocol though all interfaces seem to support it.
+As such it only
+seems to be meaningful to identical or virtually identical equipment.
+Setting the station name is identical in syntax to setting the SSID.
.It Cm txpower Ar power
-For IEEE 802.11 wireless interfaces, set the power used to transmit frames.
+Set the power used to transmit frames.
The
.Ar power
argument
@@ -673,7 +764,7 @@
the driver will use the setting closest to the specified value.
Not all adaptors support changing the transmit power.
.It Cm wepmode Ar mode
-For IEEE 802.11 wireless interfaces, set the desired WEP mode.
+Set the desired WEP mode.
Not all adaptors support all modes.
The set of valid modes is
.Dq Li off ,
@@ -693,10 +784,9 @@
.Dq Li mixed .
Modes are case insensitive.
.It Cm weptxkey Ar index
-For IEEE 802.11 wireless interfaces, set the WEP key to be used for
-transmission.
+Set the WEP key to be used for transmission.
.It Cm wepkey Ar key Ns | Ns Ar index : Ns Ar key
-For IEEE 802.11 wireless interfaces, set the selected WEP key.
+Set the selected WEP key.
If an
.Ar index
is not given, key 1 is set.
@@ -719,6 +809,31 @@
If that is the case, then the first four keys
(1-4) will be the standard temporary keys and any others will be adaptor
specific keys such as permanent keys stored in NVRAM.
+.It Cm wme
+Enable Wireless Media Extensions (WME) support, if available,
+for the specified interface.
+WME is a subset of the IEEE 802.11e standard to support the
+efficient communication of realtime and multimedia data.
+To disable WME support, use
+.Fl wme .
+.El
+.Pp
+The following parameters are support for compatibility with other systems:
+.Bl -tag -width indent
+.It Cm nwid Ar ssid
+Another name for the
+.Cm ssid
+parameter.
+Included for
+.Nx
+compatibility.
+.It Cm station Ar name
+Another name for the
+.Cm stationname
+parameter.
+Included for
+.Bsx
+compatibility.
.It Cm wep
Another way of saying
.Cm wepmode on .
@@ -733,9 +848,7 @@
compatibility.
.It Cm nwkey key
Another way of saying:
-.Pp
.Dq Li "wepmode on weptxkey 1 wepkey 1:key wepkey 2:- wepkey 3:- wepkey 4:-" .
-.Pp
Included for
.Nx
compatibility.
@@ -745,16 +858,13 @@
.Sm on
.Xc
Another way of saying
-.Pp
.Dq Li "wepmode on weptxkey n wepkey 1:k1 wepkey 2:k2 wepkey 3:k3 wepkey 4:k4" .
-.Pp
Included for
.Nx
compatibility.
.It Fl nwkey
Another way of saying
.Cm wepmode off .
-.Pp
Included for
.Nx
compatibility.
@@ -768,9 +878,6 @@
.Nm
will report only the details specific to that protocol family.
.Pp
-If the driver does supports the media selection system, the supported
-media list will be included in the output.
-.Pp
If the
.Fl m
flag is passed before an interface name,
@@ -810,6 +917,10 @@
(only list interfaces that are up).
.Pp
The
+.Fl v
+flag may be used to get more verbose status for an interface.
+.Pp
+The
.Fl C
flag may be used to list all of the interface cloners available on
the system, with no additional information.
@@ -823,22 +934,10 @@
Messages indicating the specified interface does not exist, the
requested address is unknown, or the user is not privileged and
tried to alter an interface's configuration.
-.Sh BUGS
-Basic IPv6 node operation requires a link-local address on each
-interface configured for IPv6.
-Normally, such an address is automatically configured by the
-kernel on each interface added to the system; this behaviour may
-be disabled by setting the sysctl MIB variable
-.Va net.inet6.ip6.auto_linklocal
-to 0.
-.Pp
-If you delete such an address using
-.Nm ,
-the kernel may act very oddly.
-Do this at your own risk.
.Sh SEE ALSO
.Xr netstat 1 ,
.Xr netintro 4 ,
+.Xr polling 4 ,
.Xr vlan 4 ,
.\" .Xr eon 5 ,
.Xr rc 8 ,
@@ -849,3 +948,16 @@
.Nm
utility appeared in
.Bx 4.2 .
+.Sh BUGS
+Basic IPv6 node operation requires a link-local address on each
+interface configured for IPv6.
+Normally, such an address is automatically configured by the
+kernel on each interface added to the system; this behaviour may
+be disabled by setting the sysctl MIB variable
+.Va net.inet6.ip6.auto_linklocal
+to 0.
+.Pp
+If you delete such an address using
+.Nm ,
+the kernel may act very oddly.
+Do this at your own risk.
diff -N -u -r src.preview/sbin/ifconfig/ifconfig.c src/sbin/ifconfig/ifconfig.c
--- src.preview/sbin/ifconfig/ifconfig.c 2005-05-26 05:06:40.000000000 -0400
+++ src/sbin/ifconfig/ifconfig.c 2005-09-27 15:03:42.000000000 -0400
@@ -25,17 +25,25 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * @(#) Copyright (c) 1983, 1993 The Regents of the University of California. All rights reserved.
- * @(#)ifconfig.c 8.2 (Berkeley) 2/16/94
- * $FreeBSD: src/sbin/ifconfig/ifconfig.c,v 1.96 2004/02/27 06:43:14 kan Exp $
- * $DragonFly: src/sbin/ifconfig/ifconfig.c,v 1.24 2005/05/26 09:06:40 dillon Exp $
*/
+#ifndef lint
+static const char copyright[] =
+"@(#) Copyright (c) 1983, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ifconfig.c 8.2 (Berkeley) 2/16/94";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
+#endif /* not lint */
+
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
-#include <sys/sockio.h>
#include <sys/sysctl.h>
#include <sys/time.h>
#include <sys/module.h>
@@ -54,30 +62,6 @@
#include <arpa/inet.h>
#include <netdb.h>
-#ifdef INET6
-#include <netinet6/nd6.h> /* Define ND6_INFINITE_LIFETIME */
-#endif
-
-#ifndef NO_IPX
-/* IPX */
-#define IPXIP
-#define IPTUNNEL
-#include <netipx/ipx.h>
-#include <netipx/ipx_if.h>
-#endif
-
-/* Appletalk */
-#include <netatalk/at.h>
-
-/* XNS */
-#ifdef NS
-#define NSIP
-#include <netns/ns.h>
-#include <netns/ns_if.h>
-#endif
-
-/* OSI */
-
#include <ctype.h>
#include <err.h>
#include <errno.h>
@@ -86,34 +70,15 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <ifaddrs.h>
#include "ifconfig.h"
-/* wrapper for KAME-special getnameinfo() */
-#ifndef NI_WITHSCOPEID
-#define NI_WITHSCOPEID 0
-#endif
-
/*
* Since "struct ifreq" is composed of various union members, callers
* should pay special attention to interprete the value.
* (.e.g. little/big endian difference in the structure.)
*/
-struct ifreq ifr, ridreq;
-struct ifaliasreq addreq;
-#ifdef INET6
-struct in6_ifreq in6_ridreq;
-struct in6_aliasreq in6_addreq =
- { { 0 },
- { 0, 0, 0, 0, { { { 0 } } }, 0 },
- { 0, 0, 0, 0, { { { 0 } } }, 0 },
- { 0, 0, 0, 0, { { { 0 } } }, 0 },
- 0,
- { 0, 0, ND6_INFINITE_LIFETIME, ND6_INFINITE_LIFETIME } };
-#endif
-struct sockaddr_in netmask;
-struct netrange at_nr; /* AppleTalk net range */
+struct ifreq ifr;
char name[IFNAMSIZ];
int flags;
@@ -123,326 +88,78 @@
int doalias;
int clearaddr;
int newaddr = 1;
-#ifdef INET6
-static int ip6lifetime;
-#endif
+int verbose;
-struct afswtch;
+int supmedia = 0;
+int printname = 0; /* Print the name of the created interface. */
-int supmedia = 0;
-int listcloners = 0;
-int printname = 0; /* Print the name of the created interface. */
-
-#ifdef INET6
-char addr_buf[MAXHOSTNAMELEN *2 + 1]; /*for getnameinfo()*/
-#endif
-
-void Perror(const char *cmd);
-void checkatrange(struct sockaddr_at *);
-int ifconfig(int argc, char *const *argv, const struct afswtch *afp);
-void notealias(const char *, int, int, const struct afswtch *afp);
-void list_cloners(void);
-void printb(const char *s, unsigned value, const char *bits);
-void rt_xaddrs(caddr_t, caddr_t, struct rt_addrinfo *);
-void status(const struct afswtch *afp, int addrcount,
+static int ifconfig(int argc, char *const *argv, const struct afswtch *afp);
+static void status(const struct afswtch *afp, int addrcount,
struct sockaddr_dl *sdl, struct if_msghdr *ifm,
struct ifa_msghdr *ifam);
-void tunnel_status(int s);
-void usage(void);
-void ifmaybeload(char *if_nm);
-
-#ifdef INET6
-void in6_fillscopeid(struct sockaddr_in6 *sin6);
-int prefix(void *, int);
-static char *sec2str(time_t);
-int explicit_prefix = 0;
-#endif
-
-typedef void c_func(const char *cmd, int arg, int s, const struct afswtch *afp);
-typedef void c_func2(const char *arg, const char *arg2, int s, const struct afswtch *afp);
-c_func setatphase, setatrange;
-c_func setifaddr, setifbroadaddr, setifdstaddr, setifnetmask;
-c_func2 settunnel;
-c_func deletetunnel;
-#ifdef INET6
-c_func setifprefixlen;
-c_func setip6flags;
-c_func setip6pltime;
-c_func setip6vltime;
-c_func2 setip6lifetime;
-c_func setip6eui64;
-#endif
-c_func setifipdst;
-c_func setifflags, setifmetric, setifmtu, setifcap;
-c_func clone_destroy;
-c_func setifname;
-
-void clone_create(void);
-
-
-#define NEXTARG 0xffffff
-#define NEXTARG2 0xfffffe
-
-const
-struct cmd {
- const char *c_name;
- int c_parameter; /* NEXTARG means next argv */
- void (*c_func)(const char *, int, int, const struct afswtch *afp);
- void (*c_func2)(const char *, const char *, int, const struct afswtch *afp);
-} cmds[] = {
- { "up", IFF_UP, setifflags, NULL },
- { "down", -IFF_UP, setifflags, NULL },
- { "polling", IFF_POLLING, setifflags, NULL },
- { "-polling", -IFF_POLLING, setifflags, NULL },
- { "arp", -IFF_NOARP, setifflags, NULL },
- { "-arp", IFF_NOARP, setifflags, NULL },
- { "debug", IFF_DEBUG, setifflags, NULL },
- { "-debug", -IFF_DEBUG, setifflags, NULL },
- { "promisc", IFF_PPROMISC, setifflags, NULL },
- { "-promisc", -IFF_PPROMISC, setifflags, NULL },
- { "add", IFF_UP, notealias, NULL },
- { "alias", IFF_UP, notealias, NULL },
- { "-alias", -IFF_UP, notealias, NULL },
- { "delete", -IFF_UP, notealias, NULL },
- { "remove", -IFF_UP, notealias, NULL },
-#ifdef notdef
-#define EN_SWABIPS 0x1000
- { "swabips", EN_SWABIPS, setifflags, NULL },
- { "-swabips", -EN_SWABIPS, setifflags, NULL },
-#endif
- { "netmask", NEXTARG, setifnetmask, NULL },
-#ifdef INET6
- { "prefixlen", NEXTARG, setifprefixlen, NULL },
- { "anycast", IN6_IFF_ANYCAST, setip6flags, NULL },
- { "tentative", IN6_IFF_TENTATIVE, setip6flags, NULL },
- { "-tentative", -IN6_IFF_TENTATIVE, setip6flags, NULL },
- { "deprecated", IN6_IFF_DEPRECATED, setip6flags, NULL },
- { "-deprecated", -IN6_IFF_DEPRECATED, setip6flags, NULL },
- { "autoconf", IN6_IFF_AUTOCONF, setip6flags, NULL },
- { "-autoconf", -IN6_IFF_AUTOCONF, setip6flags, NULL },
- { "pltime", NEXTARG, setip6pltime, NULL },
- { "vltime", NEXTARG, setip6vltime, NULL },
- { "eui64", 0, setip6eui64, NULL },
-#endif
- { "range", NEXTARG, setatrange, NULL },
- { "phase", NEXTARG, setatphase, NULL },
- { "metric", NEXTARG, setifmetric, NULL },
- { "broadcast", NEXTARG, setifbroadaddr, NULL },
- { "ipdst", NEXTARG, setifipdst, NULL },
- { "tunnel", NEXTARG2, NULL, settunnel },
- { "deletetunnel", 0, deletetunnel, NULL },
- { "link0", IFF_LINK0, setifflags, NULL },
- { "-link0", -IFF_LINK0, setifflags, NULL },
- { "link1", IFF_LINK1, setifflags, NULL },
- { "-link1", -IFF_LINK1, setifflags, NULL },
- { "link2", IFF_LINK2, setifflags, NULL },
- { "-link2", -IFF_LINK2, setifflags, NULL },
-#if notyet
- { "monitor", IFF_MONITOR, setifflags, NULL },
- { "-monitor", -IFF_MONITOR, setifflags, NULL },
- { "staticarp", IFF_STATICARP, setifflags, NULL },
- { "-staticarp", -IFF_STATICARP, setifflags, NULL },
-#endif
+static void tunnel_status(int s);
+static void usage(void);
-#ifdef USE_IF_MEDIA
- { "media", NEXTARG, setmedia, NULL },
- { "mode", NEXTARG, setmediamode, NULL },
- { "mediaopt", NEXTARG, setmediaopt, NULL },
- { "-mediaopt", NEXTARG, unsetmediaopt, NULL },
-#endif
-#ifdef USE_VLANS
- { "vlan", NEXTARG, setvlantag, NULL },
- { "vlandev", NEXTARG, setvlandev, NULL },
- { "-vlandev", NEXTARG, unsetvlandev, NULL },
-#endif
-#if 0
- /* XXX `create' special-cased below */
- {"create", 0, clone_create, NULL },
- {"plumb", 0, clone_create, NULL },
-#endif
- {"destroy", 0, clone_destroy, NULL },
- {"unplumb", 0, clone_destroy, NULL },
-#ifdef USE_IEEE80211
- { "ssid", NEXTARG, set80211ssid, NULL },
- { "nwid", NEXTARG, set80211ssid, NULL },
- { "stationname", NEXTARG, set80211stationname, NULL },
- { "station", NEXTARG, set80211stationname, NULL }, /* BSD/OS */
- { "channel", NEXTARG, set80211channel, NULL },
- { "authmode", NEXTARG, set80211authmode, NULL },
- { "powersavemode", NEXTARG, set80211powersavemode, NULL },
- { "powersave", 1, set80211powersave, NULL },
- { "-powersave", 0, set80211powersave, NULL },
- { "powersavesleep", NEXTARG, set80211powersavesleep, NULL },
- { "wepmode", NEXTARG, set80211wepmode, NULL },
- { "wep", 1, set80211wep, NULL },
- { "-wep", 0, set80211wep, NULL },
- { "weptxkey", NEXTARG, set80211weptxkey, NULL },
- { "wepkey", NEXTARG, set80211wepkey, NULL },
- { "nwkey", NEXTARG, set80211nwkey, NULL }, /* NetBSD */
- { "-nwkey", 0, set80211wep, NULL }, /* NetBSD */
- { "rtsthreshold",NEXTARG, set80211rtsthreshold, NULL },
- { "protmode", NEXTARG, set80211protmode, NULL },
- { "txpower", NEXTARG, set80211txpower, NULL },
-#endif
- { "rxcsum", IFCAP_RXCSUM, setifcap, NULL },
- { "-rxcsum", -IFCAP_RXCSUM, setifcap, NULL },
- { "txcsum", IFCAP_TXCSUM, setifcap, NULL },
- { "-txcsum", -IFCAP_TXCSUM, setifcap, NULL },
- { "netcons", IFCAP_NETCONS, setifcap, NULL },
- { "-netcons", -IFCAP_NETCONS, setifcap, NULL },
- { "vlanmtu", IFCAP_VLAN_MTU, setifcap, NULL },
- { "-vlanmtu", -IFCAP_VLAN_MTU, setifcap, NULL },
- { "vlanhwtag", IFCAP_VLAN_HWTAGGING, setifcap, NULL },
- { "-vlanhwtag", -IFCAP_VLAN_HWTAGGING, setifcap, NULL },
- { "normal", -IFF_LINK0, setifflags, NULL },
- { "compress", IFF_LINK0, setifflags, NULL },
- { "noicmp", IFF_LINK1, setifflags, NULL },
- { "mtu", NEXTARG, setifmtu, NULL },
- { "name", NEXTARG, setifname, NULL },
- { NULL, 0, setifaddr, NULL },
- { NULL, 0, setifdstaddr, NULL },
-};
-
-/*
- * XNS support liberally adapted from code written at the University of
- * Maryland principally by James O'Toole and Chris Torek.
- */
-typedef void af_status(int, struct rt_addrinfo *);
-typedef void af_getaddr(const char *, int);
-typedef void af_getprefix(const char *, int);
-
-af_status in_status, at_status, link_status;
-af_getaddr in_getaddr, at_getaddr, link_getaddr;
-
-#ifndef NO_IPX
-af_status ipx_status;
-af_getaddr ipx_getaddr;
-#endif
+static struct afswtch *af_getbyname(const char *name);
+static struct afswtch *af_getbyfamily(int af);
+static void af_other_status(int);
-#ifdef INET6
-af_status in6_status;
-af_getaddr in6_getaddr;
-af_getprefix in6_getprefix;
-#endif /*INET6*/
-#ifdef NS
-af_status xns_status;
-af_getaddr xns_getaddr;
-#endif
-
-/* Known address families */
-const
-struct afswtch {
- const char *af_name;
- short af_af;
- af_status *af_status;
- af_getaddr *af_getaddr;
- af_getprefix *af_getprefix;
- u_long af_difaddr;
- u_long af_aifaddr;
- caddr_t af_ridreq;
- caddr_t af_addreq;
-} afs[] = {
-#define C(x) ((caddr_t) &x)
- { "inet", AF_INET, in_status, in_getaddr, NULL,
- SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
-#ifdef INET6
- { "inet6", AF_INET6, in6_status, in6_getaddr, in6_getprefix,
- SIOCDIFADDR_IN6, SIOCAIFADDR_IN6,
- C(in6_ridreq), C(in6_addreq) },
-#endif /*INET6*/
-#ifndef NO_IPX
- { "ipx", AF_IPX, ipx_status, ipx_getaddr, NULL,
- SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
-#endif
- { "atalk", AF_APPLETALK, at_status, at_getaddr, NULL,
- SIOCDIFADDR, SIOCAIFADDR, C(addreq), C(addreq) },
-#ifdef NS
- { "ns", AF_NS, xns_status, xns_getaddr, NULL,
- SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
-#endif
- { "link", AF_LINK, link_status, link_getaddr, NULL,
- 0, SIOCSIFLLADDR, NULL, C(ridreq) },
- { "ether", AF_LINK, link_status, link_getaddr, NULL,
- 0, SIOCSIFLLADDR, NULL, C(ridreq) },
- { "lladdr", AF_LINK, link_status, link_getaddr, NULL,
- 0, SIOCSIFLLADDR, NULL, C(ridreq) },
- { NULL, 0, NULL, NULL, NULL, 0, 0, NULL, NULL }
-};
-
-/*
- * Expand the compacted form of addresses as returned via the
- * configuration read via sysctl().
- */
-
-#define ROUNDUP(a) \
- ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
-#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
+static struct option *opts = NULL;
void
-rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
+opt_register(struct option *p)
{
- struct sockaddr *sa;
- int i;
-
- memset(rtinfo->rti_info, 0, sizeof(rtinfo->rti_info));
- for (i = 0; (i < RTAX_MAX) && (cp < cplim); i++) {
- if ((rtinfo->rti_addrs & (1 << i)) == 0)
- continue;
- rtinfo->rti_info[i] = sa = (struct sockaddr *)cp;
- ADVANCE(cp, sa);
- }
+ p->next = opts;
+ opts = p;
}
-
-void
+static void
usage(void)
{
-#ifndef INET6
- fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
- "usage: ifconfig interface address_family [address [dest_address]]",
- " [parameters]",
- " ifconfig -C",
- " ifconfig interface create",
- " ifconfig -a [-d] [-m] [-u] [address_family]",
- " ifconfig -l [-d] [-u] [address_family]",
- " ifconfig [-d] [-m] [-u]");
-#else
- fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
- "usage: ifconfig [-L] interface address_family [address [dest_address]]",
- " [parameters]",
- " ifconfig -C",
- " ifconfig interface create",
- " ifconfig -a [-L] [-d] [-m] [-u] [address_family]",
- " ifconfig -l [-d] [-u] [address_family]",
- " ifconfig [-L] [-d] [-m] [-u]");
-#endif
+ char options[1024];
+ struct option *p;
+
+ /* XXX not right but close enough for now */
+ options[0] = '\0';
+ for (p = opts; p != NULL; p = p->next) {
+ strlcat(options, p->opt_usage, sizeof(options));
+ strlcat(options, " ", sizeof(options));
+ }
+
+ fprintf(stderr,
+ "usage: ifconfig %sinterface address_family [address [dest_address]]\n"
+ " [parameters]\n"
+ " ifconfig interface create\n"
+ " ifconfig -a %s[-d] [-m] [-u] [-v] [address_family]\n"
+ " ifconfig -l [-d] [-u] [address_family]\n"
+ " ifconfig %s[-d] [-m] [-u] [-v]\n",
+ options, options, options);
exit(1);
}
int
-main(int argc, char * const *argv)
+main(int argc, char *argv[])
{
- int c;
- int all, namesonly, downonly, uponly;
+ int c, all, namesonly, downonly, uponly;
int need_nl = 0, count = 0;
- const struct afswtch *afp = 0;
+ const struct afswtch *afp = NULL;
int addrcount, ifindex;
- struct if_msghdr *ifm, *nextifm;
- struct ifa_msghdr *ifam;
- struct sockaddr_dl *sdl;
- char *buf, *lim, *next;
-
+ struct if_msghdr *ifm, *nextifm;
+ struct ifa_msghdr *ifam;
+ struct sockaddr_dl *sdl;
+ char *buf, *lim, *next;
size_t needed;
int mib[6];
+ char options[1024];
+ struct option *p;
+
+ all = downonly = uponly = namesonly = verbose = 0;
/* Parse leading line options */
- all = downonly = uponly = namesonly = 0;
- while ((c = getopt(argc, argv, "adlmuC"
-#ifdef INET6
- "L"
-#endif
- )) != -1) {
+ strlcpy(options, "adlmuv", sizeof(options));
+ for (p = opts; p != NULL; p = p->next)
+ strlcat(options, p->opt, sizeof(options));
+ while ((c = getopt(argc, argv, options)) != -1) {
switch (c) {
case 'a': /* scan all interfaces */
all++;
@@ -459,32 +176,23 @@
case 'u': /* restrict scan to "up" interfaces */
uponly++;
break;
- case 'C':
- listcloners = 1;
+ case 'v':
+ verbose++;
break;
-#ifdef INET6
- case 'L':
- ip6lifetime++; /* print IPv6 address lifetime */
- break;
-#endif
default:
- usage();
+ for (p = opts; p != NULL; p = p->next)
+ if (p->opt[0] == c) {
+ p->cb(optarg);
+ break;
+ }
+ if (p == NULL)
+ usage();
break;
}
}
argc -= optind;
argv += optind;
- if (listcloners) {
- /* -C must be solitary */
- if (all || supmedia || uponly || downonly || namesonly ||
- argc > 0)
- usage();
-
- list_cloners();
- exit(0);
- }
-
/* -l cannot be used with -a or -m */
if (namesonly && (all || supmedia))
usage();
@@ -504,13 +212,11 @@
ifindex = 0;
if (argc == 1) {
- for (afp = afs; afp->af_name; afp++)
- if (strcmp(afp->af_name, *argv) == 0) {
- argc--, argv++;
- break;
- }
- if (afp->af_name == NULL)
+ afp = af_getbyname(*argv);
+ if (afp == NULL)
usage();
+ if (afp->af_name != NULL)
+ argc--, argv++;
/* leave with afp non-zero */
}
} else {
@@ -543,13 +249,9 @@
/* Check for address family */
if (argc > 0) {
- for (afp = afs; afp->af_name; afp++)
- if (strcmp(afp->af_name, *argv) == 0) {
- argc--, argv++;
- break;
- }
- if (afp->af_name == NULL)
- afp = NULL; /* not a family, NULL */
+ afp = af_getbyname(*argv);
+ if (afp != NULL)
+ argc--, argv++;
}
retry:
@@ -561,7 +263,7 @@
mib[5] = ifindex; /* interface index */
/* if particular family specified, only ask about it */
- if (afp)
+ if (afp != NULL)
mib[3] = afp->af_af;
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
@@ -586,10 +288,10 @@
if (ifm->ifm_type == RTM_IFINFO) {
#if notyet
- if (ifm->ifm_data.ifi_datalen == 0)
- ifm->ifm_data.ifi_datalen = sizeof(struct if_data);
- sdl = (struct sockaddr_dl *)((char *)ifm + sizeof(struct if_msghdr) -
- sizeof(struct if_data) + ifm->ifm_data.ifi_datalen);
+ if (ifm->ifm_data.ifi_datalen == 0)
+ ifm->ifm_data.ifi_datalen = sizeof(struct if_data);
+ sdl = (struct sockaddr_dl *)((char *)ifm + sizeof(struct if_msghdr) -
+ sizeof(struct if_data) + ifm->ifm_data.ifi_datalen);
#else
sdl = (struct sockaddr_dl *)(ifm + 1);
#endif
@@ -627,14 +329,6 @@
sizeof(name)-1 : sdl->sdl_nlen] = '\0';
if (all || namesonly) {
- size_t len;
-
- /* sdl_data may not be terminated, don't use strlcpy */
- if ((len = sdl->sdl_nlen) > sizeof(name) - 1)
- len = sizeof(name) - 1;
- bcopy(sdl->sdl_data, name, len);
- name[len] = 0;
-
if (uponly)
if ((flags & IFF_UP) == 0)
continue; /* not up */
@@ -642,9 +336,8 @@
if (flags & IFF_UP)
continue; /* not down */
if (namesonly) {
- if (afp == NULL ||
- afp->af_status != link_status ||
- sdl->sdl_type == IFT_ETHER) {
+ if (afp == NULL || afp->af_af != AF_LINK ||
+ sdl->sdl_type == IFT_ETHER) {
if (need_nl)
putchar(' ');
fputs(name, stdout);
@@ -670,92 +363,192 @@
exit (0);
}
+static struct afswtch *afs = NULL;
-int
+void
+af_register(struct afswtch *p)
+{
+ p->af_next = afs;
+ afs = p;
+}
+
+static struct afswtch *
+af_getbyname(const char *name)
+{
+ struct afswtch *afp;
+
+ for (afp = afs; afp != NULL; afp = afp->af_next)
+ if (strcmp(afp->af_name, name) == 0)
+ return afp;
+ return NULL;
+}
+
+static struct afswtch *
+af_getbyfamily(int af)
+{
+ struct afswtch *afp;
+
+ for (afp = afs; afp != NULL; afp = afp->af_next)
+ if (afp->af_af == af)
+ return afp;
+ return NULL;
+}
+
+static void
+af_other_status(int s)
+{
+ struct afswtch *afp;
+ uint8_t afmask[howmany(AF_MAX, NBBY)];
+
+ memset(afmask, 0, sizeof(afmask));
+ for (afp = afs; afp != NULL; afp = afp->af_next) {
+ if (afp->af_other_status == NULL)
+ continue;
+ if (afp->af_af != AF_UNSPEC && isset(afmask, afp->af_af))
+ continue;
+ afp->af_other_status(s);
+ setbit(afmask, afp->af_af);
+ }
+}
+
+static void
+af_all_tunnel_status(int s)
+{
+ struct afswtch *afp;
+ uint8_t afmask[howmany(AF_MAX, NBBY)];
+
+ memset(afmask, 0, sizeof(afmask));
+ for (afp = afs; afp != NULL; afp = afp->af_next) {
+ if (afp->af_status_tunnel == NULL)
+ continue;
+ if (afp->af_af != AF_UNSPEC && isset(afmask, afp->af_af))
+ continue;
+ afp->af_status_tunnel(s);
+ setbit(afmask, afp->af_af);
+ }
+}
+
+static struct cmd *cmds = NULL;
+
+void
+cmd_register(struct cmd *p)
+{
+ p->c_next = cmds;
+ cmds = p;
+}
+
+static const struct cmd *
+cmd_lookup(const char *name)
+{
+#define N(a) (sizeof(a)/sizeof(a[0]))
+ const struct cmd *p;
+
+ for (p = cmds; p != NULL; p = p->c_next)
+ if (strcmp(name, p->c_name) == 0)
+ return p;
+ return NULL;
+#undef N
+}
+
+struct callback {
+ callback_func *cb_func;
+ void *cb_arg;
+ struct callback *cb_next;
+};
+static struct callback *callbacks = NULL;
+
+void
+callback_register(callback_func *func, void *arg)
+{
+ struct callback *cb;
+
+ cb = malloc(sizeof(struct callback));
+ if (cb == NULL)
+ errx(1, "unable to allocate memory for callback");
+ cb->cb_func = func;
+ cb->cb_arg = arg;
+ cb->cb_next = callbacks;
+ callbacks = cb;
+}
+
+/* specially-handled commands */
+static void setifaddr(const char *, int, int, const struct afswtch *);
+static const struct cmd setifaddr_cmd = DEF_CMD("ifaddr", 0, setifaddr);
+
+static void setifdstaddr(const char *, int, int, const struct afswtch *);
+static const struct cmd setifdstaddr_cmd =
+ DEF_CMD("ifdstaddr", 0, setifdstaddr);
+
+static int
ifconfig(int argc, char *const *argv, const struct afswtch *afp)
{
+ struct callback *cb;
int s;
if (afp == NULL)
- afp = &afs[0];
- ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af;
+ afp = af_getbyname("inet");
+ ifr.ifr_addr.sa_family =
+ afp->af_af == AF_LINK || afp->af_af == AF_UNSPEC ?
+ AF_INET : afp->af_af;
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
- err(1, "socket");
+ err(1, "socket(family %u,SOCK_DGRAM", ifr.ifr_addr.sa_family);
while (argc > 0) {
const struct cmd *p;
- for (p = cmds; p->c_name; p++)
- if (strcmp(*argv, p->c_name) == 0)
- break;
- if (p->c_name == 0 && setaddr)
- p++; /* got src, do dst */
- if (p->c_func || p->c_func2) {
+ p = cmd_lookup(*argv);
+ if (p == NULL) {
+ /*
+ * Not a recognized command, choose between setting
+ * the interface address and the dst address.
+ */
+ p = (setaddr ? &setifdstaddr_cmd : &setifaddr_cmd);
+ }
+ if (p->c_u.c_func || p->c_u.c_func2) {
if (p->c_parameter == NEXTARG) {
if (argv[1] == NULL)
errx(1, "'%s' requires argument",
p->c_name);
- (*p->c_func)(argv[1], 0, s, afp);
+ p->c_u.c_func(argv[1], 0, s, afp);
argc--, argv++;
+ } else if (p->c_parameter == OPTARG) {
+ p->c_u.c_func(argv[1], 0, s, afp);
+ if (argv[1] != NULL)
+ argc--, argv++;
} else if (p->c_parameter == NEXTARG2) {
if (argc < 3)
errx(1, "'%s' requires 2 arguments",
p->c_name);
- (*p->c_func2)(argv[1], argv[2], s, afp);
+ p->c_u.c_func2(argv[1], argv[2], s, afp);
argc -= 2, argv += 2;
} else
- (*p->c_func)(*argv, p->c_parameter, s, afp);
+ p->c_u.c_func(*argv, p->c_parameter, s, afp);
}
argc--, argv++;
}
-#ifdef INET6
- if (ifr.ifr_addr.sa_family == AF_INET6 && explicit_prefix == 0) {
- /* Aggregatable address architecture defines all prefixes
- are 64. So, it is convenient to set prefixlen to 64 if
- it is not specified. */
- setifprefixlen("64", 0, s, afp);
- /* in6_getprefix("64", MASK) if MASK is available here... */
- }
-#endif
-#ifndef NO_IPX
- if (setipdst && ifr.ifr_addr.sa_family == AF_IPX) {
- struct ipxip_req rq;
- int size = sizeof(rq);
-
- rq.rq_ipx = addreq.ifra_addr;
- rq.rq_ip = addreq.ifra_dstaddr;
-
- if (setsockopt(s, 0, SO_IPXIP_ROUTE, &rq, size) < 0)
- Perror("Encapsulation Routing");
- }
-#endif
- if (ifr.ifr_addr.sa_family == AF_APPLETALK)
- checkatrange((struct sockaddr_at *) &addreq.ifra_addr);
-#ifdef NS
- if (setipdst && ifr.ifr_addr.sa_family == AF_NS) {
- struct nsip_req rq;
- int size = sizeof(rq);
- rq.rq_ns = addreq.ifra_addr;
- rq.rq_ip = addreq.ifra_dstaddr;
-
- if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0)
- Perror("Encapsulation Routing");
- }
-#endif
+ /*
+ * Do any post argument processing required by the address family.
+ */
+ if (afp->af_postproc != NULL)
+ afp->af_postproc(s, afp);
+ /*
+ * Do deferred operations.
+ */
if (clearaddr) {
if (afp->af_ridreq == NULL || afp->af_difaddr == 0) {
warnx("interface %s cannot change %s addresses!",
name, afp->af_name);
- clearaddr = NULL;
+ clearaddr = 0;
}
}
if (clearaddr) {
int ret;
strncpy(afp->af_ridreq, name, sizeof ifr.ifr_name);
- if ((ret = ioctl(s, afp->af_difaddr, afp->af_ridreq)) < 0) {
+ ret = ioctl(s, afp->af_difaddr, afp->af_ridreq);
+ if (ret < 0) {
if (errno == EADDRNOTAVAIL && (doalias >= 0)) {
/* means no previous address for interface */
} else
@@ -774,20 +567,23 @@
if (ioctl(s, afp->af_aifaddr, afp->af_addreq) < 0)
Perror("ioctl (SIOCAIFADDR)");
}
+
+ /*
+ * Do deferred callbacks registered while processing
+ * command-line arguments.
+ */
+ for (cb = callbacks; cb != NULL; cb = cb->cb_next)
+ cb->cb_func(s, cb->cb_arg);
+
close(s);
return(0);
}
-#define RIDADDR 0
-#define ADDR 1
-#define MASK 2
-#define DSTADDR 3
/*ARGSUSED*/
-void
-setifaddr(const char *addr, int param __unused, int s __unused,
- const struct afswtch *afp)
+static void
+setifaddr(const char *addr, int param, int s, const struct afswtch *afp)
{
- if (*afp->af_getaddr == NULL)
+ if (afp->af_getaddr == NULL)
return;
/*
* Delay the ioctl to set the interface addr until flags are all set.
@@ -797,21 +593,20 @@
setaddr++;
if (doalias == 0 && afp->af_af != AF_LINK)
clearaddr = 1;
- (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
+ afp->af_getaddr(addr, (doalias >= 0 ? ADDR : RIDADDR));
}
-void
+static void
settunnel(const char *src, const char *dst, int s, const struct afswtch *afp)
{
- struct addrinfo hints, *srcres, *dstres;
- struct ifaliasreq addr_req;
+ struct addrinfo *srcres, *dstres;
int ecode;
-#ifdef INET6
- struct in6_aliasreq in6_addr_req;
-#endif
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = afp->af_af;
+ if (afp->af_settunnel == NULL) {
+ warn("address family %s does not support tunnel setup",
+ afp->af_name);
+ return;
+ }
if ((ecode = getaddrinfo(src, NULL, NULL, &srcres)) != 0)
errx(1, "error in parsing address string: %s",
@@ -825,178 +620,58 @@
errx(1,
"source and destination address families do not match");
- switch (srcres->ai_addr->sa_family) {
- case AF_INET:
- memset(&addr_req, 0, sizeof(addr_req));
- strncpy(addr_req.ifra_name, name, IFNAMSIZ);
- memcpy(&addr_req.ifra_addr, srcres->ai_addr,
- srcres->ai_addr->sa_len);
- memcpy(&addr_req.ifra_dstaddr, dstres->ai_addr,
- dstres->ai_addr->sa_len);
-
- if (ioctl(s, SIOCSIFPHYADDR, &addr_req) < 0)
- warn("SIOCSIFPHYADDR");
- break;
-
-#ifdef INET6
- case AF_INET6:
- memset(&in6_addr_req, 0, sizeof(in6_addr_req));
- strncpy(in6_addr_req.ifra_name, name, IFNAMSIZ);
- memcpy(&in6_addr_req.ifra_addr, srcres->ai_addr,
- srcres->ai_addr->sa_len);
- memcpy(&in6_addr_req.ifra_dstaddr, dstres->ai_addr,
- dstres->ai_addr->sa_len);
-
- if (ioctl(s, SIOCSIFPHYADDR_IN6, &in6_addr_req) < 0)
- warn("SIOCSIFPHYADDR_IN6");
- break;
-#endif /* INET6 */
-
- default:
- warn("address family not supported");
- }
+ afp->af_settunnel(s, srcres, dstres);
freeaddrinfo(srcres);
freeaddrinfo(dstres);
}
/* ARGSUSED */
-void
-deletetunnel(const char *vname __unused, int param __unused, int s,
- const struct afswtch *afp __unused)
+static void
+deletetunnel(const char *vname, int param, int s, const struct afswtch *afp)
{
+
if (ioctl(s, SIOCDIFPHYADDR, &ifr) < 0)
err(1, "SIOCDIFPHYADDR");
}
-void
-setifnetmask(const char *addr, int dummy __unused, int s __unused,
- const struct afswtch *afp)
-{
- if (*afp->af_getaddr == NULL)
- return;
- setmask++;
- (*afp->af_getaddr)(addr, MASK);
-}
-
-#ifdef INET6
-void
-setifprefixlen(const char *addr, int dummy __unused, int s __unused,
- const struct afswtch *afp)
-{
- if (*afp->af_getprefix)
- (*afp->af_getprefix)(addr, MASK);
- explicit_prefix = 1;
-}
-
-void
-setip6flags(const char *dummyaddr __unused, int flag, int dummysoc __unused,
- const struct afswtch *afp)
-{
- if (afp->af_af != AF_INET6)
- err(1, "address flags can be set only for inet6 addresses");
-
- if (flag < 0)
- in6_addreq.ifra_flags &= ~(-flag);
- else
- in6_addreq.ifra_flags |= flag;
-}
-
-void
-setip6pltime(const char *seconds, int dummy __unused, int s,
- const struct afswtch *afp)
+static void
+setifnetmask(const char *addr, int dummy __unused, int s,
+ const struct afswtch *afp)
{
- setip6lifetime("pltime", seconds, s, afp);
-}
-
-void
-setip6vltime(const char *seconds, int dummy __unused, int s,
- const struct afswtch *afp)
-{
- setip6lifetime("vltime", seconds, s, afp);
-}
-
-void
-setip6lifetime(const char *cmd, const char *val, int s __unused,
- const struct afswtch *afp)
-{
- time_t newval, t;
- char *ep;
-
- t = time(NULL);
- newval = (time_t)strtoul(val, &ep, 0);
- if (val == ep)
- errx(1, "invalid %s", cmd);
- if (afp->af_af != AF_INET6)
- errx(1, "%s not allowed for the AF", cmd);
- if (strcmp(cmd, "vltime") == 0) {
- in6_addreq.ifra_lifetime.ia6t_expire = t + newval;
- in6_addreq.ifra_lifetime.ia6t_vltime = newval;
- } else if (strcmp(cmd, "pltime") == 0) {
- in6_addreq.ifra_lifetime.ia6t_preferred = t + newval;
- in6_addreq.ifra_lifetime.ia6t_pltime = newval;
+ if (afp->af_getaddr != NULL) {
+ setmask++;
+ afp->af_getaddr(addr, MASK);
}
}
-void
-setip6eui64(const char *cmd, int dummy __unused, int s __unused,
- const struct afswtch *afp)
+static void
+setifbroadaddr(const char *addr, int dummy __unused, int s,
+ const struct afswtch *afp)
{
- struct ifaddrs *ifap, *ifa;
- const struct sockaddr_in6 *sin6 = NULL;
- const struct in6_addr *lladdr = NULL;
- struct in6_addr *in6;
-
- if (afp->af_af != AF_INET6)
- errx(EXIT_FAILURE, "%s not allowed for the AF", cmd);
- in6 = (struct in6_addr *)&in6_addreq.ifra_addr.sin6_addr;
- if (memcmp(&in6addr_any.s6_addr[8], &in6->s6_addr[8], 8) != 0)
- errx(EXIT_FAILURE, "interface index is already filled");
- if (getifaddrs(&ifap) != 0)
- err(EXIT_FAILURE, "getifaddrs");
- for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
- if (ifa->ifa_addr->sa_family == AF_INET6 &&
- strcmp(ifa->ifa_name, name) == 0) {
- sin6 = (const struct sockaddr_in6 *)ifa->ifa_addr;
- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
- lladdr = &sin6->sin6_addr;
- break;
- }
- }
- }
- if (!lladdr)
- errx(EXIT_FAILURE, "could not determine link local address");
-
- memcpy(&in6->s6_addr[8], &lladdr->s6_addr[8], 8);
-
- freeifaddrs(ifap);
+ if (afp->af_getaddr != NULL)
+ afp->af_getaddr(addr, DSTADDR);
}
-#endif
-void
-setifbroadaddr(const char *addr, int dummy __unused, int s __unused,
- const struct afswtch *afp)
+static void
+setifipdst(const char *addr, int dummy __unused, int s,
+ const struct afswtch *afp)
{
- if (*afp->af_getaddr == NULL)
- return;
- (*afp->af_getaddr)(addr, DSTADDR);
-}
+ const struct afswtch *inet;
-void
-setifipdst(const char *addr, int dummy __unused, int s __unused,
- const struct afswtch *afp __unused)
-{
- in_getaddr(addr, DSTADDR);
+ inet = af_getbyname("inet");
+ if (inet == NULL)
+ return;
+ inet->af_getaddr(addr, DSTADDR);
setipdst++;
clearaddr = 0;
newaddr = 0;
}
-#define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
-void
-notealias(const char *addr __unused, int param, int s __unused,
- const struct afswtch *afp)
+static void
+notealias(const char *addr, int param, int s, const struct afswtch *afp)
{
+#define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
if (setaddr && doalias == 0 && param < 0)
if (afp->af_addreq != NULL && afp->af_ridreq != NULL)
bcopy((caddr_t)rqtosa(af_addreq),
@@ -1008,16 +683,16 @@
newaddr = 0;
} else
clearaddr = 0;
+#undef rqtosa
}
/*ARGSUSED*/
-void
-setifdstaddr(const char *addr, int param __unused, int s __unused,
- const struct afswtch *afp)
+static void
+setifdstaddr(const char *addr, int param __unused, int s,
+ const struct afswtch *afp)
{
- if (*afp->af_getaddr == NULL)
- return;
- (*afp->af_getaddr)(addr, DSTADDR);
+ if (afp->af_getaddr != NULL)
+ afp->af_getaddr(addr, DSTADDR);
}
/*
@@ -1025,9 +700,8 @@
* of the ifreq structure, which may confuse other parts of ifconfig.
* Make a private copy so we can avoid that.
*/
-void
-setifflags(const char *vname, int value, int s,
- const struct afswtch *afp __unused)
+static void
+setifflags(const char *vname, int value, int s, const struct afswtch *afp)
{
struct ifreq my_ifr;
@@ -1052,8 +726,7 @@
}
void
-setifcap(const char *vname, int value, int s,
- const struct afswtch *afp __unused)
+setifcap(const char *vname, int value, int s, const struct afswtch *afp)
{
if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) < 0) {
@@ -1071,9 +744,9 @@
Perror(vname);
}
-void
-setifmetric(const char *val, int dummy __unused, int s,
- const struct afswtch *afp __unused)
+static void
+setifmetric(const char *val, int dummy __unused, int s,
+ const struct afswtch *afp)
{
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
ifr.ifr_metric = atoi(val);
@@ -1081,9 +754,9 @@
warn("ioctl (set metric)");
}
-void
-setifmtu(const char *val, int dummy __unused, int s,
- const struct afswtch *afp __unused)
+static void
+setifmtu(const char *val, int dummy __unused, int s,
+ const struct afswtch *afp)
{
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
ifr.ifr_mtu = atoi(val);
@@ -1091,14 +764,17 @@
warn("ioctl (set mtu)");
}
-void
+static void
setifname(const char *val, int dummy __unused, int s,
- const struct afswtch *afp __unused)
+ const struct afswtch *afp)
{
- char *newname;
+ char *newname;
newname = strdup(val);
-
+ if (newname == NULL) {
+ warn("no memory to set ifname");
+ return;
+ }
ifr.ifr_data = newname;
if (ioctl(s, SIOCSIFNAME, (caddr_t)&ifr) < 0) {
warn("ioctl (set name)");
@@ -1106,7 +782,6 @@
return;
}
strlcpy(name, newname, sizeof(name));
-
free(newname);
/*
@@ -1116,38 +791,62 @@
printname = 0;
}
+/*
+ * Expand the compacted form of addresses as returned via the
+ * configuration read via sysctl().
+ */
+#define SA_SIZE(sa) \
+ ( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \
+ sizeof(long) : \
+ 1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) )
+
+static void
+rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
+{
+ struct sockaddr *sa;
+ int i;
+
+ memset(rtinfo->rti_info, 0, sizeof(rtinfo->rti_info));
+ for (i = 0; (i < RTAX_MAX) && (cp < cplim); i++) {
+ if ((rtinfo->rti_addrs & (1 << i)) == 0)
+ continue;
+ rtinfo->rti_info[i] = sa = (struct sockaddr *)cp;
+ cp += SA_SIZE(sa);
+ }
+}
+
#define IFFBITS \
"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6SMART\7RUNNING" \
"\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \
"\20MULTICAST\21POLLING\23MONITOR\24STATICARP"
#define IFCAPBITS \
-"\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU\7POLLING"
+"\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU"
/*
* Print the status of the interface. If an address family was
- * specified, show it and it only; otherwise, show them all.
+ * specified, show only it; otherwise, show them all.
*/
-void
-status(const struct afswtch *afp, int addrcount, struct sockaddr_dl *sdl,
- struct if_msghdr *ifm, struct ifa_msghdr *ifam)
+static void
+status(const struct afswtch *afp, int addrcount, struct sockaddr_dl *sdl,
+ struct if_msghdr *ifm, struct ifa_msghdr *ifam)
{
- const struct afswtch *p = NULL;
struct rt_addrinfo info;
int allfamilies, s;
struct ifstat ifs;
if (afp == NULL) {
allfamilies = 1;
- afp = &afs[0];
+ afp = af_getbyname("inet");
} else
allfamilies = 0;
ifr.ifr_addr.sa_family = afp->af_af == AF_LINK ? AF_INET : afp->af_af;
- strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
+ strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
- err(1, "socket");
+ s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0);
+ if (s < 0)
+ err(1, "socket(family %u,SOCK_DGRAM)", ifr.ifr_addr.sa_family);
printf("%s: ", name);
printb("flags", flags, IFFBITS);
@@ -1163,8 +862,7 @@
putchar('\n');
}
if (supmedia && ifr.ifr_reqcap != 0) {
- printf("\tcapability list:\n");
- printb("\t\t", ifr.ifr_reqcap, IFCAPBITS);
+ printb("\tcapabilities", ifr.ifr_reqcap, IFCAPBITS);
putchar('\n');
}
}
@@ -1172,395 +870,53 @@
tunnel_status(s);
while (addrcount > 0) {
-
info.rti_addrs = ifam->ifam_addrs;
-
/* Expand the compacted addresses */
rt_xaddrs((char *)(ifam + 1), ifam->ifam_msglen + (char *)ifam,
&info);
- if (!allfamilies) {
- if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family) {
- p = afp;
- (*p->af_status)(s, &info);
- }
- } else for (p = afs; p->af_name; p++) {
- if (p->af_af == info.rti_info[RTAX_IFA]->sa_family)
- (*p->af_status)(s, &info);
- }
+ if (allfamilies) {
+ const struct afswtch *p;
+ p = af_getbyfamily(info.rti_info[RTAX_IFA]->sa_family);
+ if (p != NULL)
+ p->af_status(s, &info);
+ } else if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family)
+ afp->af_status(s, &info);
addrcount--;
ifam = (struct ifa_msghdr *)((char *)ifam + ifam->ifam_msglen);
}
- if (allfamilies || afp->af_status == link_status)
- link_status(s, (struct rt_addrinfo *)sdl);
-#ifdef USE_IF_MEDIA
- if (allfamilies || afp->af_status == media_status)
- media_status(s, NULL);
-#endif
-#ifdef USE_VLANS
- if (allfamilies || afp->af_status == vlan_status)
- vlan_status(s, NULL);
-#endif
-#ifdef USE_IEEE80211
- if (allfamilies || afp->af_status == ieee80211_status)
- ieee80211_status(s, NULL);
-#endif
- strncpy(ifs.ifs_name, name, sizeof ifs.ifs_name);
- if (ioctl(s, SIOCGIFSTATUS, &ifs) == 0)
- printf("%s", ifs.ascii);
-
- if (!allfamilies && !p &&
-#ifdef USE_IF_MEDIA
- afp->af_status != media_status &&
-#endif
- afp->af_status != link_status
-#ifdef USE_VLANS
- && afp->af_status != vlan_status
-#endif
- )
- warnx("%s has no %s interface address!", name, afp->af_name);
-
- close(s);
- return;
-}
-
-void
-tunnel_status(int s)
-{
- char psrcaddr[NI_MAXHOST];
- char pdstaddr[NI_MAXHOST];
- u_long srccmd, dstcmd;
- struct ifreq *ifrp;
- const char *ver = "";
-#ifdef NI_WITHSCOPEID
- const int niflag = NI_NUMERICHOST | NI_WITHSCOPEID;
-#else
- const int niflag = NI_NUMERICHOST;
-#endif
-#ifdef INET6
- struct in6_ifreq in6_ifr;
- int s6;
-#endif /* INET6 */
-
- psrcaddr[0] = pdstaddr[0] = '\0';
-
-#ifdef INET6
- memset(&in6_ifr, 0, sizeof(in6_ifr));
- strncpy(in6_ifr.ifr_name, name, IFNAMSIZ);
- s6 = socket(AF_INET6, SOCK_DGRAM, 0);
- if (s6 < 0) {
- srccmd = SIOCGIFPSRCADDR;
- dstcmd = SIOCGIFPDSTADDR;
- ifrp = 𝔦
- } else {
- close(s6);
- srccmd = SIOCGIFPSRCADDR_IN6;
- dstcmd = SIOCGIFPDSTADDR_IN6;
- ifrp = (struct ifreq *)&in6_ifr;
- }
-#else /* INET6 */
- srccmd = SIOCGIFPSRCADDR;
- dstcmd = SIOCGIFPDSTADDR;
- ifrp = 𝔦
-#endif /* INET6 */
-
- if (ioctl(s, srccmd, (caddr_t)ifrp) < 0)
- return;
-#if defined(INET6) && defined(__KAME__) && defined(KAME_SCOPEID)
- if (ifrp->ifr_addr.sa_family == AF_INET6)
- in6_fillscopeid((struct sockaddr_in6 *)&ifrp->ifr_addr);
-#endif
- getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len,
- psrcaddr, sizeof(psrcaddr), 0, 0, niflag);
-#ifdef INET6
- if (ifrp->ifr_addr.sa_family == AF_INET6)
- ver = "6";
-#endif
-
- if (ioctl(s, dstcmd, (caddr_t)ifrp) < 0)
- return;
-#if defined(INET6) && defined(__KAME__) && defined(KAME_SCOPEID)
- if (ifrp->ifr_addr.sa_family == AF_INET6)
- in6_fillscopeid((struct sockaddr_in6 *)&ifrp->ifr_addr);
-#endif
- getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len,
- pdstaddr, sizeof(pdstaddr), 0, 0, niflag);
-
- printf("\ttunnel inet%s %s --> %s\n", ver,
- psrcaddr, pdstaddr);
-}
-
-void
-in_status(int s __unused, struct rt_addrinfo *info)
-{
- struct sockaddr_in *addr_in, null_in;
-
- memset(&null_in, 0, sizeof(null_in));
-
- addr_in = (struct sockaddr_in *)info->rti_info[RTAX_IFA];
- printf("\tinet %s ", inet_ntoa(addr_in->sin_addr));
-
- if (flags & IFF_POINTOPOINT) {
- /* note RTAX_BRD overlap with IFF_BROADCAST */
- addr_in = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
- if (!addr_in)
- addr_in = &null_in;
- printf("--> %s ", inet_ntoa(addr_in->sin_addr));
- }
-
- addr_in = (struct sockaddr_in *)info->rti_info[RTAX_NETMASK];
- if (!addr_in)
- addr_in = &null_in;
- printf("netmask 0x%lx ",
- (unsigned long)ntohl(addr_in->sin_addr.s_addr));
-
- if (flags & IFF_BROADCAST) {
- /* note RTAX_BRD overlap with IFF_POINTOPOINT */
- addr_in = (struct sockaddr_in *)info->rti_info[RTAX_BRD];
- if (addr_in && addr_in->sin_addr.s_addr != 0)
- printf("broadcast %s", inet_ntoa(addr_in->sin_addr));
- }
- putchar('\n');
-}
-
-#ifdef INET6
-#if defined(__KAME__) && defined(KAME_SCOPEID)
-void
-in6_fillscopeid(struct sockaddr_in6 *sin6 __unused)
-{
- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
- sin6->sin6_scope_id =
- ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
- sin6->sin6_addr.s6_addr[2] = sin6->sin6_addr.s6_addr[3] = 0;
- }
-}
-#endif /* defined(__KAME__) && defined(KAME_SCOPEID) */
-
-void
-in6_status(int s __unused, struct rt_addrinfo *info)
-{
- struct sockaddr_in6 *addr_in, null_in;
- struct in6_ifreq ifr6;
- int s6;
- u_int32_t flags6;
- struct in6_addrlifetime lifetime;
- time_t t = time(NULL);
- int error;
- u_int32_t scopeid;
-
- memset(&null_in, 0, sizeof(null_in));
-
- addr_in = (struct sockaddr_in6 *)info->rti_info[RTAX_IFA];
- strncpy(ifr6.ifr_name, ifr.ifr_name, sizeof(ifr.ifr_name));
- if ((s6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
- perror("ifconfig: socket");
- return;
- }
- ifr6.ifr_addr = *addr_in;
- if (ioctl(s6, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
- perror("ifconfig: ioctl(SIOCGIFAFLAG_IN6)");
- close(s6);
- return;
- }
- flags6 = ifr6.ifr_ifru.ifru_flags6;
- memset(&lifetime, 0, sizeof(lifetime));
- ifr6.ifr_addr = *addr_in;
- if (ioctl(s6, SIOCGIFALIFETIME_IN6, &ifr6) < 0) {
- perror("ifconfig: ioctl(SIOCGIFALIFETIME_IN6)");
- close(s6);
- return;
- }
- lifetime = ifr6.ifr_ifru.ifru_lifetime;
- close(s6);
+ if (allfamilies || afp->af_af == AF_LINK) {
+ const struct afswtch *lafp;
- /* XXX: embedded link local addr check */
- if (IN6_IS_ADDR_LINKLOCAL(&addr_in->sin6_addr) &&
- *(u_short *)&addr_in->sin6_addr.s6_addr[2] != 0) {
- u_short idx;
-
- idx = *(u_short *)&addr_in->sin6_addr.s6_addr[2];
- *(u_short *)&addr_in->sin6_addr.s6_addr[2] = 0;
- if (addr_in->sin6_scope_id == 0)
- addr_in->sin6_scope_id = ntohs(idx);
- }
- scopeid = addr_in->sin6_scope_id;
-
- error = getnameinfo((struct sockaddr *)addr_in, addr_in->sin6_len, addr_buf,
- sizeof(addr_buf), NULL, 0,
- NI_NUMERICHOST|NI_WITHSCOPEID);
- if (error != 0)
- inet_ntop(AF_INET6, &addr_in->sin6_addr, addr_buf,
- sizeof(addr_buf));
- printf("\tinet6 %s ", addr_buf);
-
- if (flags & IFF_POINTOPOINT) {
- /* note RTAX_BRD overlap with IFF_BROADCAST */
- addr_in = (struct sockaddr_in6 *)info->rti_info[RTAX_BRD];
/*
- * some of the interfaces do not have valid destination
- * address.
+ * Hack; the link level address is received separately
+ * from the routing information so any address is not
+ * handled above. Cobble together an entry and invoke
+ * the status method specially.
*/
- if (addr_in && addr_in->sin6_family == AF_INET6) {
- /* XXX: embedded link local addr check */
- if (IN6_IS_ADDR_LINKLOCAL(&addr_in->sin6_addr) &&
- *(u_short *)&addr_in->sin6_addr.s6_addr[2] != 0) {
- u_short idx;
-
- idx = *(u_short *)&addr_in->sin6_addr.s6_addr[2];
- *(u_short *)&addr_in->sin6_addr.s6_addr[2] = 0;
- if (addr_in->sin6_scope_id == 0)
- addr_in->sin6_scope_id = ntohs(idx);
- }
-
- error = getnameinfo((struct sockaddr *)addr_in,
- addr_in->sin6_len, addr_buf,
- sizeof(addr_buf), NULL, 0,
- NI_NUMERICHOST|NI_WITHSCOPEID);
- if (error != 0)
- inet_ntop(AF_INET6, &addr_in->sin6_addr, addr_buf,
- sizeof(addr_buf));
- printf("--> %s ", addr_buf);
+ lafp = af_getbyname("lladdr");
+ if (lafp != NULL) {
+ info.rti_info[RTAX_IFA] = (struct sockaddr *)sdl;
+ lafp->af_status(s, &info);
}
}
+ if (allfamilies)
+ af_other_status(s);
+ afp->af_other_status(s);
- addr_in = (struct sockaddr_in6 *)info->rti_info[RTAX_NETMASK];
- if (!addr_in)
- addr_in = &null_in;
- printf("prefixlen %d ", prefix(&addr_in->sin6_addr,
- sizeof(struct in6_addr)));
-
- if ((flags6 & IN6_IFF_ANYCAST) != 0)
- printf("anycast ");
- if ((flags6 & IN6_IFF_TENTATIVE) != 0)
- printf("tentative ");
- if ((flags6 & IN6_IFF_DUPLICATED) != 0)
- printf("duplicated ");
- if ((flags6 & IN6_IFF_DETACHED) != 0)
- printf("detached ");
- if ((flags6 & IN6_IFF_DEPRECATED) != 0)
- printf("deprecated ");
- if ((flags6 & IN6_IFF_AUTOCONF) != 0)
- printf("autoconf ");
- if ((flags6 & IN6_IFF_TEMPORARY) != 0)
- printf("temporary ");
-
- if (scopeid)
- printf("scopeid 0x%x ", scopeid);
-
- if (ip6lifetime && (lifetime.ia6t_preferred || lifetime.ia6t_expire)) {
- printf("pltime ");
- if (lifetime.ia6t_preferred) {
- printf("%s ", lifetime.ia6t_preferred < t
- ? "0" : sec2str(lifetime.ia6t_preferred - t));
- } else
- printf("infty ");
-
- printf("vltime ");
- if (lifetime.ia6t_expire) {
- printf("%s ", lifetime.ia6t_expire < t
- ? "0" : sec2str(lifetime.ia6t_expire - t));
- } else
- printf("infty ");
- }
-
- putchar('\n');
-}
-#endif /*INET6*/
-
-#ifndef NO_IPX
-void
-ipx_status(int s __unused, struct rt_addrinfo *info)
-{
- struct sockaddr_ipx *sipx, null_sipx;
-
- memset(&null_sipx, 0, sizeof(null_sipx));
-
- sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_IFA];
- printf("\tipx %s ", ipx_ntoa(sipx->sipx_addr));
-
- if (flags & IFF_POINTOPOINT) {
- sipx = (struct sockaddr_ipx *)info->rti_info[RTAX_BRD];
- if (!sipx)
- sipx = &null_sipx;
- printf("--> %s ", ipx_ntoa(sipx->sipx_addr));
- }
- putchar('\n');
-}
-#endif
-
-void
-at_status(int s __unused, struct rt_addrinfo *info)
-{
- struct sockaddr_at *sat, null_sat;
- struct netrange *nr;
-
- memset(&null_sat, 0, sizeof(null_sat));
-
- sat = (struct sockaddr_at *)info->rti_info[RTAX_IFA];
- nr = &sat->sat_range.r_netrange;
- printf("\tatalk %d.%d range %d-%d phase %d",
- ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
- ntohs(nr->nr_firstnet), ntohs(nr->nr_lastnet), nr->nr_phase);
- if (flags & IFF_POINTOPOINT) {
- /* note RTAX_BRD overlap with IFF_BROADCAST */
- sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
- if (!sat)
- sat = &null_sat;
- printf("--> %d.%d",
- ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node);
- }
- if (flags & IFF_BROADCAST) {
- /* note RTAX_BRD overlap with IFF_POINTOPOINT */
- sat = (struct sockaddr_at *)info->rti_info[RTAX_BRD];
- if (sat)
- printf(" broadcast %d.%d",
- ntohs(sat->sat_addr.s_net),
- sat->sat_addr.s_node);
- }
-
- putchar('\n');
-}
-
-#ifdef NS
-void
-xns_status(int s __unused, struct rt_addrinfo *info)
-{
- struct sockaddr_ns *sns, null_sns;
-
- memset(&null_sns, 0, sizeof(null_sns));
-
- sns = (struct sockaddr_ns *)info->rti_info[RTAX_IFA];
- printf("\tns %s ", ns_ntoa(sns->sns_addr));
-
- if (flags & IFF_POINTOPOINT) {
- sns = (struct sockaddr_ns *)info->rti_info[RTAX_BRD];
- if (!sns)
- sns = &null_sns;
- printf("--> %s ", ns_ntoa(sns->sns_addr));
- }
+ strncpy(ifs.ifs_name, name, sizeof ifs.ifs_name);
+ if (ioctl(s, SIOCGIFSTATUS, &ifs) == 0)
+ printf("%s", ifs.ascii);
- putchar('\n');
close(s);
+ return;
}
-#endif
-
-void
-link_status(int s __unused, struct rt_addrinfo *info)
+static void
+tunnel_status(int s)
{
- struct sockaddr_dl *sdl = (struct sockaddr_dl *)info;
-
- if (sdl->sdl_alen > 0) {
- if (sdl->sdl_type == IFT_ETHER &&
- sdl->sdl_alen == ETHER_ADDR_LEN)
- printf("\tether %s\n",
- ether_ntoa((struct ether_addr *)LLADDR(sdl)));
- else {
- int n = sdl->sdl_nlen > 0 ? sdl->sdl_nlen + 1 : 0;
-
- printf("\tlladdr %s\n", link_ntoa(sdl) + n);
- }
- }
+ af_all_tunnel_status(s);
}
void
@@ -1581,116 +937,6 @@
}
}
-#define SIN(x) ((struct sockaddr_in *) &(x))
-struct sockaddr_in *sintab[] = {
-SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr),
-SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)};
-
-void
-in_getaddr(const char *s, int which)
-{
- struct sockaddr_in *addr_in = sintab[which];
- struct hostent *hp;
- struct netent *np;
-
- addr_in->sin_len = sizeof(*addr_in);
- if (which != MASK)
- addr_in->sin_family = AF_INET;
-
- if (which == ADDR) {
- char *p = NULL;
-
- if((p = strrchr(s, '/')) != NULL) {
- /* address is `name/masklen' */
- int masklen;
- int ret;
- struct sockaddr_in *min = sintab[MASK];
- *p = '\0';
- ret = sscanf(p+1, "%u", &masklen);
- if(ret != 1 || (masklen < 0 || masklen > 32)) {
- *p = '/';
- errx(1, "%s: bad value", s);
- }
- min->sin_len = sizeof(*min);
- min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) &
- 0xffffffff);
- }
- }
-
- if (inet_aton(s, &addr_in->sin_addr))
- return;
- if ((hp = gethostbyname(s)) != 0)
- bcopy(hp->h_addr, (char *)&addr_in->sin_addr,
- MIN((size_t)hp->h_length, sizeof(addr_in->sin_addr)));
- else if ((np = getnetbyname(s)) != 0)
- addr_in->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
- else
- errx(1, "%s: bad value", s);
-}
-
-#ifdef INET6
-#define SIN6(x) ((struct sockaddr_in6 *) &(x))
-struct sockaddr_in6 *sin6tab[] = {
-SIN6(in6_ridreq.ifr_addr), SIN6(in6_addreq.ifra_addr),
-SIN6(in6_addreq.ifra_prefixmask), SIN6(in6_addreq.ifra_dstaddr)};
-
-void
-in6_getaddr(const char *s, int which)
-{
- struct sockaddr_in6 *addr_in = sin6tab[which];
- struct addrinfo hints, *res;
- int error = -1;
-
- newaddr &= 1;
-
- addr_in->sin6_len = sizeof(*addr_in);
- if (which != MASK)
- addr_in->sin6_family = AF_INET6;
-
- if (which == ADDR) {
- char *p = NULL;
- if((p = strrchr(s, '/')) != NULL) {
- *p = '\0';
- in6_getprefix(p + 1, MASK);
- explicit_prefix = 1;
- }
- }
-
- if (addr_in->sin6_family == AF_INET6) {
- bzero(&hints, sizeof(struct addrinfo));
- hints.ai_family = AF_INET6;
- error = getaddrinfo(s, NULL, &hints, &res);
- }
- if (error != 0) {
- if (inet_pton(AF_INET6, s, &addr_in->sin6_addr) != 1)
- errx(1, "%s: bad value", s);
- } else
- bcopy(res->ai_addr, addr_in, res->ai_addrlen);
-}
-
-void
-in6_getprefix(const char *plen, int which)
-{
- struct sockaddr_in6 *addr_in = sin6tab[which];
- u_char *cp;
- int len = atoi(plen);
-
- if ((len < 0) || (len > 128))
- errx(1, "%s: bad value", plen);
- addr_in->sin6_len = sizeof(*addr_in);
- if (which != MASK)
- addr_in->sin6_family = AF_INET6;
- if ((len == 0) || (len == 128)) {
- memset(&addr_in->sin6_addr, 0xff, sizeof(struct in6_addr));
- return;
- }
- memset((void *)&addr_in->sin6_addr, 0x00, sizeof(addr_in->sin6_addr));
- for (cp = (u_char *)&addr_in->sin6_addr; len > 7; len -= 8)
- *cp++ = 0xff;
- *cp = 0xff << (8 - len);
-}
-#endif
-
/*
* Print a value a la the %b format of the kernel's printf
*/
@@ -1722,200 +968,16 @@
}
}
-#ifndef NO_IPX
-#define SIPX(x) ((struct sockaddr_ipx *) &(x))
-struct sockaddr_ipx *sipxtab[] = {
-SIPX(ridreq.ifr_addr), SIPX(addreq.ifra_addr),
-SIPX(addreq.ifra_mask), SIPX(addreq.ifra_broadaddr)};
-
-void
-ipx_getaddr(const char *addr, int which)
-{
- struct sockaddr_ipx *sipx = sipxtab[which];
-
- sipx->sipx_family = AF_IPX;
- sipx->sipx_len = sizeof(*sipx);
- sipx->sipx_addr = ipx_addr(addr);
- if (which == MASK)
- printf("Attempt to set IPX netmask will be ineffectual\n");
-}
-#endif
-
-void
-at_getaddr(const char *addr, int which)
-{
- struct sockaddr_at *sat = (struct sockaddr_at *) &addreq.ifra_addr;
- u_int net, node;
-
- sat->sat_family = AF_APPLETALK;
- sat->sat_len = sizeof(*sat);
- if (which == MASK)
- errx(1, "AppleTalk does not use netmasks");
- if (sscanf(addr, "%u.%u", &net, &node) != 2
- || net > 0xffff || node > 0xfe)
- errx(1, "%s: illegal address", addr);
- sat->sat_addr.s_net = htons(net);
- sat->sat_addr.s_node = node;
-}
-
-void
-link_getaddr(const char *addr, int which)
-{
- char *temp;
- struct sockaddr_dl sdl;
- struct sockaddr *sa = &ridreq.ifr_addr;
-
- if (which != ADDR)
- errx(1, "can't set link-level netmask or broadcast");
- if ((temp = malloc(strlen(addr) + 1)) == NULL)
- errx(1, "malloc failed");
- temp[0] = ':';
- strcpy(temp + 1, addr);
- sdl.sdl_len = sizeof(sdl);
- link_addr(temp, &sdl);
- free(temp);
- if (sdl.sdl_alen > sizeof(sa->sa_data))
- errx(1, "malformed link-level address");
- sa->sa_family = AF_LINK;
- sa->sa_len = sdl.sdl_alen;
- bcopy(LLADDR(&sdl), sa->sa_data, sdl.sdl_alen);
-}
-
-/* XXX FIXME -- should use strtoul for better parsing. */
-void
-setatrange(const char *range, int dummy __unused, int s __unused,
- const struct afswtch *afp __unused)
-{
- u_int first = 123, last = 123;
-
- if (sscanf(range, "%u-%u", &first, &last) != 2
- || first == 0 || first > 0xffff
- || last == 0 || last > 0xffff || first > last)
- errx(1, "%s: illegal net range: %u-%u", range, first, last);
- at_nr.nr_firstnet = htons(first);
- at_nr.nr_lastnet = htons(last);
-}
-
-void
-setatphase(const char *phase, int dummy __unused, int s __unused,
- const struct afswtch *afp __unused)
-{
- if (!strcmp(phase, "1"))
- at_nr.nr_phase = 1;
- else if (!strcmp(phase, "2"))
- at_nr.nr_phase = 2;
- else
- errx(1, "%s: illegal phase", phase);
-}
-
-void
-checkatrange(struct sockaddr_at *sat)
-{
- if (at_nr.nr_phase == 0)
- at_nr.nr_phase = 2; /* Default phase 2 */
- if (at_nr.nr_firstnet == 0)
- at_nr.nr_firstnet = /* Default range of one */
- at_nr.nr_lastnet = sat->sat_addr.s_net;
-printf("\tatalk %d.%d range %d-%d phase %d\n",
- ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node,
- ntohs(at_nr.nr_firstnet), ntohs(at_nr.nr_lastnet), at_nr.nr_phase);
- if ((u_short) ntohs(at_nr.nr_firstnet) >
- (u_short) ntohs(sat->sat_addr.s_net)
- || (u_short) ntohs(at_nr.nr_lastnet) <
- (u_short) ntohs(sat->sat_addr.s_net))
- errx(1, "AppleTalk address is not in range");
- sat->sat_range.r_netrange = at_nr;
-}
-
-#ifdef NS
-#define SNS(x) ((struct sockaddr_ns *) &(x))
-struct sockaddr_ns *snstab[] = {
-SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr),
-SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)};
-
-void
-xns_getaddr(const char *addr, int which)
-{
- struct sockaddr_ns *sns = snstab[which];
-
- sns->sns_family = AF_NS;
- sns->sns_len = sizeof(*sns);
- sns->sns_addr = ns_addr(addr);
- if (which == MASK)
- printf("Attempt to set XNS netmask will be ineffectual\n");
-}
-#endif
-
-#ifdef INET6
-int
-prefix(void *val, int size)
-{
- u_char *addr = (u_char *)val;
- int byte, bit, plen = 0;
-
- for (byte = 0; byte < size; byte++, plen += 8)
- if (addr[byte] != 0xff)
- break;
- if (byte == size)
- return (plen);
- for (bit = 7; bit != 0; bit--, plen++)
- if (!(addr[byte] & (1 << bit)))
- break;
- for (; bit != 0; bit--)
- if (addr[byte] & (1 << bit))
- return(0);
- byte++;
- for (; byte < size; byte++)
- if (addr[byte])
- return(0);
- return (plen);
-}
-
-static char *
-sec2str(time_t total)
-{
- static char result[256];
- int days, hours, mins, secs;
- int first = 1;
- char *p = result;
-
- if (0) {
- days = total / 3600 / 24;
- hours = (total / 3600) % 24;
- mins = (total / 60) % 60;
- secs = total % 60;
-
- if (days) {
- first = 0;
- p += sprintf(p, "%dd", days);
- }
- if (!first || hours) {
- first = 0;
- p += sprintf(p, "%dh", hours);
- }
- if (!first || mins) {
- first = 0;
- p += sprintf(p, "%dm", mins);
- }
- sprintf(p, "%ds", secs);
- } else
- sprintf(result, "%lu", (unsigned long)total);
-
- return(result);
-}
-#endif /*INET6*/
-
void
-ifmaybeload(char *if_nm)
+ifmaybeload(char *name)
{
struct module_stat mstat;
int fileid, modid;
char ifkind[35], *cp, *dp;
-
/* turn interface and unit into module name */
strcpy(ifkind, "if_");
- for (cp = if_nm, dp = ifkind + 3;
+ for (cp = name, dp = ifkind + 3;
(*cp != 0) && !isdigit(*cp); cp++, dp++)
*dp = *cp;
*dp = 0;
@@ -1935,8 +997,8 @@
cp = mstat.name;
}
/* already loaded? */
- if (strncmp(if_nm, cp, strlen(cp)) == 0 ||
- strncmp(ifkind, cp, strlen(cp)) == 0)
+ if (strncmp(name, cp, strlen(cp)) == 0 ||
+ strncmp(ifkind, cp, strlen(cp)) == 0)
return;
}
}
@@ -1945,87 +1007,61 @@
kldload(ifkind);
}
-void
-list_cloners(void)
-{
- struct if_clonereq ifcr;
- char *cp, *buf;
- int idx;
- int s;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
- if (s == -1)
- err(1, "socket");
-
- memset(&ifcr, 0, sizeof(ifcr));
-
- if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
- err(1, "SIOCIFGCLONERS for count");
-
- buf = malloc(ifcr.ifcr_total * IFNAMSIZ);
- if (buf == NULL)
- err(1, "unable to allocate cloner name buffer");
-
- ifcr.ifcr_count = ifcr.ifcr_total;
- ifcr.ifcr_buffer = buf;
-
- if (ioctl(s, SIOCIFGCLONERS, &ifcr) < 0)
- err(1, "SIOCIFGCLONERS for names");
-
- /*
- * In case some disappeared in the mean time, clamp it down.
- */
- if (ifcr.ifcr_count > ifcr.ifcr_total)
- ifcr.ifcr_count = ifcr.ifcr_total;
-
- for (cp = buf, idx = 0; idx < ifcr.ifcr_count; idx++, cp += IFNAMSIZ) {
- if (idx > 0)
- putchar(' ');
- printf("%s", cp);
- }
-
- putchar('\n');
- free(buf);
-}
-
-void
-clone_create(void)
-{
- int s;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
- if (s == -1)
- err(1, "socket");
-
- memset(&ifr, 0, sizeof(ifr));
- (void) strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- if (ioctl(s, SIOCIFCREATE, &ifr) < 0)
- err(1, "SIOCIFCREATE");
-
- /*
- * If we get a different name back then we put in, we probably
- * want to print it out, but we might change our mind later so
- * we just signal our intrest and leave the printout for later.
- */
- if (strcmp(name, ifr.ifr_name) != 0) {
- printname = 1;
- strlcpy(name, ifr.ifr_name, sizeof(name));
- }
-
- close(s);
-}
+static struct cmd basic_cmds[] = {
+ DEF_CMD("up", IFF_UP, setifflags),
+ DEF_CMD("down", -IFF_UP, setifflags),
+ DEF_CMD("arp", -IFF_NOARP, setifflags),
+ DEF_CMD("-arp", IFF_NOARP, setifflags),
+ DEF_CMD("debug", IFF_DEBUG, setifflags),
+ DEF_CMD("-debug", -IFF_DEBUG, setifflags),
+ DEF_CMD("promisc", IFF_PPROMISC, setifflags),
+ DEF_CMD("-promisc", -IFF_PPROMISC, setifflags),
+ DEF_CMD("add", IFF_UP, notealias),
+ DEF_CMD("alias", IFF_UP, notealias),
+ DEF_CMD("-alias", -IFF_UP, notealias),
+ DEF_CMD("delete", -IFF_UP, notealias),
+ DEF_CMD("remove", -IFF_UP, notealias),
+#ifdef notdef
+#define EN_SWABIPS 0x1000
+ DEF_CMD("swabips", EN_SWABIPS, setifflags),
+ DEF_CMD("-swabips", -EN_SWABIPS, setifflags),
+#endif
+ DEF_CMD_ARG("netmask", setifnetmask),
+ DEF_CMD_ARG("metric", setifmetric),
+ DEF_CMD_ARG("broadcast", setifbroadaddr),
+ DEF_CMD_ARG("ipdst", setifipdst),
+ DEF_CMD_ARG2("tunnel", settunnel),
+ DEF_CMD("deletetunnel", 0, deletetunnel),
+ DEF_CMD("link0", IFF_LINK0, setifflags),
+ DEF_CMD("-link0", -IFF_LINK0, setifflags),
+ DEF_CMD("link1", IFF_LINK1, setifflags),
+ DEF_CMD("-link1", -IFF_LINK1, setifflags),
+ DEF_CMD("link2", IFF_LINK2, setifflags),
+ DEF_CMD("-link2", -IFF_LINK2, setifflags),
+ DEF_CMD("monitor", IFF_MONITOR, setifflags),
+ DEF_CMD("-monitor", -IFF_MONITOR, setifflags),
+ DEF_CMD("staticarp", IFF_STATICARP, setifflags),
+ DEF_CMD("-staticarp", -IFF_STATICARP, setifflags),
+ DEF_CMD("rxcsum", IFCAP_RXCSUM, setifcap),
+ DEF_CMD("-rxcsum", -IFCAP_RXCSUM, setifcap),
+ DEF_CMD("txcsum", IFCAP_TXCSUM, setifcap),
+ DEF_CMD("-txcsum", -IFCAP_TXCSUM, setifcap),
+ DEF_CMD("netcons", IFCAP_NETCONS, setifcap),
+ DEF_CMD("-netcons", -IFCAP_NETCONS, setifcap),
+ DEF_CMD("normal", -IFF_LINK0, setifflags),
+ DEF_CMD("compress", IFF_LINK0, setifflags),
+ DEF_CMD("noicmp", IFF_LINK1, setifflags),
+ DEF_CMD_ARG("mtu", setifmtu),
+ DEF_CMD_ARG("name", setifname),
+};
-void
-clone_destroy(const char *val __unused, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static __constructor void
+ifconfig_ctor(void)
{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
- (void) strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- if (ioctl(s, SIOCIFDESTROY, &ifr) < 0)
- err(1, "SIOCIFDESTROY");
- /*
- * If we create and destroy an interface in the same command,
- * there isn't any reason to print it's name.
- */
- printname = 0;
+ for (i = 0; i < N(basic_cmds); i++)
+ cmd_register(&basic_cmds[i]);
+#undef N
}
diff -N -u -r src.preview/sbin/ifconfig/ifconfig.h src/sbin/ifconfig/ifconfig.h
--- src.preview/sbin/ifconfig/ifconfig.h 2005-04-25 13:33:26.000000000 -0400
+++ src/sbin/ifconfig/ifconfig.h 2005-09-27 15:02:10.000000000 -0400
@@ -31,41 +31,112 @@
*
* so there!
*
- * $FreeBSD: src/sbin/ifconfig/ifconfig.h,v 1.12 2004/03/30 22:59:22 sam Exp $
- * $DragonFly: src/sbin/ifconfig/ifconfig.h,v 1.5 2005/04/25 17:33:26 swildner Exp $
+ * $FreeBSD$
*/
-extern struct ifreq ifr;
+#define __constructor __attribute__((constructor))
-extern char name[IFNAMSIZ]; /* name of interface */
-extern int allmedia;
-extern int supmedia;
struct afswtch;
+struct cmd;
-extern void setmedia(const char *, int, int, const struct afswtch *rafp);
-extern void setmediamode(const char *, int, int, const struct afswtch *rafp);
-extern void setmediaopt(const char *, int, int, const struct afswtch *rafp);
-extern void unsetmediaopt(const char *, int, int, const struct afswtch *rafp);
-extern void media_status(int s, struct rt_addrinfo *);
-
-extern void setvlantag(const char *, int, int, const struct afswtch *rafp);
-extern void setvlandev(const char *, int, int, const struct afswtch *rafp);
-extern void unsetvlandev(const char *, int, int, const struct afswtch *rafp);
-extern void vlan_status(int s, struct rt_addrinfo *);
-
-extern void set80211ssid(const char *, int, int, const struct afswtch *rafp);
-extern void set80211stationname(const char *, int, int, const struct afswtch *rafp);
-extern void set80211channel(const char *, int, int, const struct afswtch *rafp);
-extern void set80211authmode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211powersave(const char *, int, int, const struct afswtch *rafp);
-extern void set80211powersavemode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211powersavesleep(const char *, int, int, const struct afswtch *rafp);
-extern void set80211wepmode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211wep(const char *, int, int, const struct afswtch *rafp);
-extern void set80211weptxkey(const char *, int, int, const struct afswtch *rafp);
-extern void set80211wepkey(const char *, int, int, const struct afswtch *rafp);
-extern void set80211nwkey(const char *, int, int, const struct afswtch *rafp);
-extern void set80211rtsthreshold(const char *, int, int, const struct afswtch *rafp);
-extern void set80211protmode(const char *, int, int, const struct afswtch *rafp);
-extern void set80211txpower(const char *, int, int, const struct afswtch *rafp);
-extern void ieee80211_status(int s, struct rt_addrinfo *);
+typedef void c_func(const char *cmd, int arg, int s, const struct afswtch *afp);
+typedef void c_func2(const char *arg1, const char *arg2, int s, const struct afswtch *afp);
+
+struct cmd {
+ const char *c_name;
+ int c_parameter;
+#define NEXTARG 0xffffff /* has following arg */
+#define NEXTARG2 0xfffffe /* has 2 following args */
+#define OPTARG 0xfffffd /* has optional following arg */
+ union {
+ c_func *c_func;
+ c_func2 *c_func2;
+ } c_u;
+ struct cmd *c_next;
+};
+void cmd_register(struct cmd *);
+
+typedef void callback_func(int s, void *);
+void callback_register(callback_func *, void *);
+
+/*
+ * Macros for declaring command functions and initializing entries.
+ */
+#define DECL_CMD_FUNC(name, cmd, arg) \
+ void name(const char *cmd, int arg, int s, const struct afswtch *afp)
+#define DECL_CMD_FUNC2(name, arg1, arg2) \
+ void name(const char *arg1, const char *arg2, int s, const struct afswtch *afp)
+
+#define DEF_CMD(name, param, func) { name, param, { .c_func = func } }
+#define DEF_CMD_ARG(name, func) { name, NEXTARG, { .c_func = func } }
+#define DEF_CMD_OPTARG(name, func) { name, OPTARG, { .c_func = func } }
+#define DEF_CMD_ARG2(name, func) { name, NEXTARG2, { .c_func2 = func } }
+
+struct rt_addrinfo;
+struct addrinfo;
+
+enum {
+ RIDADDR,
+ ADDR,
+ MASK,
+ DSTADDR,
+};
+
+struct afswtch {
+ const char *af_name; /* as given on cmd line, e.g. "inet" */
+ short af_af; /* AF_* */
+ /*
+ * Status is handled one of two ways; if there is an
+ * address associated with the interface then the
+ * associated address family af_status method is invoked
+ * with the appropriate addressin info. Otherwise, if
+ * all possible info is to be displayed and af_other_status
+ * is defined then it is invoked after all address status
+ * is presented.
+ */
+ void (*af_status)(int, const struct rt_addrinfo *);
+ void (*af_other_status)(int);
+ /* parse address method */
+ void (*af_getaddr)(const char *, int);
+ /* parse prefix method (IPv6) */
+ void (*af_getprefix)(const char *, int);
+ void (*af_postproc)(int s, const struct afswtch *);
+ u_long af_difaddr; /* set dst if address ioctl */
+ u_long af_aifaddr; /* set if address ioctl */
+ void *af_ridreq; /* */
+ void *af_addreq; /* */
+ struct afswtch *af_next;
+
+ /* XXX doesn't fit model */
+ void (*af_status_tunnel)(int);
+ void (*af_settunnel)(int s, struct addrinfo *srcres,
+ struct addrinfo *dstres);
+};
+void af_register(struct afswtch *);
+
+struct option {
+ const char *opt;
+ const char *opt_usage;
+ void (*cb)(const char *arg);
+ struct option *next;
+};
+void opt_register(struct option *);
+
+extern struct ifreq ifr;
+extern char name[IFNAMSIZ]; /* name of interface */
+extern int allmedia;
+extern int supmedia;
+extern int printname;
+extern int flags;
+extern int newaddr;
+extern int verbose;
+extern int setipdst;
+
+void setifcap(const char *, int value, int s, const struct afswtch *);
+
+void Perror(const char *cmd);
+void printb(const char *s, unsigned value, const char *bits);
+
+void ifmaybeload(char *name);
+
+void clone_create(void);
diff -N -u -r src.preview/sbin/ifconfig/ifieee80211.c src/sbin/ifconfig/ifieee80211.c
--- src.preview/sbin/ifconfig/ifieee80211.c 2005-03-06 00:01:59.000000000 -0500
+++ src/sbin/ifconfig/ifieee80211.c 2005-09-27 15:02:10.000000000 -0400
@@ -24,8 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sbin/ifconfig/ifieee80211.c,v 1.1.2.3 2002/02/07 15:12:37 ambrisko Exp $
- * $DragonFly: src/sbin/ifconfig/ifieee80211.c,v 1.8 2005/03/06 05:01:59 dillon Exp $
+ * $FreeBSD$
*/
/*-
@@ -75,7 +74,10 @@
#include <net/if.h>
#include <net/if_dl.h>
#include <net/if_types.h>
+#include <net/if_media.h>
#include <net/route.h>
+
+#include <netproto/802_11/ieee80211_dragonfly.h>
#include <netproto/802_11/ieee80211.h>
#include <netproto/802_11/ieee80211_crypto.h>
#include <netproto/802_11/ieee80211_ioctl.h>
@@ -96,9 +98,15 @@
u_int8_t *buf, int *lenp);
static void print_string(const u_int8_t *buf, int len);
-void
-set80211ssid(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static int
+isanyarg(const char *arg)
+{
+ return (strcmp(arg, "-") == 0 ||
+ strcasecmp(arg, "any") == 0 || strcasecmp(arg, "off") == 0);
+}
+
+static void
+set80211ssid(const char *val, int d, int s, const struct afswtch *rafp)
{
int ssid;
int len;
@@ -118,9 +126,8 @@
set80211(s, IEEE80211_IOC_SSID, ssid, len, data);
}
-void
-set80211stationname(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211stationname(const char *val, int d, int s, const struct afswtch *rafp)
{
int len;
u_int8_t data[33];
@@ -132,19 +139,50 @@
set80211(s, IEEE80211_IOC_STATIONNAME, 0, len, data);
}
-void
-set80211channel(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+/*
+ * Convert IEEE channel number to MHz frequency.
+ */
+static u_int
+ieee80211_ieee2mhz(u_int chan)
+{
+ if (chan == 14)
+ return 2484;
+ if (chan < 14) /* 0-13 */
+ return 2407 + chan*5;
+ if (chan < 27) /* 15-26 */
+ return 2512 + ((chan-15)*20);
+ return 5000 + (chan*5);
+}
+
+/*
+ * Convert MHz frequency to IEEE channel number.
+ */
+static u_int
+ieee80211_mhz2ieee(u_int freq)
+{
+ if (freq == 2484)
+ return 14;
+ if (freq < 2484)
+ return (freq - 2407) / 5;
+ if (freq < 5000)
+ return 15 + ((freq - 2512) / 20);
+ return (freq - 5000) / 5;
+}
+
+static void
+set80211channel(const char *val, int d, int s, const struct afswtch *rafp)
{
- if (strcmp(val, "-") == 0)
+ if (!isanyarg(val)) {
+ int v = atoi(val);
+ if (v > 255) /* treat as frequency */
+ v = ieee80211_mhz2ieee(v);
+ set80211(s, IEEE80211_IOC_CHANNEL, v, 0, NULL);
+ } else
set80211(s, IEEE80211_IOC_CHANNEL, IEEE80211_CHAN_ANY, 0, NULL);
- else
- set80211(s, IEEE80211_IOC_CHANNEL, atoi(val), 0, NULL);
}
-void
-set80211authmode(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211authmode(const char *val, int d, int s, const struct afswtch *rafp)
{
int mode;
@@ -154,6 +192,10 @@
mode = IEEE80211_AUTH_OPEN;
} else if (strcasecmp(val, "shared") == 0) {
mode = IEEE80211_AUTH_SHARED;
+ } else if (strcasecmp(val, "8021x") == 0) {
+ mode = IEEE80211_AUTH_8021X;
+ } else if (strcasecmp(val, "wpa") == 0) {
+ mode = IEEE80211_AUTH_WPA;
} else {
err(1, "unknown authmode");
}
@@ -161,9 +203,8 @@
set80211(s, IEEE80211_IOC_AUTHMODE, mode, 0, NULL);
}
-void
-set80211powersavemode(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211powersavemode(const char *val, int d, int s, const struct afswtch *rafp)
{
int mode;
@@ -184,9 +225,8 @@
set80211(s, IEEE80211_IOC_POWERSAVE, mode, 0, NULL);
}
-void
-set80211powersave(const char *val __unused, int d, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211powersave(const char *val, int d, int s, const struct afswtch *rafp)
{
if (d == 0)
set80211(s, IEEE80211_IOC_POWERSAVE, IEEE80211_POWERSAVE_OFF,
@@ -196,16 +236,14 @@
0, NULL);
}
-void
-set80211powersavesleep(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211powersavesleep(const char *val, int d, int s, const struct afswtch *rafp)
{
set80211(s, IEEE80211_IOC_POWERSAVESLEEP, atoi(val), 0, NULL);
}
-void
-set80211wepmode(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211wepmode(const char *val, int d, int s, const struct afswtch *rafp)
{
int mode;
@@ -222,23 +260,29 @@
set80211(s, IEEE80211_IOC_WEP, mode, 0, NULL);
}
-void
-set80211wep(const char *val __unused, int d, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211wep(const char *val, int d, int s, const struct afswtch *rafp)
{
set80211(s, IEEE80211_IOC_WEP, d, 0, NULL);
}
-void
-set80211weptxkey(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static int
+isundefarg(const char *arg)
{
- set80211(s, IEEE80211_IOC_WEPTXKEY, atoi(val)-1, 0, NULL);
+ return (strcmp(arg, "-") == 0 || strncasecmp(arg, "undef", 5) == 0);
}
-void
-set80211wepkey(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211weptxkey(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ if (isundefarg(val))
+ set80211(s, IEEE80211_IOC_WEPTXKEY, IEEE80211_KEYIX_NONE, 0, NULL);
+ else
+ set80211(s, IEEE80211_IOC_WEPTXKEY, atoi(val)-1, 0, NULL);
+}
+
+static void
+set80211wepkey(const char *val, int d, int s, const struct afswtch *rafp)
{
int key = 0;
int len;
@@ -261,9 +305,8 @@
* iterface is too inflexable, but it's there so we'll support it since
* it's not all that hard.
*/
-void
-set80211nwkey(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211nwkey(const char *val, int d, int s, const struct afswtch *rafp)
{
int txkey;
int i, len;
@@ -298,16 +341,14 @@
set80211(s, IEEE80211_IOC_WEPTXKEY, txkey, 0, NULL);
}
-void
-set80211rtsthreshold(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211rtsthreshold(const char *val, int d, int s, const struct afswtch *rafp)
{
set80211(s, IEEE80211_IOC_RTSTHRESHOLD, atoi(val), 0, NULL);
}
-void
-set80211protmode(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211protmode(const char *val, int d, int s, const struct afswtch *rafp)
{
int mode;
@@ -324,160 +365,1049 @@
set80211(s, IEEE80211_IOC_PROTMODE, mode, 0, NULL);
}
-void
-set80211txpower(const char *val, int d __unused, int s,
- const struct afswtch *rafp __unused)
+static void
+set80211txpower(const char *val, int d, int s, const struct afswtch *rafp)
{
set80211(s, IEEE80211_IOC_TXPOWER, atoi(val), 0, NULL);
}
-void
-ieee80211_status (int s, struct rt_addrinfo *info __unused)
+#define IEEE80211_ROAMING_DEVICE 0
+#define IEEE80211_ROAMING_AUTO 1
+#define IEEE80211_ROAMING_MANUAL 2
+
+static void
+set80211roaming(const char *val, int d, int s, const struct afswtch *rafp)
{
- int i;
- int num;
- struct ieee80211req ireq;
- u_int8_t data[32];
- char spacer;
+ int mode;
+
+ if (strcasecmp(val, "device") == 0) {
+ mode = IEEE80211_ROAMING_DEVICE;
+ } else if (strcasecmp(val, "auto") == 0) {
+ mode = IEEE80211_ROAMING_AUTO;
+ } else if (strcasecmp(val, "manual") == 0) {
+ mode = IEEE80211_ROAMING_MANUAL;
+ } else {
+ err(1, "unknown roaming mode");
+ }
+ set80211(s, IEEE80211_IOC_ROAMING, mode, 0, NULL);
+}
+
+static void
+set80211wme(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ set80211(s, IEEE80211_IOC_WME, d, 0, NULL);
+}
+
+static void
+set80211hidessid(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ set80211(s, IEEE80211_IOC_HIDESSID, d, 0, NULL);
+}
+
+static void
+set80211apbridge(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ set80211(s, IEEE80211_IOC_APBRIDGE, d, 0, NULL);
+}
+
+static void
+set80211chanlist(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ struct ieee80211req_chanlist chanlist;
+#define MAXCHAN (sizeof(chanlist.ic_channels)*NBBY)
+ char *temp, *cp, *tp;
+
+ temp = malloc(strlen(val) + 1);
+ if (temp == NULL)
+ errx(1, "malloc failed");
+ strcpy(temp, val);
+ memset(&chanlist, 0, sizeof(chanlist));
+ cp = temp;
+ for (;;) {
+ int first, last, f;
+
+ tp = strchr(cp, ',');
+ if (tp != NULL)
+ *tp++ = '\0';
+ switch (sscanf(cp, "%u-%u", &first, &last)) {
+ case 1:
+ if (first > MAXCHAN)
+ errx(-1, "channel %u out of range, max %u",
+ first, MAXCHAN);
+ setbit(chanlist.ic_channels, first);
+ break;
+ case 2:
+ if (first > MAXCHAN)
+ errx(-1, "channel %u out of range, max %u",
+ first, MAXCHAN);
+ if (last > MAXCHAN)
+ errx(-1, "channel %u out of range, max %u",
+ last, MAXCHAN);
+ if (first > last)
+ errx(-1, "void channel range, %u > %u",
+ first, last);
+ for (f = first; f <= last; f++)
+ setbit(chanlist.ic_channels, f);
+ break;
+ }
+ if (tp == NULL)
+ break;
+ while (isspace(*tp))
+ tp++;
+ if (!isdigit(*tp))
+ break;
+ cp = tp;
+ }
+ set80211(s, IEEE80211_IOC_CHANLIST, 0,
+ sizeof(chanlist), (uint8_t *) &chanlist);
+#undef MAXCHAN
+}
+
+static void
+set80211bssid(const char *val, int d, int s, const struct afswtch *rafp)
+{
+
+ if (!isanyarg(val)) {
+ char *temp;
+ struct sockaddr_dl sdl;
+
+ temp = malloc(strlen(val) + 1);
+ if (temp == NULL)
+ errx(1, "malloc failed");
+ temp[0] = ':';
+ strcpy(temp + 1, val);
+ sdl.sdl_len = sizeof(sdl);
+ link_addr(temp, &sdl);
+ free(temp);
+ if (sdl.sdl_alen != IEEE80211_ADDR_LEN)
+ errx(1, "malformed link-level address");
+ set80211(s, IEEE80211_IOC_BSSID, 0,
+ IEEE80211_ADDR_LEN, LLADDR(&sdl));
+ } else {
+ uint8_t zerobssid[IEEE80211_ADDR_LEN];
+ memset(zerobssid, 0, sizeof(zerobssid));
+ set80211(s, IEEE80211_IOC_BSSID, 0,
+ IEEE80211_ADDR_LEN, zerobssid);
+ }
+}
+
+static int
+getac(const char *ac)
+{
+ if (strcasecmp(ac, "ac_be") == 0 || strcasecmp(ac, "be") == 0)
+ return WME_AC_BE;
+ if (strcasecmp(ac, "ac_bk") == 0 || strcasecmp(ac, "bk") == 0)
+ return WME_AC_BK;
+ if (strcasecmp(ac, "ac_vi") == 0 || strcasecmp(ac, "vi") == 0)
+ return WME_AC_VI;
+ if (strcasecmp(ac, "ac_vo") == 0 || strcasecmp(ac, "vo") == 0)
+ return WME_AC_VO;
+ errx(1, "unknown wme access class %s", ac);
+}
+
+static
+DECL_CMD_FUNC2(set80211cwmin, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_CWMIN, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211cwmax, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_CWMAX, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211aifs, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_AIFS, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211txoplimit, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_TXOPLIMIT, atoi(val), getac(ac), NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211acm, val, d)
+{
+ set80211(s, IEEE80211_IOC_WME_ACM, d, WME_AC_BE, NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211ackpolicy, val, d)
+{
+ set80211(s, IEEE80211_IOC_WME_ACKPOLICY, d, WME_AC_BE, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bsscwmin, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_CWMIN, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bsscwmax, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_CWMAX, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bssaifs, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_AIFS, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC2(set80211bsstxoplimit, ac, val)
+{
+ set80211(s, IEEE80211_IOC_WME_TXOPLIMIT, atoi(val),
+ getac(ac)|IEEE80211_WMEPARAM_BSS, NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211dtimperiod, val, d)
+{
+ set80211(s, IEEE80211_IOC_DTIM_PERIOD, atoi(val), 0, NULL);
+}
+
+static
+DECL_CMD_FUNC(set80211bintval, val, d)
+{
+ set80211(s, IEEE80211_IOC_BEACON_INTERVAL, atoi(val), 0, NULL);
+}
+
+static void
+set80211macmac(int s, int op, const char *val)
+{
+ char *temp;
+ struct sockaddr_dl sdl;
+
+ temp = malloc(strlen(val) + 1);
+ if (temp == NULL)
+ errx(1, "malloc failed");
+ temp[0] = ':';
+ strcpy(temp + 1, val);
+ sdl.sdl_len = sizeof(sdl);
+ link_addr(temp, &sdl);
+ free(temp);
+ if (sdl.sdl_alen != IEEE80211_ADDR_LEN)
+ errx(1, "malformed link-level address");
+ set80211(s, op, 0, IEEE80211_ADDR_LEN, LLADDR(&sdl));
+}
+
+static
+DECL_CMD_FUNC(set80211addmac, val, d)
+{
+ set80211macmac(s, IEEE80211_IOC_ADDMAC, val);
+}
+
+static
+DECL_CMD_FUNC(set80211delmac, val, d)
+{
+ set80211macmac(s, IEEE80211_IOC_DELMAC, val);
+}
+
+static
+DECL_CMD_FUNC(set80211maccmd, val, d)
+{
+ set80211(s, IEEE80211_IOC_MACCMD, d, 0, NULL);
+}
+
+static int
+getmaxrate(uint8_t rates[15], uint8_t nrates)
+{
+ int i, maxrate = -1;
+
+ for (i = 0; i < nrates; i++) {
+ int rate = rates[i] & IEEE80211_RATE_VAL;
+ if (rate > maxrate)
+ maxrate = rate;
+ }
+ return maxrate / 2;
+}
+
+static const char *
+getcaps(int capinfo)
+{
+ static char capstring[32];
+ char *cp = capstring;
+
+ if (capinfo & IEEE80211_CAPINFO_ESS)
+ *cp++ = 'E';
+ if (capinfo & IEEE80211_CAPINFO_IBSS)
+ *cp++ = 'I';
+ if (capinfo & IEEE80211_CAPINFO_CF_POLLABLE)
+ *cp++ = 'c';
+ if (capinfo & IEEE80211_CAPINFO_CF_POLLREQ)
+ *cp++ = 'C';
+ if (capinfo & IEEE80211_CAPINFO_PRIVACY)
+ *cp++ = 'P';
+ if (capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE)
+ *cp++ = 'S';
+ if (capinfo & IEEE80211_CAPINFO_PBCC)
+ *cp++ = 'B';
+ if (capinfo & IEEE80211_CAPINFO_CHNL_AGILITY)
+ *cp++ = 'A';
+ if (capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME)
+ *cp++ = 's';
+ if (capinfo & IEEE80211_CAPINFO_RSN)
+ *cp++ = 'R';
+ if (capinfo & IEEE80211_CAPINFO_DSSSOFDM)
+ *cp++ = 'D';
+ *cp = '\0';
+ return capstring;
+}
+
+static void
+printie(const char* tag, const uint8_t *ie, size_t ielen, int maxlen)
+{
+ printf("%s", tag);
+ if (verbose) {
+ maxlen -= strlen(tag)+2;
+ if (2*ielen > maxlen)
+ maxlen--;
+ printf("<");
+ for (; ielen > 0; ie++, ielen--) {
+ if (maxlen-- <= 0)
+ break;
+ printf("%02x", *ie);
+ }
+ if (ielen != 0)
+ printf("-");
+ printf(">");
+ }
+}
+
+/*
+ * Copy the ssid string contents into buf, truncating to fit. If the
+ * ssid is entirely printable then just copy intact. Otherwise convert
+ * to hexadecimal. If the result is truncated then replace the last
+ * three characters with "...".
+ */
+static size_t
+copy_essid(char buf[], size_t bufsize, const u_int8_t *essid, size_t essid_len)
+{
+ const u_int8_t *p;
+ size_t maxlen;
+ int i;
+
+ if (essid_len > bufsize)
+ maxlen = bufsize;
+ else
+ maxlen = essid_len;
+ /* determine printable or not */
+ for (i = 0, p = essid; i < maxlen; i++, p++) {
+ if (*p < ' ' || *p > 0x7e)
+ break;
+ }
+ if (i != maxlen) { /* not printable, print as hex */
+ if (bufsize < 3)
+ return 0;
+ strlcpy(buf, "0x", bufsize);
+ bufsize -= 2;
+ p = essid;
+ for (i = 0; i < maxlen && bufsize >= 2; i++) {
+ sprintf(&buf[2+2*i], "%02x", *p++);
+ bufsize -= 2;
+ }
+ maxlen = 2+2*i;
+ } else { /* printable, truncate as needed */
+ memcpy(buf, essid, maxlen);
+ }
+ if (maxlen != essid_len)
+ memcpy(buf+maxlen-3, "...", 3);
+ return maxlen;
+}
+
+/* unalligned little endian access */
+#define LE_READ_4(p) \
+ ((u_int32_t) \
+ ((((const u_int8_t *)(p))[0] ) | \
+ (((const u_int8_t *)(p))[1] << 8) | \
+ (((const u_int8_t *)(p))[2] << 16) | \
+ (((const u_int8_t *)(p))[3] << 24)))
+
+static int __inline
+iswpaoui(const u_int8_t *frm)
+{
+ return frm[1] > 3 && LE_READ_4(frm+2) == ((WPA_OUI_TYPE<<24)|WPA_OUI);
+}
+
+static int __inline
+iswmeoui(const u_int8_t *frm)
+{
+ return frm[1] > 3 && LE_READ_4(frm+2) == ((WME_OUI_TYPE<<24)|WME_OUI);
+}
+
+static int __inline
+isatherosoui(const u_int8_t *frm)
+{
+ return frm[1] > 3 && LE_READ_4(frm+2) == ((ATH_OUI_TYPE<<24)|ATH_OUI);
+}
+
+static void
+printies(const u_int8_t *vp, int ielen, int maxcols)
+{
+ while (ielen > 0) {
+ switch (vp[0]) {
+ case IEEE80211_ELEMID_VENDOR:
+ if (iswpaoui(vp))
+ printie(" WPA", vp, 2+vp[1], maxcols);
+ else if (iswmeoui(vp))
+ printie(" WME", vp, 2+vp[1], maxcols);
+ else if (isatherosoui(vp))
+ printie(" ATH", vp, 2+vp[1], maxcols);
+ else
+ printie(" VEN", vp, 2+vp[1], maxcols);
+ break;
+ case IEEE80211_ELEMID_RSN:
+ printie(" RSN", vp, 2+vp[1], maxcols);
+ break;
+ default:
+ printie(" ???", vp, 2+vp[1], maxcols);
+ break;
+ }
+ ielen -= 2+vp[1];
+ vp += 2+vp[1];
+ }
+}
+
+static void
+list_scan(int s)
+{
+ uint8_t buf[24*1024];
+ struct ieee80211req ireq;
+ char ssid[14];
+ uint8_t *cp;
+ int len;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = IEEE80211_IOC_SCAN_RESULTS;
+ ireq.i_data = buf;
+ ireq.i_len = sizeof(buf);
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ errx(1, "unable to get scan results");
+ len = ireq.i_len;
+ if (len < sizeof(struct ieee80211req_scan_result))
+ return;
+
+ printf("%-14.14s %-17.17s %4s %4s %-5s %3s %4s\n"
+ , "SSID"
+ , "BSSID"
+ , "CHAN"
+ , "RATE"
+ , "S:N"
+ , "INT"
+ , "CAPS"
+ );
+ cp = buf;
+ do {
+ struct ieee80211req_scan_result *sr;
+ uint8_t *vp;
+
+ sr = (struct ieee80211req_scan_result *) cp;
+ vp = (u_int8_t *)(sr+1);
+ printf("%-14.*s %s %3d %3dM %2d:%-2d %3d %-4.4s"
+ , copy_essid(ssid, sizeof(ssid), vp, sr->isr_ssid_len)
+ , ssid
+ , ether_ntoa((const struct ether_addr *) sr->isr_bssid)
+ , ieee80211_mhz2ieee(sr->isr_freq)
+ , getmaxrate(sr->isr_rates, sr->isr_nrates)
+ , sr->isr_rssi, sr->isr_noise
+ , sr->isr_intval
+ , getcaps(sr->isr_capinfo)
+ );
+ printies(vp + sr->isr_ssid_len, sr->isr_ie_len, 24);;
+ printf("\n");
+ cp += sr->isr_len, len -= sr->isr_len;
+ } while (len >= sizeof(struct ieee80211req_scan_result));
+}
+
+static void
+scan_and_wait(int s)
+{
+ struct ieee80211req ireq;
+ int sroute;
+
+ sroute = socket(PF_ROUTE, SOCK_RAW, 0);
+ if (sroute < 0) {
+ perror("socket(PF_ROUTE,SOCK_RAW)");
+ return;
+ }
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = IEEE80211_IOC_SCAN_REQ;
+ /* NB: only root can trigger a scan so ignore errors */
+ if (ioctl(s, SIOCS80211, &ireq) >= 0) {
+ char buf[2048];
+ struct if_announcemsghdr *ifan;
+ struct rt_msghdr *rtm;
+
+ do {
+ if (read(sroute, buf, sizeof(buf)) < 0) {
+ perror("read(PF_ROUTE)");
+ break;
+ }
+ rtm = (struct rt_msghdr *) buf;
+ if (rtm->rtm_version != RTM_VERSION)
+ break;
+ ifan = (struct if_announcemsghdr *) rtm;
+ } while (rtm->rtm_type != RTM_IEEE80211 ||
+ ifan->ifan_what != RTM_IEEE80211_SCAN);
+ }
+ close(sroute);
+}
+
+static
+DECL_CMD_FUNC(set80211scan, val, d)
+{
+ scan_and_wait(s);
+ list_scan(s);
+}
+
+static void
+list_stations(int s)
+{
+ uint8_t buf[24*1024];
+ struct ieee80211req ireq;
+ uint8_t *cp;
+ int len;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = IEEE80211_IOC_STA_INFO;
+ ireq.i_data = buf;
+ ireq.i_len = sizeof(buf);
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ errx(1, "unable to get station information");
+ len = ireq.i_len;
+ if (len < sizeof(struct ieee80211req_sta_info))
+ return;
+
+ printf("%-17.17s %4s %4s %4s %4s %4s %6s %6s %4s %3s\n"
+ , "ADDR"
+ , "AID"
+ , "CHAN"
+ , "RATE"
+ , "RSSI"
+ , "IDLE"
+ , "TXSEQ"
+ , "RXSEQ"
+ , "CAPS"
+ , "ERP"
+ cp = buf;
+ do {
+ struct ieee80211req_sta_info *si;
+ uint8_t *vp;
+
+ si = (struct ieee80211req_sta_info *) cp;
+ vp = (u_int8_t *)(si+1);
+ printf("%s %4u %4d %3dM %4d %4d %6d %6d %-4.4s %3x"
+ , ether_ntoa((const struct ether_addr*) si->isi_macaddr)
+ , IEEE80211_AID(si->isi_associd)
+ , ieee80211_mhz2ieee(si->isi_freq)
+ , (si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL)/2
+ , si->isi_rssi
+ , si->isi_inact
+ , si->isi_txseqs[0]
+ , si->isi_rxseqs[0]
+ , getcaps(si->isi_capinfo)
+ , si->isi_erp
+ );
+ printies(vp, si->isi_ie_len, 24);
+ printf("\n");
+ cp += si->isi_len, len -= si->isi_len;
+ } while (len >= sizeof(struct ieee80211req_sta_info));
+}
+
+static void
+print_chaninfo(const struct ieee80211_channel *c)
+{
+#define IEEE80211_IS_CHAN_PASSIVE(_c) \
+ (((_c)->ic_flags & IEEE80211_CHAN_PASSIVE))
+ char buf[14];
+
+ buf[0] = '\0';
+ if (IEEE80211_IS_CHAN_FHSS(c))
+ strlcat(buf, " FHSS", sizeof(buf));
+ if (IEEE80211_IS_CHAN_A(c))
+ strlcat(buf, " 11a", sizeof(buf));
+ /* XXX 11g schizophrenia */
+ if (IEEE80211_IS_CHAN_G(c) ||
+ IEEE80211_IS_CHAN_PUREG(c))
+ strlcat(buf, " 11g", sizeof(buf));
+ else if (IEEE80211_IS_CHAN_B(c))
+ strlcat(buf, " 11b", sizeof(buf));
+ if (IEEE80211_IS_CHAN_T(c))
+ strlcat(buf, " Turbo", sizeof(buf));
+ printf("Channel %3u : %u%c Mhz%-14.14s",
+ ieee80211_mhz2ieee(c->ic_freq), c->ic_freq,
+ IEEE80211_IS_CHAN_PASSIVE(c) ? '*' : ' ', buf);
+#undef IEEE80211_IS_CHAN_PASSIVE
+}
+
+static void
+list_channels(int s, int allchans)
+{
+ struct ieee80211req ireq;
+ struct ieee80211req_chaninfo chans;
+ struct ieee80211req_chaninfo achans;
+ const struct ieee80211_channel *c;
+ int i, half;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = IEEE80211_IOC_CHANINFO;
+ ireq.i_data = &chans;
+ ireq.i_len = sizeof(chans);
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ errx(1, "unable to get channel information");
+ if (!allchans) {
+ struct ieee80211req_chanlist active;
+
+ ireq.i_type = IEEE80211_IOC_CHANLIST;
+ ireq.i_data = &active;
+ ireq.i_len = sizeof(active);
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ errx(1, "unable to get active channel list");
+ memset(&achans, 0, sizeof(achans));
+ for (i = 0; i < chans.ic_nchans; i++) {
+ c = &chans.ic_chans[i];
+ if (isset(active.ic_channels, ieee80211_mhz2ieee(c->ic_freq)) || allchans)
+ achans.ic_chans[achans.ic_nchans++] = *c;
+ }
+ } else
+ achans = chans;
+ half = achans.ic_nchans / 2;
+ if (achans.ic_nchans % 2)
+ half++;
+ for (i = 0; i < achans.ic_nchans / 2; i++) {
+ print_chaninfo(&achans.ic_chans[i]);
+ print_chaninfo(&achans.ic_chans[half+i]);
+ printf("\n");
+ }
+ if (achans.ic_nchans % 2) {
+ print_chaninfo(&achans.ic_chans[i]);
+ printf("\n");
+ }
+}
+
+static void
+list_keys(int s)
+{
+}
+
+#define IEEE80211_C_BITS \
+"\020\1WEP\2TKIP\3AES\4AES_CCM\6CKIP\11IBSS\12PMGT\13HOSTAP\14AHDEMO" \
+"\15SWRETRY\16TXPMGT\17SHSLOT\20SHPREAMBLE\21MONITOR\22TKIPMIC\30WPA1" \
+"\31WPA2\32BURST\33WME"
+
+static void
+list_capabilities(int s)
+{
+ struct ieee80211req ireq;
+ u_int32_t caps;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = IEEE80211_IOC_DRIVER_CAPS;
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ errx(1, "unable to get driver capabilities");
+ caps = (((u_int16_t) ireq.i_val) << 16) | ((u_int16_t) ireq.i_len);
+ printb(name, caps, IEEE80211_C_BITS);
+ putchar('\n');
+}
+
+static void
+list_wme(int s)
+{
+ static const char *acnames[] = { "AC_BE", "AC_BK", "AC_VI", "AC_VO" };
+ struct ieee80211req ireq;
+ int ac;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_len = 0;
+ for (ac = WME_AC_BE; ac <= WME_AC_VO; ac++) {
+again:
+ if (ireq.i_len & IEEE80211_WMEPARAM_BSS)
+ printf("\t%s", " ");
+ else
+ printf("\t%s", acnames[ac]);
+
+ ireq.i_len = (ireq.i_len & IEEE80211_WMEPARAM_BSS) | ac;
+
+ /* show WME BSS parameters */
+ ireq.i_type = IEEE80211_IOC_WME_CWMIN;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" cwmin %2u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_CWMAX;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" cwmax %2u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_AIFS;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" aifs %2u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_TXOPLIMIT;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ printf(" txopLimit %3u", ireq.i_val);
+ ireq.i_type = IEEE80211_IOC_WME_ACM;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (ireq.i_val)
+ printf(" acm");
+ else if (verbose)
+ printf(" -acm");
+ }
+ /* !BSS only */
+ if ((ireq.i_len & IEEE80211_WMEPARAM_BSS) == 0) {
+ ireq.i_type = IEEE80211_IOC_WME_ACKPOLICY;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (!ireq.i_val)
+ printf(" -ack");
+ else if (verbose)
+ printf(" ack");
+ }
+ }
+ printf("\n");
+ if ((ireq.i_len & IEEE80211_WMEPARAM_BSS) == 0) {
+ ireq.i_len |= IEEE80211_WMEPARAM_BSS;
+ goto again;
+ } else
+ ireq.i_len &= ~IEEE80211_WMEPARAM_BSS;
+ }
+}
+
+static
+DECL_CMD_FUNC(set80211list, arg, d)
+{
+#define iseq(a,b) (strncasecmp(a,b,sizeof(b)-1) == 0)
+
+ if (iseq(arg, "sta"))
+ list_stations(s);
+ else if (iseq(arg, "scan") || iseq(arg, "ap"))
+ list_scan(s);
+ else if (iseq(arg, "chan") || iseq(arg, "freq"))
+ list_channels(s, 1);
+ else if (iseq(arg, "active"))
+ list_channels(s, 0);
+ else if (iseq(arg, "keys"))
+ list_keys(s);
+ else if (iseq(arg, "caps"))
+ list_capabilities(s);
+ else if (iseq(arg, "wme"))
+ list_wme(s);
+ else
+ errx(1, "Don't know how to list %s for %s", arg, name);
+#undef iseq
+}
+
+static enum ieee80211_opmode
+get80211opmode(int s)
+{
+ struct ifmediareq ifmr;
+
+ (void) memset(&ifmr, 0, sizeof(ifmr));
+ (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+
+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) >= 0) {
+ if (ifmr.ifm_current & IFM_IEEE80211_ADHOC)
+ return IEEE80211_M_IBSS; /* XXX ahdemo */
+ if (ifmr.ifm_current & IFM_IEEE80211_HOSTAP)
+ return IEEE80211_M_HOSTAP;
+ if (ifmr.ifm_current & IFM_IEEE80211_MONITOR)
+ return IEEE80211_M_MONITOR;
+ }
+ return IEEE80211_M_STA;
+}
+
+static const struct ieee80211_channel *
+getchaninfo(int s, int chan)
+{
+ struct ieee80211req ireq;
+ static struct ieee80211req_chaninfo chans;
+ static struct ieee80211_channel undef;
+ const struct ieee80211_channel *c;
+ int i, freq;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = IEEE80211_IOC_CHANINFO;
+ ireq.i_data = &chans;
+ ireq.i_len = sizeof(chans);
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ errx(1, "unable to get channel information");
+ freq = ieee80211_ieee2mhz(chan);
+ for (i = 0; i < chans.ic_nchans; i++) {
+ c = &chans.ic_chans[i];
+ if (c->ic_freq == freq)
+ return c;
+ }
+ return &undef;
+}
+
+#if 0
+static void
+printcipher(int s, struct ieee80211req *ireq, int keylenop)
+{
+ switch (ireq->i_val) {
+ case IEEE80211_CIPHER_WEP:
+ ireq->i_type = keylenop;
+ if (ioctl(s, SIOCG80211, ireq) != -1)
+ printf("WEP-%s",
+ ireq->i_len <= 5 ? "40" :
+ ireq->i_len <= 13 ? "104" : "128");
+ else
+ printf("WEP");
+ break;
+ case IEEE80211_CIPHER_TKIP:
+ printf("TKIP");
+ break;
+ case IEEE80211_CIPHER_AES_OCB:
+ printf("AES-OCB");
+ break;
+ case IEEE80211_CIPHER_AES_CCM:
+ printf("AES-CCM");
+ break;
+ case IEEE80211_CIPHER_CKIP:
+ printf("CKIP");
+ break;
+ case IEEE80211_CIPHER_NONE:
+ printf("NONE");
+ break;
+ default:
+ printf("UNKNOWN (0x%x)", ireq->i_val);
+ break;
+ }
+}
+#endif
+
+#define MAXCOL 78
+int col;
+char spacer;
+
+#define LINE_BREAK() do { \
+ if (spacer != '\t') { \
+ printf("\n"); \
+ spacer = '\t'; \
+ } \
+ col = 8; /* 8-col tab */ \
+} while (0)
+#define LINE_CHECK(fmt, ...) do { \
+ col += sizeof(fmt)-2; \
+ if (col > MAXCOL) { \
+ LINE_BREAK(); \
+ col += sizeof(fmt)-2; \
+ } \
+ printf(fmt, __VA_ARGS__); \
+ spacer = ' '; \
+} while (0)
+
+static void
+printkey(const struct ieee80211req_key *ik)
+{
+ static const uint8_t zerodata[IEEE80211_KEYBUF_SIZE];
+ int keylen = ik->ik_keylen;
+ int printcontents;
+
+ printcontents =
+ (memcmp(ik->ik_keydata, zerodata, keylen) != 0 || verbose);
+ if (printcontents)
+ LINE_BREAK();
+ switch (ik->ik_type) {
+ case IEEE80211_CIPHER_WEP:
+ /* compatibility */
+ LINE_CHECK("%cwepkey %u:%s", spacer, ik->ik_keyix+1,
+ keylen <= 5 ? "40-bit" :
+ keylen <= 13 ? "104-bit" : "128-bit");
+ break;
+ case IEEE80211_CIPHER_TKIP:
+ if (keylen > 128/8)
+ keylen -= 128/8; /* ignore MIC for now */
+ LINE_CHECK("%cTKIP %u:%u-bit",
+ spacer, ik->ik_keyix+1, 8*keylen);
+ break;
+ case IEEE80211_CIPHER_AES_OCB:
+ LINE_CHECK("%cAES-OCB %u:%u-bit",
+ spacer, ik->ik_keyix+1, 8*keylen);
+ break;
+ case IEEE80211_CIPHER_AES_CCM:
+ LINE_CHECK("%cAES-CCM %u:%u-bit",
+ spacer, ik->ik_keyix+1, 8*keylen);
+ break;
+ case IEEE80211_CIPHER_CKIP:
+ LINE_CHECK("%cCKIP %u:%u-bit",
+ spacer, ik->ik_keyix+1, 8*keylen);
+ break;
+ case IEEE80211_CIPHER_NONE:
+ LINE_CHECK("%cNULL %u:%u-bit",
+ spacer, ik->ik_keyix+1, 8*keylen);
+ break;
+ default:
+ LINE_CHECK("%cUNKNOWN (0x%x) %u:%u-bit", spacer,
+ ik->ik_type, ik->ik_keyix+1, 8*keylen);
+ break;
+ }
+ if (printcontents) {
+ int i;
+
+ printf(" <");
+ for (i = 0; i < keylen; i++)
+ printf("%02x", ik->ik_keydata[i]);
+ printf(">");
+ if (ik->ik_type != IEEE80211_CIPHER_WEP &&
+ (ik->ik_keyrsc != 0 || verbose))
+ printf(" rsc %llu", ik->ik_keyrsc);
+ if (ik->ik_type != IEEE80211_CIPHER_WEP &&
+ (ik->ik_keytsc != 0 || verbose))
+ printf(" tsc %llu", ik->ik_keytsc);
+ if (ik->ik_flags != 0 && verbose) {
+ const char *sep = " ";
+
+ if (ik->ik_flags & IEEE80211_KEY_XMIT)
+ printf("%stx", sep), sep = "+";
+ if (ik->ik_flags & IEEE80211_KEY_RECV)
+ printf("%srx", sep), sep = "+";
+ if (ik->ik_flags & IEEE80211_KEY_DEFAULT)
+ printf("%sdef", sep), sep = "+";
+ }
+ LINE_BREAK();
+ }
+}
+
+static void
+ieee80211_status(int s)
+{
+ static const uint8_t zerobssid[IEEE80211_ADDR_LEN];
+ enum ieee80211_opmode opmode = get80211opmode(s);
+ int i, num, wpa, wme;
+ struct ieee80211req ireq;
+ u_int8_t data[32];
+ const struct ieee80211_channel *c;
(void) memset(&ireq, 0, sizeof(ireq));
(void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
ireq.i_data = &data;
+ wpa = 0; /* unknown/not set */
+
ireq.i_type = IEEE80211_IOC_SSID;
ireq.i_val = -1;
if (ioctl(s, SIOCG80211, &ireq) < 0) {
/* If we can't get the SSID, the this isn't an 802.11 device. */
return;
}
- printf("\tssid ");
- print_string(data, ireq.i_len);
num = 0;
ireq.i_type = IEEE80211_IOC_NUMSSIDS;
- if (ioctl(s, SIOCG80211, &ireq) >= 0) {
+ if (ioctl(s, SIOCG80211, &ireq) >= 0)
num = ireq.i_val;
- }
- ireq.i_type = IEEE80211_IOC_SSID;
- for (ireq.i_val = 0; ireq.i_val < num; ireq.i_val++) {
- if (ioctl(s, SIOCG80211, &ireq) >= 0 && ireq.i_len > 0) {
- printf(" %d:", ireq.i_val + 1);
- print_string(data, ireq.i_len);
+ printf("\tssid ");
+ if (num > 1) {
+ ireq.i_type = IEEE80211_IOC_SSID;
+ for (ireq.i_val = 0; ireq.i_val < num; ireq.i_val++) {
+ if (ioctl(s, SIOCG80211, &ireq) >= 0 && ireq.i_len > 0) {
+ printf(" %d:", ireq.i_val + 1);
+ print_string(data, ireq.i_len);
+ }
}
- }
- printf("\n");
+ } else
+ print_string(data, ireq.i_len);
+
+ ireq.i_type = IEEE80211_IOC_CHANNEL;
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ goto end;
+ c = getchaninfo(s, ireq.i_val);
+ if (ireq.i_val != -1) {
+ printf(" channel %d", ireq.i_val);
+ if (verbose)
+ printf(" (%u)", c->ic_freq);
+ } else if (verbose)
+ printf(" channel UNDEF");
+
+ ireq.i_type = IEEE80211_IOC_BSSID;
+ ireq.i_len = IEEE80211_ADDR_LEN;
+ if (ioctl(s, SIOCG80211, &ireq) >= 0 &&
+ memcmp(ireq.i_data, zerobssid, sizeof(zerobssid)) != 0)
+ printf(" bssid %s", ether_ntoa(ireq.i_data));
ireq.i_type = IEEE80211_IOC_STATIONNAME;
if (ioctl(s, SIOCG80211, &ireq) != -1) {
- printf("\tstationname ");
+ printf("\n\tstationname ");
print_string(data, ireq.i_len);
- printf("\n");
}
- ireq.i_type = IEEE80211_IOC_CHANNEL;
- if (ioctl(s, SIOCG80211, &ireq) < 0) {
- goto end;
- }
- printf("\tchannel %d", ireq.i_val);
+ spacer = ' '; /* force first break */
+ LINE_BREAK();
ireq.i_type = IEEE80211_IOC_AUTHMODE;
if (ioctl(s, SIOCG80211, &ireq) != -1) {
- printf(" authmode");
switch (ireq.i_val) {
case IEEE80211_AUTH_NONE:
- printf(" NONE");
+ LINE_CHECK("%cauthmode NONE", spacer);
break;
case IEEE80211_AUTH_OPEN:
- printf(" OPEN");
+ LINE_CHECK("%cauthmode OPEN", spacer);
break;
case IEEE80211_AUTH_SHARED:
- printf(" SHARED");
+ LINE_CHECK("%cauthmode SHARED", spacer);
break;
- default:
- printf(" UNKNOWN");
+ case IEEE80211_AUTH_8021X:
+ LINE_CHECK("%cauthmode 802.1x", spacer);
break;
- }
- }
-
- ireq.i_type = IEEE80211_IOC_POWERSAVE;
- if (ioctl(s, SIOCG80211, &ireq) != -1 &&
- ireq.i_val != IEEE80211_POWERSAVE_NOSUP ) {
- printf(" powersavemode");
- switch (ireq.i_val) {
- case IEEE80211_POWERSAVE_OFF:
- printf(" OFF");
+ case IEEE80211_AUTH_WPA:
+ ireq.i_type = IEEE80211_IOC_WPA;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ wpa = ireq.i_val;
+ if (!wpa)
+ wpa = 1; /* default to WPA1 */
+ switch (wpa) {
+ case 2:
+ LINE_CHECK("%cauthmode WPA2/802.11i",
+ spacer);
+ break;
+ case 3:
+ LINE_CHECK("%cauthmode WPA1+WPA2/802.11i",
+ spacer);
+ break;
+ default:
+ LINE_CHECK("%cauthmode WPA", spacer);
+ break;
+ }
break;
- case IEEE80211_POWERSAVE_CAM:
- printf(" CAM");
- break;
- case IEEE80211_POWERSAVE_PSP:
- printf(" PSP");
- break;
- case IEEE80211_POWERSAVE_PSP_CAM:
- printf(" PSP-CAM");
- break;
- }
-
- ireq.i_type = IEEE80211_IOC_POWERSAVESLEEP;
- if (ioctl(s, SIOCG80211, &ireq) != -1) {
- if (ireq.i_val)
- printf(" powersavesleep %d", ireq.i_val);
- }
- }
-
- printf("\n");
-
- spacer = '\t';
- ireq.i_type = IEEE80211_IOC_RTSTHRESHOLD;
- if (ioctl(s, SIOCG80211, &ireq) != -1) {
- printf("%crtsthreshold %d", spacer, ireq.i_val);
- spacer = ' ';
- }
-
- ireq.i_type = IEEE80211_IOC_PROTMODE;
- if (ioctl(s, SIOCG80211, &ireq) != -1) {
- printf("%cprotmode", spacer);
- switch (ireq.i_val) {
- case IEEE80211_PROTMODE_OFF:
- printf(" OFF");
- break;
- case IEEE80211_PROTMODE_CTS:
- printf(" CTS");
- break;
- case IEEE80211_PROTMODE_RTSCTS:
- printf(" RTSCTS");
+ case IEEE80211_AUTH_AUTO:
+ LINE_CHECK("%cauthmode AUTO", spacer);
break;
default:
- printf(" UNKNOWN");
+ LINE_CHECK("%cauthmode UNKNOWN (0x%x)",
+ spacer, ireq.i_val);
break;
}
- spacer = ' ';
}
- ireq.i_type = IEEE80211_IOC_TXPOWER;
- if (ioctl(s, SIOCG80211, &ireq) != -1) {
- printf("%ctxpower %d", spacer, ireq.i_val);
- spacer = ' ';
- }
-
- if (spacer != '\t')
- printf("\n");
-
ireq.i_type = IEEE80211_IOC_WEP;
if (ioctl(s, SIOCG80211, &ireq) != -1 &&
ireq.i_val != IEEE80211_WEP_NOSUP) {
- printf("\twepmode");
- switch (ireq.i_val) {
+ int firstkey, wepmode;
+
+ wepmode = ireq.i_val;
+ switch (wepmode) {
case IEEE80211_WEP_OFF:
- printf(" OFF");
+ LINE_CHECK("%cprivacy OFF", spacer);
break;
case IEEE80211_WEP_ON:
- printf(" ON");
+ LINE_CHECK("%cprivacy ON", spacer);
break;
case IEEE80211_WEP_MIXED:
- printf(" MIXED");
+ LINE_CHECK("%cprivacy MIXED", spacer);
break;
default:
- printf(" UNKNOWN");
+ LINE_CHECK("%cprivacy UNKNOWN (0x%x)",
+ spacer, wepmode);
break;
}
@@ -491,7 +1421,10 @@
warn("WEP support, but no tx key!");
goto end;
}
- printf(" weptxkey %d", ireq.i_val+1);
+ if (ireq.i_val != -1)
+ LINE_CHECK("%cdeftxkey %d", spacer, ireq.i_val+1);
+ else if (wepmode != IEEE80211_WEP_OFF || verbose)
+ LINE_CHECK("%cdeftxkey UNDEF", spacer);
ireq.i_type = IEEE80211_IOC_NUMWEPKEYS;
if (ioctl(s, SIOCG80211, &ireq) < 0) {
@@ -500,28 +1433,201 @@
}
num = ireq.i_val;
- printf("\n");
-
- ireq.i_type = IEEE80211_IOC_WEPKEY;
- spacer = '\t';
+ firstkey = 1;
for (i = 0; i < num; i++) {
- ireq.i_val = i;
+ struct ieee80211req_key ik;
+
+ memset(&ik, 0, sizeof(ik));
+ ik.ik_keyix = i;
+ ireq.i_type = IEEE80211_IOC_WPAKEY;
+ ireq.i_data = &ik;
+ ireq.i_len = sizeof(ik);
if (ioctl(s, SIOCG80211, &ireq) < 0) {
warn("WEP support, but can get keys!");
goto end;
}
- if (ireq.i_len == 0 ||
- ireq.i_len > IEEE80211_KEYBUF_SIZE)
- continue;
- printf("%cwepkey %d:%s", spacer, i+1,
- ireq.i_len <= 5 ? "40-bit" :
- ireq.i_len <= 13 ? "104-bit" : "128-bit");
- if (spacer == '\t')
+ if (ik.ik_keylen != 0) {
+ if (verbose)
+ LINE_BREAK();
+ printkey(&ik);
+ firstkey = 0;
+ }
+ }
+ }
+
+ ireq.i_type = IEEE80211_IOC_POWERSAVE;
+ if (ioctl(s, SIOCG80211, &ireq) != -1 &&
+ ireq.i_val != IEEE80211_POWERSAVE_NOSUP ) {
+ if (ireq.i_val != IEEE80211_POWERSAVE_OFF || verbose) {
+ switch (ireq.i_val) {
+ case IEEE80211_POWERSAVE_OFF:
+ LINE_CHECK("%cpowersavemode OFF",
+ spacer);
+ break;
+ case IEEE80211_POWERSAVE_CAM:
+ LINE_CHECK("%cpowersavemode CAM",
+ spacer);
+ break;
+ case IEEE80211_POWERSAVE_PSP:
+ LINE_CHECK("%cpowersavemode PSP",
+ spacer);
+ break;
+ case IEEE80211_POWERSAVE_PSP_CAM:
+ LINE_CHECK("%cpowersavemode PSP-CAM",
+ spacer);
+ break;
+ }
+ ireq.i_type = IEEE80211_IOC_POWERSAVESLEEP;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ LINE_CHECK("%cpowersavesleep %d",
+ spacer, ireq.i_val);
+ }
+ }
+
+ ireq.i_type = IEEE80211_IOC_TXPOWMAX;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ LINE_CHECK("%ctxpowmax %d", spacer, ireq.i_val);
+
+ if (verbose) {
+ ireq.i_type = IEEE80211_IOC_TXPOWER;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ LINE_CHECK("%ctxpower %d", spacer, ireq.i_val);
+ }
+
+ ireq.i_type = IEEE80211_IOC_RTSTHRESHOLD;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (ireq.i_val != IEEE80211_RTS_MAX || verbose)
+ LINE_CHECK("%crtsthreshold %d", spacer, ireq.i_val);
+ }
+
+ if (IEEE80211_IS_CHAN_G(c) || IEEE80211_IS_CHAN_PUREG(c) || verbose) {
+ ireq.i_type = IEEE80211_IOC_PROTMODE;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ switch (ireq.i_val) {
+ case IEEE80211_PROTMODE_OFF:
+ LINE_CHECK("%cprotmode OFF", spacer);
+ break;
+ case IEEE80211_PROTMODE_CTS:
+ LINE_CHECK("%cprotmode CTS", spacer);
+ break;
+ case IEEE80211_PROTMODE_RTSCTS:
+ LINE_CHECK("%cprotmode RTSCTS", spacer);
+ break;
+ default:
+ LINE_CHECK("%cprotmode UNKNOWN (0x%x)",
+ spacer, ireq.i_val);
+ break;
+ }
+ }
+ }
+
+ ireq.i_type = IEEE80211_IOC_WME;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ wme = ireq.i_val;
+ if (wme)
+ LINE_CHECK("%cwme", spacer);
+ else if (verbose)
+ LINE_CHECK("%c-wme", spacer);
+ } else
+ wme = 0;
+
+ if (opmode == IEEE80211_M_HOSTAP) {
+ ireq.i_type = IEEE80211_IOC_HIDESSID;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (ireq.i_val)
+ LINE_CHECK("%cssid HIDE", spacer);
+ else if (verbose)
+ LINE_CHECK("%cssid SHOW", spacer);
+ }
+
+ ireq.i_type = IEEE80211_IOC_APBRIDGE;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (!ireq.i_val)
+ LINE_CHECK("%c-apbridge", spacer);
+ else if (verbose)
+ LINE_CHECK("%capbridge", spacer);
+ }
+
+ ireq.i_type = IEEE80211_IOC_DTIM_PERIOD;
+ if (ioctl(s, SIOCG80211, &ireq) != -1)
+ LINE_CHECK("%cdtimperiod %u", spacer, ireq.i_val);
+ } else {
+ ireq.i_type = IEEE80211_IOC_ROAMING;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (ireq.i_val != IEEE80211_ROAMING_AUTO || verbose) {
+ switch (ireq.i_val) {
+ case IEEE80211_ROAMING_DEVICE:
+ LINE_CHECK("%croaming DEVICE", spacer);
+ break;
+ case IEEE80211_ROAMING_AUTO:
+ LINE_CHECK("%croaming AUTO", spacer);
+ break;
+ case IEEE80211_ROAMING_MANUAL:
+ LINE_CHECK("%croaming MANUAL", spacer);
+ break;
+ default:
+ LINE_CHECK("%croaming UNKNOWN (0x%x)",
+ spacer, ireq.i_val);
+ break;
+ }
+ }
+ }
+ }
+ ireq.i_type = IEEE80211_IOC_BEACON_INTERVAL;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (ireq.i_val)
+ LINE_CHECK("%cbintval %u", spacer, ireq.i_val);
+ else if (verbose)
+ LINE_CHECK("%cbintval %u", spacer, ireq.i_val);
+ }
+
+ if (wme && verbose) {
+ LINE_BREAK();
+ list_wme(s);
+ }
+
+ if (wpa) {
+ ireq.i_type = IEEE80211_IOC_COUNTERMEASURES;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ if (ireq.i_val)
+ LINE_CHECK("%ccountermeasures", spacer);
+ else if (verbose)
+ LINE_CHECK("%c-countermeasures", spacer);
+ }
+#if 0
+ /* XXX not interesting with WPA done in user space */
+ ireq.i_type = IEEE80211_IOC_KEYMGTALGS;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ }
+
+ ireq.i_type = IEEE80211_IOC_MCASTCIPHER;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ printf("%cmcastcipher ", spacer);
+ printcipher(s, &ireq, IEEE80211_IOC_MCASTKEYLEN);
+ spacer = ' ';
+ }
+
+ ireq.i_type = IEEE80211_IOC_UCASTCIPHER;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ printf("%cucastcipher ", spacer);
+ printcipher(s, &ireq, IEEE80211_IOC_UCASTKEYLEN);
+ }
+
+ if (wpa & 2) {
+ ireq.i_type = IEEE80211_IOC_RSNCAPS;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
+ printf("%cRSN caps 0x%x", spacer, ireq.i_val);
spacer = ' ';
+ }
+ }
+
+ ireq.i_type = IEEE80211_IOC_UCASTCIPHERS;
+ if (ioctl(s, SIOCG80211, &ireq) != -1) {
}
- if (spacer == ' ')
- printf("\n");
+#endif
+ LINE_BREAK();
}
+ LINE_BREAK();
end:
return;
@@ -623,3 +1729,79 @@
}
}
+static struct cmd ieee80211_cmds[] = {
+ DEF_CMD_ARG("ssid", set80211ssid),
+ DEF_CMD_ARG("nwid", set80211ssid),
+ DEF_CMD_ARG("stationname", set80211stationname),
+ DEF_CMD_ARG("station", set80211stationname), /* BSD/OS */
+ DEF_CMD_ARG("channel", set80211channel),
+ DEF_CMD_ARG("authmode", set80211authmode),
+ DEF_CMD_ARG("powersavemode", set80211powersavemode),
+ DEF_CMD("powersave", 1, set80211powersave),
+ DEF_CMD("-powersave", 0, set80211powersave),
+ DEF_CMD_ARG("powersavesleep", set80211powersavesleep),
+ DEF_CMD_ARG("wepmode", set80211wepmode),
+ DEF_CMD("wep", 1, set80211wep),
+ DEF_CMD("-wep", 0, set80211wep),
+ DEF_CMD_ARG("deftxkey", set80211weptxkey),
+ DEF_CMD_ARG("weptxkey", set80211weptxkey),
+ DEF_CMD_ARG("wepkey", set80211wepkey),
+ DEF_CMD_ARG("nwkey", set80211nwkey), /* NetBSD */
+ DEF_CMD("-nwkey", 0, set80211wep), /* NetBSD */
+ DEF_CMD_ARG("rtsthreshold", set80211rtsthreshold),
+ DEF_CMD_ARG("protmode", set80211protmode),
+ DEF_CMD_ARG("txpower", set80211txpower),
+ DEF_CMD_ARG("roaming", set80211roaming),
+ DEF_CMD("wme", 1, set80211wme),
+ DEF_CMD("-wme", 0, set80211wme),
+ DEF_CMD("hidessid", 1, set80211hidessid),
+ DEF_CMD("-hidessid", 0, set80211hidessid),
+ DEF_CMD("apbridge", 1, set80211apbridge),
+ DEF_CMD("-apbridge", 0, set80211apbridge),
+ DEF_CMD_ARG("chanlist", set80211chanlist),
+ DEF_CMD_ARG("bssid", set80211bssid),
+ DEF_CMD_ARG("ap", set80211bssid),
+ DEF_CMD("scan", 0, set80211scan),
+ DEF_CMD_ARG("list", set80211list),
+ DEF_CMD_ARG2("cwmin", set80211cwmin),
+ DEF_CMD_ARG2("cwmax", set80211cwmax),
+ DEF_CMD_ARG2("aifs", set80211aifs),
+ DEF_CMD_ARG2("txoplimit", set80211txoplimit),
+ DEF_CMD("acm", 1, set80211acm),
+ DEF_CMD("-acm", 0, set80211acm),
+ DEF_CMD("ack", 1, set80211ackpolicy),
+ DEF_CMD("-ack", 0, set80211ackpolicy),
+ DEF_CMD_ARG2("bss:cwmin", set80211bsscwmin),
+ DEF_CMD_ARG2("bss:cwmax", set80211bsscwmax),
+ DEF_CMD_ARG2("bss:aifs", set80211bssaifs),
+ DEF_CMD_ARG2("bss:txoplimit", set80211bsstxoplimit),
+ DEF_CMD_ARG("dtimperiod", set80211dtimperiod),
+ DEF_CMD_ARG("bintval", set80211bintval),
+ DEF_CMD("mac:open", IEEE80211_MACCMD_POLICY_OPEN, set80211maccmd),
+ DEF_CMD("mac:allow", IEEE80211_MACCMD_POLICY_ALLOW, set80211maccmd),
+ DEF_CMD("mac:deny", IEEE80211_MACCMD_POLICY_DENY, set80211maccmd),
+ DEF_CMD("mac:flush", IEEE80211_MACCMD_FLUSH, set80211maccmd),
+ DEF_CMD("mac:detach", IEEE80211_MACCMD_DETACH, set80211maccmd),
+ DEF_CMD_ARG("mac:add", set80211addmac),
+ DEF_CMD_ARG("mac:del", set80211delmac),
+#if 0
+ DEF_CMD_ARG("mac:kick", set80211kickmac),
+#endif
+};
+static struct afswtch af_ieee80211 = {
+ .af_name = "af_ieee80211",
+ .af_af = AF_UNSPEC,
+ .af_other_status = ieee80211_status,
+};
+
+static __constructor void
+ieee80211_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(ieee80211_cmds); i++)
+ cmd_register(&ieee80211_cmds[i]);
+ af_register(&af_ieee80211);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifmac.c src/sbin/ifconfig/ifmac.c
--- src.preview/sbin/ifconfig/ifmac.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifmac.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,119 @@
+/*-
+ * Copyright (c) 2001 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by NAI Labs, the
+ * Security Research Division of Network Associates, Inc. under
+ * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
+ * CHATS research program.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ifconfig.h"
+
+static void
+maclabel_status(int s)
+{
+ struct ifreq ifr;
+ mac_t label;
+ char *label_text;
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+ if (mac_prepare_ifnet_label(&label) == -1)
+ return;
+ ifr.ifr_ifru.ifru_data = (void *)label;
+ if (ioctl(s, SIOCGIFMAC, &ifr) == -1)
+ goto mac_free;
+
+
+ if (mac_to_text(label, &label_text) == -1)
+ goto mac_free;
+
+ if (strlen(label_text) != 0)
+ printf("\tmaclabel %s\n", label_text);
+ free(label_text);
+
+mac_free:
+ mac_free(label);
+}
+
+static void
+setifmaclabel(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ struct ifreq ifr;
+ mac_t label;
+ int error;
+
+ if (mac_from_text(&label, val) == -1) {
+ perror(val);
+ return;
+ }
+
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ ifr.ifr_ifru.ifru_data = (void *)label;
+
+ error = ioctl(s, SIOCSIFMAC, &ifr);
+ mac_free(label);
+ if (error == -1)
+ perror("setifmac");
+}
+
+static struct cmd mac_cmds[] = {
+ DEF_CMD_ARG("maclabel", setifmaclabel),
+};
+static struct afswtch af_mac = {
+ .af_name = "af_maclabel",
+ .af_af = AF_UNSPEC,
+ .af_other_status = maclabel_status,
+};
+
+static __constructor void
+mac_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(mac_cmds); i++)
+ cmd_register(&mac_cmds[i]);
+ af_register(&af_mac);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifmedia.c src/sbin/ifconfig/ifmedia.c
--- src.preview/sbin/ifconfig/ifmedia.c 2005-03-06 00:01:59.000000000 -0500
+++ src/sbin/ifconfig/ifmedia.c 2005-09-27 15:02:10.000000000 -0400
@@ -1,6 +1,5 @@
/* $NetBSD: ifconfig.c,v 1.34 1997/04/21 01:17:58 lukem Exp $ */
-/* $FreeBSD: src/sbin/ifconfig/ifmedia.c,v 1.6.2.3 2001/11/14 04:35:07 yar Exp $ */
-/* $DragonFly: src/sbin/ifconfig/ifmedia.c,v 1.8 2005/03/06 05:01:59 dillon Exp $ */
+/* $FreeBSD$ */
/*
* Copyright (c) 1997 Jason R. Thorpe.
@@ -90,24 +89,6 @@
#include "ifconfig.h"
-#ifndef IFM_SUBTYPE_IEEE80211_MODE_DESCRIPTIONS
- #define IFM_SUBTYPE_IEEE80211_MODE_DESCRIPTIONS { \
- { IFM_AUTO, "autoselect" }, \
- { IFM_IEEE80211_11A, "11a" }, \
- { IFM_IEEE80211_11B, "11b" }, \
- { IFM_IEEE80211_11G, "11g" }, \
- { IFM_IEEE80211_FH, "fh" }, \
- { 0, NULL }, \
-}
-#endif
-
-#ifndef IFM_SUBTYPE_IEEE80211_MODE_ALIASES
- #define IFM_SUBTYPE_IEEE80211_MODE_ALIASES { \
- { IFM_AUTO, "auto" }, \
- { 0, NULL }, \
-}
-#endif
-
static void domediaopt(const char *, int, int);
static int get_media_subtype(int, const char *);
static int get_media_mode(int, const char *);
@@ -121,8 +102,8 @@
static struct ifmedia_description *get_subtype_desc(int,
struct ifmedia_type_to_subtype *ttos);
-void
-media_status(int s, struct rt_addrinfo *info __unused)
+static void
+media_status(int s)
{
struct ifmediareq ifmr;
int *media_list, i;
@@ -179,14 +160,12 @@
printf("no ring");
break;
-#if notyet
case IFM_ATM:
if (ifmr.ifm_status & IFM_ACTIVE)
printf("active");
else
printf("no carrier");
break;
-#endif
case IFM_IEEE80211:
/* XXX: Different value for adhoc? */
@@ -211,29 +190,72 @@
free(media_list);
}
-void
-setmedia(const char *val, int d __unused, int s,
- const struct afswtch *afp __unused)
+static struct ifmediareq *
+getifmediastate(int s)
{
- struct ifmediareq ifmr;
- int first_type, subtype;
+ static struct ifmediareq *ifmr = NULL;
+ int *mwords;
- (void) memset(&ifmr, 0, sizeof(ifmr));
- (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+ if (ifmr == NULL) {
+ ifmr = (struct ifmediareq *)malloc(sizeof(struct ifmediareq));
+ if (ifmr == NULL)
+ err(1, "malloc");
+
+ (void) memset(ifmr, 0, sizeof(struct ifmediareq));
+ (void) strncpy(ifmr->ifm_name, name,
+ sizeof(ifmr->ifm_name));
+
+ ifmr->ifm_count = 0;
+ ifmr->ifm_ulist = NULL;
- ifmr.ifm_count = 1;
- ifmr.ifm_ulist = &first_type;
- if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
/*
- * If we get E2BIG, the kernel is telling us
- * that there are more, so we can ignore it.
+ * We must go through the motions of reading all
+ * supported media because we need to know both
+ * the current media type and the top-level type.
*/
- if (errno != E2BIG)
+
+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)ifmr) < 0) {
+ err(1, "SIOCGIFMEDIA");
+ }
+
+ if (ifmr->ifm_count == 0)
+ errx(1, "%s: no media types?", name);
+
+ mwords = (int *)malloc(ifmr->ifm_count * sizeof(int));
+ if (mwords == NULL)
+ err(1, "malloc");
+
+ ifmr->ifm_ulist = mwords;
+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)ifmr) < 0)
err(1, "SIOCGIFMEDIA");
}
- if (ifmr.ifm_count == 0)
- errx(1, "%s: no media types?", name);
+ return ifmr;
+}
+
+static void
+setifmediacallback(int s, void *arg)
+{
+ struct ifmediareq *ifmr = (struct ifmediareq *)arg;
+ static int did_it = 0;
+
+ if (!did_it) {
+ if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
+ err(1, "SIOCSIFMEDIA (media)");
+ free(ifmr->ifm_ulist);
+ free(ifmr);
+ did_it = 1;
+ }
+}
+
+static void
+setmedia(const char *val, int d, int s, const struct afswtch *afp)
+{
+ struct ifmediareq *ifmr;
+ int subtype;
+
+
+ ifmr = getifmediastate(s);
/*
* We are primarily concerned with the top-level type.
@@ -244,27 +266,29 @@
* (I'm assuming that all supported media types for a given
* interface will be the same top-level type..)
*/
- subtype = get_media_subtype(IFM_TYPE(first_type), val);
+ subtype = get_media_subtype(IFM_TYPE(ifmr->ifm_ulist[0]), val);
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- ifr.ifr_media = (ifmr.ifm_current & ~(IFM_NMASK|IFM_TMASK)) |
- IFM_TYPE(first_type) | subtype;
+ ifr.ifr_media = (ifmr->ifm_current & ~(IFM_NMASK|IFM_TMASK)) |
+ IFM_TYPE(ifmr->ifm_ulist[0]) | subtype;
+
+ if ((ifr.ifr_media & IFM_TMASK) == 0) {
+ ifr.ifr_media &= ~IFM_GMASK;
+ }
- if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
- err(1, "SIOCSIFMEDIA (media)");
+ ifmr->ifm_current = ifr.ifr_media;
+ callback_register(setifmediacallback, (void *)ifmr);
}
-void
-setmediaopt(const char *val, int d __unused, int s,
- const struct afswtch *afp __unused)
+static void
+setmediaopt(const char *val, int d, int s, const struct afswtch *afp)
{
domediaopt(val, 0, s);
}
-void
-unsetmediaopt(const char *val, int d __unused, int s,
- const struct afswtch *afp __unused)
+static void
+unsetmediaopt(const char *val, int d, int s, const struct afswtch *afp)
{
domediaopt(val, 1, s);
@@ -273,87 +297,40 @@
static void
domediaopt(const char *val, int clear, int s)
{
- struct ifmediareq ifmr;
- int *mwords, options;
+ struct ifmediareq *ifmr;
+ int options;
- (void) memset(&ifmr, 0, sizeof(ifmr));
- (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+ ifmr = getifmediastate(s);
- /*
- * We must go through the motions of reading all
- * supported media because we need to know both
- * the current media type and the top-level type.
- */
-
- if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
- err(1, "SIOCGIFMEDIA");
-
- if (ifmr.ifm_count == 0)
- errx(1, "%s: no media types?", name);
-
- mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
- if (mwords == NULL)
- err(1, "malloc");
-
- ifmr.ifm_ulist = mwords;
- if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
- err(1, "SIOCGIFMEDIA");
-
- options = get_media_options(IFM_TYPE(mwords[0]), val);
-
- free(mwords);
+ options = get_media_options(IFM_TYPE(ifmr->ifm_ulist[0]), val);
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- ifr.ifr_media = ifmr.ifm_current;
+ ifr.ifr_media = ifmr->ifm_current;
if (clear)
ifr.ifr_media &= ~options;
else
ifr.ifr_media |= options;
- if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
- err(1, "SIOCSIFMEDIA (mediaopt)");
+ ifmr->ifm_current = ifr.ifr_media;
+ callback_register(setifmediacallback, (void *)ifmr);
}
-void
-setmediamode(const char *val, int d __unused, int s,
- const struct afswtch *afp __unused)
+static void
+setmediamode(const char *val, int d, int s, const struct afswtch *afp)
{
- struct ifmediareq ifmr;
- int *mwords, mode;
-
- (void) memset(&ifmr, 0, sizeof(ifmr));
- (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
-
- /*
- * We must go through the motions of reading all
- * supported media because we need to know both
- * the current media type and the top-level type.
- */
+ struct ifmediareq *ifmr;
+ int mode;
- if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
- err(1, "SIOCGIFMEDIA");
-
- if (ifmr.ifm_count == 0)
- errx(1, "%s: no media types?", name);
-
- mwords = (int *)malloc(ifmr.ifm_count * sizeof(int));
- if (mwords == NULL)
- err(1, "malloc");
-
- ifmr.ifm_ulist = mwords;
- if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
- err(1, "SIOCGIFMEDIA");
-
- mode = get_media_mode(IFM_TYPE(mwords[0]), val);
+ ifmr = getifmediastate(s);
- free(mwords);
+ mode = get_media_mode(IFM_TYPE(ifmr->ifm_ulist[0]), val);
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- ifr.ifr_media = (ifmr.ifm_current & ~IFM_MMASK) | mode;
+ ifr.ifr_media = (ifmr->ifm_current & ~IFM_MMASK) | mode;
- if (ioctl(s, SIOCSIFMEDIA, (caddr_t)&ifr) < 0)
- err(1, "SIOCSIFMEDIA (mode)");
+ ifmr->ifm_current = ifr.ifr_media;
+ callback_register(setifmediacallback, (void *)ifmr);
}
/**********************************************************************
@@ -405,7 +382,6 @@
struct ifmedia_description ifm_subtype_ieee80211_mode_aliases[] =
IFM_SUBTYPE_IEEE80211_MODE_ALIASES;
-#if notyet
static struct ifmedia_description ifm_subtype_atm_descriptions[] =
IFM_SUBTYPE_ATM_DESCRIPTIONS;
@@ -414,7 +390,6 @@
static struct ifmedia_description ifm_subtype_atm_option_descriptions[] =
IFM_SUBTYPE_ATM_OPTION_DESCRIPTIONS;
-#endif
static struct ifmedia_description ifm_subtype_shared_descriptions[] =
IFM_SUBTYPE_SHARED_DESCRIPTIONS;
@@ -516,17 +491,13 @@
{
{ &ifm_subtype_shared_descriptions[0], 0 },
{ &ifm_subtype_shared_aliases[0], 1 },
-#if notyet
{ &ifm_subtype_atm_descriptions[0], 0 },
{ &ifm_subtype_atm_aliases[0], 1 },
-#endif
{ NULL, 0 },
},
{
{ &ifm_shared_option_descriptions[0], 0 },
-#if notyet
{ &ifm_subtype_atm_option_descriptions[0], 0 },
-#endif
{ NULL, 0 },
},
{
@@ -808,3 +779,27 @@
/**********************************************************************
* ...until here.
**********************************************************************/
+
+static struct cmd media_cmds[] = {
+ DEF_CMD_ARG("media", setmedia),
+ DEF_CMD_ARG("mode", setmediamode),
+ DEF_CMD_ARG("mediaopt", setmediaopt),
+ DEF_CMD_ARG("-mediaopt",unsetmediaopt),
+};
+static struct afswtch af_media = {
+ .af_name = "af_media",
+ .af_af = AF_UNSPEC,
+ .af_other_status = media_status,
+};
+
+static __constructor void
+ifmedia_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(media_cmds); i++)
+ cmd_register(&media_cmds[i]);
+ af_register(&af_media);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifpfsync.c src/sbin/ifconfig/ifpfsync.c
--- src.preview/sbin/ifconfig/ifpfsync.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sbin/ifconfig/ifpfsync.c 2005-09-27 15:02:10.000000000 -0400
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2003 Ryan McBride. All rights reserved.
+ * Copyright (c) 2004 Max Laier. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <netinet/in.h>
+#include <net/pfvar.h>
+#include <net/if_pfsync.h>
+#include <net/route.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "ifconfig.h"
+
+void setpfsync_syncif(const char *, int, int, const struct afswtch *rafp);
+void unsetpfsync_syncif(const char *, int, int, const struct afswtch *rafp);
+void setpfsync_maxupd(const char *, int, int, const struct afswtch *rafp);
+void pfsync_status(int);
+
+void
+setpfsync_syncif(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ struct pfsyncreq preq;
+
+ bzero((char *)&preq, sizeof(struct pfsyncreq));
+ ifr.ifr_data = (caddr_t)&preq;
+
+ if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+ err(1, "SIOCGETPFSYNC");
+
+ strlcpy(preq.pfsyncr_syncif, val, sizeof(preq.pfsyncr_syncif));
+
+ if (ioctl(s, SIOCSETPFSYNC, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSETPFSYNC");
+}
+
+void
+unsetpfsync_syncif(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ struct pfsyncreq preq;
+
+ bzero((char *)&preq, sizeof(struct pfsyncreq));
+ ifr.ifr_data = (caddr_t)&preq;
+
+ if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+ err(1, "SIOCGETPFSYNC");
+
+ bzero((char *)&preq.pfsyncr_syncif, sizeof(preq.pfsyncr_syncif));
+
+ if (ioctl(s, SIOCSETPFSYNC, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSETPFSYNC");
+}
+
+void
+setpfsync_maxupd(const char *val, int d, int s, const struct afswtch *rafp)
+{
+ int maxupdates;
+ struct pfsyncreq preq;
+
+ maxupdates = atoi(val);
+
+ memset((char *)&preq, 0, sizeof(struct pfsyncreq));
+ ifr.ifr_data = (caddr_t)&preq;
+
+ if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+ err(1, "SIOCGETPFSYNC");
+
+ preq.pfsyncr_maxupdates = maxupdates;
+
+ if (ioctl(s, SIOCSETPFSYNC, (caddr_t)&ifr) == -1)
+ err(1, "SIOCSETPFSYNC");
+}
+
+void
+pfsync_status(int s)
+{
+ struct pfsyncreq preq;
+
+ bzero((char *)&preq, sizeof(struct pfsyncreq));
+ ifr.ifr_data = (caddr_t)&preq;
+
+ if (ioctl(s, SIOCGETPFSYNC, (caddr_t)&ifr) == -1)
+ return;
+
+ if (preq.pfsyncr_syncif[0] != '\0') {
+ printf("\tpfsync: syncif: %s maxupd: %d\n",
+ preq.pfsyncr_syncif, preq.pfsyncr_maxupdates);
+ }
+}
+
+static struct cmd pfsync_cmds[] = {
+ DEF_CMD_ARG("syncif", setpfsync_syncif),
+ DEF_CMD_ARG("maxupd", setpfsync_maxupd),
+ DEF_CMD("-syncif", 1, unsetpfsync_syncif),
+};
+static struct afswtch af_pfsync = {
+ .af_name = "af_pfsync",
+ .af_af = AF_UNSPEC,
+ .af_other_status = pfsync_status,
+};
+
+static __constructor void
+pfsync_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(pfsync_cmds); i++)
+ af_register(&af_pfsync);
+#undef N
+}
diff -N -u -r src.preview/sbin/ifconfig/ifvlan.c src/sbin/ifconfig/ifvlan.c
--- src.preview/sbin/ifconfig/ifvlan.c 2005-03-06 00:01:59.000000000 -0500
+++ src/sbin/ifconfig/ifvlan.c 2005-09-27 15:02:10.000000000 -0400
@@ -28,9 +28,6 @@
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD: src/sbin/ifconfig/ifvlan.c,v 1.2 1999/08/28 00:13:09 peter Exp $
- * $DragonFly: src/sbin/ifconfig/ifvlan.c,v 1.6 2005/03/06 05:01:59 dillon Exp $
*/
#include <sys/param.h>
@@ -61,7 +58,8 @@
static int __tag = 0;
static int __have_tag = 0;
-void vlan_status(int s, struct rt_addrinfo *info __unused)
+static void
+vlan_status(int s)
{
struct vlanreq vreq;
@@ -78,8 +76,8 @@
return;
}
-void setvlantag(const char *val, int d __unused, int s,
- const struct afswtch *afp __unused)
+static void
+setvlantag(const char *val, int d, int s, const struct afswtch *afp)
{
u_int16_t tag;
struct vlanreq vreq;
@@ -101,8 +99,8 @@
return;
}
-void setvlandev(const char *val, int d __unused, int s,
- const struct afswtch *afp __unused)
+static void
+setvlandev(const char *val, int d, int s, const struct afswtch *afp)
{
struct vlanreq vreq;
@@ -124,8 +122,8 @@
return;
}
-void unsetvlandev(const char *val __unused, int d __unused, int s,
- const struct afswtch *afp __unused)
+static void
+unsetvlandev(const char *val, int d, int s, const struct afswtch *afp)
{
struct vlanreq vreq;
@@ -143,3 +141,30 @@
return;
}
+
+static struct cmd vlan_cmds[] = {
+ DEF_CMD_ARG("vlan", setvlantag),
+ DEF_CMD_ARG("vlandev", setvlandev),
+ DEF_CMD_ARG("-vlandev", unsetvlandev),
+ DEF_CMD("vlanmtu", IFCAP_VLAN_MTU, setifcap),
+ DEF_CMD("-vlanmtu", -IFCAP_VLAN_MTU, setifcap),
+ DEF_CMD("vlanhwtag", IFCAP_VLAN_HWTAGGING, setifcap),
+ DEF_CMD("-vlanhwtag", -IFCAP_VLAN_HWTAGGING, setifcap),
+};
+static struct afswtch af_vlan = {
+ .af_name = "af_vlan",
+ .af_af = AF_UNSPEC,
+ .af_other_status = vlan_status,
+};
+
+static __constructor void
+vlan_ctor(void)
+{
+#define N(a) (sizeof(a) / sizeof(a[0]))
+ int i;
+
+ for (i = 0; i < N(vlan_cmds); i++)
+ cmd_register(&vlan_cmds[i]);
+ af_register(&af_vlan);
+#undef N
+}
diff -N -u -r src.preview/sys/bus/cam/scsi/scsi_da.c src/sys/bus/cam/scsi/scsi_da.c
--- src.preview/sys/bus/cam/scsi/scsi_da.c 2005-06-02 17:12:45.000000000 -0400
+++ src/sys/bus/cam/scsi/scsi_da.c 2005-09-23 11:24:22.000000000 -0400
@@ -345,14 +345,6 @@
},
{
/*
- * iRiver iFP MP3 player (with UMS Firmware)
- * PR: kern/54881, i386/63941, kern/66124
- */
- {T_DIRECT, SIP_MEDIA_REMOVABLE, "iRiver", "iFP*", "*"},
- /*quirks*/ DA_Q_NO_SYNC_CACHE
- },
- {
- /*
* Frontier Labs NEX IA+ Digital Audio Player, rev 1.10/0.01
* PR: kern/70158
*/
@@ -401,6 +393,14 @@
#endif /* DA_OLD_QUIRKS */
{
/*
+ * iRiver iFP MP3 player (with UMS Firmware)
+ * PR: kern/54881, i386/63941, kern/66124
+ */
+ {T_DIRECT, SIP_MEDIA_REMOVABLE, "iRiver", "iFP*", "*"},
+ /*quirks*/ DA_Q_NO_SYNC_CACHE
+ },
+ {
+ /*
* EXATELECOM (Sigmatel) i-Bead 100/105 USB Flash MP3 Player
* PR: kern/51675
*/
diff -N -u -r src.preview/sys/conf/Makefile.i386 src/sys/conf/Makefile.i386
--- src.preview/sys/conf/Makefile.i386 2005-08-16 22:51:45.000000000 -0400
+++ src/sys/conf/Makefile.i386 2005-09-23 11:24:22.000000000 -0400
@@ -68,6 +68,10 @@
# include path into 100+ source files.
INCLUDES+= -I$S/contrib/ipfilter
+# This hack lets us use the ath_hal code without spamming a new
+# include path into source files.
+INCLUDES+= -I$S/contrib/dev/ath -I$S/contrib/dev/ath/freebsd
+
COPTS= ${INCLUDES} ${IDENT} -D_KERNEL -include opt_global.h
CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
diff -N -u -r src.preview/sys/conf/files src/sys/conf/files
--- src.preview/sys/conf/files 2005-09-03 21:28:57.000000000 -0400
+++ src/sys/conf/files 2005-09-23 11:24:22.000000000 -0400
@@ -65,6 +65,7 @@
bus/cam/scsi/scsi_target.c optional targ
bus/cam/scsi/scsi_targ_bh.c optional targbh
+contrib/dev/ath/freebsd/ah_osdep.c optional ath_hal
contrib/ipfilter/netinet/fil.c optional ipfilter inet
contrib/ipfilter/netinet/ip_auth.c optional ipfilter inet
contrib/ipfilter/netinet/ip_fil.c optional ipfilter inet
@@ -144,6 +145,11 @@
dev/disk/ata/atapi-fd.c optional atapifd
dev/disk/ata/atapi-tape.c optional atapist
dev/disk/ata/atapi-cam.c optional atapicam
+dev/netif/ath/if_ath.c optional ath
+dev/netif/ath/if_ath_pci.c optional ath pci
+dev/netif/ath/ath_rate/amrr/amrr.c optional ath_rate_amrr
+dev/netif/ath/ath_rate/onoe/onoe.c optional ath_rate_onoe
+dev/netif/ath/ath_rate/sample/sample.c optional ath_rate_sample
dev/raid/amr/amr_cam.c optional amr
dev/raid/amr/amr_disk.c optional amr
dev/raid/amr/amr_pci.c optional amr
@@ -700,12 +706,18 @@
net/zlib.c optional ppp_deflate
net/zlib.c optional ipsec
netproto/802_11/ieee80211.c optional wlan
+netproto/802_11/ieee80211_acl.c optional wlan
netproto/802_11/ieee80211_crypto.c optional wlan
+netproto/802_11/ieee80211_crypto_none.c optional wlan
+netproto/802_11/ieee80211_crypto_tkip.c optional wlan
+netproto/802_11/ieee80211_crypto_wep.c optional wlan
+netproto/802_11/ieee80211_dragonfly.c optional wlan
netproto/802_11/ieee80211_input.c optional wlan
netproto/802_11/ieee80211_ioctl.c optional wlan
netproto/802_11/ieee80211_node.c optional wlan
netproto/802_11/ieee80211_output.c optional wlan
netproto/802_11/ieee80211_proto.c optional wlan
+netproto/802_11/ieee80211_xauth.c optional wlan
netproto/atalk/aarp.c optional netatalk
netproto/atalk/at_control.c optional netatalk
netproto/atalk/at_proto.c optional netatalk
diff -N -u -r src.preview/sys/conf/files.i386 src/sys/conf/files.i386
--- src.preview/sys/conf/files.i386 2005-08-16 06:31:35.000000000 -0400
+++ src/sys/conf/files.i386 2005-09-23 11:24:22.000000000 -0400
@@ -47,6 +47,16 @@
no-obj no-implicit-rule before-depend \
clean "ukbdmap.h"
#
+hal.o optional ath_hal \
+ dependency "$S/contrib/dev/ath/public/i386-elf.hal.o.uu" \
+ compile-with "uudecode < $S/contrib/dev/ath/public/i386-elf.hal.o.uu" \
+ no-implicit-rule
+opt_ah.h optional ath_hal \
+ dependency "$S/contrib/dev/ath/public/i386-elf.opt_ah.h" \
+ compile-with "cp $S/contrib/dev/ath/public/i386-elf.opt_ah.h opt_ah.h" \
+ no-obj no-implicit-rule before-depend \
+ clean "opt_ah.h"
+#
emulation/linux/linux_file.c optional compat_linux
emulation/linux/linux_getcwd.c optional compat_linux
emulation/linux/linux_ioctl.c optional compat_linux
diff -N -u -r src.preview/sys/contrib/dev/ath/COPYRIGHT src/sys/contrib/dev/ath/COPYRIGHT
--- src.preview/sys/contrib/dev/ath/COPYRIGHT 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/COPYRIGHT 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,42 @@
+All files contained in this distribution are covered by the following
+copyright unless explicitly identified otherwise. Note that this
+copyright does _NOT_ contain a "or GPL" clause and does _NOT_ permit
+redistribution with changes.
+
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: COPYRIGHT,v 1.3 2004/01/07 23:09:27 sam Exp $
+ */
diff -N -u -r src.preview/sys/contrib/dev/ath/README src/sys/contrib/dev/ath/README
--- src.preview/sys/contrib/dev/ath/README 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/README 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,64 @@
+$Id: README,v 1.3 2004/01/07 23:09:27 sam Exp $
+
+
+WARNING: THIS IS A BETA DISTRIBUTION. THIS SOFTWARE HAS KNOWN PROBLEMS AND
+WARNING: LIMITATIONS THAT WILL BE CORRECTED BEFORE A PRODUCTION RELEASE.
+WARNING: USE AT YOUR OWN RISK!
+
+
+Atheros Hardware Access Layer (HAL)
+===================================
+
+* Copyright (c) 2002-2004 Sam Leffler.
+* Copyright (c) 2002-2004 Atheros Communications, Inc.
+* All rights reserved.
+
+Read the file COPYRIGHT for the complete copyright.
+
+This code manages much of the chip-specific operation of the Atheros driver.
+The HAL is provided in a binary-only form in order to comply with FCC
+regulations. In particular, a radio transmitter can only be operated at
+power levels and on frequency channels for which it is approved. The FCC
+requires that a software-defined radio cannot be configured by a user
+to operate outside the approved power levels and frequency channels.
+This makes it difficult to open-source code that enforces limits on
+the power levels, frequency channels and other parameters of the radio
+transmitter. See
+
+http://ftp.fcc.gov/Bureaus/Engineering_Technology/Orders/2001/fcc01264.pdf
+
+for the specific FCC regulation. Because the module is provided in a
+binary-only form it is marked "Proprietary"; this means when you load
+it you will see messages that your system is now "tainted".
+
+If you wish to use this driver on a platform for which an ath_hal
+module is not already provided please contact the author. Note that
+this is only necessary for new _architectures_; the HAL is not tied to
+any specific version of your operating system.
+
+
+Atheros Hardware
+================
+There are currently 3 generations of Atheros 802.11 wireless devices:
+
+5210 supports 11a only
+5211 supports both 11a and 11b
+5212 supports 11a, 11b, and 11g
+
+These parts have been incorporated in a variety of retail products
+including cardbus cards from DLink, Linksys, Netgear, and Proxim; and
+mini-pci cards from some of these same vendors. In addition many
+laptop vendors use Atheros mini-pci cards for their builtin wireless
+support. An (incomplete) list of products that use Atheros parts is:
+
+Netgear WAG511 D-Link DWL-AG520 Linksys WPC55AG
+Netgear WAB501 D-Link DWL-AG650 Linksys WMP55AG
+ D-Link DWL-AB650 Linksys WPC51AB
+
+In general, if a device is identified as ``11a only'' it is almost
+certain to contain an Atheros 5210 part in it. All retail a+b
+products use the 5211. The latest generation of universal a+b+g
+combo products use the 5212. When in doubt check the PCI vendor
+id with a tool like lspci, the Atheros vendor id is 0x168c; e.g.
+
+ 00:13.0 Ethernet controller: Unknown device 168c:0012 (rev 01)
diff -N -u -r src.preview/sys/contrib/dev/ath/ah.h src/sys/contrib/dev/ath/ah.h
--- src.preview/sys/contrib/dev/ath/ah.h 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/ah.h 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,691 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah.h,v 1.1.1.6 2004/12/08 18:04:16 sam Exp $
+ */
+
+#ifndef _ATH_AH_H_
+#define _ATH_AH_H_
+/*
+ * Atheros Hardware Access Layer
+ *
+ * Clients of the HAL call ath_hal_attach to obtain a reference to an ath_hal
+ * structure for use with the device. Hardware-related operations that
+ * follow must call back into the HAL through interface, supplying the
+ * reference as the first parameter.
+ */
+#include "ah_osdep.h"
+
+/*
+ * __ahdecl is analogous to _cdecl; it defines the calling
+ * convention used within the HAL. For most systems this
+ * can just default to be empty and the compiler will (should)
+ * use _cdecl. For systems where _cdecl is not compatible this
+ * must be defined. See linux/ah_osdep.h for an example.
+ */
+#ifndef __ahdecl
+#define __ahdecl
+#endif
+
+/*
+ * Status codes that may be returned by the HAL. Note that
+ * interfaces that return a status code set it only when an
+ * error occurs--i.e. you cannot check it for success.
+ */
+typedef enum {
+ HAL_OK = 0, /* No error */
+ HAL_ENXIO = 1, /* No hardware present */
+ HAL_ENOMEM = 2, /* Memory allocation failed */
+ HAL_EIO = 3, /* Hardware didn't respond as expected */
+ HAL_EEMAGIC = 4, /* EEPROM magic number invalid */
+ HAL_EEVERSION = 5, /* EEPROM version invalid */
+ HAL_EELOCKED = 6, /* EEPROM unreadable */
+ HAL_EEBADSUM = 7, /* EEPROM checksum invalid */
+ HAL_EEREAD = 8, /* EEPROM read problem */
+ HAL_EEBADMAC = 9, /* EEPROM mac address invalid */
+ HAL_EESIZE = 10, /* EEPROM size not supported */
+ HAL_EEWRITE = 11, /* Attempt to change write-locked EEPROM */
+ HAL_EINVAL = 12, /* Invalid parameter to function */
+ HAL_ENOTSUPP = 13, /* Hardware revision not supported */
+ HAL_ESELFTEST = 14, /* Hardware self-test failed */
+ HAL_EINPROGRESS = 15, /* Operation incomplete */
+} HAL_STATUS;
+
+typedef enum {
+ AH_FALSE = 0, /* NB: lots of code assumes false is zero */
+ AH_TRUE = 1,
+} HAL_BOOL;
+
+typedef enum {
+ HAL_CAP_REG_DMN = 0, /* current regulatory domain */
+ HAL_CAP_CIPHER = 1, /* hardware supports cipher */
+ HAL_CAP_TKIP_MIC = 2, /* handle TKIP MIC in hardware */
+ HAL_CAP_TKIP_SPLIT = 3, /* hardware TKIP uses split keys */
+ HAL_CAP_PHYCOUNTERS = 4, /* hardware PHY error counters */
+ HAL_CAP_DIVERSITY = 5, /* hardware supports fast diversity */
+ HAL_CAP_KEYCACHE_SIZE = 6, /* number of entries in key cache */
+ HAL_CAP_NUM_TXQUEUES = 7, /* number of hardware xmit queues */
+ HAL_CAP_VEOL = 9, /* hardware supports virtual EOL */
+ HAL_CAP_PSPOLL = 10, /* hardware has working PS-Poll support */
+ HAL_CAP_DIAG = 11, /* hardware diagnostic support */
+ HAL_CAP_COMPRESSION = 12, /* hardware supports compression */
+ HAL_CAP_BURST = 13, /* hardware supports packet bursting */
+ HAL_CAP_FASTFRAME = 14, /* hardware supoprts fast frames */
+ HAL_CAP_TXPOW = 15, /* global tx power limit */
+ HAL_CAP_TPC = 16, /* per-packet tx power control */
+} HAL_CAPABILITY_TYPE;
+
+/*
+ * "States" for setting the LED. These correspond to
+ * the possible 802.11 operational states and there may
+ * be a many-to-one mapping between these states and the
+ * actual hardware states for the LED's (i.e. the hardware
+ * may have fewer states).
+ */
+typedef enum {
+ HAL_LED_INIT = 0,
+ HAL_LED_SCAN = 1,
+ HAL_LED_AUTH = 2,
+ HAL_LED_ASSOC = 3,
+ HAL_LED_RUN = 4
+} HAL_LED_STATE;
+
+/*
+ * Transmit queue types/numbers. These are used to tag
+ * each transmit queue in the hardware and to identify a set
+ * of transmit queues for operations such as start/stop dma.
+ */
+typedef enum {
+ HAL_TX_QUEUE_INACTIVE = 0, /* queue is inactive/unused */
+ HAL_TX_QUEUE_DATA = 1, /* data xmit q's */
+ HAL_TX_QUEUE_BEACON = 2, /* beacon xmit q */
+ HAL_TX_QUEUE_CAB = 3, /* "crap after beacon" xmit q */
+ HAL_TX_QUEUE_PSPOLL = 4, /* power-save poll xmit q */
+} HAL_TX_QUEUE;
+
+#define HAL_NUM_TX_QUEUES 10 /* max possible # of queues */
+
+/*
+ * Transmit queue subtype. These map directly to
+ * WME Access Categories (except for UPSD). Refer
+ * to Table 5 of the WME spec.
+ */
+typedef enum {
+ HAL_WME_AC_BK = 0, /* background access category */
+ HAL_WME_AC_BE = 1, /* best effort access category*/
+ HAL_WME_AC_VI = 2, /* video access category */
+ HAL_WME_AC_VO = 3, /* voice access category */
+ HAL_WME_UPSD = 4, /* uplink power save */
+} HAL_TX_QUEUE_SUBTYPE;
+
+/*
+ * Transmit queue flags that control various
+ * operational parameters.
+ */
+typedef enum {
+ TXQ_FLAG_TXOKINT_ENABLE = 0x0001, /* enable TXOK interrupt */
+ TXQ_FLAG_TXERRINT_ENABLE = 0x0001, /* enable TXERR interrupt */
+ TXQ_FLAG_TXDESCINT_ENABLE = 0x0002, /* enable TXDESC interrupt */
+ TXQ_FLAG_TXEOLINT_ENABLE = 0x0004, /* enable TXEOL interrupt */
+ TXQ_FLAG_TXURNINT_ENABLE = 0x0008, /* enable TXURN interrupt */
+ TXQ_FLAG_BACKOFF_DISABLE = 0x0010, /* disable Post Backoff */
+ TXQ_FLAG_COMPRESSION_ENABLE = 0x0020, /* compression enabled */
+ TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE = 0x0040, /* enable ready time
+ expiry policy */
+ TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE = 0x0080, /* enable backoff while
+ sending fragment burst*/
+} HAL_TX_QUEUE_FLAGS;
+
+typedef struct {
+ u_int32_t tqi_ver; /* hal TXQ version */
+ HAL_TX_QUEUE_SUBTYPE tqi_subtype; /* subtype if applicable */
+ HAL_TX_QUEUE_FLAGS tqi_qflags; /* flags (see above) */
+ u_int32_t tqi_priority; /* (not used) */
+ u_int32_t tqi_aifs; /* aifs */
+ u_int32_t tqi_cwmin; /* cwMin */
+ u_int32_t tqi_cwmax; /* cwMax */
+ u_int16_t tqi_shretry; /* rts retry limit */
+ u_int16_t tqi_lgretry; /* long retry limit (not used)*/
+ u_int32_t tqi_cbrPeriod;
+ u_int32_t tqi_cbrOverflowLimit;
+ u_int32_t tqi_burstTime;
+ u_int32_t tqi_readyTime;
+} HAL_TXQ_INFO;
+
+/* token to use for aifs, cwmin, cwmax */
+#define HAL_TXQ_USEDEFAULT ((u_int32_t) -1)
+
+/*
+ * Transmit packet types. This belongs in ah_desc.h, but
+ * is here so we can give a proper type to various parameters
+ * (and not require everyone include the file).
+ *
+ * NB: These values are intentionally assigned for
+ * direct use when setting up h/w descriptors.
+ */
+typedef enum {
+ HAL_PKT_TYPE_NORMAL = 0,
+ HAL_PKT_TYPE_ATIM = 1,
+ HAL_PKT_TYPE_PSPOLL = 2,
+ HAL_PKT_TYPE_BEACON = 3,
+ HAL_PKT_TYPE_PROBE_RESP = 4,
+} HAL_PKT_TYPE;
+
+/* Rx Filter Frame Types */
+typedef enum {
+ HAL_RX_FILTER_UCAST = 0x00000001, /* Allow unicast frames */
+ HAL_RX_FILTER_MCAST = 0x00000002, /* Allow multicast frames */
+ HAL_RX_FILTER_BCAST = 0x00000004, /* Allow broadcast frames */
+ HAL_RX_FILTER_CONTROL = 0x00000008, /* Allow control frames */
+ HAL_RX_FILTER_BEACON = 0x00000010, /* Allow beacon frames */
+ HAL_RX_FILTER_PROM = 0x00000020, /* Promiscuous mode */
+ HAL_RX_FILTER_PROBEREQ = 0x00000080, /* Allow probe request frames */
+ HAL_RX_FILTER_PHYERR = 0x00000100, /* Allow phy errors */
+ HAL_RX_FILTER_PHYRADAR = 0x00000200, /* Allow phy radar errors*/
+} HAL_RX_FILTER;
+
+typedef enum {
+ HAL_PM_UNDEFINED = 0,
+ HAL_PM_AUTO = 1,
+ HAL_PM_AWAKE = 2,
+ HAL_PM_FULL_SLEEP = 3,
+ HAL_PM_NETWORK_SLEEP = 4
+} HAL_POWER_MODE;
+
+/*
+ * NOTE WELL:
+ * These are mapped to take advantage of the common locations for many of
+ * the bits on all of the currently supported MAC chips. This is to make
+ * the ISR as efficient as possible, while still abstracting HW differences.
+ * When new hardware breaks this commonality this enumerated type, as well
+ * as the HAL functions using it, must be modified. All values are directly
+ * mapped unless commented otherwise.
+ */
+typedef enum {
+ HAL_INT_RX = 0x00000001, /* Non-common mapping */
+ HAL_INT_RXDESC = 0x00000002,
+ HAL_INT_RXNOFRM = 0x00000008,
+ HAL_INT_RXEOL = 0x00000010,
+ HAL_INT_RXORN = 0x00000020,
+ HAL_INT_TX = 0x00000040, /* Non-common mapping */
+ HAL_INT_TXDESC = 0x00000080,
+ HAL_INT_TXURN = 0x00000800,
+ HAL_INT_MIB = 0x00001000,
+ HAL_INT_RXPHY = 0x00004000,
+ HAL_INT_RXKCM = 0x00008000,
+ HAL_INT_SWBA = 0x00010000,
+ HAL_INT_BMISS = 0x00040000,
+ HAL_INT_BNR = 0x00100000, /* Non-common mapping */
+ HAL_INT_GPIO = 0x01000000,
+ HAL_INT_FATAL = 0x40000000, /* Non-common mapping */
+ HAL_INT_GLOBAL = 0x80000000, /* Set/clear IER */
+
+ /* Interrupt bits that map directly to ISR/IMR bits */
+ HAL_INT_COMMON = HAL_INT_RXNOFRM
+ | HAL_INT_RXDESC
+ | HAL_INT_RXEOL
+ | HAL_INT_RXORN
+ | HAL_INT_TXURN
+ | HAL_INT_TXDESC
+ | HAL_INT_MIB
+ | HAL_INT_RXPHY
+ | HAL_INT_RXKCM
+ | HAL_INT_SWBA
+ | HAL_INT_BMISS
+ | HAL_INT_GPIO,
+ HAL_INT_NOCARD = 0xffffffff /* To signal the card was removed */
+} HAL_INT;
+
+typedef enum {
+ HAL_RFGAIN_INACTIVE = 0,
+ HAL_RFGAIN_READ_REQUESTED = 1,
+ HAL_RFGAIN_NEED_CHANGE = 2
+} HAL_RFGAIN;
+
+/*
+ * Channels are specified by frequency.
+ */
+typedef struct {
+ u_int16_t channel; /* setting in Mhz */
+ u_int16_t channelFlags; /* see below */
+} HAL_CHANNEL;
+
+#define CHANNEL_RAD_INT 0x0001 /* Radar interference detected on channel */
+#define CHANNEL_CW_INT 0x0002 /* CW interference detected on channel */
+#define CHANNEL_BUSY 0x0004 /* Busy, occupied or overlap with adjoin chan */
+#define CHANNEL_TURBO 0x0010 /* Turbo Channel */
+#define CHANNEL_CCK 0x0020 /* CCK channel */
+#define CHANNEL_OFDM 0x0040 /* OFDM channel */
+#define CHANNEL_2GHZ 0x0080 /* 2 GHz spectrum channel. */
+#define CHANNEL_5GHZ 0x0100 /* 5 GHz spectrum channel */
+#define CHANNEL_PASSIVE 0x0200 /* Only passive scan allowed in the channel */
+#define CHANNEL_DYN 0x0400 /* dynamic CCK-OFDM channel */
+#define CHANNEL_XR 0x0800 /* XR channel */
+#define CHANNEL_AR 0x8000 /* Software use: radar detected */
+
+
+#define CHANNEL_A (CHANNEL_5GHZ|CHANNEL_OFDM)
+#define CHANNEL_B (CHANNEL_2GHZ|CHANNEL_CCK)
+#define CHANNEL_PUREG (CHANNEL_2GHZ|CHANNEL_OFDM)
+#ifdef notdef
+#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_DYN)
+#else
+#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_OFDM)
+#endif
+#define CHANNEL_T (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define CHANNEL_108G (CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define CHANNEL_X (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_XR)
+#define CHANNEL_ALL \
+ (CHANNEL_OFDM|CHANNEL_CCK|CHANNEL_5GHZ|CHANNEL_2GHZ|CHANNEL_TURBO)
+#define CHANNEL_ALL_NOTURBO (CHANNEL_ALL &~ CHANNEL_TURBO)
+
+typedef struct {
+ u_int32_t ackrcv_bad;
+ u_int32_t rts_bad;
+ u_int32_t rts_good;
+ u_int32_t fcs_bad;
+ u_int32_t beacons;
+} HAL_MIB_STATS;
+
+typedef u_int16_t HAL_CTRY_CODE; /* country code */
+typedef u_int16_t HAL_REG_DOMAIN; /* regulatory domain code */
+
+enum {
+ CTRY_DEBUG = 0x1ff, /* debug country code */
+ CTRY_DEFAULT = 0 /* default country code */
+};
+
+enum {
+ HAL_MODE_11A = 0x001,
+ HAL_MODE_TURBO = 0x002,
+ HAL_MODE_11B = 0x004,
+ HAL_MODE_PUREG = 0x008,
+#ifdef notdef
+ HAL_MODE_11G = 0x010,
+#else
+ HAL_MODE_11G = 0x008,
+#endif
+ HAL_MODE_108G = 0x020,
+ HAL_MODE_ALL = 0xfff
+};
+
+typedef struct {
+ int rateCount; /* NB: for proper padding */
+ u_int8_t rateCodeToIndex[32]; /* back mapping */
+ struct {
+ u_int8_t valid; /* valid for rate control use */
+ u_int8_t phy; /* CCK/OFDM/XR */
+ u_int16_t rateKbps; /* transfer rate in kbs */
+ u_int8_t rateCode; /* rate for h/w descriptors */
+ u_int8_t shortPreamble; /* mask for enabling short
+ * preamble in CCK rate code */
+ u_int8_t dot11Rate; /* value for supported rates
+ * info element of MLME */
+ u_int8_t controlRate; /* index of next lower basic
+ * rate; used for dur. calcs */
+ u_int16_t lpAckDuration; /* long preamble ACK duration */
+ u_int16_t spAckDuration; /* short preamble ACK duration*/
+ } info[32];
+} HAL_RATE_TABLE;
+
+typedef struct {
+ u_int rs_count; /* number of valid entries */
+ u_int8_t rs_rates[32]; /* rates */
+} HAL_RATE_SET;
+
+typedef enum {
+ HAL_ANT_VARIABLE = 0, /* variable by programming */
+ HAL_ANT_FIXED_A = 1, /* fixed to 11a frequencies */
+ HAL_ANT_FIXED_B = 2, /* fixed to 11b frequencies */
+} HAL_ANT_SETTING;
+
+typedef enum {
+ HAL_M_STA = 1, /* infrastructure station */
+ HAL_M_IBSS = 0, /* IBSS (adhoc) station */
+ HAL_M_HOSTAP = 6, /* Software Access Point */
+ HAL_M_MONITOR = 8 /* Monitor mode */
+} HAL_OPMODE;
+
+typedef struct {
+ u_int8_t kv_type; /* one of HAL_CIPHER */
+ u_int8_t kv_pad;
+ u_int16_t kv_len; /* length in bits */
+ u_int8_t kv_val[16]; /* enough for 128-bit keys */
+ u_int8_t kv_mic[8]; /* TKIP MIC key */
+} HAL_KEYVAL;
+
+typedef enum {
+ HAL_CIPHER_WEP = 0,
+ HAL_CIPHER_AES_OCB = 1,
+ HAL_CIPHER_AES_CCM = 2,
+ HAL_CIPHER_CKIP = 3,
+ HAL_CIPHER_TKIP = 4,
+ HAL_CIPHER_CLR = 5, /* no encryption */
+
+ HAL_CIPHER_MIC = 127 /* TKIP-MIC, not a cipher */
+} HAL_CIPHER;
+
+enum {
+ HAL_SLOT_TIME_9 = 9,
+ HAL_SLOT_TIME_20 = 20,
+};
+
+/*
+ * Per-station beacon timer state. Note that the specified
+ * beacon interval (given in TU's) can also include flags
+ * to force a TSF reset and to enable the beacon xmit logic.
+ * If bs_cfpmaxduration is non-zero the hardware is setup to
+ * coexist with a PCF-capable AP.
+ */
+typedef struct {
+ u_int32_t bs_nexttbtt; /* next beacon in TU */
+ u_int32_t bs_nextdtim; /* next DTIM in TU */
+ u_int32_t bs_intval; /* beacon interval+flags */
+#define HAL_BEACON_PERIOD 0x0000ffff /* beacon interval period */
+#define HAL_BEACON_ENA 0x00800000 /* beacon xmit enable */
+#define HAL_BEACON_RESET_TSF 0x01000000 /* clear TSF */
+ u_int32_t bs_dtimperiod;
+ u_int16_t bs_cfpperiod; /* CFP period in TU */
+ u_int16_t bs_cfpmaxduration; /* max CFP duration in TU */
+ u_int32_t bs_cfpnext; /* next CFP in TU */
+ u_int16_t bs_timoffset; /* byte offset to TIM bitmap */
+ u_int16_t bs_bmissthreshold; /* beacon miss threshold */
+ u_int32_t bs_sleepduration; /* max sleep duration */
+} HAL_BEACON_STATE;
+
+/*
+ * Per-node statistics maintained by the driver for use in
+ * optimizing signal quality and other operational aspects.
+ */
+typedef struct {
+ u_int32_t ns_avgbrssi; /* average beacon rssi */
+ u_int32_t ns_avgrssi; /* average data rssi */
+ u_int32_t ns_avgtxrssi; /* average tx rssi */
+} HAL_NODE_STATS;
+
+#define HAL_RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */
+
+struct ath_desc;
+
+/*
+ * Hardware Access Layer (HAL) API.
+ *
+ * Clients of the HAL call ath_hal_attach to obtain a reference to an
+ * ath_hal structure for use with the device. Hardware-related operations
+ * that follow must call back into the HAL through interface, supplying
+ * the reference as the first parameter. Note that before using the
+ * reference returned by ath_hal_attach the caller should verify the
+ * ABI version number.
+ */
+struct ath_hal {
+ u_int32_t ah_magic; /* consistency check magic number */
+ u_int32_t ah_abi; /* HAL ABI version */
+#define HAL_ABI_VERSION 0x04112900 /* YYMMDDnn */
+ u_int16_t ah_devid; /* PCI device ID */
+ u_int16_t ah_subvendorid; /* PCI subvendor ID */
+ HAL_SOFTC ah_sc; /* back pointer to driver/os state */
+ HAL_BUS_TAG ah_st; /* params for register r+w */
+ HAL_BUS_HANDLE ah_sh;
+ HAL_CTRY_CODE ah_countryCode;
+
+ u_int32_t ah_macVersion; /* MAC version id */
+ u_int16_t ah_macRev; /* MAC revision */
+ u_int16_t ah_phyRev; /* PHY revision */
+ /* NB: when only one radio is present the rev is in 5Ghz */
+ u_int16_t ah_analog5GhzRev;/* 5GHz radio revision */
+ u_int16_t ah_analog2GhzRev;/* 2GHz radio revision */
+
+ const HAL_RATE_TABLE *__ahdecl(*ah_getRateTable)(struct ath_hal *,
+ u_int mode);
+ void __ahdecl(*ah_detach)(struct ath_hal*);
+
+ /* Reset functions */
+ HAL_BOOL __ahdecl(*ah_reset)(struct ath_hal *, HAL_OPMODE,
+ HAL_CHANNEL *, HAL_BOOL bChannelChange,
+ HAL_STATUS *status);
+ HAL_BOOL __ahdecl(*ah_phyDisable)(struct ath_hal *);
+ void __ahdecl(*ah_setPCUConfig)(struct ath_hal *);
+ HAL_BOOL __ahdecl(*ah_perCalibration)(struct ath_hal*, HAL_CHANNEL *);
+ HAL_BOOL __ahdecl(*ah_setTxPowerLimit)(struct ath_hal *, u_int32_t);
+
+ /* Transmit functions */
+ HAL_BOOL __ahdecl(*ah_updateTxTrigLevel)(struct ath_hal*,
+ HAL_BOOL incTrigLevel);
+ int __ahdecl(*ah_setupTxQueue)(struct ath_hal *, HAL_TX_QUEUE,
+ const HAL_TXQ_INFO *qInfo);
+ HAL_BOOL __ahdecl(*ah_setTxQueueProps)(struct ath_hal *, int q,
+ const HAL_TXQ_INFO *qInfo);
+ HAL_BOOL __ahdecl(*ah_getTxQueueProps)(struct ath_hal *, int q,
+ HAL_TXQ_INFO *qInfo);
+ HAL_BOOL __ahdecl(*ah_releaseTxQueue)(struct ath_hal *ah, u_int q);
+ HAL_BOOL __ahdecl(*ah_resetTxQueue)(struct ath_hal *ah, u_int q);
+ u_int32_t __ahdecl(*ah_getTxDP)(struct ath_hal*, u_int);
+ HAL_BOOL __ahdecl(*ah_setTxDP)(struct ath_hal*, u_int, u_int32_t txdp);
+ u_int32_t __ahdecl(*ah_numTxPending)(struct ath_hal *, u_int q);
+ HAL_BOOL __ahdecl(*ah_startTxDma)(struct ath_hal*, u_int);
+ HAL_BOOL __ahdecl(*ah_stopTxDma)(struct ath_hal*, u_int);
+ HAL_BOOL __ahdecl(*ah_updateCTSForBursting)(struct ath_hal *,
+ struct ath_desc *, struct ath_desc *,
+ struct ath_desc *, struct ath_desc *,
+ u_int32_t, u_int32_t);
+ HAL_BOOL __ahdecl(*ah_setupTxDesc)(struct ath_hal *, struct ath_desc *,
+ u_int pktLen, u_int hdrLen,
+ HAL_PKT_TYPE type, u_int txPower,
+ u_int txRate0, u_int txTries0,
+ u_int keyIx, u_int antMode, u_int flags,
+ u_int rtsctsRate, u_int rtsctsDuration);
+ HAL_BOOL __ahdecl(*ah_setupXTxDesc)(struct ath_hal *, struct ath_desc*,
+ u_int txRate1, u_int txTries1,
+ u_int txRate2, u_int txTries2,
+ u_int txRate3, u_int txTries3);
+ HAL_BOOL __ahdecl(*ah_fillTxDesc)(struct ath_hal *, struct ath_desc *,
+ u_int segLen, HAL_BOOL firstSeg,
+ HAL_BOOL lastSeg, const struct ath_desc *);
+ HAL_STATUS __ahdecl(*ah_procTxDesc)(struct ath_hal *, struct ath_desc*);
+ void __ahdecl(*ah_getTxIntrQueue)(struct ath_hal *, u_int32_t *);
+
+ /* Receive Functions */
+ u_int32_t __ahdecl(*ah_getRxDP)(struct ath_hal*);
+ void __ahdecl(*ah_setRxDP)(struct ath_hal*, u_int32_t rxdp);
+ void __ahdecl(*ah_enableReceive)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_stopDmaReceive)(struct ath_hal*);
+ void __ahdecl(*ah_startPcuReceive)(struct ath_hal*);
+ void __ahdecl(*ah_stopPcuReceive)(struct ath_hal*);
+ void __ahdecl(*ah_setMulticastFilter)(struct ath_hal*,
+ u_int32_t filter0, u_int32_t filter1);
+ HAL_BOOL __ahdecl(*ah_setMulticastFilterIndex)(struct ath_hal*,
+ u_int32_t ndx);
+ HAL_BOOL __ahdecl(*ah_clrMulticastFilterIndex)(struct ath_hal*,
+ u_int32_t ndx);
+ u_int32_t __ahdecl(*ah_getRxFilter)(struct ath_hal*);
+ void __ahdecl(*ah_setRxFilter)(struct ath_hal*, u_int32_t);
+ HAL_BOOL __ahdecl(*ah_setupRxDesc)(struct ath_hal *, struct ath_desc *,
+ u_int32_t size, u_int flags);
+ HAL_STATUS __ahdecl(*ah_procRxDesc)(struct ath_hal *, struct ath_desc *,
+ u_int32_t phyAddr, struct ath_desc *next);
+ void __ahdecl(*ah_rxMonitor)(struct ath_hal *,
+ const HAL_NODE_STATS *);
+ void __ahdecl(*ah_procMibEvent)(struct ath_hal *,
+ const HAL_NODE_STATS *);
+
+ /* Misc Functions */
+ HAL_STATUS __ahdecl(*ah_getCapability)(struct ath_hal *,
+ HAL_CAPABILITY_TYPE, u_int32_t capability,
+ u_int32_t *result);
+ HAL_BOOL __ahdecl(*ah_setCapability)(struct ath_hal *,
+ HAL_CAPABILITY_TYPE, u_int32_t capability,
+ u_int32_t setting, HAL_STATUS *);
+ HAL_BOOL __ahdecl(*ah_getDiagState)(struct ath_hal *, int request,
+ const void *args, u_int32_t argsize,
+ void **result, u_int32_t *resultsize);
+ void __ahdecl(*ah_getMacAddress)(struct ath_hal *, u_int8_t *);
+ HAL_BOOL __ahdecl(*ah_setMacAddress)(struct ath_hal *, const u_int8_t*);
+ HAL_BOOL __ahdecl(*ah_setRegulatoryDomain)(struct ath_hal*,
+ u_int16_t, HAL_STATUS *);
+ void __ahdecl(*ah_setLedState)(struct ath_hal*, HAL_LED_STATE);
+ void __ahdecl(*ah_writeAssocid)(struct ath_hal*,
+ const u_int8_t *bssid, u_int16_t assocId);
+ HAL_BOOL __ahdecl(*ah_gpioCfgOutput)(struct ath_hal *, u_int32_t gpio);
+ HAL_BOOL __ahdecl(*ah_gpioCfgInput)(struct ath_hal *, u_int32_t gpio);
+ u_int32_t __ahdecl(*ah_gpioGet)(struct ath_hal *, u_int32_t gpio);
+ HAL_BOOL __ahdecl(*ah_gpioSet)(struct ath_hal *,
+ u_int32_t gpio, u_int32_t val);
+ void __ahdecl(*ah_gpioSetIntr)(struct ath_hal*, u_int, u_int32_t);
+ u_int32_t __ahdecl(*ah_getTsf32)(struct ath_hal*);
+ u_int64_t __ahdecl(*ah_getTsf64)(struct ath_hal*);
+ void __ahdecl(*ah_resetTsf)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_detectCardPresent)(struct ath_hal*);
+ void __ahdecl(*ah_updateMibCounters)(struct ath_hal*,
+ HAL_MIB_STATS*);
+ HAL_RFGAIN __ahdecl(*ah_getRfGain)(struct ath_hal*);
+ u_int __ahdecl(*ah_getDefAntenna)(struct ath_hal*);
+ void __ahdecl(*ah_setDefAntenna)(struct ath_hal*, u_int);
+ HAL_BOOL __ahdecl(*ah_setSlotTime)(struct ath_hal*, u_int);
+ u_int __ahdecl(*ah_getSlotTime)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_setAckTimeout)(struct ath_hal*, u_int);
+ u_int __ahdecl(*ah_getAckTimeout)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_setCTSTimeout)(struct ath_hal*, u_int);
+ u_int __ahdecl(*ah_getCTSTimeout)(struct ath_hal*);
+
+ /* Key Cache Functions */
+ u_int32_t __ahdecl(*ah_getKeyCacheSize)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_resetKeyCacheEntry)(struct ath_hal*, u_int16_t);
+ HAL_BOOL __ahdecl(*ah_isKeyCacheEntryValid)(struct ath_hal *,
+ u_int16_t);
+ HAL_BOOL __ahdecl(*ah_setKeyCacheEntry)(struct ath_hal*,
+ u_int16_t, const HAL_KEYVAL *,
+ const u_int8_t *, int);
+ HAL_BOOL __ahdecl(*ah_setKeyCacheEntryMac)(struct ath_hal*,
+ u_int16_t, const u_int8_t *);
+
+ /* Power Management Functions */
+ HAL_BOOL __ahdecl(*ah_setPowerMode)(struct ath_hal*,
+ HAL_POWER_MODE mode, int setChip,
+ u_int16_t sleepDuration);
+ HAL_POWER_MODE __ahdecl(*ah_getPowerMode)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_initPSPoll)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_enablePSPoll)(struct ath_hal *,
+ u_int8_t *, u_int16_t);
+ HAL_BOOL __ahdecl(*ah_disablePSPoll)(struct ath_hal *);
+
+ /* Beacon Management Functions */
+ void __ahdecl(*ah_beaconInit)(struct ath_hal *,
+ u_int32_t nexttbtt, u_int32_t intval);
+ void __ahdecl(*ah_setStationBeaconTimers)(struct ath_hal*,
+ const HAL_BEACON_STATE *);
+ void __ahdecl(*ah_resetStationBeaconTimers)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_waitForBeaconDone)(struct ath_hal *,
+ HAL_BUS_ADDR);
+
+ /* Interrupt functions */
+ HAL_BOOL __ahdecl(*ah_isInterruptPending)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_getPendingInterrupts)(struct ath_hal*, HAL_INT*);
+ HAL_INT __ahdecl(*ah_getInterrupts)(struct ath_hal*);
+ HAL_INT __ahdecl(*ah_setInterrupts)(struct ath_hal*, HAL_INT);
+};
+
+/*
+ * Check the PCI vendor ID and device ID against Atheros' values
+ * and return a printable description for any Atheros hardware.
+ * AH_NULL is returned if the ID's do not describe Atheros hardware.
+ */
+extern const char *__ahdecl ath_hal_probe(u_int16_t vendorid, u_int16_t devid);
+
+/*
+ * Attach the HAL for use with the specified device. The device is
+ * defined by the PCI device ID. The caller provides an opaque pointer
+ * to an upper-layer data structure (HAL_SOFTC) that is stored in the
+ * HAL state block for later use. Hardware register accesses are done
+ * using the specified bus tag and handle. On successful return a
+ * reference to a state block is returned that must be supplied in all
+ * subsequent HAL calls. Storage associated with this reference is
+ * dynamically allocated and must be freed by calling the ah_detach
+ * method when the client is done. If the attach operation fails a
+ * null (AH_NULL) reference will be returned and a status code will
+ * be returned if the status parameter is non-zero.
+ */
+extern struct ath_hal * __ahdecl ath_hal_attach(u_int16_t devid, HAL_SOFTC,
+ HAL_BUS_TAG, HAL_BUS_HANDLE, HAL_STATUS* status);
+
+/*
+ * Return a list of channels available for use with the hardware.
+ * The list is based on what the hardware is capable of, the specified
+ * country code, the modeSelect mask, and whether or not outdoor
+ * channels are to be permitted.
+ *
+ * The channel list is returned in the supplied array. maxchans
+ * defines the maximum size of this array. nchans contains the actual
+ * number of channels returned. If a problem occurred or there were
+ * no channels that met the criteria then AH_FALSE is returned.
+ */
+extern HAL_BOOL __ahdecl ath_hal_init_channels(struct ath_hal *,
+ HAL_CHANNEL *chans, u_int maxchans, u_int *nchans,
+ HAL_CTRY_CODE cc, u_int16_t modeSelect,
+ HAL_BOOL enableOutdoor, HAL_BOOL enableExtendedChannels);
+
+/*
+ * Return bit mask of wireless modes supported by the hardware.
+ */
+extern u_int __ahdecl ath_hal_getwirelessmodes(struct ath_hal*, HAL_CTRY_CODE);
+
+/*
+ * Return rate table for specified mode (11a, 11b, 11g, etc).
+ */
+extern const HAL_RATE_TABLE * __ahdecl ath_hal_getratetable(struct ath_hal *,
+ u_int mode);
+
+/*
+ * Calculate the transmit duration of a frame.
+ */
+extern u_int16_t __ahdecl ath_hal_computetxtime(struct ath_hal *,
+ const HAL_RATE_TABLE *rates, u_int32_t frameLen,
+ u_int16_t rateix, HAL_BOOL shortPreamble);
+
+/*
+ * Convert between IEEE channel number and channel frequency
+ * using the specified channel flags; e.g. CHANNEL_2GHZ.
+ */
+extern u_int __ahdecl ath_hal_mhz2ieee(u_int mhz, u_int flags);
+extern u_int __ahdecl ath_hal_ieee2mhz(u_int ieee, u_int flags);
+
+/*
+ * Return a version string for the HAL release.
+ */
+extern char ath_hal_version[];
+/*
+ * Return a NULL-terminated array of build/configuration options.
+ */
+extern const char* ath_hal_buildopts[];
+#endif /* _ATH_AH_H_ */
diff -N -u -r src.preview/sys/contrib/dev/ath/ah_desc.h src/sys/contrib/dev/ath/ah_desc.h
--- src.preview/sys/contrib/dev/ath/ah_desc.h 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/ah_desc.h 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,180 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_desc.h,v 1.1.1.2 2004/12/08 18:04:16 sam Exp $
+ */
+
+#ifndef _DEV_ATH_DESC_H
+#define _DEV_ATH_DESC_H
+
+/*
+ * Transmit descriptor status. This structure is filled
+ * in only after the tx descriptor process method finds a
+ * ``done'' descriptor; at which point it returns something
+ * other than HAL_EINPROGRESS.
+ *
+ * Note that ts_antenna may not be valid for all h/w. It
+ * should be used only if non-zero.
+ */
+struct ath_tx_status {
+ u_int16_t ts_seqnum; /* h/w assigned sequence number */
+ u_int16_t ts_tstamp; /* h/w assigned timestamp */
+ u_int8_t ts_status; /* frame status, 0 => xmit ok */
+ u_int8_t ts_rate; /* h/w transmit rate index */
+#define HAL_TXSTAT_ALTRATE 0x80 /* alternate xmit rate used */
+ int8_t ts_rssi; /* tx ack RSSI */
+ u_int8_t ts_shortretry; /* # short retries */
+ u_int8_t ts_longretry; /* # long retries */
+ u_int8_t ts_virtcol; /* virtual collision count */
+ u_int8_t ts_antenna; /* antenna information */
+};
+
+#define HAL_TXERR_XRETRY 0x01 /* excessive retries */
+#define HAL_TXERR_FILT 0x02 /* blocked by tx filtering */
+#define HAL_TXERR_FIFO 0x04 /* fifo underrun */
+
+/*
+ * Receive descriptor status. This structure is filled
+ * in only after the rx descriptor process method finds a
+ * ``done'' descriptor; at which point it returns something
+ * other than HAL_EINPROGRESS.
+ *
+ * If rx_status is zero, then the frame was received ok;
+ * otherwise the error information is indicated and rs_phyerr
+ * contains a phy error code if HAL_RXERR_PHY is set. In general
+ * the frame contents is undefined when an error occurred thought
+ * for some errors (e.g. a decryption error), it may be meaningful.
+ *
+ * Note that the receive timestamp is expanded using the TSF to
+ * a full 16 bits (regardless of what the h/w provides directly).
+ *
+ * rx_rssi is in units of dbm above the noise floor. This value
+ * is measured during the preamble and PLCP; i.e. with the initial
+ * 4us of detection. The noise floor is typically a consistent
+ * -96dBm absolute power in a 20MHz channel.
+ */
+struct ath_rx_status {
+ u_int16_t rs_datalen; /* rx frame length */
+ u_int16_t rs_tstamp; /* h/w assigned timestamp */
+ u_int8_t rs_status; /* rx status, 0 => recv ok */
+ u_int8_t rs_phyerr; /* phy error code */
+ int8_t rs_rssi; /* rx frame RSSI */
+ u_int8_t rs_keyix; /* key cache index */
+ u_int8_t rs_rate; /* h/w receive rate index */
+ u_int8_t rs_antenna; /* antenna information */
+ u_int8_t rs_more; /* more descriptors follow */
+};
+
+#define HAL_RXERR_CRC 0x01 /* CRC error on frame */
+#define HAL_RXERR_PHY 0x02 /* PHY error, rs_phyerr is valid */
+#define HAL_RXERR_FIFO 0x04 /* fifo overrun */
+#define HAL_RXERR_DECRYPT 0x08 /* non-Michael decrypt error */
+#define HAL_RXERR_MIC 0x10 /* Michael MIC decrypt error */
+
+enum {
+ HAL_PHYERR_UNDERRUN = 0, /* Transmit underrun */
+ HAL_PHYERR_TIMING = 1, /* Timing error */
+ HAL_PHYERR_PARITY = 2, /* Illegal parity */
+ HAL_PHYERR_RATE = 3, /* Illegal rate */
+ HAL_PHYERR_LENGTH = 4, /* Illegal length */
+ HAL_PHYERR_RADAR = 5, /* Radar detect */
+ HAL_PHYERR_SERVICE = 6, /* Illegal service */
+ HAL_PHYERR_TOR = 7, /* Transmit override receive */
+ /* NB: these are specific to the 5212 */
+ HAL_PHYERR_OFDM_TIMING = 17, /* */
+ HAL_PHYERR_OFDM_SIGNAL_PARITY = 18, /* */
+ HAL_PHYERR_OFDM_RATE_ILLEGAL = 19, /* */
+ HAL_PHYERR_OFDM_LENGTH_ILLEGAL = 20, /* */
+ HAL_PHYERR_OFDM_POWER_DROP = 21, /* */
+ HAL_PHYERR_OFDM_SERVICE = 22, /* */
+ HAL_PHYERR_OFDM_RESTART = 23, /* */
+ HAL_PHYERR_CCK_TIMING = 25, /* */
+ HAL_PHYERR_CCK_HEADER_CRC = 26, /* */
+ HAL_PHYERR_CCK_RATE_ILLEGAL = 27, /* */
+ HAL_PHYERR_CCK_SERVICE = 30, /* */
+ HAL_PHYERR_CCK_RESTART = 31, /* */
+};
+
+/* value found in rs_keyix to mark invalid entries */
+#define HAL_RXKEYIX_INVALID ((u_int8_t) -1)
+/* value used to specify no encryption key for xmit */
+#define HAL_TXKEYIX_INVALID ((u_int) -1)
+
+/* XXX rs_antenna definitions */
+
+/*
+ * Definitions for the software frame/packet descriptors used by
+ * the Atheros HAL. This definition obscures hardware-specific
+ * details from the driver. Drivers are expected to fillin the
+ * portions of a descriptor that are not opaque then use HAL calls
+ * to complete the work. Status for completed frames is returned
+ * in a device-independent format.
+ */
+struct ath_desc {
+ /*
+ * The following definitions are passed directly
+ * the hardware and managed by the HAL. Drivers
+ * should not touch those elements marked opaque.
+ */
+ u_int32_t ds_link; /* phys address of next descriptor */
+ u_int32_t ds_data; /* phys address of data buffer */
+ u_int32_t ds_ctl0; /* opaque DMA control 0 */
+ u_int32_t ds_ctl1; /* opaque DMA control 1 */
+ u_int32_t ds_hw[4]; /* opaque h/w region */
+ /*
+ * The remaining definitions are managed by software;
+ * these are valid only after the rx/tx process descriptor
+ * methods return a non-EINPROGRESS code.
+ */
+ union {
+ struct ath_tx_status tx;/* xmit status */
+ struct ath_rx_status rx;/* recv status */
+ } ds_us;
+} __packed;
+
+#define ds_txstat ds_us.tx
+#define ds_rxstat ds_us.rx
+
+/* flags passed to tx descriptor setup methods */
+#define HAL_TXDESC_CLRDMASK 0x0001 /* clear destination filter mask */
+#define HAL_TXDESC_NOACK 0x0002 /* don't wait for ACK */
+#define HAL_TXDESC_RTSENA 0x0004 /* enable RTS */
+#define HAL_TXDESC_CTSENA 0x0008 /* enable CTS */
+#define HAL_TXDESC_INTREQ 0x0010 /* enable per-descriptor interrupt */
+#define HAL_TXDESC_VEOL 0x0020 /* mark virtual EOL */
+
+/* flags passed to rx descriptor setup methods */
+#define HAL_RXDESC_INTREQ 0x0020 /* enable per-descriptor interrupt */
+#endif /* _DEV_ATH_AR521XDMA_H */
diff -N -u -r src.preview/sys/contrib/dev/ath/ah_devid.h src/sys/contrib/dev/ath/ah_devid.h
--- src.preview/sys/contrib/dev/ath/ah_devid.h 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/ah_devid.h 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,87 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_devid.h,v 1.1.1.3 2004/12/08 18:04:16 sam Exp $
+ */
+
+#ifndef _DEV_ATH_DEVID_H_
+#define _DEV_ATH_DEVID_H_
+
+#define ATHEROS_VENDOR_ID 0x168c /* Atheros PCI vendor ID */
+/*
+ * NB: all Atheros-based devices should have a PCI vendor ID
+ * of 0x168c, but some vendors, in their infinite wisdom
+ * do not follow this so we must handle them specially.
+ */
+#define ATHEROS_3COM_VENDOR_ID 0xa727 /* 3Com 3CRPAG175 vendor ID */
+#define ATHEROS_3COM2_VENDOR_ID 0x10b7 /* 3Com 3CRDAG675 vendor ID */
+
+/* AR5210 (for reference) */
+#define AR5210_DEFAULT 0x1107 /* No eeprom HW default */
+#define AR5210_PROD 0x0007 /* Final device ID */
+#define AR5210_AP 0x0207 /* Early AP11s */
+
+/* AR5211 */
+#define AR5211_DEFAULT 0x1112 /* No eeprom HW default */
+#define AR5311_DEVID 0x0011 /* Final ar5311 devid */
+#define AR5211_DEVID 0x0012 /* Final ar5211 devid */
+#define AR5211_LEGACY 0xff12 /* Original emulation board */
+#define AR5211_FPGA11B 0xf11b /* 11b emulation board */
+
+/* AR5212 */
+#define AR5212_DEFAULT 0x1113 /* No eeprom HW default */
+#define AR5212_DEVID 0x0013 /* Final ar5212 devid */
+#define AR5212_FPGA 0xf013 /* Emulation board */
+#define AR5212_DEVID_IBM 0x1014 /* IBM minipci ID */
+#define AR5212_AR5312_REV2 0x0052 /* AR5312 WMAC (AP31) */
+#define AR5212_AR5312_REV7 0x0057 /* AR5312 WMAC (AP30-040) */
+#define AR5212_AR2313_REV8 0x0058 /* AR2313 WMAC (AP43-030) */
+
+/* AR5212 compatible devid's also attach to 5212 */
+#define AR5212_DEVID_0014 0x0014
+#define AR5212_DEVID_0015 0x0015
+#define AR5212_DEVID_0016 0x0016
+#define AR5212_DEVID_0017 0x0017
+#define AR5212_DEVID_0018 0x0018
+#define AR5212_DEVID_0019 0x0019
+#define AR5212_AR2413 0x001a /* AR2413 aka Griffin-lite */
+
+/* AR5213 */
+#define AR5213_SREV_1_0 0x0055
+#define AR5213_SREV_REG 0x4020
+
+#define AR_SUBVENDOR_ID_NOG 0x0e11 /* No 11G subvendor ID */
+#define AR_SUBVENDOR_ID_NEW_A 0x7065 /* Update device to new RD */
+#endif /* _DEV_ATH_DEVID_H */
diff -N -u -r src.preview/sys/contrib/dev/ath/freebsd/ah_if.m src/sys/contrib/dev/ath/freebsd/ah_if.m
--- src.preview/sys/contrib/dev/ath/freebsd/ah_if.m 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/freebsd/ah_if.m 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,90 @@
+#
+# Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+# Communications, Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms are permitted
+# provided that the following conditions are met:
+# 1. The materials contained herein are unmodified and are used
+# unmodified.
+# 2. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following NO
+# ''WARRANTY'' disclaimer below (''Disclaimer''), without
+# modification.
+# 3. Redistributions in binary form must reproduce at minimum a
+# disclaimer similar to the Disclaimer below and any redistribution
+# must be conditioned upon including a substantially similar
+# Disclaimer requirement for further binary redistribution.
+# 4. Neither the names of the above-listed copyright holders nor the
+# names of any contributors may be used to endorse or promote
+# product derived from this software without specific prior written
+# permission.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+# FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGES.
+#
+# $Id: ah_if.m,v 1.1.1.2 2004/12/08 18:04:16 sam Exp $
+#
+
+
+METHOD const char* ath_hal_probe {
+ u_int16_t vendorID;
+ u_int16_ deviceID;
+};
+
+METHOD struct ath_hal* ath_hal_attach {
+ u_int16_t deviceID;
+ HAL_SOFTC sc;
+ HAL_BUS_TAG st;
+ HAL_BUS_HANDLE sh;
+ HAL_STATUS* error;
+};
+
+METHOD u_int ath_hal_init_channels {
+ struct ath_hal* ah;
+ HAL_CHANNEL* chans;
+ u_int maxchans;
+ u_int* nchans;
+ HAL_CTRY_CODE cc;
+ u_int16_t modeSelect;
+ int enableOutdoor;
+};
+
+METHOD u_int ath_hal_getwirelessmodes {
+ struct ath_hal* ah;
+ HAL_CTRY_CODE cc;
+};
+
+METHOD const HAL_RATE_TABLE* ath_hal_getratetable {
+ struct ath_hal* ah;
+ u_int mode;
+};
+
+METHOD u_int16_t ath_hal_computetxtime {
+ struct ath_hal* ah;
+ const HAL_RATE_TABLE* rates;
+ u_int32_t frameLength;
+ u_int16_t rateIndex;
+ HAL_BOOL shortPreamble;
+};
+
+METHOD u_int ath_hal_mhz2ieee {
+ u_int mhz;
+ u_int flags;
+};
+
+METHOD u_int ath_hal_ieee2mhz {
+ u_int ieee;
+ u_int flags;
+};
diff -N -u -r src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.c src/sys/contrib/dev/ath/freebsd/ah_osdep.c
--- src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.c 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/freebsd/ah_osdep.c 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,419 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * DragonFly Port - Copyright (c) 2005 Andrew Atrens
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_osdep.c,v 1.3 2004/12/08 18:18:39 sam Exp $
+ */
+#include "opt_ah.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/sysctl.h>
+#include <sys/bus.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+
+#include <machine/stdarg.h>
+
+#include <net/ethernet.h> /* XXX for ether_sprintf */
+
+#include <contrib/dev/ath/ah.h>
+
+extern void ath_hal_printf(struct ath_hal *, const char*, ...)
+ __printflike(2,3);
+extern void ath_hal_vprintf(struct ath_hal *, const char*, __va_list)
+ __printflike(2, 0);
+extern const char* ath_hal_ether_sprintf(const u_int8_t *mac);
+extern void *ath_hal_malloc(size_t);
+extern void ath_hal_free(void *);
+#ifdef AH_ASSERT
+extern void ath_hal_assert_failed(const char* filename,
+ int lineno, const char* msg);
+#endif
+#ifdef AH_DEBUG
+extern void HALDEBUG(struct ath_hal *ah, const char* fmt, ...);
+extern void HALDEBUGn(struct ath_hal *ah, u_int level, const char* fmt, ...);
+#endif /* AH_DEBUG */
+
+/* NB: put this here instead of the driver to avoid circular references */
+SYSCTL_NODE(_hw, OID_AUTO, ath, CTLFLAG_RD, 0, "Atheros driver parameters");
+SYSCTL_NODE(_hw_ath, OID_AUTO, hal, CTLFLAG_RD, 0, "Atheros HAL parameters");
+
+#ifdef AH_DEBUG
+static int ath_hal_debug = 0;
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, debug, CTLFLAG_RW, &ath_hal_debug,
+ 0, "Atheros HAL debugging printfs");
+TUNABLE_INT("hw.ath.hal.debug", &ath_hal_debug);
+#endif /* AH_DEBUG */
+
+SYSCTL_STRING(_hw_ath_hal, OID_AUTO, version, CTLFLAG_RD, ath_hal_version, 0,
+ "Atheros HAL version");
+
+int ath_hal_dma_beacon_response_time = 2; /* in TU's */
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, dma_brt, CTLFLAG_RW,
+ &ath_hal_dma_beacon_response_time, 0,
+ "Atheros HAL DMA beacon response time");
+int ath_hal_sw_beacon_response_time = 10; /* in TU's */
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, sw_brt, CTLFLAG_RW,
+ &ath_hal_sw_beacon_response_time, 0,
+ "Atheros HAL software beacon response time");
+int ath_hal_additional_swba_backoff = 0; /* in TU's */
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, swba_backoff, CTLFLAG_RW,
+ &ath_hal_additional_swba_backoff, 0,
+ "Atheros HAL additional SWBA backoff time");
+
+void*
+ath_hal_malloc(size_t size)
+{
+ return malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO);
+}
+
+void
+ath_hal_free(void* p)
+{
+ return free(p, M_DEVBUF);
+}
+
+void
+ath_hal_vprintf(struct ath_hal *ah, const char* fmt, __va_list ap)
+{
+ vprintf(fmt, ap);
+}
+
+void
+ath_hal_printf(struct ath_hal *ah, const char* fmt, ...)
+{
+ __va_list ap;
+ __va_start(ap, fmt);
+ ath_hal_vprintf(ah, fmt, ap);
+ __va_end(ap);
+}
+
+const char*
+ath_hal_ether_sprintf(const u_int8_t *mac)
+{
+ static char buffer[256];
+ sprintf(buffer,"%6D",mac,":");
+ return &buffer[0];
+}
+
+#ifdef AH_DEBUG
+void
+HALDEBUG(struct ath_hal *ah, const char* fmt, ...)
+{
+ if (ath_hal_debug) {
+ __va_list ap;
+ __va_start(ap, fmt);
+ ath_hal_vprintf(ah, fmt, ap);
+ __va_end(ap);
+ }
+}
+
+void
+HALDEBUGn(struct ath_hal *ah, u_int level, const char* fmt, ...)
+{
+ if (ath_hal_debug >= level) {
+ __va_list ap;
+ __va_start(ap, fmt);
+ ath_hal_vprintf(ah, fmt, ap);
+ __va_end(ap);
+ }
+}
+#endif /* AH_DEBUG */
+
+#ifdef AH_DEBUG_ALQ
+/*
+ * ALQ register tracing support.
+ *
+ * Setting hw.ath.hal.alq=1 enables tracing of all register reads and
+ * writes to the file /tmp/ath_hal.log. The file format is a simple
+ * fixed-size array of records. When done logging set hw.ath.hal.alq=0
+ * and then decode the file with the arcode program (that is part of the
+ * HAL). If you start+stop tracing the data will be appended to an
+ * existing file.
+ *
+ * NB: doesn't handle multiple devices properly; only one DEVICE record
+ * is emitted and the different devices are not identified.
+ */
+#include <sys/alq.h>
+#include <sys/pcpu.h>
+#include <contrib/dev/ath/ah_decode.h>
+
+static struct alq *ath_hal_alq;
+static int ath_hal_alq_emitdev; /* need to emit DEVICE record */
+static u_int ath_hal_alq_lost; /* count of lost records */
+static const char *ath_hal_logfile = "/tmp/ath_hal.log";
+static u_int ath_hal_alq_qsize = 64*1024;
+
+static int
+ath_hal_setlogging(int enable)
+{
+ int error;
+
+ if (enable) {
+ error = suser(curthread);
+ if (error == 0) {
+ error = alq_open(&ath_hal_alq, ath_hal_logfile,
+ curthread->td_ucred,
+ sizeof (struct athregrec), ath_hal_alq_qsize);
+ ath_hal_alq_lost = 0;
+ ath_hal_alq_emitdev = 1;
+ printf("ath_hal: logging to %s enabled\n",
+ ath_hal_logfile);
+ }
+ } else {
+ if (ath_hal_alq)
+ alq_close(ath_hal_alq);
+ ath_hal_alq = NULL;
+ printf("ath_hal: logging disabled\n");
+ error = 0;
+ }
+ return (error);
+}
+
+static int
+sysctl_hw_ath_hal_log(SYSCTL_HANDLER_ARGS)
+{
+ int error, enable;
+
+ enable = (ath_hal_alq != NULL);
+ error = sysctl_handle_int(oidp, &enable, 0, req);
+ if (error || !req->newptr)
+ return (error);
+ else
+ return (ath_hal_setlogging(enable));
+}
+SYSCTL_PROC(_hw_ath_hal, OID_AUTO, alq, CTLTYPE_INT|CTLFLAG_RW,
+ 0, 0, sysctl_hw_ath_hal_log, "I", "Enable HAL register logging");
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, alq_size, CTLFLAG_RW,
+ &ath_hal_alq_qsize, 0, "In-memory log size (#records)");
+SYSCTL_INT(_hw_ath_hal, OID_AUTO, alq_lost, CTLFLAG_RW,
+ &ath_hal_alq_lost, 0, "Register operations not logged");
+
+static struct ale *
+ath_hal_alq_get(struct ath_hal *ah)
+{
+ struct ale *ale;
+
+ if (ath_hal_alq_emitdev) {
+ ale = alq_get(ath_hal_alq, ALQ_NOWAIT);
+ if (ale) {
+ struct athregrec *r =
+ (struct athregrec *) ale->ae_data;
+ r->op = OP_DEVICE;
+ r->reg = 0;
+ r->val = ah->ah_devid;
+ alq_post(ath_hal_alq, ale);
+ ath_hal_alq_emitdev = 0;
+ } else
+ ath_hal_alq_lost++;
+ }
+ ale = alq_get(ath_hal_alq, ALQ_NOWAIT);
+ if (!ale)
+ ath_hal_alq_lost++;
+ return ale;
+}
+
+void
+ath_hal_reg_write(struct ath_hal *ah, u_int32_t reg, u_int32_t val)
+{
+ if (ath_hal_alq) {
+ struct ale *ale = ath_hal_alq_get(ah);
+ if (ale) {
+ struct athregrec *r = (struct athregrec *) ale->ae_data;
+ r->op = OP_WRITE;
+ r->reg = reg;
+ r->val = val;
+ alq_post(ath_hal_alq, ale);
+ }
+ }
+#if _BYTE_ORDER == _BIG_ENDIAN
+ if (reg >= 0x4000 && reg < 0x5000)
+ bus_space_write_4(ah->ah_st, ah->ah_sh, reg, htole32(val));
+ else
+#endif
+ bus_space_write_4(ah->ah_st, ah->ah_sh, reg, val);
+}
+
+u_int32_t
+ath_hal_reg_read(struct ath_hal *ah, u_int32_t reg)
+{
+ u_int32_t val;
+
+ val = bus_space_read_4(ah->ah_st, ah->ah_sh, reg);
+#if _BYTE_ORDER == _BIG_ENDIAN
+ if (reg >= 0x4000 && reg < 0x5000)
+ val = le32toh(val);
+#endif
+ if (ath_hal_alq) {
+ struct ale *ale = ath_hal_alq_get(ah);
+ if (ale) {
+ struct athregrec *r = (struct athregrec *) ale->ae_data;
+ r->op = OP_READ;
+ r->reg = reg;
+ r->val = val;
+ alq_post(ath_hal_alq, ale);
+ }
+ }
+ return val;
+}
+
+void
+OS_MARK(struct ath_hal *ah, u_int id, u_int32_t v)
+{
+ if (ath_hal_alq) {
+ struct ale *ale = ath_hal_alq_get(ah);
+ if (ale) {
+ struct athregrec *r = (struct athregrec *) ale->ae_data;
+ r->op = OP_MARK;
+ r->reg = id;
+ r->val = v;
+ alq_post(ath_hal_alq, ale);
+ }
+ }
+}
+#elif defined(AH_DEBUG) || defined(AH_REGOPS_FUNC)
+/*
+ * Memory-mapped device register read/write. These are here
+ * as routines when debugging support is enabled and/or when
+ * explicitly configured to use function calls. The latter is
+ * for architectures that might need to do something before
+ * referencing memory (e.g. remap an i/o window).
+ *
+ * NB: see the comments in ah_osdep.h about byte-swapping register
+ * reads and writes to understand what's going on below.
+ */
+
+void
+ath_hal_reg_write(struct ath_hal *ah, u_int32_t reg, u_int32_t val)
+{
+#if _BYTE_ORDER == _BIG_ENDIAN
+ if (reg >= 0x4000 && reg < 0x5000)
+ bus_space_write_4(ah->ah_st, ah->ah_sh, reg, htole32(val));
+ else
+#endif
+ bus_space_write_4(ah->ah_st, ah->ah_sh, reg, val);
+}
+
+u_int32_t
+ath_hal_reg_read(struct ath_hal *ah, u_int32_t reg)
+{
+ u_int32_t val;
+
+ val = bus_space_read_4(ah->ah_st, ah->ah_sh, reg);
+#if _BYTE_ORDER == _BIG_ENDIAN
+ if (reg >= 0x4000 && reg < 0x5000)
+ val = le32toh(val);
+#endif
+ return val;
+}
+#endif /* AH_DEBUG || AH_REGOPS_FUNC */
+
+#ifdef AH_ASSERT
+void
+ath_hal_assert_failed(const char* filename, int lineno, const char *msg)
+{
+ printf("Atheros HAL assertion failure: %s: line %u: %s\n",
+ filename, lineno, msg);
+ panic("ath_hal_assert");
+}
+#endif /* AH_ASSERT */
+
+/*
+ * Delay n microseconds.
+ */
+void
+ath_hal_delay(int n)
+{
+ DELAY(n);
+}
+
+u_int32_t
+ath_hal_getuptime(struct ath_hal *ah)
+{
+ struct timeval bt;
+ getmicrouptime(&bt);
+ return (bt.tv_sec * 1000) + (bt.tv_usec / 1000);
+}
+
+void
+ath_hal_memzero(void *dst, size_t n)
+{
+ bzero(dst, n);
+}
+
+void *
+ath_hal_memcpy(void *dst, const void *src, size_t n)
+{
+ return memcpy(dst, src, n);
+}
+
+/*
+ * Module glue.
+ */
+
+static int
+ath_hal_modevent(module_t mod, int type, void *unused)
+{
+ const char *sep;
+ int i;
+
+ switch (type) {
+ case MOD_LOAD:
+ printf("ath_hal: %s (", ath_hal_version);
+ sep = "";
+ for (i = 0; ath_hal_buildopts[i] != NULL; i++) {
+ printf("%s%s", sep, ath_hal_buildopts[i]);
+ sep = ", ";
+ }
+ printf(")\n");
+ return 0;
+ case MOD_UNLOAD:
+ return 0;
+ }
+ return EINVAL;
+}
+
+static moduledata_t ath_hal_mod = {
+ "ath_hal",
+ ath_hal_modevent,
+ 0
+};
+DECLARE_MODULE(ath_hal, ath_hal_mod, SI_SUB_DRIVERS, SI_ORDER_ANY);
+MODULE_VERSION(ath_hal, 1);
diff -N -u -r src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.h src/sys/contrib/dev/ath/freebsd/ah_osdep.h
--- src.preview/sys/contrib/dev/ath/freebsd/ah_osdep.h 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/freebsd/ah_osdep.h 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,129 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ * DragonFly Port - Copyright (c) 2005 Andrew Atrens
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: ah_osdep.h,v 1.1.1.4 2004/12/08 18:04:17 sam Exp $
+ */
+#ifndef _ATH_AH_OSDEP_H_
+#define _ATH_AH_OSDEP_H_
+/*
+ * Atheros Hardware Access Layer (HAL) OS Dependent Definitions.
+ */
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/endian.h>
+
+#include <machine/bus.h>
+
+typedef void* HAL_SOFTC;
+typedef bus_space_tag_t HAL_BUS_TAG;
+typedef bus_space_handle_t HAL_BUS_HANDLE;
+typedef bus_addr_t HAL_BUS_ADDR;
+
+/*
+ * Delay n microseconds.
+ */
+extern void ath_hal_delay(int);
+#define OS_DELAY(_n) ath_hal_delay(_n)
+
+#define OS_INLINE __inline
+#define OS_MEMZERO(_a, _n) ath_hal_memzero((_a), (_n))
+extern void ath_hal_memzero(void *, size_t);
+#define OS_MEMCPY(_d, _s, _n) ath_hal_memcpy(_d,_s,_n)
+extern void *ath_hal_memcpy(void *, const void *, size_t);
+
+#define abs(_a) __builtin_abs(_a)
+
+struct ath_hal;
+extern u_int32_t ath_hal_getuptime(struct ath_hal *);
+#define OS_GETUPTIME(_ah) ath_hal_getuptime(_ah)
+
+/*
+ * Register read/write; we assume the registers will always
+ * be memory-mapped. Note that register accesses are done
+ * using target-specific functions when debugging is enabled
+ * (AH_DEBUG) or we are explicitly configured this way. The
+ * latter is used on some platforms where the full i/o space
+ * cannot be directly mapped.
+ */
+#if defined(AH_DEBUG) || defined(AH_REGOPS_FUNC) || defined(AH_DEBUG_ALQ)
+#define OS_REG_WRITE(_ah, _reg, _val) ath_hal_reg_write(_ah, _reg, _val)
+#define OS_REG_READ(_ah, _reg) ath_hal_reg_read(_ah, _reg)
+
+extern void ath_hal_reg_write(struct ath_hal *ah, u_int reg, u_int32_t val);
+extern u_int32_t ath_hal_reg_read(struct ath_hal *ah, u_int reg);
+#else
+/*
+ * The hardware registers are native little-endian byte order.
+ * Big-endian hosts are handled by enabling hardware byte-swap
+ * of register reads and writes at reset. But the PCI clock
+ * domain registers are not byte swapped! Thus, on big-endian
+ * platforms we have to byte-swap thoese registers specifically.
+ * Most of this code is collapsed at compile time because the
+ * register values are constants.
+ */
+#define AH_LITTLE_ENDIAN 1234
+#define AH_BIG_ENDIAN 4321
+
+#if _BYTE_ORDER == _BIG_ENDIAN
+#define OS_REG_WRITE(_ah, _reg, _val) do { \
+ if ( (_reg) >= 0x4000 && (_reg) < 0x5000) \
+ bus_space_write_4((_ah)->ah_st, (_ah)->ah_sh, \
+ (_reg), htole32(_val)); \
+ else \
+ bus_space_write_4((_ah)->ah_st, (_ah)->ah_sh, \
+ (_reg), (_val)); \
+} while (0)
+#define OS_REG_READ(_ah, _reg) \
+ (((_reg) >= 0x4000 && (_reg) < 0x5000) ? \
+ le32toh(bus_space_read_4((_ah)->ah_st, (_ah)->ah_sh, \
+ (_reg))) : \
+ bus_space_read_4((_ah)->ah_st, (_ah)->ah_sh, (_reg)))
+#else /* _BYTE_ORDER == _LITTLE_ENDIAN */
+#define OS_REG_WRITE(_ah, _reg, _val) \
+ bus_space_write_4((_ah)->ah_st, (_ah)->ah_sh, (_reg), (_val))
+#define OS_REG_READ(_ah, _reg) \
+ ((u_int32_t) bus_space_read_4((_ah)->ah_st, (_ah)->ah_sh, (_reg)))
+#endif /* _BYTE_ORDER */
+#endif /* AH_DEBUG || AH_REGFUNC || AH_DEBUG_ALQ */
+
+#ifdef AH_DEBUG_ALQ
+extern void OS_MARK(struct ath_hal *, u_int id, u_int32_t value);
+#else
+#define OS_MARK(_ah, _id, _v)
+#endif
+
+#endif /* _ATH_AH_OSDEP_H_ */
diff -N -u -r src.preview/sys/contrib/dev/ath/public/i386-elf.hal.o.uu src/sys/contrib/dev/ath/public/i386-elf.hal.o.uu
--- src.preview/sys/contrib/dev/ath/public/i386-elf.hal.o.uu 1969-12-31 19:00:00.000000000 -0500
+++ src/sys/contrib/dev/ath/public/i386-elf.hal.o.uu 2005-09-23 11:24:22.000000000 -0400
@@ -0,0 +1,3518 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: i386-elf.hal.o.uu,v 1.1.1.1 2004/12/08 18:04:43 sam Exp $
+ */
+#define ATH_HAL_VERSION "0.9.14.9"
+begin 644 hal.o
+M?T5,1@$!`0D```````````$``P`!```````````````4"`(``````#0`````
+M`"@`#@`+``^W5"0$@_I7#X2^````@_I7?T6#^A)_&(/Z$0^-HP```(/Z!P^$
+ME````.FM````D(/Z&@^$FP```(/Z&G\.@_H3#X2-````Z9````"#^E)T>^F&
+M````B?:!^A(1``!T9('Z$A$``'\H@?H4$```=&2!^A00``!_#+@J````@_I8
+M=%_K6('Z!Q$``'0RZTZ)]K@]````@?H3\```=$2!^A/P``!_"H'Z$Q$``'0G
+MZRVX40```('Z&_$``'0EZQZX90```,.X<@```,.)]KA_````PXGVN)(```##
+MB?:X`````,.)]HM4)`2+1"0(9H'ZC!9T$V:!^B>G=`RY`````&:!^K<0=0X/
+MM\!0Z/'^__^#Q`2)P8G(PY!75E.+?"04BW0D&(M<)!R+3"0@BT0D$`^WT('Z
+M!P(```^$L@```('Z!P(``'\N@_H2?QF#^A$/C80```"#^@</A),```#II@``
+M`(GV@_H3=%B#^AIT3NF5````D('Z$A$``'1<@?H2$0``?Q2!^A00``!T,('Z
+M!Q$``'1<ZW*)]H'Z$_```'0A@?H3\```?PJ!^A,1``!T$>M6@?H;\0``=![K
+M3+@3````@^P,45-65P^WP%#H_/___XG"@\0@ZSN#[`Q14U97#[?`4.C\____
+MB<*#Q"#K))"#[`Q14U97#[?`4.C\____B<*#Q"#K#)"Z`````,<!`0```(72
+M=$MFBX*@`0``9HE""&:+@J(!``!FB4(*BX*D`0``B4(<9HN"J`$``&:)0B!F
+MBX*J`0``9HE"(F:+@JP!``!FB4(D9HN"K@$``&:)0B:)T%M>7\-55U93@^P,
+MBVPD)(M\)"B+="0LNP````"+5"0@BT(4BP0H(?@Y\'4(N`$```#K')"#[`QJ
+M"NC\____@\000X'[YP,``'[2N`````"#Q`Q;7E]=PY!64XM,)`R+="00NP``
+M``"X`````#GP<Q&-%`")R(/@`0G0T>E#.?-R[UM>PU=64XM,)!2+="08BU0D
+M'`^WPHT$0(U$@2`/MU@&#[9`!8/X`G1F@_@"?PF%P'09Z>@```"#^`-T?X/X
+M!`^$GP```.G5````D+_`````@WPD(`!T%`^WPHT$0(!\@2D`=`=FOV``C78`
+MC03U`````(T$@(T$@(T$@,'@`[H`````]_.-1#@*Z98```"0C12=`````+C3
+M36(0]^+!Z@:-3/(5B<B)T[H`````]_.-!(4D````ZVR-=@"-%-T`````N---
+M8A#WXL'J!HU,\A6)R(G3N@````#W\XT$A18```#K0(T4G0````"XTTUB$/?B
+MP>H&C4SR%8G(B=:Z`````/?VC02%`````('[YP,``'<'!;T```#K"H/`7.L%
+MN``````/M\!;7E_#BTPD"+H"````]D$"('5)#[=!`B70````N@,````]P```
+M`'0T#[=!`B70````N@0````]T````'0?N@$```#V00(0=10/MT$"P>@+@^`!
+M@_@!&=+WTH/B!8G0PY"+5"0$BT0D"*F`````=$6X#@```('ZM`D```^$I```
+M`('ZLPD``'<4@>IG"0``N,W,S,SWXHG0P>@"PY"!ZM`)``"XS<S,S/?BB=#!
+MZ`2#P`_#B?;VQ`%T$X'JB!,``+C-S,S,]^*)T,'H`L.X#@```('ZM`D``'1+
+M@?JS"0``=Q.!ZF<)``"XS<S,S/?BB=#!Z`+#@?J'$P``=Q:!ZM`)``"XS<S,
+MS/?BB=#!Z`2#P`_#@>J($P``N,W,S,SWXHG0P>@"PXUV`(M4)`2+1"0(J8``
+M``!T);BT"0``@_H.=%N#^@UW"HT$D@5G"0``PY"-!)*-!(6D"```PY#VQ`%T
+M"XT$D@6($P``PXGVN+0)``"#^@YT)H/Z#7<)C022!6<)``##@_H:=PN-!)*-
+M!(6D"```PXT$D@6($P``PXUV`(M,)`B+1"0$BY#\!P``A=)T0O9"`A!T"(T$
+MB<'@!,.0#[="`B5``0``/4`!``!U"(T$B<'@`\.0#[="`B70````/<````!U
+M#(T$B8T$0<'@`L.)]HT$B8T$0='@PXUV`(M,)`B+1"0$BY#\!P``A=)T5O9"
+M`A!T$+C-S,S,]^&)T,'H!L.-=@`/MT(")4`!```]0`$``'40N,W,S,SWX8G0
+MP>@%PXUV``^W0@(ET````#W`````=1"XHXLNNO?AB=#!Z`7#C78`N*.++KKW
+MX8G0P>@$PXUV`%575E.#[`2+?"0<@'\$`'5QNP````")]L9$'P3_0X/['W[U
+MNP````"#/P!^58UV`(T$6XUTAR"*1@B*3@L/MM"(7!<$"D8)#[;`B%P'!`^V
+MZ6H`56H.5_]T)"CH_/___X/$%&:)1@QJ`55J#E?_="0HZ/S___^#Q!1FB48.
+M0SD??ZZ#Q`1;7E]=PXGV5E.+3"0,BU0D$(M<)!2+="08C8&T`0``@_H/#X<?
+M`0``_R25``````^W@=0!``")!K@`````Z0T!``"X#0```.D#`0``N`T```#I
+M^0```+@-````Z>\````/MT`*B0:X`````.G?````#[=`"(D&N`````#ISP``
+M``^V0`*#X`&#^`$9P(/@#>F[````BD`!P.@'#[;`@_@!&<#WT(/@#>FC````
+MB@#`Z`*#X`&#^`$9P(/@#>F.````B@#`Z`.#X`&#^`$9P(/@#>M\B@#`Z`2#
+MX`&#^`$9P(/@#>MJBX'(`0``B0:X`````.M;@_L!=!:X`````(/[`7),@_L"
+M=!>#^P-T(NLO#[^!S`$``(D&N`````#K,`^W@<X!``")!K@`````ZR"+@=`!
+M``")!K@`````ZQ&X#0```.L*B?:X#````(UV`%M>PY"+5"00BT0D%(-\)`@/
+M=1V#?"0,`W46@_H$=Q&+1"0$B9#0`0``N`$```##D(7`=`;'``P```"X````
+M`,-55U93BVPD%(M<)""+3"0<OP````"#^P=V/HGVBT0D&`^W%+@/MW2X`HG0
+MP>`0"?")`8/!!(/K!(M%%(L$$(D!@\$$@\($@^L$.?)W!8/[`W?F1X/[!W?$
+MB<@K1"0<6UY?7<.04XM$)`B+5"0,BTPD&(M<)!R%TG0'@_H-=!;K,`6@`0``
+MB0''`Q````"X`0```.LA_S/_,?]T)!A0Z%[___^)`[@!````@\00ZP>)]K@`
+M````6\.04XM<)`R+3"00N`````"#>P0`#X0M`0``BP&)`XM!!(E#"(M!"(E#
+M#(M!#(E#$(-Y$/]T%(M!$#W_````=@6X_P```(E#%.L(QT,4`@```)"#>13_
+M=#"+412!^@`$``!V!;H`!```QT,8`0```#E3&',:N`$```"0T>"#R`$YT'+W
+MB4,8ZP:+012)0QB#>1C_=#"+41B!^@`$``!V!;H`!```QT,<`0```#E3'',>
+MN`$```"0T>"#R`$YT'+WB4,<ZPK'0QS_`P``C78`9H-Y'`!T%6:+01QF@_@/
+M=@6X#P```&:)0R#K!F;'0R`*`&:#>1X`=!=FBT$>9H/X#W8%N`\```!FB4,B
+MZPB)]F;'0R(*`(M!((E#)(M!)(E#*(M!*(E#+(M!+(E#,(-Y!`1U$(-[!`%U
+M"L=#.`$```"-=@"X`0```%O#D(M,)`B+5"0,N`````"#>@0`=%N+0@R)00B+
+M`HD!BT((B4$$BT(,B4$(BT(0B4$,BT(4B4$0BT(8B4$4BT(<B4$89HM"(&:)
+M01QFBT(B9HE!'HM")(E!((M"*(E!)(M"+(E!*(M",(E!++@!````PY!55U93
+M@^P4BUPD-(M,)"R+5"0PQT0D#$````"+1"0H9H$X`3!V",=$)`Q6````O@``
+M```/M^H/M_F-=@"+5"0,#[<$<HG!#Z_-NF0````IPHG0#Z_'`<&X'X7K4??I
+MB00DB50D!(M$)`3!^`7!^1\IR&:)`X/#`D:#_@I^OX/$%%M>7UW#C78`BU0D
+M"`^WPF:!^O\`=$2+1"0$9H$X`C!W*V:#^CYV$0^WPHT$@`4B%0``#[?`PXGV
+M#[?"C02`C80`[!,```^WP,.-=@`/M\*-!(`%P!(```^WP,.0BU0D"`^WPF:!
+M^O\`=!^+1"0$9H$X`C!W"XV"8`D```^WP,.0C8+\"```#[?`PXGV55=64X/L
+M#(ML)""+="0D9H$^_S]V&F:#?BP`=!.Z`0```&:#?A8`#X13`@``C78`9H$^
+M`C!V9[]0`0``NP````!F@[YV`0````^$+`(``)"#[`2-1"0.4`^WQU!'5?^5
+MA`$``(/$$(7`#X2]`0``9@^V1"0+9HF$7F(!``!F#[9$)`IFB81>9`$``(/#
+M`@^WAG8!```YV'^WZ:4!``"#[`2-1"0.4&@``0``OP$!``!5_Y6$`0``@\00
+MN@````"%P`^$N0$``&:+1"0*B<)FP>H)9HF68@$``&;!Z`*#X']FB89D`0``
+M#[=$)`K!X`6#X']FB89F`0``@^P$C40D#E`/M\=01U7_E80!``"#Q!"Z````
+M`(7`#X1C`0``9HM$)`J)PF;!Z@MF"99F`0``9L'H!(/@?V:)AF@!```/MT0D
+M"L'@`X/@?V:)AFH!``"#[`2-1"0.4`^WQU!'5?^5A`$``(/$$+H`````A<`/
+MA`T!``!FBT0D"HG"9L'J#68)EFH!``!FP>@&@^!_9HF&;`$```^W1"0*T>"#
+MX']FB89N`0``@^P$C40D#E`/M\=01U7_E80!``"#Q!"Z`````(7`#X2X````
+M9HM4)`J)T&;!Z`]F"89N`0``B=!FP>@(@^!_9HF&<`$``&;1ZH/B?V:)EG(!
+M```/MT0D"L'@!H/@?V:)AG0!``"#[`2-1"0.4`^WQU!5_Y6$`0``@\00N@``
+M``"%P'18ZPF)]KH`````ZTUFBT0D"F;!Z`IF"89T`0``NP````!F@[YV`0``
+M`'0I#[>^=@$``(UV``^WA%YB`0``4%;H$?W__X/$"&:)A%YB`0``0SG??^&Z
+M`0```(G0@\0,6UY?7<.)]E575E.#[!B+1"0PBWPD-&:+4!1FB50D$HE$)!0/
+MM\*-%("-%)"-1``#P>@"`<+!X@)2Z/S___^)P8/$$+@`````A<D/A*4```")
+M#P^W5"0&C402`R7\_P<``<B)1PAFBVPD!F:);P2^`````(/Z`'YXC78`BQ^+
+M3PB-!+:-!(:+;"0(9HM4=0!FB12!9HD4<[D`````C02VC02&C1R%`````(GV
+MC02)C02#B<(#5PAFB4H$`T<(9L=`!@``08/Y`W[BBU<(C02VC02&P>`"9L=$
+M$`8$`(M7"&;'1!!"`P!&#[=$)`8Y\'^+N`$```"#Q`Q;7E]=PXGV55=64X/L
+M!(ML)""+5"0<9HM"%F:)109FQP0DK=YFQT0D`JW>N@````"Y``````^WV(GF
+MD(G8T_BH`70*@_H!?REFB0Q60D&#^0-^Z(M4)!QFBT(49HE%!+@`````9H-]
+M!``/A-4!``#K"K@`````Z<D!``"_`````&:#?00`#X2T`0``C11_C127BT0D
+M'(T44(U:&(MU"(T$OXT$A\'@`F:+4AAFB10PBW4(9HM3$F:)5#`"N0````"-
+M!+^-!(>-%(4`````B?:-!(F-!((#10AFQT`&``!!@_D#?NMF@7PD`JW>=68/
+MMPPDC12_C127C02)P>`"C120`U4(@\($9L="`@0`9HM#`F:)0@1F`T,&9HE"
+M!F8#0PIFB4((9@-##F:)0@IFBT,$9HE"#&:+0PAFB4(.9HM##&:)0A!FBT,0
+M9HE"$NGA````B?:-!+^-!(>--(4`````#[<$)(T$@(T$A@-%"&:+4P)FB5`(
+M#[=$)`*-!("-!(8#10AFQT`(%``/MT0D`HT$@(T$A@-%"&;'0`HC``^W1"0"
+MC02`C02&`T4(9L=`##\`#[<,)(T$B8T4A@-5"(/"!&;'0@($`&:+0@1F`T,&
+M9HE"!F8#0PIFB4((9@-##F:)0@IFBT,$9HE"#&:+0PAFB4(.9HM##&:)0A!F
+MBT,09HE"$@^W3"0"C02)C12&`U4(@\($9L="`@,`9HM#%&:)0@QFBT,69HE"
+M#F:+0QAFB4(01P^W100Y^`^/3/[__[@!````@\0$6UY?7<.-=@!55U93@>Q<
+M`0``OU`!``#'1"0(`````,=$)`0`````@WPD"`$/A-X```"#?"0(`7\/@WPD
+M"`!T&.EC`0``C78`@WPD"`(/A`D!``#I4`$``(N$)'0!``!F@W@6``^$/@0`
+M`(-\)`0)#X\_`0``@^P$C40D$E!71_^T)'P!``"+E"2``0``_Y*$`0``@\00
+MA<`/A!X$``"`?"0.``^$"P$``(M<)`0/MD0D#O]$)`10_[0D>`$``.CU^/__
+M@\0(9HF$7#`!``!F#[9$)`]FA<`/A-<```"+7"0$#[;`_T0D!%#_M"1X`0``
+MZ,/X__^#Q`AFB81<,`$``(-\)`0)#XYJ____Z:0```"+C"1T`0``9H-Y&``/
+MA(8#``"[`````)"+A"1T`0``9H&\6%0!``#_`'099HN$6%0!``"+3"0$9HF$
+M3#`!``!!B4PD!$.#^P)^SNM8BX0D=`$``&:#>!H`#X0Z`P``NP````"0BY0D
+M=`$``&:!O%I.`0``_P!T&6:+A%I.`0``BTPD!&:)A$PP`0``08E,)`1#@_L"
+M?L[K#+@`````Z0H#``")]H/L"&@<`0``C40D'%#H_/___XM$)!1FB40D-+L`
+M````@\00.UPD!`^-7`(``(UL)`Z-=@!FBX1<,`$``&:)1%P0C11;C1239HE$
+M5"B#[`155T?_M"1\`0``BY0D@`$``/^2A`$``(/$$(7`#X27`@``C0Q;C0R+
+MC4Q,(&:+1"0.#[;09L'H!X/@`<'@"&8IPF:)40QFBT0D#HG"9L'J"&;!Z`_!
+MX`AF*<)FB5$0@^P$55='_[0D?`$``(N,)(`!``#_D80!``"#Q!"%P`^$-@(`
+M`(T,6XT,BXV,3%`!``!FBT0D#@^VT&;!Z`>#X`'!X`AF*<)FB9'D_O__9HM$
+M)`Z)PF;!Z@AFP>@/P>`(9BG"9HF1Z/[__X/L!%571_^T)'P!``"+E"2``0``
+M_Y*$`0``@\00A<`/A,P!``"-%%N-%).-5%0@9HM$)`Z#X!]FB4(.9HM$)`YF
+MP>@%@^`?9HE"$F:+1"0.9L'H"H/@'V:)0A:#[`155T?_M"1\`0``BXPD@`$`
+M`/^1A`$``(/$$(7`#X1Q`0``C0Q;C0R+C4Q,,&:+1"0.#[;09L'H!X/@`<'@
+M"&8IPF:)40QFBT0D#HG"9L'J"&;!Z`_!X`AF*<)FB5$.@^P$55='_[0D?`$`
+M`(N4)(`!``#_DH0!``"#Q!"%P`^$$`$``(T$6XT$@XVT1%`!``"-CN#^__]F
+MBT0D#@^VT&;!Z`>#X`'!X`AF*<)FB5$0BX0D=`$``&:!.`)`=AIFBT$(9HE!
+M"F8/MD0D#X/@/V:)AMK^___K,HT$6XT$@XV$1%`!``!FBU0D#HG19L'I"&;!
+MZ@_!X@AF*=%FB8CJ_O__9L>`VO[__P$`0SM<)`0/C*O]__^+5"0(BXPD=`$`
+M`&:+1%%F9HE$)":#[`2-!%*-A(%0"0``4(U$)!A0_[0D?`$``.A7^/__@\00
+MA<!T1(M4)`B-!%*+C"1T`0``C82!4`D``%"-1"044/^T)'@!``#H(?G__X/$
+M#(7`=!:)]O]$)`B#?"0(`@^.:/O__[@!````@<1<`0``6UY?7<.055=64XM\
+M)!2+1"08B<5FB4<(#[=7"KX`````]L(!=`6^`0```(G0T>B#X`&#^`%F@][_
+MB=#!Z`*#X`&#^`%F@][_B=#!Z`.#X`&#^`%F@][_NP````!F.>MS*I`/M\.+
+M5"0<9HL,0F:)#$>-%("-%)*-%%"-%%=FB4H,9HER#D-F.>MRUUM>7UW#B?95
+M5U93@^P\BVPD4(M\)%R^`````(-\)&``=&^0@^P$C40D$E`/M\=01U7_E80!
+M``"#Q!"%P`^$/04``(!\)`X`=$@/M]X/MD0D#D90_W0D6.AC]/__@\0(9HE$
+M7!!F#[9$)`]FA<!T(@^WW@^VP$90_W0D6.@_]/__@\0(9HE$7!`/M\8[1"1@
+M<I*-1"004`^WQE#_="1@Z-C^__^+?"1LT>\#?"1H9L=$)!@``(/$#(M$)%AF
+M@W@(``^&M`0``(UT)`Z0#[=4)`R-!)*-!("-!$*+5"18C5Q"#&:#>P(`#X2_
+M````@^P$5@^WQU!'5?^5A`$``(/$$(7`#X1X!```9HM$)`Z#X!]FB4,,9HM$
+M)`YFP>@%@^!_9HE#!&:+1"0.9L'H#&:)0SR#[`16#[?'4$=5_Y6$`0``@\00
+MA<`/A#0$``!FBT0D#H/@/V:)0Q1FBT0D#F;!Z`:#X`]FB4-$9HM$)`YFP>@*
+M9HE#'(/L!%8/M\=01U7_E80!``"#Q!"%P`^$\`,``&:+1"0.@^`/9HE#3&:+
+M1"0.9L'H!(/@/V:)0R1F@WL"`0^&Y0```&:+1"0.9L'H"H/@'V:)0PYFBT0D
+M#F;!Z`]FB4,&@^P$5@^WQU!'5?^5A`$``(/$$(7`#X21`P``#[=$)`Z#X#_1
+MX&8)0P9FBT0D#F;!Z`:#X`]FB4,^9HM$)`YFP>@*9HE#%H/L!%8/M\=01U7_
+ME80!``"#Q!"%P`^$2P,``&:+1"0.@^`/9HE#1F:+1"0.9L'H!(/@/V:)0QYF
+MBT0D#F;!Z`J#X`]FB4-.9HM$)`YFP>@.9HE#)H/L!%8/M\=01U7_E80!``"#
+MQ!"%P`^$]P(```^W1"0.@^`/P>`"9@E#)NM2B?9F@WL"`75)9HM$)`YFP>@*
+M@^`/9HE#5&:+1"0.9L'H#F:)0RR#[`16#[?'4$=5_Y6$`0``@\00A<`/A*4"
+M```/MT0D#H/@#\'@`F8)0RR)]F:#>P("#X:]````9HM$)`YFP>@$@^`?9HE#
+M$&:+1"0.9L'H"6:)0PB#[`16#[?'4$=5_Y6$`0``@\00A<`/A%$"``!FBT0D
+M#H/@#V:)0T!FBT0D#F;!Z`2#X#]FB4,89HM$)`YFP>@*@^`/9HE#2&:+1"0.
+M9L'H#F:)0R"#[`16#[?'4$=5_Y6$`0``@\00A<`/A/T!```/MT0D#H/@#\'@
+M`F8)0R!FBT0D#F;!Z`2#X`]FB4-09@^V1"0/@^`_9HE#*.LGC78`9H-[`@)U
+M'6:+1"0.9L'H!(/@#V:)0U9F#[9$)`^#X#]FB4,N9H-[`@,/AC4!``!FBT0D
+M#F;!Z`YFB4,2@^P$5@^WQU!'5?^5A`$``(/$$(7`#X1U`0``#[=$)`Z#X`?!
+MX`)F"4,29HM$)`YFP>@#@^!_9HE#"F:+1"0.9L'H"H/@#V:)0T)FBT0D#F;!
+MZ`YFB4,:@^P$5@^WQU!'5?^5A`$``(/$$(7`#X0>`0``#[=$)`Z#X`_!X`)F
+M"4,:9HM$)`YFP>@$@^`/9HE#2F8/MD0D#X/@/V:)0R)FBT0D#F;!Z`YFB4-2
+M@^P$5@^WQU!'5?^5A`$``(/$$(7`#X3*````#[=$)`Z#X`/!X`)F"4-29HM$
+M)`YFP>@"@^`_9HE#*F8/MD0D#X/@#V:)0UIFBT0D#F;!Z`QFB4,R@^P$5@^W
+MQU!'5?^5A`$``(/$$(7`='H/MT0D#H/@`\'@!&8)0S+K39!F@WL"`W5%9HM$
+M)`YFP>@.9HE#6(/L!%8/M\=01U7_E80!``"#Q!"%P'0]#[=$)`Z#X`/!X`)F
+M"4-89HM$)`YFP>@"@^`_9HE#,(GV9O]$)`R+5"0,BT0D6&8Y4`@/AU'[__^X
+M`0```(/$/%M>7UW#55=64X/L#(M4)"1FBT((BVPD(&:)10AFBT4*9HE$)`AF
+MQT0D!@``J`%T!V;'1"0&`0"+1"0(9M'H@^`!@_@!9H-<)`;_BT0D"&;!Z`*#
+MX`&#^`%F@UPD!O^+1"0(9L'H`X/@`8/X`6:#7"0&_V;'1"0*``"+5"0D9H-Z
+M"``/AL<```"0#[=4)`J+;"0D9HM,50"+1"0@9HD,4(T$DHT$@(T$0HM4)""-
+M!$)FB4@,9HML)`9FB6@0OP````"[``````^W="0*C02VC02`C01&T>")!"0/
+MM\N-!$F+%"2-!,*+;"0@C10H9HE:$@^W1"0(T_BH`7069L="%`0`1V:#_P%U
+M*&;'0A0%`.L@D`^WTXT44HT$MHT$@(T$1M'@C130BT0D(&;'1`(4``!#9H/[
+M`W:B9O]$)`IFBVPD"HM4)"1F.6H(#X<Z____@\0,6UY?7<.)]E575E.#["1F
+MQT0D&*W>C40D&&;'0`*MWF;'0`2MWF;'0`:MWL=$)!``````9L=$)!0``(M$
+M)$`/MU`*NP,```"-="08#[=$)!2)V2G!B=#3^*@!=!2)V&8K1"04BTPD$&:)
+M!$Y!B4PD$&;_1"049H-\)!0#=LZ+5"0\9HM""(M,)$!FB4$(9L=$)!8``&:#
+M>0@`#X;_````#[=4)!:-!)*-!("-!$+1X(M,)#R-%`B-:@QFBU(,BTPD0&:)
+M5`@,9L=$)!0``(-\)!``#X2N````#[=4)!:-!)*-!("-!$+1X(E$)`R-=@`/
+MMU0D%`^W1%08C01`BTPD#(T$P8M,)$"-=`@2#[]$50S!X`)FB48.9HM$501F
+MB48$OP$```!F@WX"`79&#[=$)!2)1"0(9HM6`F:)5"0&D`^WSXM$)`B-'(@/
+MOT1=-&:+5$X,C01"9HE$3@YFBT1.`F8#1%T,9HE$3@1'9CE\)`9WS6;_1"04
+M#[=$)!0[1"00#X)I____9O]$)!9FBTPD%HM4)$!F.4H(#X<!____N`$```"#
+MQ"1;7E]=PU575E.![`P%``"+M"0D!0``9L=$)`@$`(U$)`AFQT`"!@!FQT`$
+M"0!FQT`&#`"#[`AH[`0``(U$)!Q0Z/S___\/M[[0````@\009H-^&`!T?XVL
+M)+0!``!FBT9H9HF$)+X!``"#[`QJ!%=55O^T)#P%``#H$/?__X/$(+H`````
+MA<`/A+D```"-GO0*``!FBT9H9HE#"E53Z&O\__]35?^T)#`%``#HL?W__X/$
+M%+H`````A<`/A(8````/MT4.#[=41`8/MT4(#Z_"C7P'`I!F@WX:`'1EC:PD
+M6`,``&:+1FIFB80D8@,``(/L#&H$5U56_[0D/`4``.B*]O__@\0@N@````"%
+MP'0WC9Z8#```9HM&:F:)0PI54^CI^___4U7_M"0P!0``Z"_]__^#Q!2Z````
+M`(7`=`B-=@"Z`0```(G0@<0,!0``6UY?7<.)]E575E.#[!R+?"0PBT0D-&:!
+M./\_=AIF@W@L`743@^P(4%?HQ?#__X/$$.DJ`P``D(M4)#1F@3K_3W9-9H-Z
+M+`)U1H/L"%)7Z&3^__^#Q!#I!0,``+@`````Z?L"``"X`````.GQ`@``N```
+M``#IYP(``+@`````Z=T"``"X`````.G3`@``B?;'1"00`````(M,)#1F@3D#
+M,!GV@^:P@<90`0``@WPD$`%T3H-\)!`!?PZ#?"00`'03Z9\```")]H-\)!`"
+M=&3ID0```(/&!8M$)#1FBX!V`0``9HE$)!B+7"0T@<-X`0``BU0D-('"8@$`
+M`(E4)`SK;XM,)#1F@WD8``^$/0(``(/&-V:+@8`#``!FB40D&(G+@<,J!```
+M@<&(`P``B4PD#.L]BU0D-&:#>AH`#X0+`@``@\9&9HN*@`,``&:)3"08B=.!
+MPXX#``"!PH(#``")5"0,ZPNX`````.GR`0``D,=$)!0`````9H-\)!@`#X3)
+M`0``C6PD&HM4)!2+3"0,9HL$46:)`X/L!%561E?_EX0!``"#Q!"%P`^$K?[_
+M_V:+1"0:9L'H"F:)0P1FBT0D&F;!Z`2#X#]FB4,"#[=$)!K!X`*#X#]FB4,>
+M@^P$559&5_^7A`$``(/$$(7`#X1S_O__9HM$)!IFP>@.9@E#'F8/MD0D&X/@
+M/V:)0R!FBT0D&F;!Z`*#X#]FB4,B#[=$)!K!X`2#X#]FB4,D@^P$559&5_^7
+MA`$``(/$$(7`#X0L_O__9HM$)!IFP>@,9@E#)&:+1"0:9L'H!H/@/V:)0R9F
+MBT0D&H/@/V:)0RB#[`155D97_Y>$`0``@\00A<`/A/7]__]FBT0D&F;!Z`IF
+MB4,J9HM$)!IFP>@$@^`_9HE#+`^W1"0:P>`"@^`_9HE#+H/L!%561E?_EX0!
+M``"#Q!"%P`^$N_W__V:+1"0:9L'H#F8)0RYF#[9$)!N#X#]FB4,P9HM$)!IF
+MP>@"@^`_9HE#,HU#"%`/MT,$4`^W0P)0_W0D0.@2Y___N@````"#Q!`/MT,&
+MB<&#^`!^&HUV``^_1%,>C02`C02`T>!FB413'D(YT7_I@\,T_T0D%`^W1"08
+M.T0D%`^/._[___]$)!"#?"00`@^.//W__[@!````@\0<6UY?7<.-=@!55U93
+M@^P<BWPD-+T`````9H$__S]V"0^W1R*-<*OK$&:!/P,P&?:#YK"!QE`!``"#
+M_0%T,X/]`7\&A>UT"NMX@_T"=$OK<9"#QE7'1"00"````(V?R`0``(V'Q@0`
+M`(E$)`SK7XUV`&:#?Q@`#X31`0``@\9EQT0D$`(```"-GSH%``"-ES@%``")
+M5"0,ZS1F@W\:``^$J0$``(/&:<=$)!`#````C9\:!0``C8<8!0``B40D#.L,
+MN`````#ID0$``(GVBU0D#&;'`@``QT0D%`````"+1"00.40D%`^-80$``)"#
+M[`2-1"0>4%9&_W0D/(M4)$#_DH0!``"#Q!"%P`^$3`$``&:!/P(P=@YF#[9$
+M)!MFB4,(ZP^)]F:+1"0:9L'H"6:)0PAF@WL(``^$^@```(7M=10/MT,(4%?H
+M]>7__X/$"&:)0PCK$@^W0PA05^@UYO__@\0(9HE#"&:!/P(P=B-FBT0D&F;!
+MZ`*#X#]FB4,&#[=$)!K!X`2#X#]FB4,$ZR&)]F:+1"0:9L'H`X/@/V:)0P8/
+MMT0D&L'@`X/@/V:)0P2#[`2-1"0>4%9&_W0D/(M4)$#_DH0!``"#Q!"%P`^$
+MB0```&:!/P(P=BMFBT0D&F;!Z`QF"4,$9HM$)!IFP>@&@^`_9HE#`F:+1"0:
+M@^`_9HD#ZRR09HM$)!IFP>@-9@E#!&:+1"0:9L'H!X/@/V:)0P)FBT0D&F;1
+MZ(/@/V:)`XM$)`QF_P"#PPK_1"04BU0D$#E4)!0/C*'^__^018/]`@^.POW_
+M_[@!````@\0<6UY?7<.055=64X/L#(ML)""+="0D@<90!0``BT0D)&:!./\_
+M=@D/MW@B@\<:ZW>_OP$``(M4)"1F@3H",'=GZUVX`````.FY`P``N`````#I
+MKP,``+@`````Z:4#``"X`````.F;`P``N`````#ID0,``+@`````Z8<#``"X
+M`````.E]`P``N`````#I<P,``+@`````Z6D#``"-=@"_;P$``(UV`,=$)`0`
+M````BTPD)&:#N00!````#X0_`P``B?:+1"0$BU0D)&:#O$(&`0```'499H$Z
+M`C!V!H/'".L$D(/'!X/&0.GY`@``D(M,)"1F@3D",`^&K0```+L`````@^P$
+MC40D#E!71U7_E80!``"#Q!"%P`^$(____V:+1"0*B<)FP>H(9HD4WB7_````
+M9HE$W@B#PP*#^P=^P[L`````B?:#[`2-5"0.4E='5?^5A`$``(/$$(7`#X3I
+M_O__9@^V1"0+@^`_9HE$W@)FBT0D"F;!Z`Z#X`&)1-X$9HM$)`J#X#]FB43>
+M"F:+1"0*9L'H!H/@`8E$W@R#PP*#^P=^H>G9`0``@^P$C4PD#E%71U7_E80!
+M``"#Q!"%P`^$C_[__V:+1"0*B<)FP>H)9HD69L'H`H/@?V:)1@@/MT0D"L'@
+M!8/@?V:)1A"#[`2-1"0.4%='5?^5A`$``(/$$(7`#X15_O__9HM$)`J)PF;!
+MZ@MF"5809L'H!(/@?V:)1A@/MT0D"L'@`X/@?V:)1B"#[`2-5"0.4E='5?^5
+MA`$``(/$$(7`#X0:_O__9HM$)`J)PF;!Z@UF"58@9L'H!H/@?V:)1B@/MT0D
+M"M'@@^!_9HE&,(/L!(U,)`Y15T=5_Y6$`0``@\00A<`/A.#]__]FBU0D"HG0
+M9L'H#V8)1C")T&;!Z`B#X']FB48X9L'J`H/B/V:)5@(/MT0D"L'@!(/@/V:)
+M1@J#[`2-1"0.4%='5?^5A`$``(/$$(7`#X28_?__9HM4)`J)T&;!Z`QF"48*
+MB=!FP>@&@^`_9HE&$H/B/V:)5AJ#[`2-5"0.4E='5?^5A`$``(/$$(7`#X1C
+M_?__9HM$)`J)PF;!Z@IFB58B9L'H!(/@/V:)1BH/MT0D"L'@`H/@/V:)1C*#
+M[`2-3"0.45='5?^5A`$``(/$$(7`#X0H_?__9HM$)`J)PF;!Z@YF"58R9L'H
+M"(/@/V:)1CJ[`````(GV@SS>`'1*BU0D!(M,)"0/MX11!@$``(/@!W0%@_@#
+M=1@/MP3>4/]T)"CH*N'__X/$"&:)!-[K&9`/MP3>4/]T)"CH9N'__X/$"&:)
+M!-Z-=@!#@_L'?JJ#QD"-=@#_1"0$BU0D)`^W@@0!```[1"0$#X_#_/__N`$`
+M``"#Q`Q;7E]=PXGV55=64X/L#(ML)""+="0D9L=&*`\`9L=&*@\`9H$^`C!V
+M$L<$)(0```!FQX8$`0``(`#K$,<$)&P```!FQX8$`0``$`"#[`2-1"0.4(M$
+M)`C_,%7_E80!``"#Q!#'1"0$`````(7`#X0T#0``9HM4)`J)T&;!Z`]FB48&
+MB=!FP>@.@^`!9HE&"HG09L'H"X/@!V:)1@R)T&;!Z`2#X']FB48.9H$^_S]V
+M#XG09L'H`X/@`6:)1@CK!F;'1@@!`&:+5"0*B=!FP>@"@^`!9HE&&HG09M'H
+M@^`!9HE&&(/B`6:)5A:+!"2+6`2#[`2-1"0.4%-#5?^5A`$``(/$$,=$)`0`
+M````A<`/A),,``!FBU0D"HG09L'H"(A&'(A6'6:!/O\_#X;7````@^P$C40D
+M#E!30U7_E80!``"#Q!#'1"0$`````(7`#X13#```9HM4)`J)T&;!Z`YFB48L
+MB=!FP>@-@^`!B8;(````B=!FP>@,@^`!B8;,````@>+_#P``9HE6+H/L!(U$
+M)`Y04T-5_Y6$`0``@\00QT0D!`````"%P`^$^`L``&:+1"0*B<*!XO\/``!F
+MB58B9L'H#H/@`8A&(6:!/O]/=C:#PP*#[`2-1"0.4%-5_Y6$`0``@\00QT0D
+M!`````"%P`^$L`L``&:+1"0*9L'H!&:)AM````"_`````(L$)(M<N`B#[`2-
+M1"0.4%-#5?^5A`$``(/$$(7`#X13"0``9@^V1"0+@^!_9HE$?C!FBT0D"F;!
+MZ`*#X#]FB41^-@^W1"0*P>`$@^`_9HE$?G*#[`2-1"0.4%-#5?^5A`$``(/$
+M$(7`#X05"0``9HM$)`IFP>@,9@E$?G)FBT0D"F;!Z`:#X#]FB41^>&:+1"0*
+M@^`_9HE$?GZ#[`2-1"0.4%-#5?^5A`$``(/$$(7`#X3:"```9HM$)`IFP>@*
+M9HF$?H0```!FBT0D"F;!Z`2#X#]FB81^B@````^W1"0*P>`"@^`_9HF$?I``
+M``"#[`2-1"0.4%-#5?^5A`$``(/$$(7`#X23"```9HM$)`IFP>@.9@F$?I``
+M``!F#[9$)`N#X#]FB81^E@```&:+1"0*9L'H`H/@/V:)A'Z<````#[=$)`K!
+MX`2#X#]FB81^H@```(/L!(U$)`Y04T-5_Y6$`0``@\00A<`/A#L(``!FBT0D
+M"F;!Z`QF"81^H@```&:+1"0*9L'H!H/@/V:)A'ZH````9HM$)`J#X#]FB81^
+MK@```(/L!(U$)`Y04T-5_Y6$`0``@\00A<`/A/<'``!F#[9$)`N(1#=4@_\!
+M=%"#_P%_"X7_=`[I_@```(GV@_\"=%SK>6:+1"0*B<)FP>H%@^('9HF6\```
+M`&;!Z`*#X`=FB8;R````#[=$)`K1X(/@!V:)ANP```#K0XUV`&:+5"0*B=!F
+MP>@$@^`'9HF&]````(/B!V:)EO8```#K'V:+5"0*B=!FP>@$@^`'9HF&^```
+M`(/B!V:)EOH```"%_W5X@^P$C40D#E!30U7_E80!``"#Q!"%P`^$10<``&:+
+M5"0*B=!FP>@/9@F&[````(G09L'H#(/@!V:)ANX```")T&;!Z`F#X`=FB8;H
+M````B=!FP>@&@^`'9HF&Z@```(G09L'H`X/@!V:)AN0```"#X@=FB9;F````
+M@^P$C40D#E!30U7_E80!``"#Q!"%P`^$V@8``&8/MD0D"V:)1'X\9@^V1"0*
+M9HE$?D*#[`2-1"0.4%-#5?^5A`$``(/$$(7`#X2U!@``9@^V1"0+9HE$?DAF
+M#[9$)`IFB41^3H/L!(U$)`Y04T-5_Y6$`0``@\00A<`/A)`&``!F#[9$)`N(
+M1#=79@^V1"0*9HE$?EKV1'Y:@'0*#0#___]FB41^6H/L!(U$)`Y04T-5_Y6$
+M`0``@\00A<`/A%L&``!FBT0D"F;!Z`4E_P```&:)1'Y@9HM$)`IFT>B#X`]F
+MB41^9F:+1"0*@^`!9HE$?FQF@3[_/W8OA?]T!X/_`G04ZR1FBT0D"F;!Z`V#
+MX`%FB48DZQ)FBT0D"F;!Z`V#X`%FB48FB?9F@3X",`^&E0```(/L!(U$)`Y0
+M4T-5_Y6$`0``@\00A<`/A-L%``!FBT0D"F;!Z`:#X']FB81^M````(/_`702
+M@_\!?P:%_W1+ZU6#_P)T(^M.9HM$)`J)PH/B!V:)EOP```!FP>@#@^`'9HF&
+M``$``.LM9HM$)`J)PH/B!V:)EOX```!FP>@#@^`'9HF&`@$``.L,9HM$)`J#
+MX#]FB4829H$^`S`/AID```!FBT0D"F;!Z`UFB81^N@```(/L!(U$)`Y04T-5
+M_Y6$`0``@\00A<`/A#<%```/MT0D"L'@`X/@.&8)A'ZZ````@_\"=2!FBU0D
+M"HG09L'H`XA&(&:!/@5`=@N)T&;!Z`MFB48JD(7_=3YF@3[_/P^&S0,``&:+
+M5"0*B=!FP>@(@^`_9HF&1@$``&;!Z@.#XA]FB99*`0``ZPYFQX1^N@````H`
+MQD8@#V:!/O\_#X:/`P``@_\!=""#_P%_#87_#X25`@``Z7@#``"#_P(/A)L`
+M``#I:@,``(/L!(U$)`Y04T-5_Y6$`0``@\00A<`/A'X$```/MD0D"E!6Z';9
+M__^#Q`AFB894`0``#[9$)`M05NA@V?__@\0$9HF&5@$``(U$)`Y04U7_E80!
+M``"#Q!"%P`^$1P0```^V1"0*4%;H,MG__X/$"&:)AE@!``!F@3X`0`^&Z0(`
+M`&8/MD0D"X/@/V:)AL(```#IU`(``(/L!(U$)`Y04T-5_Y6$`0``@\00A<`/
+MA`($```/MD0D"E!6Z.#8__^#Q`AFB89.`0``#[9$)`M05NC*V/__@\0$9HF&
+M4`$``(U$)`Y04T-5_Y6$`0``@\00A<`/A,H#``!FBT0D"HG"@^)_9HE6$&;!
+MZ`>#X#]FB484@^P$C40D#E!30U7_E80!``"#Q!"%P`^$H@,```^V1"0*4%;H
+M9MC__X/$"&:)AE(!``!F@3X`0'809@^V1"0+@^`_9HF&Q````(/L!(U$)`Y0
+M4T-5_Y6$`0``@\00A<`/A&8#``!FBU0D"HG09L'H"(/@/V:)AD@!``!FP>H#
+M@^(?9HF63`$``&:!/@%`#X;'`0``@^P$C40D#E!30U7_E80!``"#Q!"%P`^$
+M*0,``&:+5"0*9@^VPF:)1BAF@3[_3P^&DP$``(G09L'H"(/@?V:)AM8```")
+MT&;!Z`]FB8;:````@^P$C40D#E!30U7_E80!``"#Q!"%P`^$Y0(```^W1"0*
+M@^`?T>!F"8;:````9HM4)`J)T&;!Z`6#X#]FB8;B````9L'J"XB6W0```(/L
+M!(U$)`Y04U7_E80!``"#Q!"%P`^$IP(```^W1"0*@^`'P>`%"(;=````9HM$
+M)`IFP>@#B(;?````Z>H```")]F:!/@!`#X;=````@^P$C40D#E!30U7_E80!
+M``"#Q!"%P`^$9@(``&:+5"0*B="#X#]FB8;`````9H$^_T\/AJ4```")T&;!
+MZ`:#X']FB8;4````B=!FP>@-9HF&V````(/L!(U$)`Y04T-5_Y6$`0``@\00
+MA<`/A!X"```/MT0D"H/@!\'@`V8)AM@```!FBU0D"HG09L'H`X/@/V:)AN``
+M``!FP>H)B);<````@^P$C40D#E!35?^5A`$``(/$$(7`#X3?`0``#[=$)`J#
+MX`'!X`<(AMP```!FBT0D"F;1Z(B&W@```)!'@_\"#XX']___9H$^`C`/A^,!
+M``"#[`2-1"0.4&CL````5?^5A`$``(/$$,=$)`0`````A<`/A'`"``!FBT0D
+M"HG"@^('9HF6_````&;!Z`.#X`=FB88``0``@^P$C40D#E!H[0```%7_E80!
+M``"#Q!#'1"0$`````(7`#X0J`@``Z5(!``#'1"0$`````.D8`@``QT0D!```
+M``#I"P(``,=$)`0`````Z?X!``#'1"0$`````.GQ`0``QT0D!`````#IY`$`
+M`,=$)`0`````Z=<!``#'1"0$`````.G*`0``QT0D!`````#IO0$``,=$)`0`
+M````Z;`!``#'1"0$`````.FC`0``QT0D!`````#IE@$``,=$)`0`````Z8D!
+M``#'1"0$`````.E\`0``QT0D!`````#I;P$``,=$)`0`````Z6(!``#'1"0$
+M`````.E5`0``QT0D!`````#I2`$``,=$)`0`````Z3L!``#'1"0$`````.DN
+M`0``QT0D!`````#I(0$``,=$)`0`````Z10!``#'1"0$`````.D'`0``QT0D
+M!`````#I^@```,=$)`0`````Z>T```#'1"0$`````.G@````QT0D!`````#I
+MTP```&:+1"0*B<*#X@=FB9;^````9L'H`X/@!V:)A@(!``!FQX9@`0``!`!F
+MQX9>`0```0!FQX9<`0```0!FQX9:`0````"+!"2+6!2_`````&:#O@0!````
+M=$6-=@"#[`2-1"0.4%-#5?^5A`$``(/$$(7`=(!F#[9$)`MFB81^!@$``&8/
+MMD0D"F:)A'X(`0``@\<"#[>&!`$``#GX?[YF@3X",'<F9L=&6LK_9L=&7/__
+M9L=&7O__=Q)FQT9"#P!FQT9$'`!FQT9&'`#'1"0$`0```)"+1"0$@\0,6UY?
+M7<-64X/L#(MT)!B+7"0<4U;H0/+__X/$$+H`````A<!T5(/L"%-6Z(+3__^#
+MQ!"Z`````(7`=#Z#[`A35NA,Z/__@\00N@````"%P'0H@^P(4U;HFNO__X/$
+M$+H`````A<!T$H/L"%-6Z.#M__^)PH/$$(UV`(G0@\0$6U[#BT0D!`^W@-0!
+M```E_[\``,.-=@!3BUPD#+D`````B?8/O]&-!%)F.9P`(`L``'4$B=#K#$%F
+M@_DJ=N6X_____UO#B?93BUPD#+D`````B?8/O]&-!%)F.1S%X````'4$B=#K
+M#$%F@_EL=N6X_____UO#B?975E.+7"00BW0D%(M\)!A3Z'?___^#Q`2)P;@`
+M````9H7)>&B!X?\/``!T-KH`````C78`C035`````"G09CD,Q>`0``!U%87V
+M=`-FB0Z%_W0"B1>X`0```.LQD$*#^@IVTK@`````@[NP`0``!G4<A?9T"6:A
+MX!```&:)!H7_=`;'!P````"X`0```%M>7\-75E.+="00BT0D%(M\)!AFA<!U
+M,&H05NCT_O__B<-6Z-C^__^#Q`QFA<!T.@^WP%!6Z-K^__^#Q`AF@_C_=">)
+MP^LCD`^WP%!6Z/+^__^8C01`#[<$Q>(```!05NBO_O__B<.#Q!#WQX````!T
+M$@^_PXT$0`^WA``D"P``ZQ")]@^_PXT$0`^WA``B"P``6UY?PXGVBU0D"+@H
+M````]L(0=1*X!0```/?"@````'4%N!0```##C78`BU0D"/;&`707B=#!Z`2#
+MX`&#^`$9P(/@#H/``\.-=@"X`````/?"@````'02B=#!Z`2#X`&#^`$9P/?0
+M@\`(PXM4)`CVQ@%T$[A`#@``]L(0=26X0`P``,.-=@"X`````/?"@````'0/
+MN.`.``#VPA!U!;C`#P``PXUV`%575E.#[""+1"0X9HE$)!Z+5"0\9HE4)!S'
+M1"04!!8``(%\)!08%@``#X,P`0``9HM$)!Z+3"049H4!#X0+`0``#[=9`E/_
+M="0XZ'7___^#Q`B)1"084_]T)#CH)/___X/$"(E$)`Q3_W0D..CO_O__@\0(
+M9HE$)!*]`````#ML)`P/C<0```"^`````(U$+0")P@'HC02`BTPD&&:#?$$"
+M``^$E@````^W1"02B40D"(E4)`2)%"2-!"J-!("-%':-!!"+5"08C01"9HM(
+M!F8Y2`AR3HM\)`B+1"0$`>B-!("-%':-!!"+5"08C1Q"D&8[3"0<=0V+3"04
+M#[=!`NMCC78`#[?1C8$P]O__9CW<`'8%C00ZZP.-0A2)P68Y0PASS4:+%"2-
+M!"J-!("+3"08#[=$00(Y\`^/>O___T4[;"0,#XP_____C78`@T0D%`2!?"04
+M&!8```^"T/[__[@`````@\0@6UY?7<.+1"0(@_@@=R?_)(48%@``N$`!``##
+MN*````##N,````##N%`!``##N-````##B?:X`````,.)]E575E.+="04#[=<
+M)!Q35N@,_O__@\0(B<535NC`_?__@\0(B<=3#[=$)!Q05NCV_/__B<&Z````
+M`(/$##GZ?1F-!%*-!(#1X&8Y#"AU!@'HZPR)]D(Y^GSGN+`0``!;7E]=PY`/
+MMT0D#%`/MT0D#%#_="0,Z(?___\/MP"#Q`S#4_]T)`CHFOO__X/$!(G!9H7`
+M>22)PX'C_W\``+H`````C78`C0129CD<Q>````!T0T*#^FQV[9`/M\&#Z$"#
+M^`MW.?\DA9P6``"XB`$``.LPN(@!``#K*;B+`0``ZR*XB@$``.L;N(P!``#K
+M%+B-`0``ZPT/M\/K"(UV`+@`````6\.0:@!J`/]T)`SHA_O__X/$#,.-=@`/
+MMT0D!(/X"'\.@_@'?1&#^`-T#.L2B?8]F`$``'4)D+@!````PXGVN`````##
+MB?:+3"0(N@````"-=@"-!%+!X`-F.8C@````=0F+@.P```##B?9"@_IL=N*X
+M`````,-H0`$```^W1"0,4/]T)`SHG/O__P^WP%#H@____X/$$(7`#Y3`#[;`
+MPXUV`%575E.#[`2+="085NA/____@\0$A<!T=&:+KM0!``"Z`````(T$U0``
+M``")P2G0P>`#9CFHX!```'5!NP````!F@[CL$````'0RO_`0``")SHUV`(G(
+M*="-!$.#/(<`=`B+!(?V``)U:$.)\8GP*=`/MP3%[!```#G8?]A"@_H*=J*X
+M`````.F\````5NCN^?__@\0$B<-FA<!Y2HG!@>'_?P``N@````"-=@"-!%+!
+MX`-F.8C@````=0F#N/``````=11"@_IL=N*X`````.MWN`$```#K<+@!````
+MZVFX`0```.MB:%`!``!6Z(O[__^#Q`B)!"1H4`$``%;H.OO__X/$"(G'#[?#
+M4%;H@_G__YB-!$!FBZP`(@L``+H`````@\0(.?I]%XUV`(T$4HT$@(L,)&8Y
+M+$%TI$(Y^GSLN`````"-=@"#Q`1;7E]=PXM,)`BZ`````&:%R746_W0D!.B9
+M_O__@\0$PXN`\````,.)]HT$4L'@`V8YB.````!TZ$*#^FQVZ[@`````PY!3
+MBUPD#+D`````B?:-!$F-%,4`````9CF:X````'4-N/````"+1`($ZPV)]D&#
+M^6QVVK@`````6\.-=@!55U93@^P$BWPD',<$)`````"+1"0@9HMH`H'E\`$`
+M`+X`````C78`C01VC1R%`````&8YNR`7``!U-?]T)!CH</C__X/$!&8Y@R(7
+M``!T"F:#NR(7````=1:-!'9F.2R%)!<``'4)QP0D`0```.L&1H/^$':R@SPD
+M`'1:C01VP>`"@[@H%P```'1+BX@H%P``QP0D`````+X`````9H-Y`@!T,@^W
+M60*+5+$$9H,Z`'0?B?9FBP*+?"0@9CL'=0BX`0```.L2D(/"`F:#.@!UXT8Y
+M\W_2BP0D@\0$6UY?7<.-=@!75E.+?"04_W0D$.C`]___@\0$B<:Z`````(GV
+MC035`````"G09CDTA0`"``!U,;D`````C035`````"G0C1R%`````(T$RV8Y
+MN`0"``!U"(N`"`(``.L308/Y`G;FB?9"@_H&=K:X`````%M>7\.0BU0D!+@!
+M````]H+5`0``0'4>N`````"#NK`!```&=!!J`&H`4NBJ]___@\0,C78`PXUV
+M`%.+7"0,N`$```!FA=MT;?]T)`CH%/?__X/$!(G!9H7`>14/M\.)RH'B_W\`
+M`#G0#Y3`#[;`ZT5F/?\!=`JZ`````&:%P'41N`$```#K+K@!````ZR>-=@"-
+M!%+!X`-F.9C@````=0EF.8CB````=-Y"@_IL=N*X`````)!;PXGV_W0D!.BC
+M]O__@\0$B<&Z`````&:%P'DL@>'_?P``B?:-!%)F.0S%X````'0(0H/Z;';M
+MZR*X`0```,.X`0```,.-=@"-!%)F.8P`(`L``'3J0H/Z*G;MN`````##C78`
+M55=64X/L/(M$)&!FB40D-(U$)#A0C40D.E#_="18Z)WV__^#Q`RZ`````(7`
+M#X2K`@``BT0D.(T4Q0`````IPL'B`XN"Y!```(M,)%")@=@!``"#?"1D`'4,
+M@<)@$P``B50D,.L8BU0D.(T$U0`````IT(T$Q>`0``")1"0PQT0D+`````"#
+M[`S_="1<BU0D8/^2@`$``(E$)#C'1"0T`````(/$$(M,)#!F@WD,``^$%P(`
+M``^W1"0TB40D#(GVBU0D)(M,)#"+;)$0#[=U`,=$)"``````BT4$9H,X``^$
+MT0$```^W1"0TB40D$(M4)`R)5"0<P>H#B50D&(M,)!S!Z0*)3"04A70D*`^$
+MC@$``(M<)!"%WG4B5O]T)%3HS/C__X/$"*F`````#X1N`0``]L,L#X1E`0``
+MD(M$)%@Y1"0L#X."`0``BT4$BU0D(`^W/%`/M\=0#[?&4/]T)%CH'O?__P^W
+MV(/$#/?#@````'0DB=@ET````#W0````=!:!XP_^___V1"08`70%@,O`ZP2`
+MRZ"0A=L/A``!``"`Y_WWQ@P```!T68'_J`D``'0:@?^H"0``=PJ!_Z,)``!T
+M"NL/@?^T"0``=0>X`0```.L%N`$```"%P'0J@?^T"0``=0:`XS^`RZ`/M\=0
+M_W0D5.B$_/__@\0(A<!T"(#/`NL#@,\"BTPD+(M$)%1FB3R(9HE<B`)!B4PD
+M+(M4)%0/MT2*_B70````/<````!U*O9$)!0!=".+1"18.<$/@X<```"`XS^`
+MRZ!FB3R*9HE<B@)!B4PD+(UV`(M4)"R+3"14#[=$D?XE4`$``#U0`0``=2OV
+M1"0<`70DBT0D6#G"<TB!XZ_^__^!RT`!``!FB3R19HE<D0)"B50D+(GV_T0D
+M((M%!(M4)"!F@SQ0``^%4O[___]$)"2+3"0P#[=!##M$)"0/C_3]__^+1"1<
+MBU0D+(D0A=(/E<`/MM")T(/$/%M>7UW#BU0D!(M,)`AFBP)F.P%U&`^W4@*!
+MXO`!```/MT$")?`!```IPNL)D`^W$@^W`2G"B=##D%575E.#["R+?"1`BUPD
+M4(M$)%1FB40D(F;'1"0:6!M7Z%_\__^#Q`2Z`````(7`#X2C`P``5^A1]___
+M9HF'U@$``%?HR/?__X/$"(7`=`K'A]P!```!````9H._U@$```!U(0^WPU!7
+MZ)?[__^#Q`BZ`````(7`#X1;`P``9HF?U@$``(/L"`^WA]8!``!05^C\____
+MB40D+%?H,?O__X/$%(7`=$*#[`C_="1D9HM$)"XC1"0H#[?`4/]T)%S_="1<
+M_W0D7%?H&/S__X/$(+H`````A<`/A/P"``"+5"1,BRKI?`(``)"#?"18`'41
+M9H'[2`-U"F;'1"0:71:-=@"]`````+X$%@``@?X8%@``#X--`@``B?9FBUPD
+M(F:%'@^$+@(```^W!H5$)!P/A"$"``"-1"0J4(U$)"Q0#[=&`E!7_Y=X`0``
+M@\00A<`/A``"```/MT8"4`^WA]8!``!05^BE]?__B40D(`^W7@)35^A2\___
+M@\0(9HE$)!Y3#[>'U@$``%!7Z./U__]FB40D*,=$)"0`````@\08BT0D%&:#
+M>`(`#X2H`0``BU0D#(T$4HM<)!2-!$-FBU@&9CE8"`^"<P$``(U$)"2)1"0$
+M9CE<)"@/AT4!``!F.UPD*@^'.@$``&8[7"0:#X<O`0``9H'[M`EU#&:!?@+`
+M``^$'`$```^WPXM4)%P]J`D``'07/:@)``!W"3VC"0``=`GK"SVT"0``=02)
+MT.L%N`$```"%P`^$Y@```#ML)$@/@Q\!``!FB5PD)(U4)"1FBT8"9HE"`F:!
+M^[0)=0@D/PR@9HE"`HU4)"2)5"0(9H%B`O_]4@^W1"044%?H_??__X/$#(7`
+M=`R+1"0(9H%(`@`"ZU,/MP:H#'1,#[?#/:@)``!T%SVH"0``=PD]HPD``'0)
+MZPX]M`D``'4'N`$```#K!;@!````A<!T&P^WPU!7Z(SX__^#Q`B%P'0*BU0D
+M!&:!2@(``HM$)"2+5"1$B02J10^W1*K^)5`!```]4`$``'4>]D0D(@%T%SML
+M)$AS5(M$)`1F@V`"[XM$)"2)!*I%9@-<)!*+5"0,C012BU0D%&8Y7$((#X.5
+M_O___T0D#(M<)!0/MT,".T0D#`^'6_[__XUV`(/&!('^&!8```^"M?W__X7M
+M=%5H@$4``&H$5?]T)%#H;`8``(/$$(/]0'8%O4````")K_@'``"Y`````#GI
+M<RB-!$F-!,>+7"1$9HL4BV:)D/@!``!FBU2+`F:)D/H!``!!.>ERVHGVBT0D
+M3(DH9HN'U@$``&:)1QB%[0^5P`^VT(UV`(G0@\0L6UY?7<.)]E575E.+3"04
+MBUPD&`^W>P*!Y_`!``"+D?P'``"%TG0<9HL"9CL#=10/MT(")?`!```Y^'1=
+MZP6)RNM7D(VQ^`$``(N1^`<``(72=$$/MQN0B=#1^(T$0(T,Q@^W`8G=*<6)
+MZ'4<#[=!`B7P`0``.?ATQ0^W00(E\`$``(G]*<6)Z(7`?@2-<1A*T?IUP[H`
+M````B=!;7E]=PXUV`%575E.#[`R+1"0D9HL`9HE$)`J+5"0@xxxxx@$````/
+MA?D```!2Z(7N__^#Q`1FB40D"+@`````9H-\)`@`>!*+1"0()?\/``#K!XG0
+MZ2(!``!FB40D"&:%P`^$O@```+\`````C78`C03]`````"GXBUPD"&8Y',7@
+M$```#X61````BVPD)`^W70)3_W0D).@7\/__@\0(B<93_W0D).C([___@\0(
+MB40D!+L`````.<-]8+D`````C00;B<(!V(T$@&:#?$8"`'0_B10DB?:-!!J-
+M!("-%$F-!!"-!$:-4`9FBVPD"F8Y:`9W"F8Y:@(/@U3___]!BQ0DC00:C02`
+M#[=$1@(YR'_&0SM<)`1\HXUV`$>#_PH/ADK___^+5"0D#[="`E"+7"0D#[>#
+MU@$``%!3Z%/Q__^)QK\`````@\0,9H-X`@!T)0^W2`*)]HT$?XT41HU"!F:+
+M;"0*9CEJ!G<&9CEJ"',*1SGY?^&X`````(/$#%M>7UW#_W0D"/]T)`CH=_[_
+M_X/$"+H`````A<!T&P^V4`71XHM$)`PHT`^^T(3`>0BZ`````(UV`(G0PY!5
+M5U93@^P<BWPD,(''Y`$```^V1P&#Z`.)1"00QT0D%`````"#^`(/CHD```"-
+M=@"+5"04C012`?AF#[90!6:)5"0:BE@'O@````"`>`8`=%&+1"04C2Q`A-MT
+M/(M4)#@X6@1R,XM$)#0/MP")1"0,@^P(BU0D/`^W0@)0#[=$)"90Z/S___^#
+MQ!`Y1"0,=0@/ML/K*8UV`$8/MD0]!CGP?[:#;"00`_]$)!2#?"00`@^/>O__
+M_XM4)#@/MD($@\0<6UY?7<.)]E93@^P$BUPD$(MT)!2#N]P!````=#.Z$@``
+M`/9&`H!U9[H`````9HL.C78`C012T>!F.XA`````<@EF.XA"````<CM"@_H&
+M=N-64^@T_?__@\0(N@4```"%P'0L@[O@`0```'03@^P$4%93Z,C^__\/MM"#
+MQ!#K$`^V4`3K"@^VD$0```"-=@")T(/$!%M>PU575E.#[!"+1"0D9H.XU@$`
+M```/A1(!``!0Z(7K__^#Q`1FB40D#HM4)"AFBQ)FB50D#+@`````9H-\)`X`
+M>!1FBT0D#B7_#P``ZPB-!#GI]0```&:)1"0.9H7`#X3)````QT0D"`````")
+M]HM$)`C!X`,K1"0(9HML)`YF.2S%X!````^%D@```(M$)"@/MU@"4_]T)"CH
+M!.W__X/$"(G'4_]T)"CHM>S__X/$"(E$)`2^`````#G&?6&0NP````"-!#:)
+MP@'PC02`9H-\1P(`=$")%"2)]HT$,HT$@(T,`(T$6XT$00'XC5`&BVPD#&8Y
+M:`9W"F8Y:@(/@TS___]#BQ0DC00RC02`#[=$1P(YV'_%1CMT)`1\HHGV_T0D
+M"(-\)`@*#X9!____BU0D*`^W0@)0BVPD*`^WA=8!``!05>@Z[O__@\0,@\00
+M6UY?7<.-=@!3BUPD#%/_="0,Z)W^__\/ME`$#[=#`B7`````@\0(/<````!U
+M$HG0@^`/@_@!=0B#XO"#R@*)]HG06\-75E.+?"00BW0D%(/L#%?_EX`!``")
+MPX/$$*@"="H/M\905^B\\/__@\0(A<!U`X/C_0^WQE!7Z.CP__^#Q`B%P'4%
+M@^/?B?;VPP%T%P^WQE!7Z!'O__^#Q`B%P'4&@^/^C78`]L,(=!</M\905^C%
+M[O__@\0(A<!U!H/C]XUV`(G86UY?PXGVBU0D!(M$)`@/MT`"4`^W@M8!``!0
+M4NAUZO__N@````"#Q`RY[!<``&8Y!%%U!K@!````PT*#^@5V[K@`````PU57
+M5E.#[`R+;"0HBT0D((E$)`0!Z(D$)(M$)"1(B40D"'1#BSPDBT0D!#G'=B^)
+M]HG^*>Z#[`A75O]4)#R#Q!"%P'X9B?F)ZXH6B@&(!D:($4%+=?,I[SM\)`1W
+MTP$L)/],)`AUO8/$#%M>7UW#D)!55U93@>RH````BZPDO````&B4"0``Z/S_
+M__^)PX/$$+X"````A<`/A&@%``")QX/L!&@`"```:``8``!0Z/S___^+A"3$
+M````B4,,BX0DR````(E#$(N$),P```")0Q1FB:N@`0``9L>#H@$`````9L>#
+MS`$``#P`QX/0`0```````,>#Q`@```````#'@X0)````````QX.("0``____
+M_\>#C`D``/_____'@Y`)``#_____@\0(:@!3Z/S___^#Q!"^`P```(7`#X3%
+M!```QX.D`0```0```(M#%(N0($```&8/MM)FB9.H`0``BY`8F```9HF3J@$`
+M`&;'@ZX!`````,>`T)@``!8<``"^`````)"+1Q3'@("8``````$`1H/^`W;M
+MBT<4BX``G```P>@<@^P(:@10Z/S___]`9HF'K`$``(M7%(N"$$```(E$)!B#
+MR`&)@A!```"#Q`R-1"024&H]5^C\____@\00O@@```"%P`^$#`0``+X$````
+M9H%\)`ZE6@^%^@,``(/L!(U$)!)0:C]7Z/S___^#Q!"^"````(7`#X3:`P``
+M9HM$)`YFB8,""```@^P$C40D$E!HP0```%?H_/___X/$$+X(````A<`/A*L#
+M``!FBT0D#F;!Z`QFB8,`"```O@4```!F@_@!#X6,`P``O0````"^`````(GV
+M@^P$C41T%%"-AL````!05^C\____@\00A<`/A%@#```/MT1T$#'%1H/^/W;3
+MO@<```"!_?__```/A4(#``"#[`2-1"024&B_````5^C\____@\00O@@```"%
+MP`^$'P,``&8/MD0D#F:)A]0!``"+1"049HF#!`@``&:+1"069HF#!@@``(M$
+M)!B(@P@(``!F#[9$)!F(@PD(``!FBT0D&HB#"P@``&8/MD0D&XB#"@@``&8/
+MMD0D'8B##@@``(M$)!R(@P\(``!F#[9$)!^(@Q`(``!FBT0D'HB#$0@``(I$
+M)""#X`&(@PP(``"+1"0@9M'H@^`'B(,-"```O@````"]"0```(T4]0`````I
+M\HT4E@':C8H2"```9HM$;!!FP>@*B((2"```9HM$;!!FP>@$@^`_B$$+#[=$
+M;!#!X`*#X#QFBU1L$F;!Z@X)T(A!`8I$;!.#X#^(00QFBT1L$F;!Z`*#X#^(
+M00(/MT1L$L'@!(/@,&:+5&P49L'J#`G0B$$-9HM$;!1FP>@&@^`_B$$#BD1L
+M%(/@/XA!#F:+1&P69L'H"HA!!&:+1&P69L'H!(/@/XA!#P^W1&P6P>`"@^`\
+M9HM4;!AFP>H."="(006*1&P9@^`_B$$09HM$;!AFP>@"@^`_B$$&#[=$;!C!
+MX`2#X#!FBU1L&F;!Z@P)T(A!$6:+1&P:9L'H!H/@/XA!!XI$;!J#X#^(01)F
+MBT1L'&;!Z`J(00AFBT1L'&;!Z`2#X#^(01,/MT1L','@`H/@/&:+5&P>9L'J
+M#@G0B$$)BD1L'X/@/XA!%&:+1&P>9L'H`H/@/XA!"@^W1&P>P>`$@^`P9HM4
+M;"!FP>H,"="(015FBT1L(&;!Z`:#X#^(01:*1&P@@^`_B$$79HM$;")FP>@*
+MB$$89HM$;")FP>@$@^`_B$$9#[=$;"+!X`*#X#QFBU1L)&;!Z@X)T(A!&HI$
+M;"6#X#^(01MFBT1L)&;!Z`*#X#^(01Q&@\4+@_X$#X82_O__@^P,5^CW````
+MO0````"^`````(/$$(/L!(U$)!)0N!\````I\%!7Z/S___^#Q!"%P'1*#[=$
+M)`X!Q68/MD0D#XB$<Z,(``!FBT0D#HB$<Z0(``!&@_X"=KV%[70(@?W]_P(`
+M=0>^"0```.L@BT<4BU0D"(F0$$```(GXZT2^"````.L5O@@```"-=@"+1Q2+
+M5"0(B9`00```A=MT#(/L#%/H_/___X/$$(.\),``````=`F+A"3`````B3"X
+M`````('$G````%M>7UW#@^P8_W0D'.C\____@\0<P[@`````]D0D"0%T%XM$
+M)`QFQP``%(M$)!!FQP`V%;@!````PXM4)`2-@K0!``"#2`0!9L=`#``49L=`
+M#C85@(JT`0```H!@`7]FQT`(`P!FQT`*0`"X`0```,.05E.+3"0,BW0D$(M<
+M)!2+012)L"R```"#N;`!```!=#R+412)\"L%`````,'@`XF",(```(M1%(GP
+M*P4`````P>`#B8(T@```BU$4B?`#@80)``")@CB```#K*9"+013'@#"```#_
+M____BT$4QX`T@```_____XM!%,>`.(````$```"0@>/__X`!BT$4B9@D@```
+M6U[#B?964X/L!(MT)!"[,@```(M6%(M"+*@$=0B+0@BH`G0^D(/L#&H!Z/S_
+M__^#Q!!+=1R+1A2+5"04B5`$BT84QT`H"@```+@`````ZQ>0BU84BT(LJ`1U
+MRHM""*@"=<.X`0```(/$!%M>PXM4)`2+0A3'@"R`````````BTH4BX$$@```
+M#0``$``E__]?_XF!!(```(M"%,>`)(```/__``##5E.+="0,BTPD$&:#>1(`
+M=$>+5A2+@@2````E__]__PT``"``B8($@```BU84#[=!$(F"*(```(M6%`^W
+M01*)@DB```"+5A2+013!X`.)@C2```#K%XUV`(M6%(N"!(```"7__U__B8($
+M@```BU84BP&)@BR```"+7A2+@R2````E``"`_P^W40@)PF:#>1@`=!$/MT$8
+M@\`$P>`0)0``?P`)PHF3)(```&:#OJ@!```#=B4/MT$:J`=T'8M.%(N1&(``
+M`(#F^,'@""4`!P``"<*)D1B```"06U[#D(M$)`2+0!2+@`A```"%P`^5P`^V
+MP,.)]E.+7"0,BTPD"(M!%(M0'(/Z_W40QP,`````N`````#K.8UV`(G0(X&L
+M"```);K8!0&)`_?"(`!P`'0'#0```$")`_;"!70#@PL!]\+`!0``=`.#"T"X
+M`0```%O#BT0D!(N`K`@``,.05U93BW0D$(M<)!2)\8N^K`@``(7_>0V+1A3'
+M0"0`````C78`B=J!XKK8!0'VPP%T`X/*!?;#0'0S@[FP"````'0#@\I`@[FT
+M"````'0#@,X!@[FX"````'0#@,J`@[F\"````'0&@,X$C78`BT84B5`@B9FL
+M"```A=MY#(M&%,=`)`$```")]HGX6UY?PY"0N$````##B?:+1"0(9H/X/W<?
+M#[?`P>`%BU0D!`-"%(N`')```+H!````J0"```!U!;H`````B=##C78`BTPD
+M!(M$)`BZ`````&:#^#\/AX$````/M\#!X`6)P@-1%,>"`)````````")P@-1
+M%,>"!)````````")P@-1%,>"")````````")P@-1%,>"#)````````")P@-1
+M%,>"$)````````")P@-1%,>"%)````````")P@-1%,>"&)`````````#013'
+M@!R0````````N@$```")T,.05U93BWPD$(M4)!B+="04N`````!F@_X_=VJ%
+MTG0X#[9:!<'C"`^V0@0)PP^V2@/!X1@/MD("P>`0"<$/MD(!P>`("<$/M@()
+MP='IB=C!X!\)P='KZPJ[`````+D`````#[?&P>`%B<(#5Q2)BAB0```#1Q2)
+MVH#.@(F0')```+@!````6UY?PU575E.#[!"+="0LBT0D*&:)1"0.@WPD-`$9
+MR??1@>&JJJJJN`````!F@WPD#C\/AU`!``"X`````(`^``^%0@$``+@`````
+M9H-^`@0/AC(!``#'!"0`````9H-^`@5V$&:#?@(.&=*#XOZ#P@.)%"0/MFX$
+M#[9&!<'@"`G%#[9&!L'@$`G%#[9&!\'@&`G%,<T/MD8)P>`(#[96"`G",<J!
+MXO__``")5"0(#[9^"@^V1@O!X`@)QP^V1@S!X!`)QP^V1@W!X!@)QS'/#[9&
+M#\'@"`^V5@X)PC'*@>+__P``B50D!`^V7A`/MD81P>`("<,/MD82P>`0"<,/
+MMD83P>`8"<,QRV:#?@(-=P:!X_\````/MTPD#HG(P>`%B<*+="0D`U84B:H`
+MD```B<(#5A2+="0(B;($D```B<*+="0D`U84B;H(D```B<(#5A2+="0$B;(,
+MD```B<*+="0D`U84B9H0D````T84BQ0DB9`4D```_W0D,%%6Z/S___^#Q`R-
+M=@"#Q!!;7E]=PX/L$&H&BT0D&`6C"```4/]T)"#H_/___X/$',.#[!!J!O]T
+M)!R+1"0<!:,(``!0Z/S___^X`0```(/$',.-=@!3@^P(BUPD$(M3%(M$)!2+
+MA((`8```:@)J`V@`;```4^C\____@\00N@````"%P'05BT,4BY``:```BT0D
+M&&:)$+H!````B="#Q`A;PXUV`%.+7"00BTPD"+H,````BT0D#&8Y@=0!``!T
+M&`^W@0((``#!Z`>#X`&#^`$9TH/B^(/""X7;=`*)$[@`````6\.X`0```,.)
+M]HM$)`2`N`P(````#Y7`#[;`PXGV4X/L$(M<)!AJ`%/H_/___X/$#(7`#Y3`
+M#[;`4&H`4^C\____@\086\.-=@!3BT0D"(M8%(M,)`S1X;H#````T^+WTHN#
+M%$```"'"N`(```#3X`G"B9,40```N`$```!;PXUV`%.+1"0(BU@4BTPD#-'A
+MN`,```#3X/?0BY,40```(=")@Q1```"X`0```%O#4XM,)`R+1"0(BU@4BY,8
+M0```N/[____3P"'"BT0D$(/@`=/@"<*)DQA```"X`0```%O#D(M,)`BX____
+M_X/Y!7<5BT0D!(M`%(N`'$```(/@+]/H@^`!PU93@^P$BW0D$(M,)!2+1A2+
+MF!1```")RL'B#-'AN`,```#3X`G0#0"``0#WT"'#"=.`SX"#?"08`'0&@<L`
+M``$`BT84B9@40```@^P(BX:L"```#0````%05NC\____@\046U[#C78`4XM<
+M)`B+3"0,BT,4BY`00```A<ET"H/Y!'0-ZQ.-=@"#XI_K$8UV`(/BWX/*0.L&
+M@\H@@^*_BT,4B9`00```6\.-=@"+1"0$BT`4BX`$@```P>@7@^`!@_@!&<"#
+MP`+#BTPD!(M4)`B+012+@`2```"I``"``'0(@_H"=0C#B?:#^@%T#HM1%`T`
+M`(``B8($@```PU93@^P(BW0D%(M<)!QJ!O]T)!R-AL@(``!0Z/S___^+3A0/
+MMI;("```#[:&R0@``,'@"`G"#[:&R@@``,'@$`G"#[:&RP@``,'@&`G"B9$(
+M@```@\00BTX4#[:&S0@``,'@"`^VELP(```)PHG8)?\_``#!X!`)PHF1#(``
+M`&:%VW05@^P$:@!J`%;H_/___X/$$.L/C78`@^P,5NC\____@\00@\0$6U[#
+MB?93BT0D"(M(%(N!<(```(G"N`````"+B6R```"[``````G("=I;PXGVBT0D
+M!(M`%(N`;(```,.)]HM$)`2+4!2+@B2````-`````8F")(```,.-=@"+5"0$
+MBT(4BX!DF```B<'!Z1.!X?\!``")R,'H"(7`=`:!\0#^__^+4A2+@G"```"+
+MDFR````QT#'(PY"+1"0$#[>0J`$``(M`%(N`($```"7_````.<(/E,`/MM")
+MT,.+3"0$BT0D"(M1%(N2F(````$0BU$4BY*4@````5`$BU$4BY*<@````5`,
+MBU$4BY*0@````5`(BU$4BY*@@````5`0PXM4)`2+0A3'0"0`````BXJL"```
+M@,U`B8JL"```BT(4B4@@BT(4QT`D`0```,.)]E=64XM\)!"+="04B?N#_@AV
+M%H/L"&C__P``5^C\____@\00.?!S$I#'@X@)``#_____N`````#K(X/L"%97
+MZ/S___^+5Q2)@A"```"#Q!")MX@)``"X`0```(GV6UY?PX/L%(M4)!B+0A2+
+M@!"````E__\``%!2Z/S___^#Q!S#55=64X/L%(ML)"AH_Q\``%7H_/___X/$
+M$#M$)"1S$<>%C`D``/____^X`````.L\BW44BYX4@```@>,`X/__@^P(_W0D
+M+%7H_/___R7_'P``"<.)GA2```"#Q!"+1"0DB86,"0``N`$```"0@\0,6UY?
+M7<.#[!2+5"08BT(4BX`4@```)?\?``!04NC\____@\0<PU575E.#[!2+;"0H
+M:/\?``!5Z/S___^#Q!`[1"0D<Q''A9`)``#_____N`````#K0(MU%(N>%(``
+M`('C__\`X(/L"/]T)"Q5Z/S____!X!`E``#_'PG#B9X4@```@\00BT0D)(F%
+MD`D``+@!````B?:#Q`Q;7E]=PX/L%(M4)!B+0A2+@!2````E``#_'\'H$%!2
+MZ/S___^#Q!S#D+@`````PXGVPXUV`,.-=@"#[`R+1"04BU0D&(/X`74,@_H!
+M&<#WT(/@#>L2_W0D'%)0_W0D'.C\____@\00@\0,PXGV@^P,BT0D$(M,)!2+
+M5"0<@_D+=1R#X@:)D,@!``"+0!2)D&B```"X`0```.L9C78`@^P,_W0D+%+_
+M="0L45#H_/___X/$((/$#,.)]H/L%/]T)"S_="0L_W0D+/]T)"S_="0L_W0D
+M+.C\____@\0LPU.+7"0(BTPD$(M3%(N"!(```"7__W__#0``!`")@@2```"#
+M?"0,`'01BU,4#[?!#0```P")@@1```!;PU93@^P$BW0D$(-\)!0`=&2+1A3'
+M@`1`````````@^P,:-`'``#H_/___[L*````@\00B?:+1A2+@!!```"I```!
+M`'0B@^P,:,@```#H_/___XM&%,>`!$````````"#Q!!+==#K!H7;=0J)]K@`
+M````ZQJ0BU84BX($@```)?__>_^)@@2```"X`0```(/$!%M>PY"+3"0$BU$4
+MBX($@```)?__?_\-```$`(F"!(```(-\)`@`=`V+013'@`1```````$`PXGV
+M5U93BU0D$(M<)!2+3"08BT0D'(G6OP$```"#^P)T)8/[`G<(@_L!=`KK.9"#
+M^P-T).LQ#[?`4%%2Z+[^__^#Q`SK*9"#[`A14NCJ_O__B<>#Q!#K%U%2Z'#_
+M__^#Q`CK"XUV`+@`````ZPF0B9[$"```B?A;7E_#BT0D!(N`Q`@``,.0N```
+M``##B?:+1"0$BU`4BX($@```)?__;_^)@@2```"X`0```,.)]HM$)`2+4!2+
+M@@2````E__]__PT``!``B8($@```N`$```##D%.#[`B+1"04@_@!=`^[````
+M`(/X`G05ZPN-=@"[`````.L)D+@`````ZQ.0@^P(4_]T)!SH_/___XG8@\00
+M@\0(6\.0BT0D!(M`%(M`#,.0BT0D!(M0%(M$)`B)0@S#D(M$)`2+0!3'0`@$
+M````PY!64X/L!(MT)!"+1A3'0`@@````NP````"+1A2+0`BH!'4*N`$```#K
+M'HUV`(/L#&H*Z/S___^#Q!!#@?OG`P``?M:X`````(/$!%M>PXUV`(M$)`2+
+M4!2+@FB```"#X+^)@FB```##D(M$)`2+4!2+@FB```"#R$")@FB```##D(M,
+M)`2+412+1"0(B8)0@```BU$4BT0D#(F"5(```,.04XM4)`B+3"0,N`````"#
+M^3]W0H/Y'W8@BU(4BYI4@```@^D@N/[____3P"'8B8)4@```ZQN-=@"+4A2+
+MFE"```"X_O___]/`(=B)@E"```"X`0```%O#D%.+5"0(BTPD#+@`````@_D_
+M=T*#^1]V((M2%(N:5(```(/I(+@!````T^`)V(F"5(```.L;C78`BU(4BYI0
+M@```N`$```#3X`G8B8)0@```N`$```!;PY"+1"0$BT`4BX!,@```PXGVBU0D
+M"/;&`G0&@.;]@\H@BT0D!(M`%(F03(```,.-=@"+5"0,BTPD",=!"`````")
+MT"7_#P``B4$,N``````Y40QU(?9$)!`@=`>!20P`(```QT$4`````,=!$```
+M``"X`0```,.-=@!75E.+?"00BW0D%(GSBT0D'+H/````]D84`0^$!P$``/9`
+M%`%U%8M'%(M`#+H/````.T0D&`^$[````&:+0Q`E_P\``&:)1B"+2Q2!X0"`
+M_P_!Z0^+1Q2+@&R```")PL'J"H'B__\``(G0)?\?```YR',1C8(`X/__)?__
+M```)P>L$B?8)T8G()?]_``!FB48BQD8D`(M#%*@"=3BH!'0(QD8D`>LNB?;V
+M0Q00=`:`3B0(ZR#V0Q0(=`:`3B0$ZQ2`3B0"BT,4)>````#!Z`6(1B6)]HM#
+M$"4``/@'P>@3B$8FBT,4]L0!=`XE`'X``,'H"8A&)^L%D,9&)_^+0Q`E`(`'
+M`,'H#XA&*(M#$,'H#H/@`8A&*8M#$,'H#(/@`8A&*KH`````B=!;7E_#D)"0
+M55=64X/L#(M\)""+;"0LB7PD"+H,````BT0D*/9``P$/A/(%``"#?"0D!G0A
+M@WPD)`9W"8-\)"0!=PGK$8-\)"0(=`JZ#````.G*!0``BT<4BX`00```B<.#
+MXV"#[`C_="0P5^C\____@\00N@,```"%P`^$GP4``(M/%(MT)`@/MI:C"```
+M#[:&I`@``,'@"`G"#[:&I0@``,'@$`G"#[:&I@@``,'@&`G"B9$`@```@WPD
+M)`$/A)T```"#?"0D`7)8@WPD)`9T$(-\)"0(#X3"````Z?D```"+3Q2+1"0(
+M#[:0J`@``,'B"`^V@*<(```)T`T``%$`B8$$@```BT<4QT`H`````(M'%,>`
+M$$```$`0``#IN````(M/%(MT)`@/MI:H"```P>((#[:&IP@```G0#0``4@")
+M@02```"+1Q3'0"@!````BT<4QX`00```)!```.MZBT\4BT0D"`^VD*@(``#!
+MX@@/MH"G"```"=`-```4`(F!!(```(M'%,=`*`````"+1Q3'@!!````D$```
+MZSR+3Q2+="0(#[:6J`@``,'B"`^VAJ<(```)T`T``!``B8$$@```BT<4QT`H
+M`````(M'%,>`$$```$`0``"+5Q2+@A!````)V(F"$$```(M/%(M$)`@/MI#(
+M"```#[:`R0@``,'@"`G"BUPD"`^V@\H(``#!X!`)P@^V@\L(``#!X!@)PHF1
+M"(```(M/%`^VD\T(``#!X@@/MH/,"```"=")@0R```"+1Q3'``````"+1Q3'
+M0`0`````BT<4QT`,`````(M'%(M0',=`(`````"+1Q3'0"0`````QX.L"```
+M`````(M'%(M0+,=`,`4```"+1Q3'0#0%````BT<4QT!$"````(M'%,=`2`@`
+M``"+1Q3'0%``````BT<4QT!,`````(M'%,>`#$````````"+1Q3'0$``````
+MBT<4QX`8@`````<``(M'%,>`2(````````"#[`AJ`%?H_/___XM'%,>`4(``
+M``````"#Q!"+1Q3'@%2`````````BT<4QX!8@````````(M'%,>`7(``````
+M``"+1Q3'@&"````!````BT<4QX!D@````0```(M'%,>`:(````````"+1Q3'
+M@"B`````````BT<4QX`L@````````(M'%,>`;(````````"+1Q3'@#"```#_
+M____BT<4QX`T@```_____XM'%,>`.(````$```"Y`````+X`(```D(L<SH7M
+M=`V-@P"`__\]_P\``'8*BU<4BT3.!(D$&D&!^:8```!VV8/L"/]T)#!7Z/S_
+M__^#Q!"Z`P```(7`#X0H`@``BT\4BY$HF```,/:+="0(#[:&"0@``,'@"`G"
+MB9$HF```BU\4#[:6"@@``(G0P>`8P>(0"=`/MHX+"```B<K!X@@)T`G(B8,T
+MF```BT\4BY%$F```@>)_P/__9HN&!`@``&;1Z"6`/P``"<*)D428``"+3Q2+
+MD4B8``"!XO\/_/\/MX8$"```P>`*)0#P`P`)PHF12)@``(M/%(N19)@``('B
+M_P_X_P^VA@@(``#!X`PE`/`'``G"B9%DF```BT\4BY$0F0``@^+\#[>&!`@`
+M`(/@`PG"B9$0F0``@^P(_W0D,%?HQ`P``(/$$+H#````A<`/A#`!``"+1Q3'
+M@!R8```!````@^P,:.@#``#H_/___XM7%(N"8)@``(/(`8F"8)@``(/$$&H`
+M:@%H8)@``%?H_/___X/$"/]T)#!7Z/S___^#Q!"[`````(7`=1.+1"0H9H-(
+M`@*Z`P```.G&````@^P(4U?H_/___X/$$$.#^P)^[8M4)`B`N@P(````=`R#
+M[`Q7Z/S___^#Q!"+5Q2+@B2````E__]__HF")(```(M<)`B#NX@)``#_=!*#
+M[`C_LX@)``!7Z/S___^#Q!"+="0(@[Z,"0``_W02@^P(_[:,"0``5^C\____
+M@\00BT0D"(.XD`D``/]T$H/L"/^PD`D``%?H_/___X/$$(._R`$```!T#XM7
+M%(N'R`$``(F":(```(M4)"2)E[`!``"X`0```.L0BUPD,(,[`'0"B1.X````
+M`(/$#%M>7UW#BTPD!(M!%(N`!(```"7__P``BY&P`0``@_H!=#.#^@%R'H/Z
+M!G0)@_H(=#/#C78`BU$4#0``40")@@2```##D(M1%`T``%(`B8($@```PY"+
+M410-```4`(F"!(```,.+410-```0`(F"!(```,.)]H/L$&H*:@C_="0<Z#@#
+M``"#Q!S#4X/L"(M<)!!J`&H!:@)3Z/S___^#Q!"Z`````(7`=%"#[`1H($X`
+M`&H/4^@$`P``@\00N@````"%P'0T@^P,:.@#``#H_/___X/$#&@@3@``:A]3
+MZ-L"``#'!"0T"```Z/S___^Z`0```(/$$(UV`(G0@\0(6\.05E.#[`2+="00
+MBUPD%&H`:@%J`E;H_/___X/$$+H`````A<`/A)<```"+1A2Z`````(7;=`CV
+M0P(0=`*R`8F0!)@``(/L!&@@3@``:@]6Z&D"``"#Q!"Z`````(7`=&&#[`QH
+MZ`,``.C\____@\0,:"!.``!J'U;H0`(``(/$$+H`````A<!T.(/L#&@T"```
+MZ/S___]J`&H!:@)6Z/S___^#Q""Z`````(7`=!.#[`1J"FH`5N@"`@``B<*#
+MQ!"0B="#Q`1;7L-55U93@^P8BVPD+(M5%(N":(```(/(8(F":(```(M5%(NZ
+M)(```(GX)?__?_^)@B2```!HH`\``.C\____BU44BX((F```#0````B)@@B8
+M``#'!"0*````Z/S___^#Q`C_="0L5>@^"0``@\00N@````"%P`^$;@$``(/L
+M#&CH`P``Z/S___^+512+@@B8```E____]XF"")@``(/$!(M%%(N86)@``(NP
+M7)@``(N0:)@``(E4)!2)VH'*``#\`XF06)@``(M5%(GP)7\`P/\-@,`_`(F"
+M7)@``(M5%(M$)!0E'P#^_PV`$0``B8)HF```:A3H_/___XM5%(N"")@```T`
+M```(B8((F```QP0D"@```.C\____BT44QX#4F```(0```(M5%(N"")@``"7_
+M___WB8((F```QP0DZ`,``.C\____BU44BX)@F```@\@!B8)@F```@\00:@!J
+M`6A@F```5>C\____@\0(BT44B9A8F```BT44B;!<F```BT44BU0D$(F0:)@`
+M`/]T)"Q5Z/S___^#Q!"%P'4L@^P,:(@3``#H_/___X/$"/]T)"Q5Z/S___^#
+MQ!"%P'4+BT0D)&:#2`("B?:+112+D&B```"#XI^)D&B```"+112)N"2```"Z
+M`0```(G0@\0,6UY?7<.)]E=64XM\)!"+="04B?"%]G4%N/____^)PXM'%(FP
+M`$```(/L#/]T)"3H_/___X/F#X/C#U93:`!```!7Z/S___^)PH/$(/?&!```
+M`'4*BT<4QT`4`````(G06UY?PXUV`%93@^P$BTPD%(I$)!B(1"0#NP````"Z
+M"@````^VP(UP`8UV`(U$$@,Z1"0#=1J`/!$_=`P/M@01Z9X```"-=@"[`0``
+M`.MQD(U$$@,/ML`YQG51A=)^38`\$3]T/X!\"O\_=#@/MAP1#[9,"O\IRXT$
+MFXT$@(T4Q0`````IPHV<$N<#``"XTTUB$/?CB=#!Z`:-'`@/ML/K0HUV`+L!
+M````ZQ60@_L!=0^`/!$_=`D/M@01ZR:-=@!*#XEE____N@````"`/!$_=`8/
+MM@01ZPM"@_H*?NZX`0```(/$!%M>PXUV`%575E.#[`2+7"0<BVPD)(I4)""_
+M_____[[_____N0````")]H`\"S]T*C@4"W1/.!0+<P*)SC@4"W89B<^#_O]U
+M&HU$"0.(10`/MD0+"^F2````D$&#^0I^RNL%@_D*?BNX/P```(/^_W1Z@_D*
+M?AR-1#8#B$4`#[9$,POK9XU$"0.(10`/MD0+"^M9C40^`XA%``^VT@^V##,I
+MRHT4DHT4DHT4DHTLU0`````/M@0[*<B)P8GHF??YB<4/MD0["P^V3#,+*<B)
+MZ@^OT('"YP,``+C336(0]^*)T,'H!@)$,PL/ML"#Q`1;7E]=PXUV`(M4)`B#
+M^CQV!;H\````BT0D!&:)D,P!``"X`0```,.055=64X/L$(ML)"2+5"0HBWPD
+M+(EL)`1FBX4&"```9L'H!(/@!XA'#XJ%!@@``(/@!XA'$&:+`BTR%```N0``
+M``!F/98`#X=,`@``NP````"+3"0$9@^VA`L."```9CF%U`$``'0&0X/[`W;D
+MN0````"#^P0/A!T"```/MPJ!Z3(4``"X9V9F9O?IP?H"B<C!^!^)T2G!@_D,
+M@]'_N*NJJJKWX8G1T>F-!,T`````*<B--(&+1"0$C;0&$@@``(I$'AF(1PZ*
+M1A8Z1!X9=@2*1!X9B$<)BD87.D0>&78$BD0>&8A'"(I&&#I$'AEV!(I$'AF(
+M1P>-1"0/4`^V1!X94%95Z.G]__^(PXU$)!Y0#[9'"5!65>C6_?__B$0D(X/$
+M((U$)`U0#[9'"%!65>B^_?__B$0D$HU$)!Q0#[9'!U!65>BI_?__B,*#Q""#
+MO=`!````#X3T````BX70`0``9HN,`$HE```/ME0D#P^WP8/``SG"?0?&1"0/
+M`^L$*$PD#P^V1"0/4%95Z'[\__^(1PZ-1"074`^V1PY05E7H3OW__XC#BD0D
+M*X/$'#I$)`YV!(I$)`Z(1"0.#[;`4%95Z$C\__^(1PF-1"074`^V1PE05E7H
+M&/W__XA$)!^*1"0K@\0<.D0D#78$BD0D#8A$)`T/ML!05E7H$/S__XA'"(U$
+M)!=0#[9'"%!65>C@_/__B$0D'HI$)"N#Q!PZ1"0,=@2*1"0,B$0D#`^VP%!6
+M5>C8^___B$<'C40D%U`/MD<'4%95Z*C\__^(PH/$'`^V1"0/T>!FB87.`0``
+MBD<.B$<*B$<+B$<,B$<-B-@HT(@'B-@J1"0"B$<!B-@J1"0#B$<"QD<&`,9'
+M!0#&1P0`QD<#`+D!````B<B#Q!!;7E]=PXUV`%=64X/L=(N\)(0```!J1&A@
+M)0``C40D#%#H_/___X/$#&H1:#@E``"-7"1<4^C\____4_^T))@```!7Z!S]
+M__^#Q!RZ`````(7`#X1@`@``BD0D7TBZ`````#P$#X=.`@``BD0D8$BZ````
+M`#P$#X<\`@``O@````"-=@`/M]Z#[`AJ!0^V1!Q<4.C\____B$0<8(/$$$9F
+M@_X&=M^^!P```(GV#[?>@^P(:@8/MD0<7%#H_/___XA$'&"#Q!!&9H/^#G;?
+M#[9$)%'!X`4EX`````^V5"10@^(?"=`)!"0/ME0D4\'B!X'B@`````^V1"12
+MP>`"@^!\"<**1"11P.@#@^`#"<()5"0$#[94)%3!X@2!XO````"*1"13T.B#
+MX`\)P@E4)`@/ME0D5L'B!H'BP`````^V1"15T>"#X#X)PHI$)%3`Z`2#X`$)
+MP@E4)`P/ME0D5\'B`X'B^````(I$)%;`Z`*#X`<)P@E4)!`/ME0D6<'B!X'B
+M@`````^V1"18T>"#X'X)PHI$)%?`Z`6#X`$)P@E4)!0/ME0D6L'B!8'BX```
+M`(I$)%G0Z(/@'PG""50D&`^V5"1;P>(#@>+X````BD0D6L#H`X/@!PG""50D
+M'`^V5"1<T>*#XGZ*1"1;P.@%@^`!"<()5"0@#[9$)%W!X`4EX`````E$)"0/
+MME0D7L'B`X'B^````(I$)%W`Z`.#X`<)P@E4)"B*1"1>P.@%@^`!"40D+(/L
+M"&H##[9$)&M0Z/S____!X`<E@`````E$)#"#Q`AJ`P^V1"1K4.C\____T>B#
+MX`,)1"0T@\0(:@,/MD0D;%#H_/___\'@`H/@'`E$)#2^`````(/$$(GVBT<4
+M#[?6BQ24B9"<F```1F:#_@]VZHM'%`^WUHL4E(F0U)@``+H!````B?:)T(/$
+M<%M>7\.-=@!75E.+7"00BWPD%(/L"%=3Z/S___^)QH/$$+@`````A?9T3H/L
+M"&H%#[</@>D`%```N&=F9F;WZ8G0P?@"P?D?*<A0Z/S____1X(/(08M3%(F"
+MG)@``(/$$(M#%,>`P)@```````")L_P'``"X`0```%M>7\.-=@"+1"0$BT`4
+MBX!DF```P>@3)?\!``#VQ`%T!34`_O__F,.-=@!64X/L!(MT)!"+1A2+D&"8
+M``"#R@*)D&"8``!J`&H":&"8``!6Z/S___^#Q!"Z`````(7`=#N[`````)"#
+M[`QHZ`,``.C\____5NC\____F(/$%$.#^Q1_!X/XN'_>ZPRZ`````(/XN'\'
+MB?:Z`0```(G0@\0$6U[#C78`N`````##D)!3@^P(BUPD$(M4)!2X`````(/Z
+M`G\>@^P$_W0D'(T$4HT$@(V$@]`(``!04^C\____@\00@\0(6\.-=@!3@^P(
+MBUPD$(M4)!2X`````(/Z`G\>@^P$C012C02`C82#T`@``%#_="0@4^C\____
+M@\00@\0(6\.-=@!55U93@^P,BVPD((MT)"2)ZH/^`G06@_X"=PF#_@%T'.LB
+MB?:#_@-T"^L9D+\"````ZQF0OP$```#K$9"_`````.L)D+C_____ZVB0C01_
+MC02`C9R"T`@``+C_____@WL$`'5/@^P(:CQ3Z/S___^)<P2#Q!"#?"0H`'4D
+MQT,,"P```,=#%`(```#'0QC_____9L=#(`H`9L=#(@H`ZQ*0@^P$_W0D+%=5
+MZ/S___^#Q!")^(/$#%M>7UW#D%.+3"0,BU0D"+L`````@_D"=TF-!$F-!("-
+MA(+0"```NP````"#>`0`=#''0`0`````N/[____3P"&"L`@``"&"M`@``"&"
+MN`@``"&"O`@``"&"P`@``+L!````B=A;PU575E.+="04BTPD&(GSBY;\!P``
+MN`````"#^0(/APX"``"-!$F-!("-O(;0"```N`````"#?P0`#X3R`0``N`$`
+M``"#?P0!#X7C`0``]D("$'1XBT84QX`0@```X`$``(M&%,>`%(`````(``B+
+M1A3'@""```#/C]T!BU84BT<4C01`C02`P>`0C8````\`#>`!``")@D"```"+
+M1A3'@$2```#``ZX%BU84BX)$F```@^"`@\@XB8)$F```BT84QX`$F```(R``
+M;^MZBT84QX`0@```:`$``(M&%,>`%(`````$``2+1A3'@""```"GC]T!BVX4
+MBU<4C022C01"C02"C03%,`(``,'@"PTP`@``B85`@```BT84QX!$@```F`/7
+M!(M6%(N"1)@``(/@@(/('(F"1)@``(M&%,>`!)@``"`0`&^X#P```(-_&/]T
+M`XM'&(MV%(G"P>(4#[='(L'@!"7P````"<(/MT<@@^`/"<*!R@`@"`")EAR`
+M``#V1PP!=`^X`0```-/@"8.P"```ZPVX_O___]/`(8.P"```]D<,`70/N`$`
+M``#3X`F#M`@``.L-N/[____3P"&#M`@``/9'#`)T#[@!````T^`)@[@(``#K
+M#;C^____T\`A@[@(``#V1PP$=`^X`0```-/@"8.\"```ZPVX_O___]/`(8.\
+M"```]D<,"'0/N`$```#3X`F#P`@``.L-N/[____3P"&#P`@``+@!````C78`
+M6UY?7<.-=@"+3"0$BT0D"(T$0(T$@+K_____@[R!U`@```%U!8M!%(L0B=##
+MC78`BU0D!(M$)`B+3"0,C01`C02`BX2"U`@``(/X`70.@_@!<AF#^`-W%.L*
+MB?:+0A2)".L1D(M"%(E(!.L(N`````##B?:X`0```,.)]E93@^P0BW0D'%;H
+M_/___XG#@\0()?___W]05NC\____BT84BY!D@```@\00@WPD%`!T#;@E````
+M*=#1Z`'"ZQR#^@%V`TKK%(/L"%-6Z/S___^X`````(/$$.L;BT84B9!D@```
+M@^P(4U;H_/___[@!````@\00@\0$6U[#C78`BU0D!(M$)`B-!$"-!("+A(+4
+M"```@_@"=#J#^`)W"8/X`70,ZSJ)]H/X`W0/ZS&0BT(4QT`(`0```.LLBT(4
+MQT`(`@```(M"%,=`*`X```#K%HGVBT(4QT`H"@```.L(N`````##B?:X`0``
+M`,.)]HM,)`2+1"0(C01`C02`N@````"#O('4"````743BT$4BT`4)0!X``")
+MPL'J"XUV`(G0PY!64X/L!(MT)!"+1"04C01`C02`BX2&U`@``(/X`70'@_@"
+M=$WK7HM&%,=`"`@```"[`````(UV`(M&%(M`%/;$>'06@^P,:@KH_/___X/$
+M$$.!^^<#``!^WXM&%,=`"`````"!^^<#```/GL`/ML#K&&H`:@1J+%;H_/__
+M_X/$$.L'B?:X`````(/$!%M>PY"X`0```,.)]E=64XM4)""+?"0PBW0D.(M,
+M)!2-0OV[````#(/X`78%B=/!XQJ+1"08)?\/``"+5"0HP>(2"="+5"0<P>(,
+M@>(`\`,`"=`)V/?&`0```'0%#0````'WQA````!T!0T````@B<*#?"0T`'0&
+M@<H````"B5$(@___=!N)^,'@#24`X`<`B4$,B=`-````0(E!".L*B?;'00P`
+M````D/?&!````'03@4D(``!``(M$)$`E``#X_PE!#+@!````6UY?P[@`````
+MPXGV4XM,)!"+7"08BU0D#(-\)!0`=!2+0@P)R(7;=0.`S!")0@SK)XUV`(7;
+M=!"+1"0<BT`(B4((B4H,ZQ&0QT((`````(G(@,P0B4(,D,="%`````#'0A``
+M````N`$```!;PXUV`(M,)`B)RK@/````]D$4`0^$@````&:+010E_A\``&:)
+M02`/MT$29HE!(L9!)`"+01"H`74?J`)T!,9!)`'V0A`(=`2`220"]D(0!'0'
+M@$DD!(UV`(M"""4``#P`P>@2B$$EBT(4)0#@'P#!Z`V(02:+0A`E``\``,'H
+M"(A!)XM"$"7P````P>@$B$$HQD$J`+@`````PXGVPY"0D(/L#(M,)!"+013'
+M@-"8```6'```N@````"-=@"+013'@("8``````$`0H/Z!W[MBT$4BX``G```
+MP>@8B<+!Z@2#X`_!X`0)T(/L"&H(4.C\____@\0<PY!55U93@^P8BVPD+&@4
+M&0``Z/S___^)PX/$$+X"````A<`/A"D$``")QX/L!&@`"```:,`E``!0Z/S_
+M__^+1"0TB4,,BT0D.(E#$(M$)#R)0Q1FB:N@`0``9L>#H@$`````9L>#S`$`
+M`#P`QX/0`0```````,>#W!@```````#'@]@8````````QX/X&```_____\>#
+M_!@``/_____'@P`9``#_____@\0(:@!3Z/S___^#Q!"^`P```(7`#X2/`P``
+M9H&[H`$``!OQ=2R+0Q3'@`"B````````BT,4QX!\F```&0```(/L#&CH`P``
+MZ/S___^#Q!")]HM'%(N`($```"7_````B<+!Z@2)EZ0!``"#X`]FB8>H`0``
+M@^H"O@T```"#^@(/AR0#``"+1Q2+@!B8``!FB8>J`0``@^P,5^A'`P``@\00
+MO@X```"%P`^$^P(``(._I`$```-V$HM'%,>``)@```<```#K$(UV`(M'%,>`
+M`)@``$<```"#[`QHT`<``.C\____B3PDZ!;^__]FB8>L`0``#[?`)?````"#
+MQ!"^#0```(/X$`^%G@(``(/L!(U$)`Y0:,$```!7Z/S___^#Q!"^"````(7`
+M#X1[`@``O@4```!F@7PD"O\O#X9I`@``9HM$)`IFB8,`"```BT<4BX`00```
+M@^`8P>@#O@H```"#^`(/A4`"``"#[`2-1"0.4&H_5^C\____@\00O@@```"%
+MP`^$(`(``&:+1"0*9HF#`@@``+T`````O@````")]H/L!(U$)`Y0C8;`````
+M4%?H_/___X/$$(7`#X3@`0``#[=$)`HQQ4:!_C\#``!VT+X'````@?W__P``
+M#X7'`0``9L>#=@D```H`9L>#@`L```,`O@````"-!':-!(9FQX2#?@D```L`
+M1H/^"7;JO@````"ZP"T``&:+!')FB81SB`L``&:)A'.""P``C01VC02&C02#
+M9L>`,`P```L`9L>`E`L```L`1H/^`G;+@^P(C8,`"```4%?H_/___X/$$+X(
+M````A<`/A#L!``"#OZ0!```#=FMF@[L8"````'1ABT<4QX``F```!T```(/L
+M#&C0!P``Z/S___^)/"3H7OS__V:)AZX!``"+1Q3'@`"8```'````QP0DT`<`
+M`.C\____#[>'K@$``"7P````@\00O@T```"#^"`/A<D```#K"6;'@Q@(````
+M`(/L!(U$)`Y0:+\```!7Z/S___^#Q!"^"````(7`#X2;````9HM$)`IFB8,$
+M"```9HF'U`$``(/L#%?H]P$``(D\).C\____O0````"^`````(/$$(/L!(U$
+M)`Y0N!\````I\%!7Z/S___^#Q!"%P'0[#[=$)`H!Q68/MD0D"XB$<U@6``!F
+MBT0D"HB$<UD6``!&@_X"=KV%[70*B?B!_?W_`@!U.[X)````ZQ*^"````.L+
+MC78`O@@```"-=@"%VW0,@^P,4^C\____@\00@WPD,`!T!HM$)#"),+@`````
+M@\0,6UY?7<.)]H/L&/]T)!SH_/___X/$',-55U93@^PLBW0D0,=$)`@`@```
+MQT0D#""8``#'1"0055555<=$)!2JJJJJQT0D&&9F9F;'1"0<F9F9F;\`````
+MC6PD"(T$O0````"+'"B+5A2+%!J)%`2Y`````(G(P>`0B<()RHM&%(D4&(M&
+M%(L$&#G0=`>X`````.MA08'Y_P```'[7N0````"+5(P0BT84B108BT84BP08
+M.<)T"K@`````ZSB-=@!!@_D#?MR-!+T`````BTX4BQ0HBP0$B0011X/_`0^.
+M>?___X/L#&IDZ/S___^X`0```(/$$(/$+%M>7UW#C78`BU0D#(M,)!"+1"0(
+M]L0!=!-FQP(X$V;'`=07N`$```##C78`J8````!T(8M$)`1F@[@8"````'03
+M9L<""`EFQP&L"K@!````PXUV`+@`````PXGV5E.#[`2+="00C9ZT`0``9H.^
+MU`$```%U$X/L!(U$)`10:A!6Z/S___^#Q!#'0P0`````9H.^%@@```!T&\=#
+M!`$```!F@[X&"````'4*QT,$`P```(UV`&:#OA@(````=`2#2P0$9L=#$`@)
+M9L=#$JP*9L=###@39L=##M07@`L#@$L!@(!+`@%FQT,("@!FQT,*@`"X`0``
+M`(/$!%M>PU=64XM,)!"+="04BUPD&(G/BT$4B;`H@```BX&P`0``@_@!=`^#
+M^`%R)H/X!G0A@_@(=42+013'@"R```#__P``BT$4QX`P@```__\'`.LHBU$4
+MB?`K!0````#!X`.)@BR```"+412)\"L%`````,'@`XF",(```(M1%(U&`8._
+MV!@```!T"(GP`X?8&```B8(T@```@>/__X`!BT$4B9@@@```6UY?PU93@^P$
+MBW0D$+L`````B?:#[`AJ`E;H_/___X/$$(7`=!:#[`QJ"NC\____@\000X'[
+MYP,``'[8@?OG`P``#Y[`#[;`@\0$6U[#B?:+5"0$BT(4QX`H@````````(M*
+M%(N!!(````T```0`)?__S_^)@02```"+0A3'@""```#__P``PU93BW0D#(M<
+M)!!F@WL2`'0_BU84BX($@```#0``$`")@@2```"+5A0/MT,0B8(D@```BU84
+M#[=#$HF".(```(M6%(M#%,'@`XF",(```.L4BU84BX($@```)?__[_^)@@2`
+M``"+5A2+`XF"*(```(M.%(N!((```"4``(#_#[=3"`G"9H-[&`!T$0^W0QB#
+MP`3!X!`E``!_``G"B9$@@```BTX4BY$8@```,/8/MT,:P>`()0#_```)PHF1
+M&(```(M.%(N1!$```('B``#__XM#'(/H`\'@`R7__P``"<*)D01```!;7L.+
+M1"0$BT`4BX`(0```A<`/E<`/ML##B?:+3"0(BT0D!(M`%(N0P````(/Z_W4.
+MQP$`````N`````##B?:)T"6ZV`4!B0'WP@``"`!T!PT```!`B0'VP@5T`X,)
+M`??"P`4``'0#@PE`]L(@=`:!"0```$"X`0```,.+1"0$BX!D%@``PY!75E.+
+M="00BUPD%(GQB[YD%@``A?]Y$8M&%,=`)`````"+1A2+0"20B=J!XKK8!0'V
+MPT!T,X.Y:!8```!T`X/*0(.Y;!8```!T`X#.`8.Y<!8```!T`X#*@(.Y=!8`
+M``!T!H#.!(UV`/;#`70#@\H']\,```!`=`:!R@``"`"+1A2)D*````")F606
+M``"%VWD+BT84QT`D`0```)")^%M>7\.0D+B`````PXGVBT0D"&:#^']W'P^W
+MP,'@!8M4)`0#0A2+@!R(``"Z`0```*D`@```=06Z`````(G0PXUV`(M,)`2+
+M1"0(N@````!F@_A_#X>!````#[?`P>`%B<(#413'@@"(````````B<(#413'
+M@@2(````````B<(#413'@@B(````````B<(#413'@@R(````````B<(#413'
+M@A"(````````B<(#413'@A2(````````B<(#413'@AB(`````````T$4QX`<
+MB````````+H!````B=##D%=64XM\)!"+5"08BW0D%+@`````9H/^?W=JA=)T
+M.`^V6@7!XP@/MD($"<,/MDH#P>$8#[9"`L'@$`G!#[9"`<'@"`G!#[8""<'1
+MZ8G8P>`?"<'1Z^L*NP````"Y``````^WQL'@!8G"`U<4B8H8B````T<4B=J`
+MSH")D!R(``"X`0```%M>7\-55U93@^P0BWPD+(M$)"AFB40D#H-\)#0!&<GW
+MT8'AJJJJJK@`````9H-\)`Y_#X=\`0``#[8'@_@!=!2#^`%_!X7`=!3K39"#
+M^`5T/.M%D,<$)`4```#K1[@`````9H-_`@0/AD<!``#'!"0`````9H-_`@5V
+M*6:#?P(.&=*#XOZ#P@.)%"3K%\<$)`<```#K#HGVN`````#I$@$``(GV#[9O
+M!`^V1P7!X`@)Q0^V1P;!X!`)Q0^V1P?!X!@)Q3'-#[9'"<'@"`^V5P@)PC'*
+M@>+__P``B50D"`^V=PH/MD<+P>`("<8/MD<,P>`0"<8/MD<-P>`8"<8QS@^V
+M1P_!X`@/ME<."<(QRH'B__\``(E4)`0/ME\0#[9'$<'@"`G##[9'$L'@$`G#
+M#[9'$\'@&`G#,<MF@W\"#7<&@>/_````#[=,)`Z)R,'@!8G"BWPD)`-7%(FJ
+M`(@``(G"`U<4BWPD"(FZ!(@``(G"BWPD)`-7%(FR"(@``(G"`U<4BW0D!(FR
+M#(@``(G"`U<4B9H0B````T<4BSPDB;@4B```_W0D,%'_="0LZ/S___^#Q`R#
+MQ!!;7E]=PX/L$&H&BT0D&`58%@``4/]T)"#H_/___X/$',.#[!!J!O]T)!R+
+M1"0<!5@6``!0Z/S___^X`0```(/$',.-=@!3@^P(BUPD$(M3%(M$)!2)@@!@
+M``"+0Q3'@`A@```!````:@)J`V@,8```4^C\____@\00N@````"%P'05BT,4
+MBY`$8```BT0D&&:)$+H!````B="#Q`A;PXUV`%.+7"00BTPD"+H,````BT0D
+M#&8Y@=0!``!T&`^W@0((``#!Z`>#X`&#^`$9TH/B^(/""X7;=`*)$[@`````
+M6\.+5"0$N`````!F@[H6"````'0.9H.Z!@@```$9P(/@`D!F@[H8"````'0#
+M@\@$PY!3@^P(BUPD$&:#NPH(````=$:#[`2-1"0*4&H/4^C\____@\00N@``
+M``"%P'16#[=4)`:)T(/@','X`HF#!!D``(/B`M'ZB9,(&0``QX,0&0```0``
+M`.L>QX,(&0```````,>#!!D```````#'@Q`9````````9H.["@@````/E<`/
+MMM")T(/$"%O#D%.#[!"+7"08:@!3Z/S___^#Q`R%P`^4P`^VP%!J`%/H_/__
+M_X/$"/^S!!D``%/H_/___XM3%(N"`)@``(#DWXF"`)@``(/$"/^S!!D``%/H
+M_/___XF##!D``(/$##N#"!D```^5P`^VP%#_LP09``!3Z/S___^#Q!A;PY!3
+MBT0D"(M8%(N3%$```(M,)`S1X;@#````T^`)PHF3%$```+@!````6\.)]E.+
+M1"0(BU@4BY,40```BTPD#-'AN`,```#3X/?0(<*)DQ1```"X`0```%O#4XM,
+M)`R+1"0(BU@4BY,80```N/[____3P"'"BT0D$(/@`=/@"<*)DQA```"X`0``
+M`%O#D(M,)`BX_____X/Y!7<5BT0D!(M`%(N`'$```(/@+]/H@^`!PX/L#(M,
+M)!"+012+D!1```"!XOQ__O^`SH"#?"08`'0&@<H```$`BT$4B9`40```@^P(
+MBX%D%@``#0````%04>C\____@\0<PXM$)`2+2!2+@1!````EG__Q_XM4)`B#
+MX@<+!)7@+0``B8$00```PY!64X/L"(M<)!2+="0<:@;_="0<C8->%@``4.C\
+M____BTL4#[:37A8```^V@U\6``#!X`@)P@^V@V`6``#!X!`)P@^V@V$6``#!
+MX!@)PHF1"(```(M+%`^V@V,6``#!X`@/MI-B%@``"<*!YO\_``#!YA`)\HF1
+M#(```(/$%%M>PU.+1"0(BT@4BX%0@```B<*X`````(N)3(```+L`````"<@)
+MVEO#B?:+1"0$BT`4BX!,@```PXGVBT0D!(M0%(N"((````T````!B8(@@```
+MPXUV`(M4)`2+0A2+@&28``")P<'I$X'A_P$``(G(P>@(A<!T!H'Q`/[__XM2
+M%(N"4(```(N23(```#'0,<C#D%.+5"0(BT(4BX`@0```)?\```")P8/A#[L`
+M````P>@$.8*D`0``=0QF.8JH`0``=0.S`9")V%O#BTPD!(M$)`B+412+DI"`
+M```!$(M1%(N2C(````%0!(M1%(N2E(````%0#(M1%(N2B(````%0"(M1%(N2
+MF(````%0$,.#[!2+1"08BU`4QX)4F0```0```(N09!8``(#.0%)0Z/S___^#
+MQ!S#5U93BWPD$(MT)!2)^X/^"'86@^P(:/__``!7Z/S___^#Q!`Y\',.D(FS
+M^!@``+@`````ZR.#[`A65^C\____BU<4B8)P$```@\00B;?X&```N`$```")
+M]EM>7\.#[!2+5"08BT(4BX!P$```)?__``!04NC\____@\0<PU575E.#[!2+
+M;"0H:/\?``!5Z/S___^#Q!`[1"0D<Q''A?P8``#_____N`````#K/(MU%(N>
+M%(```('C`.#__X/L"/]T)"Q5Z/S___\E_Q\```G#B9X4@```@\00BT0D)(F%
+M_!@``+@!````D(/$#%M>7UW#@^P4BU0D&(M"%(N`%(```"7_'P``4%+H_/__
+M_X/$',-55U93@^P4BVPD*&C_'P``5>C\____@\00.T0D)',1QX4`&0``____
+M_[@`````ZT"+=12+GA2```"!X___`."#[`C_="0L5>C\____P>`0)0``_Q\)
+MPXF>%(```(/$$(M$)"2)A0`9``"X`0```(GV@\0,6UY?7<.#[!2+5"08BT(4
+MBX`4@```)0``_Q_!Z!!04NC\____@\0<PY"X`````,.)]L.-=@##C78`BT0D
+M!(M`%(N`')P``"7_````PY"+1"0$BT`4BX!8@```@^`'PXUV`(M$)`2+4!2+
+M1"0(@^`'B8)8@```PXUV`%575E.+?"04BVPD&(G[BT0D'`^W0`(EX`$``#W`
+M````="H]P````'\+/:````!T%.LBB?:^`````#U``0``="#K$HGVO@$```#K
+M%9"^`@```.L-D+@`````Z;L```")]@^WC'-X"```#[>$<WX(``#!X`8)P0^W
+MA'.$"```P>`,"<$/MX1SB@@``,'@$@G!#[>$<Y`(``#!X!@)P0^WE'.6"```
+M#[>$<YP(``#!X`8)P@^WA'.B"```P>`,"<(/MX1SJ`@``,'@$@G"#[>$<ZX(
+M``#!X!@)PH/]`70/@_T!<AJ#_0)T">L+C78`B<KK#(G1ZPBX`````.L>D(FK
+MW!@``(M'%(F(8)D``(M'%(F09)D``+@!````6UY?7<.)]H/L#(M$)!2+5"08
+M@_@!=12#^@%V![`-@_H%=1JX`````.L3D/]T)!Q24/]T)!SH_/___X/$$(/$
+M#,.)]H/L#(M$)!"+3"04BU0D'(/Y"W4<@^(&B9#(`0``BT`4B9!(@```N`$`
+M``#K&8UV`(/L#/]T)"Q2_W0D+%%0Z/S___^#Q""#Q`S#B?:#[!3_="0L_W0D
+M+/]T)"S_="0L_W0D+/]T)"SH_/___X7`#Y7`#[;`@\0LPU.+7"0(BTPD$(M3
+M%(N"!(```"7__]__#0``!`")@@2```"#?"0,`'01BU,4#[?!#0```@")@@1`
+M``!;PU93@^P$BW0D$(-\)!0`=&"+1A3'@`1`````````@^P,:@KH_/___[L*
+M````@\00D(M&%(N`$$```*D```$`="*#[`QHR````.C\____BT84QX`$0```
+M`````(/$$$MUT.L&A=MU"HGVN`````#K&I"+5A2+@@2````E___[_XF"!(``
+M`+@!````@\0$6U[#D(M,)`2+412+@@2````-```$`(F"!(```(-\)`@`=`V+
+M013'@`1```````$`PXUV`%.+7"0(BTPD$(M3%(N"!(````T```0`B8($@```
+M@WPD#`!T$8M3%`^WP0T```(`B8($0```6\.05U93BU0D$(M<)!2+3"08BT0D
+M'(G6OP$```"#^P)T*8/[`G<(@_L!=`_K39"#^P-T*(/[!'0OZT`/M\!045+H
+MB?[__X/$#.LX@^P(45+HMO[__XG'@\00ZR=14N@X____@\0(ZQL/M\!045+H
+M6/___X/$#.L+C78`N`````#K"9")GM08``")^%M>7\.+1"0$BX#4&```PY"X
+M`````,.)]K@`````PXGVN`````##D)!3@^P(BT0D%(/X`G0G@_@"=PJ#^`%T
+M#>LCC78`@_@$=`OK&9"[`````.L9D+L`````ZQ&0NP````#K"9"X`````.L3
+MD(/L"%/_="0<Z/S___^)V(/$$(/$"%O#D(M$)`2+0!2+0`S#D(M$)`2+4!2+
+M1"0(B4(,PY"+1"0$BT`4QT`(!````,.0@^P,BU0D$(M"%,=`""````!J`&H$
+M:@A2Z/S___^%P`^5P`^VP(/$',.-=@"+1"0$BU`4BX)(@```@^#?B8)(@```
+MPY"+1"0$BU`4BX)(@```@\@@B8)(@```PY"+3"0$BU$4BT0D"(F"0(```(M1
+M%(M$)`R)@D2```##D%.+5"0(BTPD#+@`````@_D_=T*#^1]V((M2%(N:1(``
+M`(/I(+C^____T\`AV(F"1(```.L;C78`BU(4BYI`@```N/[____3P"'8B8)`
+M@```N`$```!;PY!3BU0D"(M,)`RX`````(/Y/W="@_D?=B"+4A2+FD2```"#
+MZ2"X`0```-/@"=B)@D2```#K&XUV`(M2%(N:0(```+@!````T^`)V(F"0(``
+M`+@!````6\.0BT0D!(M`%(N`/(```,.)]HM$)`2+4!2+1"0(B8(\@```PXGV
+MBU0D#(M,)`C'00@`````B=`E_P\``(E!#+@`````.5$,=2'V1"00('0'@4D,
+M`"```,=!%`````#'01``````N`$```##C78`4XM,)`R)RHM$)!2[#P```/9!
+M%`$/A,<```#V0!0!=1F+1"0(BT`4BT`,NP\````[1"00#X2H````9HM"$"7_
+M#P``9HE!((M"%"4`@/\/P>@/9HE!(L9!)`"+0A2H`G4LJ`1T",9!)`'K(HGV
+M]D(4$'0&@$DD".L4@$DD`HM"%"7@````P>@%B$$EB?:+0A`E``#X!\'H$XA!
+M)HM"%/;$`70.)0!^``#!Z`F(02?K!9#&02?_BT(0)0"`!P#!Z`^(02B+0A`E
+M````.,'H&XA!*8M"$,'H#(/@`8A!*KL`````B=A;PY"0D%575E.#[&R+K"2`
+M````B6PD)&;'1"06``!FQT0D%```QT0D$`````#'1"0,`````(N4)(@````/
+MMT("B<+!Z@?!Z`@QT+H,````J`$/A+X(``"+C"2(````#[=!`HG"P>H&P>@%
+M,="Z#````*@!#X2<"```@^P(_[0DD````%7H_/___XE$)#"#Q!"Z#````(7`
+M#X1X"```@[PDA`````9T*H.\)(0````&=PR#O"2$`````7<,ZQ2#O"2$````
+M"'0*N@P```#I1`@``(.\)(P`````=$R+112+F$R```")7"00BY!0@```B50D
+M#(.]I`$```-V#(N`0!$``(E$)##K(+X`````BU44C02U`````(N$`D`1``")
+M1+0P1H/^"7;HBT44BX!8@```B40D"(7`=0C'1"0(`0```(M5%(N"!(```"4`
+M```"B40D&(N"$$```"5@`/X`B40D'(N*%$```(E,)"R+DAA```")5"0H@^P(
+MBYPDD`````^W0P)05>C\____@\00N@,```"%P`^$>P<``(N4)(@````/MT("
+M)?`!```]P````'10/<````!_"3V@````=#+K3CU``0``=`D]4`$``'02ZSYF
+MQT0D%@$`9L=$)!0!`.LN9L=$)!8"`&;'1"04`0#K'F;'1"06`P!FQT0D%`(`
+MZPYFQT0D%@0`9L=$)!0"`(.]I`$```-V#XM%%,>``)@```<```#K#8M%%,>`
+M`)@``$<```"#O:0!```##X;E````BXPDB`````^W00*I@`````^$I0```(M<
+M)"1F@;L`"````#`/AI(```"H('04#[>[_`@```^W@P`)``")1"0$ZQ:+5"0D
+M#[>Z_@@```^WB@()``")3"0$@^P(:@-7Z/S___^)QX/$"&H#_W0D$.C\____
+MB40D%`^W7"0DN<P,``"+%)F`XC^)^,'@!B7`````"<*)%)F^V`P``(L,GH/A
+M\(GZP>H"@^(!BT0D%-'@@^`."<()T8D,GH/$$+X`````OZ`+```/MUPD%(T$
+M=HM-%(L4A:`+```!V(L$AXD$$4:#_AMVY8/L"/^T))````!5Z,<,``"^````
+M`(/$$+\`+@``#[=<)!:0C02VBTT4BQ2%`"X```'8BP2'B0011H/^(G;EO@``
+M``"_(#8```^W7"04B?:-!':+312+%(4@-@```=B+!(>)!!%&@_X_=N6^````
+M`+O`,```O\0P``")]HL,\X.\)(P`````=`V-@0"`__\]_P\``'8)BU44BP3W
+MB00*1H'^J@```';4@[VD`0```W=$BU44BXH<@```B<@E__\/``T``-`!B8(<
+M@```BT44QT!<`````(M%%,>`>)@```@```"+512+@DB```"`S`2)@DB```"#
+MO"2,`````'14BT44BUPD$(F83(```(M%%(M4)`R)D%"```"^`````(.]I`$`
+M``-V$8M5%(M$)#")@D`1``#K'8GVC0RU`````(M5%(M$M#")A`I`$0``1H/^
+M"7;EBTT4BUPD)`^VDU@6```/MH-9%@``P>`("<(/MH-:%@``P>`0"<(/MH-;
+M%@``P>`8"<*)D0"```"#O"2$`````71U@[PDA`````%R1(.\)(0````&=`^#
+MO"2$````"'1^Z:(```"+312+1"0D#[:0718``,'B"`^V@%P6```)T`M$)!@-
+M``"!`(F!!(```.MWBTT4BUPD)`^VDUT6``#!X@@/MH-<%@``"=`-``""`(F!
+M!(```.M0BTT4BT0D)`^VD%T6``#!X@@/MH!<%@``"=`-```@`(F!!(```.LI
+MBTT4BUPD)`^VDUT6``#!X@@/MH-<%@``"=`+1"08#0``(`")@02```"+512+
+M@A!````+1"0<B8(00```BT44BU0D+(F0%$```(M%%(M,)"B)B!A```"+112+
+M7"0(B9A8@```BTT4BT0D)`^VD%X6```/MH!?%@``P>`("<*+7"0D#[:#8!8`
+M`,'@$`G"#[:#818``,'@&`G"B9$(@```BTT4#[:38Q8``,'B"`^V@V(6```)
+MT(F!#(```(M%%,>`@````/____^#O:0!```$=19F@[VH`0```7<,BU44BT(4
+M@,P$B4(4BT44QX`8@`````<``(/L"/^T))````!5Z/S___^#Q!"Z`P```(7`
+M#X2K`@``@^P(_[0DD````%7H`PT``(/$"/]T)"A5Z$H&``"#Q!"Z`P```(7`
+M#X1^`@``9H&]H`$``!OQ=1J+A"2(````]D`"@'0-BT44QX`(V````@4``(M%
+M%,>`')@```$```"+112+@!29``")P8'A_S\``(N4)(@```#V0@(@=!6-%(T`
+M````N*.++KKWXHG0P>@$ZPRXS<S,S/?AB=#!Z`.#[`R#P&10Z/S___^+512+
+M@F"8``"#R`&)@F"8``"#Q!!J`&H!:&"8``!5Z/S___^#Q`C_M"20````5>C\
+M____@\00A<!U'(N,)(@```#V00(@=05F@TD"`KH#````Z:H!``"+7"0D@[O@
+M&````'07BT44QX`@F0```/`!`,>#Y!@```$```"[`````+X!````C3R=````
+M`(M5%(GPB-G3X(F$.@`0``!#@_L)?N.[`````(/L"%-5Z/S___^#Q!!#@_L)
+M?NV+113'@*0````!``$`BT44QX"H`````0```(M%%,>`K`````$```"+512+
+M@K`0``")@K`0``"+113'@*````!E"0@`BUPD),>#9!8``&4)"`"+512+@JP`
+M```-```'`(F"K````(.\)(0````&=1R+512+@J````"`S!")@J````"!BV06
+M````$```@^P,5>C\____@\00A<!T#(/L#%7H_/___X/$$(M5%(N"((```"7_
+M_W_^B8(@@```BT0D)(.X^!@``/]T$H/L"/^P^!@``%7H_/___X/$$(M4)"2#
+MNOP8``#_=!*#[`C_LOP8``!5Z/S___^#Q!"+3"0D@[D`&0``_W02@^P(_[$`
+M&0``5>C\____@\00@[W(`0```'0/BU44BX7(`0``B8)(@```BYPDA````(F=
+ML`$``+@!````ZQ:-=@"+A"20````@S@`=`*)$+@`````@\1L6UY?7<.0@^P4
+M:@+_="0<Z#(#``"#Q!S#B?93@^P(BUPD$&H`:@%J`E/H_/___X/$$+H`````
+MA<!T+(/L"&H34^@!`P``@\00N@````"%P'05@^P,:#0(``#H_/___[H!````
+M@\00B="#Q`A;PY!64X/L!(M<)!"+="04:@!J`6H"4^C\____@\00N@````"%
+MP`^$AP$``(GP)?`!```]P`````^$B0```#W`````?Q8]H````'0]/;````!T
+M-ND/`0``C78`/4`!```/A*@````]0`$``'\,/=````!T4^GN````/5`!```/
+MA(H```#IW@```(M#%,>`!)@```````"+0Q3'@`"B```#````BT,4QX!\F```
+M&0```(/L#&@L`0``Z/S___^#Q!#IH@```(GVBT,4QX`$F````````&:#NZ`!
+M```2#X6%````BT,4QX!\F```&````(/L#&@L`0``Z/S___^+0Q3'@`"B```"
+M````@\00ZUGWQA````!T#XM#%,>`!)@```,```#K#8M#%,>`!)@```````!F
+M@[N@`0``$G4KBT,4QX!\F```&````(/L#&@L`0``Z/S___^+0Q3'@`"B````
+M````@\00D(/L"&H34^AI`0``@\00N@````"%P'0U@^P,:#0(``#H_/___VH`
+M:@%J`E/H_/___X/$(+H`````A<!T$(/L"&H`4^@M`0``B<*#Q!")T(/$!%M>
+MPU575E.#[`R+="0@BWPD)(.^Y!@````/A(````"+7A2+@R"9``"I```!`'5P
+MQX;D&````````(NK$)P``(N#%)P``(N3&)P``(E4)`B)ZM'JB<'1Z0'*B<'!
+MZ0;!Z@>)%"1T.87)=#6+1"0(]]B9]SPD@^`_B40D!(GHF??YB<^+1"0$
+MP>`%BY,@F0``"=`)R(#,"(F#()D``(/L"%=6Z"(#``"#Q!"%P'43]D<"('4%
+M9H-/`@*X`````.M9D(/L"%=6Z/S___^#Q!"%P'4S@^P,:(@3``#H_/___X/$
+M"%=6Z/S___^#Q!"%P'45]D<"('4%9H-/`@*X`````.L7C78`@^P,5N@W&```
+MN`$```"#Q!"-=@"#Q`Q;7E]=PU=64XM\)!"+="04B?"%]G4%N/____^)PXM'
+M%(M0#(FP`$```(/L#&H/Z/S___^#Y@.#XP-64V@`0```5^C\____B<*#Q"#W
+MQ@$```!U"HM'%,=`%`````")T%M>7\.)]E575E.#[!2+;"0L#[=%`E`/MT4`
+M4.C\____@\00]D4"@'0]#[_XC1Q_P>,"C;L$.@``@^P(:@C_=P3H_/___XG&
+M@>;_````P>8%BX,$.@``P>`$"<9FBT<(@\00ZP>)]KX`````9CV0`'\$J`%T
+M(8/L"&H(F(/H&%#H_/___XG#@>/_````N`$```"#Q!#K*(/L"&H(F(/H&(G"
+MP>H?`=#1^%#H_/___XG#@>/_````N`````"#Q!#!XP+1X`G#@<L!!```BT0D
+M((M(%(GP)?\```#!X`@/MM,)T(F!G)@``(M$)""+2!2)\"4`_P``#[;7"=")
+M@="8``"+1"0@B:C\!P``N`$```"#Q`Q;7E]=PXUV`(M$)`2+0!2+@&28``#!
+MZ!,E_P$``/;$`70%-0#^__^8PXUV`%=64XM\)!"*7"04BT\4BY%DF```@>(`
+M\/__B=C!X`DE``X```G"#[]$)!@E_P$```G"B9%DF```BU<4BX)@F```@\@"
+MB8)@F```OC@```"$VW01#[;SC03U`````"GPB<;!Y@F[`````(UV`(M'%(N`
+M8)@``*@"=!2#[`Q6Z/S___^#Q!!#@_L[?N'K!8/[.WX'N`````#K"E?H_/__
+M_YB#Q`1;7E_#D(M,)`R+5"0$BT0D"`^W0`(EX`$``#W`````=#`]P````'\)
+M/:````!T%NLL/4`!``!U)6:+@EH(``!FB0'K(9!FBX)<"```9HD!ZQ1FBX)>
+M"```9HD!ZPBX`````,.)]K@!````PXGV4X/L!(M<)`R-1"0"4/]T)!13Z('_
+M__^#Q`RZ`````(7`="R+0Q2+D&"8``"+@&28``#!Z!,E_P$``/;$`70%-0#^
+M__]F.T0D`@^>P`^VT(G0@\0$6\.)]E93@^P$BUPD$(MT)!2#NZ0!```#=U:#
+M[`A64^C\____@\00A<!T18U$)`)05E/H#?___X/$#+H`````A<!T1+X`````
+M@^P$:@`/MH9(.P``4%/H0?[__X/$$$:#_@)VY(/^`P^6P`^VT.L8D(M3%(N"
+M8)@``(/(`HF"8)@``+H!````B="#Q`1;7L.055=64X/L/(M4)%2+1"10B40D
+M+/9"`H`/E,!F#[;`9HE$)`BX`@```&8K1"0(9HE$)`@/MT(")>`!```]P```
+M``^$Q@$``#W`````?Q`]H`````^$9P$``.G\`0``/4`!```/A?$!``!FBP(M
+MH0\``&8]Z@1W)8M4)"QFBY+D"```9HE4)`R+="0L9HNVY@@``&:)="0*Z9<`
+M``!FBP(MC!0``&8][P!W(HM$)"QFBX#H"```9HE$)`R+5"0L9HN2Z@@``&:)
+M5"0*ZV=FBP(M?!4``&8]X`!W(HMT)"QFB[;L"```9HET)`R+1"0L9HN`[@@`
+M`&:)1"0*ZS=F@3I<%G8BBU0D+&:+DO`(``!FB50D#(MT)"QFB[;R"```9HET
+M)`KK#F;'1"0*``!FQT0D#```BT0D+&:+J&8(``!FBY!L"```9HE4)!!F@[AL
+M"`````^4P&8/ML!FB40D#@^W3"0(NSP-``"+%(N!XO___^^+="0L#[>&7`D`
+M`,'@'`G"B12+NT@-``"+%(N!XO____L/MX9>"0``P>`:"<*)%(N[_`T``(L4
+MBX/B]P^WAEH)``#!X`,)PHD4B^FD````BT0D+&:+@/0(``!FB40D#(M4)"QF
+MBY+V"```9HE4)`J+="0L9HNN:`@``&:+AFX(``!FB40D$&:#OFX(````#Y3`
+M9@^VP&:)1"0.ZU>+5"0L9HN2^`@``&:)5"0,BW0D+&:+MOH(``!FB70D"HM$
+M)"QFBZAJ"```9HN0<`@``&:)5"009H.X<`@````/E,!F#[;`9HE$)`[K"K@`
+M````Z1,!```/MW0D"+^$#0``BQRW@.,_@^P(:@0/M^U5Z/S____!X`</MU0D
+M'L'B!@G0)<`````)PXD<M[^0#0``BQRW@^/X@\0(:@15Z/S____1Z(/@!PG#
+MB1RW@.-_@\0(:@,/MVPD&%7H_/___\'@!R6`````"<.)'+>_G`T``(L<MX/C
+M_(/$"&H#5>C\____T>B#X`,)PXD<MX/CXX/$"&H##[=$)!90Z/S____!X`*#
+MX!P)PXD<M[G,#0``BQ2Q@^+WBT0D(,'@`X/@"`G"B12QNP````"#Q!"_``T`
+M``^W="0(B?:-!%N+5"10BTH4BQ2%``T```'PBP2'B0010X/[&';ABW0D+,>&
+M[!@```````"X`0```(/$/%M>7UW#B?955U93@^P,BWPD((G^BU0D)`^W0@(E
+MX`$``#W`````=$L]P````'\,/:````!T->M#C78`/4`!``!U.;T`````BT\4
+MBY%$F0``@^+'#[>'8`D``,'@`X/@.`G"B9%$F0``ZQV0O0$```#K%9"]`@``
+M`.L-D+@`````Z=<!``")]H._I`$```-W%XM7%(N"$)D``(/(`XF"$)D``.M7
+MC78`BT\4BX$0F0``)0;\__\/MY1N<@@``,'B!`G0@\@!B8$0F0``@^P$_W0D
+M*/^VW!@``%?H_/___XM7%`^_A&Y:"```)?\!``"`S`*)@FB9``"#Q!"0BT\4
+MBY%$F```@>)_P/__#[>$;C`(``#!X`<E@#\```G"B9%$F```BT\4BY%(F```
+M@>+_#_S_#[>$;C8(``#!X`PE`/`#``G"B9%(F```BT\4BY%0F```@>(``/__
+M#[Z$-5<(``#!X`@E`/\```G"#[:$-50(```)PHF14)@``(M?%`^WE&Y("```
+MB=#!X!C!XA`)T`^WC&Y."```B<K!X@@)T`G(B8,TF```BT\4BY$HF```,/8/
+MMX1N/`@``,'@"`G"B9$HF```BT\4BY%DF```@>+_#_C_#[>$;D((``#!X`PE
+M`/`'``G"B9%DF```NP(```!F@;X`"````C!W'&:!OZ(!```B$'4UBT0D)/9`
+M`D!T*[,(ZR>-=@"+5"0D9HL"@^`?#[?`A<!T$X/H"H/X#'8+#[>$;K0(```!
+MPY"+3Q2+D229``"`X@&-!!LE]P````G"B9$DF0``N`$```"#Q`Q;7E]=PXUV
+M`(M,)`2+5"0(B="#^CQV!;@\````9HF!S`$``(M!%(F0/)D``+@!````PXGV
+M55=64X/L+(M\)$2+7"1`#[='`B7@`0``/<````!T5CW`````?PX]H````'1[
+MZ:H```")]CU``0``#X6=````9HN#=@D``&:)1"04C8-B"0``B40D$(V#>`D`
+M`(E$)!@/MX/&#```B40D"(VKR`P``.F#````9HN#@`L``&:)1"04C8.""P``
+MB40D$(V#C@L``(E$)!@/MX,8#0``B40D"(VK&@T``.M09HN#@`L``&:)1"04
+MC8.("P``B40D$(V#*@P``(E$)!@/MX,X#0``B40D"(VK.@T``.L=D+@`````
+MZ98```")T,'@!HV<&%`-``")7"0,ZV2#[`0/MP=0C40D&%#_="1,Z'<```#'
+M1"0<`````(/$"%?_="1,Z/S___^)QKH`````@\009H.[!`D```!T)@^WBP0)
+M``"-=@!F@[Q3!@D```!T#`^WA%,&"0``.?!TCT(YT7_D@^P,5P^W1"084%7_
+M="0D_W0D7.A4`P``N`$```"#Q""#Q"Q;7E]=PU575E.#[#2+7"109L=$)"X`
+M`&;'1"0L/P!H"`$``&@`````Z/S___^#Q`AH@````&@@`0``Z/S___^]B```
+M`+\!````O@````"#Q!`/M\9FB;P`"````$=&9H/_/W;M9HDU!@```&;'!0(`
+M```!`&;'!00````_`+X`````9H,]!@````!V+@^W^P^WWH/L!/]T)$@/MX0;
+M"````%!7Z+4'``!FB41=`(/$$$9F.34&````=]5FBTT`#[<%!@```&:+7$7^
+MO@````!F@ST&`````'9V#[?&9CE,10!_"F:+3$4`9HET)":)\/?0B<=F`ST&
+M````=",/M]=FBT15_F8[1%4`?@IFBT15`&:)1%7^1F8Y-08```!WNKX`````
+M9H,]!@````!V(6:+%08````/M\9F.5Q%`'X*9HM<10!FB70D)$9F.?)WY@^_
+MR8/!&;L?A>M1B<CWZXG0P?@$P?D?*<B-!("-!("--`!FQT0D(@``OP`````/
+MO\Z)3"0<B<CWZXE$)!")5"04BT0D%,'X!,'Y'RG(0(7`?CJY(`$``+@?A>M1
+M]VPD'(G3P?L$BT0D')F)V"G0C5`!#[=$)")FBUPD)F:)'$%F_T0D(D</M\<Y
+MT'SEOP`````/MP4&````B<)F.71%_@^.V0```(/&,HE4)!AF.715_GY9#[_.
+MB<L/M\>)1"0,#[]$10")RBG"B50D$(M$)`P/OU1%`BG1BT0D$`^OP87`?BI'
+MBU0D&&8Y=%7^?AX/M]</OT15`(G9*<&)R`^_5%4"B=DIT0^OP87`?]:#[`AJ
+M``^WUP^WA!(*````T>`/M\!0#[>$$@@```#1X`^WP%`/MT15`E`/MT15`%`/
+MM\90Z)T'``!`#[=4)$*Y(`$``&;1Z&:)!%&#Q""+7"0D9CG8=@1FB1Q19O]$
+M)"(/MQ4&````9CET5?X/CR?___]F@WPD(C]W)+L@`0``N1X!```/MU0D(F:+
+M!%%FB0139O]$)")F@WPD(C]VYKF`H0``OP````"^(@$``+L@`0``#[?'#[<4
+MAL'B&('*``#_``^W!(/!X`@,_R7__P``"<*+;"1`BT44B10(@\$$1V:#_Q]V
+MS(/$+%M>7UW#55=64X/L1(MT)&2+1"18B40D(&;'1"0>``!FQT0D'```9L=$
+M)!H``&;'1"08``!FQT0D%C\`9L=$)!(``+^@`0``_W0D:/]T)%SH_/___]'@
+M9HE$)!R#Q!"+5"1@]D(#`706BTPD4(J!'`@``.L49HE<)!+I6`$``(M4)!B*
+M@AT(``"#[`0/OL!0_W0D:/]T)%SH_/___XA$)!F#Q!"#?"14``^$HP```+L`
+M````B?8/M].+3"149H,\T0!T$&:+!-%FB414($-F@_L'=N*)W8/L#(U$)"I0
+MC40D+%`/M\-0C40D.%"+5"1\#[<"4.C=!@``NP````"#Q"!F.>MS%(M4)!P/
+MM\-F.51$('0&0V8YZW+PBT0D'&8[1"0>=0Z+3"1@9HL!9CM$)!QT#@^WPXM4
+M)%2#?,($`'01#[?#BTPD5&:+1,$"9HE$)`Z[`````&8Y\W,<B?8/M\.-%("+
+M3"189HM440AFB51$($-F.?-RYH/L#(U$)"I0C40D+%`/M\90C40D.%"+5"1\
+M#[<"4.@[!@``NP````"#Q"!F.?-S+XGV#[?#9HM$1"!F.T0D''4%9HE<)!8/
+MM\-FBT1$(&8[1"0>#X2D_O__0V8Y\W+3NP````")]HM,)&#V00)`#X36````
+M9H/[!'<P#[=$)!:-!("+5"189HM$0@9FB40D%`^W1"02C02`9HM$0@9FB40D
+M$.E;`0``C78`9H/[!74N#[=$)!:-!("+3"189HM$001FB40D%`^W1"02C02`
+M9HM$001FB40D$.DE`0``D&:#^P9U+@^W1"06C02`BU0D6&:+1$("9HE$)!0/
+MMT0D$HT$@&:+1$("9HE$)!#I\0```)!F@_L'#X7F````#[=$)!:-!("+3"18
+M9HL$06:)1"04#[=$)!*-!(!FBP1!9HE$)!#INP```(UV``^WPX/X!P^'K```
+M`/\DA5@[```/MT0D%HT$@(M4)%AFBT1"!F:)1"04#[=$)!*-!(!FBT1"!F:)
+M1"00ZWL/MT0D%HT$@(M,)%AFBT1!!&:)1"04#[=$)!*-!(!FBT1!!&:)1"00
+MZU$/MT0D%HT$@(M4)%AFBT1"`F:)1"04#[=$)!*-!(!FBT1"`F:)1"00ZR</
+MMT0D%HT$@(M,)%AFBP1!9HE$)!0/MT0D$HT$@&:+!$%FB40D$)"#[`AJ``^W
+M1"0<4`^W1"0D4`^W1"0R4`^W1"0T4(M4)'P/MP)0Z$H#``")P8/$(&8[1"0.
+M=@5FBTPD#HM$)&#V0`(0=!^+5"089H&Z``@````P=A!F.XH."```=@=FBXH.
+M"```#[?S#[=4)`P/OD0D"2G"#[?!.<)^`HG"9HD4=V:%VW4KBTPD4(N!T`$`
+M``^WA`!,.P``T>!FBQ=F*<)FB50D"F:%TG\'9L=$)`H!``^WRP^_1"0*#[<4
+M3SG0?@*)T&:)!$]#9H/[!P^&D_W__P^W!XM4)!B)@O`8``"+3"10BUD4N0``
+M``"#X0'!X1ZX/P```&8C1P;!X!B)R@G"N#\```!F(T<$P>`0"<*X/P```&8C
+M1P(/M\#!X`@)PK@_````9B,'#[?`"<*)DS29``"+1"10BU`4N#\```!F(T<.
+MP>`8"<&X/P```&8C1PS!X!`)P;@_````9B-'"@^WP,'@"`G!N#\```!F(T<(
+M#[?`"<&)BCB9```/MP=0_W0D5.C\____9HL'BU0D6&:)@LX!``"#Q$1;7E]=
+MPXUV`%575E.#[!R+?"0XBW0D,(M<)#2-1"0:4%</M\-0#[?&4.@^`0``@\00
+MA<!T"P^W1"0:Z24!``"0@^P,C40D)%"-1"0F4`^W1P10_S</M_96Z&<"``"#
+MQ!2-1"0@4(U$)")05P^W1"0N4`^WVU/H*@,``(/$%(U$)!Q0C40D'E!7#[=$
+M)#!04^@0`P``@\0@C40D#%!7#[=$)!I0#[=$)")0Z+X```"-1"0:4%</MT0D
+M+%`/MT0D,E#HIP```(/$&&H`#[=$)!90#[=$)!Q0#[=$)"A0#[=$)"I04^CT
+M````B<6#Q""-1"0,4%</MT0D%E`/MT0D)%#H:````(U$)!I05P^W1"0H4`^W
+M1"0T4.A1````@\08:@`/MT0D%E`/MT0D'%`/MT0D)%`/MT0D)E!3Z)X```"#
+MQ!AJ``^WP%`/M\50#[=$)"Q0#[=$)"Y05NA_````#[?`@\0@D(/$'%M>7UW#
+M55=64XMT)!R+;"04BWPD&(M."+L`````9H-^!`!V1Y!F.2EU-XU1"+@`````
+M9H-Y!@!V*&8Y.G47#[?`9HM401Z+1"0@9HD0N`$```#K')"#P@)`9CE!!G?:
+MB?:#P31#9CE>!'>ZN`````!;7E]=PU575E.#[`2+;"08BTPD'(M\)""+="0D
+MBUPD*&;'1"0"9``/M\8/M],/K\*Z`````(7`#X2C````@WPD+`!T!V;'1"0"
+M`0!F.<]T=0^WQ0^WR2G(C02`C02`P>`"#[?7*<J)T9GW^6:%P'D5#[?&@WPD
+M+`!T8XT$@(T$@,'@`NM89H/X9'X6#[?#@WPD+`!T2(T$@(T$@,'@`NL]D`^_
+MR`^WPP^OP;ID````*<H/M\X/K]$!T`^W5"0"B=&9]_GK&(GP@WPD+`!T#P^W
+MQHT$@(T$@,'@`HUV``^WT(G0@\0$6UY?7<.-=@!55U93BW0D&(M\)""+;"0D
+MBUPD'`^WPV:+3$;^#[=4)!2-!)*-!("-%(4`````#[<&C02`C02`C02%]O__
+M_SG0=A)FBP9FB0=FBP9FB44`Z80````/M\&-!("-!("-!(4*````.=!S+&:)
+M#V:)30#K9V:+!$YFB0=FBP1.9HE%`.M69HL$3F:)!V:+1$X"9HE%`.M$N0``
+M``!FA=MT.@^WVXUV``^W!$Z-!("-!(#!X`(IT(/`"8/X$G:V#[=$3@*-!("-
+M!("-!(7V____.=!WL4$YRW_.B?9;7E]=PXUV`%=64XM$)!B+?"00BW0D%(M0
+M"+D`````#[=`!(G#@_@`?@^)]F8Y,G0(@\(T03G+?_/_="0@_W0D(`^W0@90
+MC4((4`^WQU#HU?[__X/$%%M>7\.)]HM$)`2-B#P6``"+%80[``")D#P6``"-
+M!-4`````*="-!(6(.P``B4$8QT$4`0```,=!#!0```#'01`C````PY!75E.+
+M5"04BT0D$(N`_`<``/9``B!T);\`````NQP```"Y0````+YR````QT(,````
+M`,="$'<```#K(Y"_`````+LR````N0````"^,@```,="#!0```#'0A`C````
+MBU($N``````Y^G($.=IV#3G*<@0Y\G8%N`$```!;7E_#D(M$)`2+2!2+D/`8
+M``#!X@F!X@!^``"`SH")D3"9``#'@.P8```!````PXGV5U93BWPD$(G[C;<\
+M%@``N`````"#?A0`='B#O^P8```!=6F+1Q2+@#"9``"I`(```'59P>@9B48$
+MQX?L&````````%97Z`K___^#Q`B%P'4[@^P(5E?H/0```(/$$(7`="J#[`A6
+M5^A(````@\00A<!^&8/L"%97Z$L!``#'A^P8```"````@\00B?:+@^P8``!;
+M7E_#B?:+3"0(N`````"+400[40QV!3M1$'(%N`$```##5E.+7"00NO____^#
+M>Q0`#X3W````BP.-%,4`````*<*-%)6(.P``B5,8BT,$.T,0<F*Z_____X,[
+M``^$S````(M#!(E#"#M#$')!@SL`=#R+`TB)`XT4Q0`````IPL'B`HM+&(N"
+MD#L``"M!"-'@BTL(*<&)2PB!PH@[``")4Q@[2Q!R!X,[`'7&B?:Z`0```.MY
+MD(M#!+H`````.T,,=VNA@#L``$BZ_O___SD#=%R+0P2)0P@[0PQW2:&`.P``
+M2#D#<S^)QI"+`T")`XT4Q0`````IPL'B`HM+&(N"D#L``"M!"-'@BTL(*<&)
+M2PB!PH@[``")4Q@[2PQW!SDS<L>-=@"Z`@```(UV`(G06U[#C78`BTPD!(M4
+M)`B#>A0`=#>+0AAFBP!FB8%@"0``BT(89HM``F:)@5X)``"+0AAFBT`$9HF!
+M7`D``(M"&&:+0`9FB8%:"0``PXGVBTPD!(M!%(N`!(```"7__P``BY&P`0``
+M@_H!=#.#^@%R'H/Z!G0)@_H(="3#C78`BU$4#0``@0")@@2```##D(M1%`T`
+M`$(`B8($@```PY"+410-```@`(F"!(```,.05U93BWPD$(/L#%?H_/___XG&
+M@\0()?___W]05^C\____BT<4BU`PB=.!X_`#``#!ZP2#Q!"#?"04`'00N"4`
+M```IV-'H`</K'XUV`(/[`78#2^L4@^P(5E?H_/___[@`````@\00ZRJ+3Q2!
+MX@_\__^)V,'@!"7P`P``"<*)43"#[`A65^C\____N`$```"#Q!!;7E_#B?93
+M@^P(BUPD$(M4)!2X`````(/Z"7\>@^P$_W0D'(T$4HT$@(V$@WP6``!04^C\
+M____@\00@\0(6\.-=@!3@^P(BUPD$(M4)!2X`````(/Z"7\>@^P$C012C02`
+MC82#?!8``%#_="0@4^C\____@\00@\0(6\.-=@!55U93@^P,BVPD((MT)"2)
+MZH/^`G0:@_X"=PF#_@%T*.L^B?:#_@-T#X/^!'01ZS"_"0```.LQD+\(````
+MZRF_`0```.LBB?:_`````+@`````@[V`%@```'5\ZPN-=@"X_____^MPD(T$
+M?XT$@(V<@GP6``"X_____X-[!`!U5X/L"&H\4^C\____B7,$@\00@WPD*`!U
+M+,=##`L```#'0Q0"````QT,8_____\=#'/\#``!FQT,@"@!FQT,B"@#K$XGV
+M@^P$_W0D+%=5Z/S___^#Q!")^(/$#%M>7UW#D%.+3"0(BUD4BY%H%@``@>+_
+M`P``BX%P%@``P>`0)0``_P,)PHF3I````(M9%(N1;!8``('B_P,``(N!=!8`
+M`,'@$"4``/\#"<*)DZ@```"+612+@ZP````E`/S__XN1>!8``('B_P,```G0
+MB8.L````6\.05E.+="0,BTPD$+@`````@_D)=U2-!$F-!("-G(9\%@``N```
+M``"#>P0`=#S'0P0`````N/[____3P"&&:!8``"&&;!8``"&&<!8``"&&=!8`
+M`"&&>!8``%-6Z"W___^X`0```(/$")!;7L.055=64XM\)!B+;"04BY7\!P``
+MN`````"#_PD/AP@$``"-!'^-!("-M(5\%@``N`$```"#?@0`#X3L`P``@WX8
+M_W4VA=)T%0^W0@(EH````+H?````/:````!T!;H/````N`$````YT',2C78`
+MT>"#R`$YT'+WZP20BT88C1R]`````(M4)!2+2A2)PH'B_P,``(M&','@"B4`
+M_`\`"<*+1A3!X!0E``#P#PG"B9090!```(M$)!2+2!0/MT8BP>`$)?`````/
+MMU8@@^(/"=`-`"`(`(F$&8`0``"+5"04BT(4QX08P`D````(``"#NJ0!```#
+M=PZ+0A3'A!@`$0```````8-^)`!T3HT,O0````"+1"04BU@4BU8D@>+___\`
+MBT8HP>`8"<*)E`O`"```BU0D%(M:%(N$"\`)``")PH/*`8-^*`!T"(G"@<H!
+M`0``B90+P`D``(-^,`!T(HT,O0````"+1"04BU`4BT8P)?___P`-`````8F$
+M"@`)``"#?BP`=$.-#+T`````BT0D%(M0%(M&+"7__P\`#0``$`")A`K`$```
+M]D8,0'0;BT0D%(M0%(N$"L`)``"`S`*)A`K`"0``C78`]D8,$'0AC0R]````
+M`(M$)!2+4!2+A`H`$0``#0``(`")A`H`$0``]D8,@'0?C0R]`````(M$)!2+
+M4!2+A`H`$0``@,P"B80*`!$``(M&!(/X`W1I@_@#=PJ#^`)T$^GY````@_@$
+M#X30````Z>L```"-#+T`````BT0D%(M0%(N$"L`)```,HHF$"L`)``"+5"04
+M@[JD`0``!!G;@>,````!@<,``"4`B<J+3"04BT$4B9P0`!$``.F?````C0R]
+M`````(M$)!2+4!2+A`K`"0``#6("``")A`K`"0``H0`````K!0````"+E?08
+M``")TRG#*QT`````P>,*BT0D%(M0%(G8#0````&)A`H`"0``BU0D%(.ZI`$`
+M``09VX'C`````8'#```$`(G*BTPD%(M!%(F<$,`)``#K((T,O0````"+1"04
+MBU`4BX0*P`D``(/((XF$"L`)``"0]D8X`70AC0R]`````(M$)!2+4!2+A`H`
+M$0``#0``)`")A`H`$0``]D8,`703N`$```")^=/@"85H%@``ZQ&)]KC^____
+MB?G3P"&%:!8``/9&#`%T$[@!````B?G3X`F%;!8``.L1B?:X_O___XGYT\`A
+MA6P6``#V1@P"=!.X`0```(GYT^`)A7`6``#K$8GVN/[___^)^=/`(85P%@``
+M]D8,!'03N`$```")^=/@"85T%@``ZQ&)]KC^____B?G3P"&%=!8``/9&#`AT
+M$[@!````B?G3X`F%>!8``.L1B?:X_O___XGYT\`AA7@6``!6_W0D&.@#^___
+MN`$```"#Q`B-=@!;7E]=PXUV`(M$)`C!X`*+5"0$BU(4BX0"``@``,.)]HM4
+M)`C!X@*+1"0$BT@4BT0D#(F$$0`(``"X`0```,.0BTPD"(M$)`2+4!2X`0``
+M`-/@B8)`"```N`$```##B?964XM4)!#!X@*+1"0,BW`4BX06``H``(G#@^,#
+M=1JX`0```(I,)!#3X(N60`@``(7"=`6[`0```(G86U[#C78`5U93BWPD$(MT
+M)!2+5Q2X`0```(GQT^")@H`(``"[`````(GV5E?H_/___X/$"(7`=!:#[`QJ
+M"NC\____@\000X'[#R<``'[<BT<4QX"`"````````('[#R<```^>P`^VP%M>
+M7\.-=@"X`0```,.)]E93BW0D+(M<)#2+3"00BT0D%"7_#P``BU0D),'B$@G0
+MBU0D,,'B&0G0]L,!=`4-`````?;#$'0%#0```"#VPP1T!0T``$``]L,@=`4-
+M``"``(E!"(M$)!R)PL'B&O;#`G0&@<H``(``B5$,@_[_=!:)\,'@#24`X`\`
+M"=")00R!20@```!`N`$```!;7L.)]K@`````PXGV4XM,)!"+7"08BU0D#(-\
+M)!0`=!2+0@P)R(7;=0.`S!")0@SK)XUV`(7;=!"+1"0<BT`(B4((B4H,ZQ&0
+MQT((`````(G(@,P0B4(,D,="%`````#'0A``````N`$```!;PXUV`%.+3"0,
+MB<JX#P```/9!%`$/A*(```"+010E_A\``-'H9HE!(`^W01)FB4$BQD$D`(M!
+M$*@!=1VH`G0$QD$D`?9"$`AT!(!))`+V0A`$=`6`220$D(M"""4``#P`P>@2
+MB$$EBT(4)0#@'P#!Z`V(02:+0A`E``\``(G#P>L(B%DGBT(0)?````#!Z`2(
+M02B+0A`E`/```,'H#(A!*<9!*@"$VW0&C4,!B$$G@'DH`'0#_D$HN`````!;
+MPXGVPY"0D(/L#(M,)!"+013'@-"8```6'```N@````"-=@"+013'@("8````
+M``$`0H/Z!W[MBT$4BX``G```P>@8B<+!Z@2#X`_!X`0)T(/L"&H(4.C\____
+M@\0<PY!75E.![)````"+G"2@````C7PD<+ZL1```_+D%````\Z6-?"10OL!$
+M``"Q!?.EC7PD,+[41```L07SI8U\)!"^Z$0``+$%\Z6Z`````(UV`(M$E'")
+MA).T+@``BT244(F$D\@N``"+1)0PB823W"X``(M$E!")A)/P+@``0H/Z!'[.
+M@<20````6UY?PU93@^P0BW0D'&@P+P``Z/S___^)PX/$$(7`=12+1"0@QP`"
+M````N`````#INP```(/L!&@`"```:*`\``!0Z/S___^+1"0DB4,,BT0D*(E#
+M$(M$)"R)0Q1FB;.@`0``9L>#H@$`````9L>#S`$``#P`QX/0`0```````,>#
+M5!D```````#'@U@9````````QX-<&0```````,>#:!D```$```#'@VP9````
+M````QX-P&0``9````,>#=!D```(```#'@X09``#_____QX.(&0``_____\>#
+MC!D``/_____&@Y`9````B=B#Q!"#Q`1;7L.-=@!55U93@^PHBWPD3%?_="1,
+M_W0D3/]T)$P/MT0D3%#H_/___XG&@\0@N`````"%]@^$:@4``(GS:@!J`6H"
+M5NC\____@\00A<!U#L=$)!0#````Z2D%``"0@^P(:@!6Z/S___^#Q!"%P'4.
+MQT0D%`,```#I"04``)"+1A2+@"!````/MM")T,'H!(F&I`$``(G0@^`/9HF&
+MJ`$``(.^I`$```5T"8.^I`$```=U"F:#NZ@!```!=PW'1"04#0```.F\!```
+MBT,4BX`8F```9HF#J@$``(/L#%/H_/___X/$$(7`=0W'1"04#@```.F/!```
+MBT,4QX``F```!P```(/L#%/H_/___V:)@ZP!``"#Q!`/M\`E\````(/X('18
+M@_@@?PR#^`=T3H/X$'1)ZPJ#^#!T0H/X4'0]9H.[K`$```!U,X.[I`$```5U
+M&(&[J`$```D`0P!U#&;'@ZP!``!&`.L3D(.[I`$```=U"6;'@ZP!``!1``^W
+MDZP!``")T"7P````@_@O?A>)T(/@#X/X!'\-QT0D%`T```#IX`,``(/L!(U$
+M)!Y0:,$```!3Z/S___^#Q!"%P'4-QT0D%`@```#IN0,``&:!?"0:`3!W#<=$
+M)!0%````Z:,#``!FBT0D&F:)A@`(``"+0Q2+D!!```"#XAC!Z@.#^@)T#<=$
+M)!0*````Z78#``"#[`2-1"0>4&H_4^C\____@\00A<!U#<=$)!0(````Z5(#
+M``!FBT0D&F:)A@((``"#[`2-1"0>4&H<4^C\____@\00A<!U#<=$)!0(````
+MZ2(#``#'1"0,0`,``&:#?"0:`'1&#[=$)!HE\/\``,'@#(E$)`R#[`2-1"0>
+M4&H;4^C\____@\00A<!U#<=$)!0(````Z=T"```/MT0D&@E$)`R!;"0,P```
+M`,=$)!``````O0````"+1"0,.<5S,(/L!(U$)!Y0C87`````4%/H_/___X/$
+M$(7`#X2/`@``#[=$)!HQ1"0013ML)`QRT(%\)!#__P``=`W'1"04!P```.EP
+M`@``9L>&=@D```H`9L>&@`L```,`O0````"-1&T`C42%`&;'A(9^"0``"P!%
+M@_T)=NB]`````+J@1```N:9$``!FBP1J9HF$;H@+``!FBP1I9HF$;H(+``"-
+M1&T`C42%`(T$AF;'@#`,```+`&;'@)0+```+`$6#_0)VQ8/L"(V&``@``%!3
+MZ/S___^#Q!"%P'4-QT0D%`@```#ITP$``&:#OA@(````='4/MX.L`0``)?``
+M``"#^!!U9(M#%,>``)@```=```"#[`QHT`<``.C\____B1PDZ/S___]FB8.N
+M`0``BT,4QX``F```!P```,<$)-`'``#H_/___P^W@ZX!```E\````(/$$(/X
+M('0.QT0D%`T```#I50$``)"#[`2-1"0>4&B_````4^C\____@\00A<!U#<=$
+M)!0(````Z2T!``!FBT0D&F:)A@0(``!FB8/4`0``@^P,4^C\____@\00A<!U
+M#<=$)!0(````Z?T```"#NZ0!```'=12#[`B-1"0<4%/H_/___X/$$.LVD`^W
+M@ZP!```E\````(/X+WX3@^P(C40D'%!3Z/S___^#Q!#K$8/L"(U$)!Q04^C\
+M____@\00A<`/A*,```"#[`Q3Z/S____'1"0@`````+T`````@\00@^P$C40D
+M'E"X'P```"GH4%/H_/___X/$$(7`=%D/MT0D&@%$)!!F#[9$)!N(A&Y<%@``
+M9HM$)!J(A&Y=%@``18/]`G:[@WPD$`!T"H%\)!#]_P(`=0K'1"04"0```.LJ
+M4^@D^?__@^P(4^C\____B=B#Q!#K,\=$)!0(````ZPJ)]L=$)!0(````A?9T
+M#(/L#%;H_/___X/$$(7_=`:+1"04B0>X`````(/$'%M>7UW#D%.#[!2+7"0<
+M4^C\____@\00@[O(%@```'0.@^P,4_^3R!8``(/$$)!J`&H!:@-3Z/S___^)
+M'"3H_/___X/$&%O#C78`55=64X/L+(MT)$#'1"0(`(```,=$)`P@F```QT0D
+M$%55557'1"04JJJJJL=$)!AF9F9FQT0D')F9F9F_`````(UL)`B-!+T`````
+MBQPHBU84BQ0:B10$N0````")R,'@$(G""<J+1A2)%!B+1A2+!!@YT'0'N```
+M``#K84&!^?\```!^U[D`````BU2,$(M&%(D4&(M&%(L$&#G"=`JX`````.LX
+MC78`08/Y`W[<C02]`````(M.%(L4*(L$!(D$$4>#_P$/CGG___^#[`QJ9.C\
+M____N`$```"#Q!"#Q"Q;7E]=PXUV`(M4)`R+3"00BT0D"/;$`7039L<".!-F
+MQP'4%[@!````PXUV`*F`````="&+1"0$9H.X&`@```!T$V;'`@@)9L<!K`JX
+M`0```,.-=@"X`````,.)]E575E.#[`R+;"0@B>^)ZXVUM`$``&;'1"0*``!F
+M@;T`"````%!V)8/L!(U$)`Y0:,D```!5_Y6$`0``@\00N@````"%P`^$3`(`
+M`)!F@WPD"@!U+(.]I`$```=U(V:#O:@!```(=1EFQT0D"@4`9L>'!@@```$`
+M9L>'"`@```$`@[NP`0``!G0[9H&[H@$``&5P=3!FBY/4`0``C4*<9H/X`7<,
+MC4(%9HF#U`$``.L49H.[U`$``$%U"F;'@]0!``!#`)#'1@0`````9H._%@@`
+M``!T&\=&!`$```!F@[\&"````'4*QT8$`P```(UV`&:#OQ@(````=`2#3@0$
+M9H._&@@```!T*&:!NZ(!```1#G0=BU8$B="#R`B)1@1F@[\("````'4(B="#
+MR"B)1@1FQT80"`D/MX6L`0``)?````"#^"]_"8.]I`$```=U"&;'1A+$">L&
+M9L=&$JP*9L=&##@39L=&#M07BD8!@^#?@\A`B$8!N`````!F@[NH`0```W8+
+M]D0D"@)U!+`!B?;!X`2*5@&#XNL)PH/*"`^W3"0*B<C1Z(/P`8/@`='@@^+]
+M"<*(5@&`#@-F@[NH`0```79=N`````#VP0%U"O9&!`ET!+`!B?:-'(4`````
+MBA:#XO,/MTPD"HG(P>@#@_`!@^`!P>`#"=H)PH@6N`````#VP01U"?9&!`ET
+M`[`!D(C"P>($B@:#X.\)T(/(H(@&@":_N@````"#O\@(````=`F#O\P(````
+M=06Z`0```(I&`8/@_@G0@\B`B$8!@$X"`0^W1"0*)?`!``!T"L'X!&:)1@CK
+M!Y!FQT8("@!F]T0D"@#P=!4/MTPD"L'I#+@!````T^!FB48*ZP9FQT8*@`"Z
+M`0```(G0@\0,6UY?7<.0D)!75E.+3"00BW0D%(M<)!B)SXM!%(FP*(```(N!
+ML`$``(/X`70/@_@!<B:#^`9T(8/X"'5$BT$4QX`L@```__\``(M!%,>`,(``
+M`/__!P#K*(M1%(GP*P4`````P>`#B8(L@```BU$4B?`K!0````#!X`.)@C"`
+M``"+412-1@&#OU09````=`B)\`.'5!D``(F"-(```('C__^``8G8P>@8A<!T
+M#8M!%,>`((````````&+012)F""```!;7E_#B?964X/L!(MT)!"[`````(GV
+M@^P(:@)6Z/S___^#Q!"%P'06@^P,:@KH_/___X/$$$.!^^<#``!^V('[YP,`
+M``^>P`^VP(/$!%M>PXGVBU0D!(M"%,>`*(````````"+2A2+@02````-```$
+M`"7__\__B8$$@```BT(4QX`@@```__\``,-55U93BVPD%(M<)!AF@WL2`'1!
+MBU44BX($@```#0``$`")@@2```"+510/MT,0B8(D@```BU44#[=#$HF".(``
+M`(M5%(M#%,'@`XF",(```.L6B?:+512+@@2````E___O_XF"!(```(M5%(L#
+MB8(H@```BTT4BX$@@```)0``@/\/MU,("<)F@WL8`'01#[=#&(/`!,'@$"4`
+M`'\`"<*)D2"```"+312+D1B````P]@^W0QK!X`@E`/\```G"B9$8@```BWL(
+M.7L<=@.+>QR+<PPY<QQV`XMS'#GW=0:+2P3K`Y"+"XM5%(M#!(/H`\'@`R7_
+M_P<`#0``&`J)@M2```"+512-!,WH____)?__!P`-````"HF"V(```(M-%(GX
+M)?__``")\L'B$`G0B8'<@```6UY?7<-3@^P(BUPD$(M3%(M$)!2)@@!@``"+
+M0Q3'@`A@```!````:@)J`V@,8```4^C\____@\00N@````"%P'05BT,4BY`$
+M8```BT0D&&:)$+H!````B="#Q`A;PY"0D%.+1"0(BU@4BTPD#-'AN@,```#3
+MXHN#%$````G0B8,40```N`$```!;PXGV4XM$)`B+6!2+3"0,T>&X`P```-/@
+M]]"+DQ1````AT(F#%$```+@!````6\-3BTPD#(M$)`B+6!2+DQA```"X_O__
+M_]/`(<*+1"00@^`!T^`)PHF3&$```+@!````6\.0BTPD"+C_____@_D%=Q6+
+M1"0$BT`4BX`<0```@^`OT^B#X`'#5E.#[`2+="00BU0D%(M&%(N8%$```(T,
+M$K@#````T^`-`/`!`/?0(</!X@P)TX#/@(-\)!@`=`:!RP```0"+1A2)F!1`
+M``"#[`B+AF@6```-`````5!6Z/S___^#Q!1;7L.0D(M$)`2+0!2+@`A```"#
+M^`$/E,`/ML##D%=64XM\)!"+="04BT<4BYC`````@_O_=1/'!@````"X````
+M`.F9````C78`B=@ENM@%`8D&]\,```@`=`<-````0(D&]L,%=`.##@'WP\`%
+M``!T7H,.0(M/%(N1Q````('B_P,```N7+"\``(F7+"\``(N!Q````"4``/\#
+MP>@0"=")ARPO``"+D<@```"!XO\#```)PHF7+"\``(N!R````"4``/\#P>@0
+M"=")ARPO``#VPR!T!H$.````0+@!````6UY?PXGVBT0D!(N`:!8``,.05U93
+MBW0D$(M<)!2)\8N^:!8``(7_>1&+1A3'0"0`````BT84BT`DD(G:@>*ZV`4!
+M]L-`=#.#N>06````=`.#RD"#N>@6````=`.`S@&#N>P6````=`.`RH"#N?`6
+M````=`:`S@2-=@#VPP%T`X/*!_?#````0'0&@<H```@`BT84B9"@````B9EH
+M%@``A=MY"XM&%,=`)`$```"0B?A;7E_#D)"+1"0$#[>`O@$``,.+5"0$BT0D
+M"&8Y@KX!``!V&P^WP,'@!0-"%(N`'(@``+H!````J0"```!U!;H`````B=##
+M5E.+7"0,BW0D$+@`````9CFSO@$```^&V0````^WQL'@!8G"`U,4BXH4B```
+MQX(`B````````(G"`U,4QX($B````````(G"`U,4QX((B````````(G"`U,4
+MQX(,B````````(G"`U,4QX(0B````````(G"`U,4QX(4B```!P```(G"`U,4
+MQX(8B`````````-#%,>`'(@```````"#^01U38.[:!D```!T1(U&0`^WP,'@
+M!8G"`U,4QX(`B````````(G"`U,4QX($B````````(G"`U,4QX((B```````
+M``-#%,>`#(@```````"0N`$```!;7L-75E.+?"00BU0D&(MT)!2X`````&8Y
+MM[X!``!V:X72=#@/MEH%P>,(#[9"!`G##[9*`\'A&`^V0@+!X!`)P0^V0@'!
+MX`@)P0^V`@G!T>F)V,'@'PG!T>OK"[L`````N0````"0#[?&P>`%B<(#5Q2)
+MBAB(```#1Q2)VH#.@(F0'(@``+@!````6UY?PU575E.#[!2+="0PBTPD+(M4
+M)"B!PK0!``"#?"0X`1G;]].!XZJJJJJ_`````&8Y2@H/AD$#```/M@:#^`4/
+MAXT```#_)(7\1```QT0D!`4```#IA0```+\`````]D(!$`^$$@,``,=$)`0&
+M````ZVS'1"0$!`````^WP8/`0`^W4@J_`````#G0#XWI`@``ZTN_`````&:#
+M?@($#X;7`@``QT0D!`````!F@WX"!78L9H-^`@X9P(/@_H/``XE$)`3K&<=$
+M)`0'````ZP^-=@"_`````.F>`@``B?8/ME8$#[9&!<'@"`G"#[9&!L'@$`G"
+M#[9&!\'@&`G",=J)5"00#[9&"<'@"`^V5@@)PC':@>+__P``B50D#`^V;@H/
+MMD8+P>`("<4/MD8,P>`0"<4/MD8-P>`8"<4QW0^V1@_!X`@/ME8."<(QVH'B
+M__\``(E4)`@/MGX0#[9&$<'@"`G'#[9&$L'@$`G'#[9&$\'@&`G',=]F@WX"
+M#7<&@>?_````@WPD!`0/A7,!``"+7"0H@[MH&0````^$8@$``(U90`^WR8G(
+MP>`%B00DB<*+1"0H`U`4BT0D$/?0B8(`B```BQ0DBT0D*`-0%(M$)`SWT(F"
+M!(@``(L$)(M4)"@#0A2)J`B(``"+!"0#0A2+5"0(B9`,B```BP0DBU0D*`-"
+M%(FX$(@``(L$)`-"%,>`%(@```0```#_="0T45+H_/___P^V3A0/MD85P>`(
+M"<$/MD86P>`0"<$/MD87P>`8"<$/ME88#[9&&<'@"`G"#[9&&L'@$`G"#[9&
+M&\'@&`G"#[?;P>,%B=B+="0T`T84B8@`B```@\0,B=@#1A3'@`2(````````
+MB=@#1A2)D`B(``")V`-&%,>`#(@```````")V`-&%,>`$(@```````")V`-&
+M%,>`%(@```<```")V`-&%,>`&(@````````#7A3'@QR(````````BP0D`T84
+MBU0D$(F0`(@``(L$)`-&%(M,)`R)B`2(``#K=(UV``^WR8G(P>`%B<*+7"0H
+M`U,4BW0D$(FR`(@``(G"`U,4BUPD#(F:!(@``(G"BW0D*`-6%(FJ"(@``(G"
+M`U84BUPD"(F:#(@``(G"`U84B;H0B````T84BW0D!(FP%(@``/]T)#11_W0D
+M,.C\____@\0,OP$```")]HGX@\046UY?7<.0D(/L$&H&BT0D&`5<%@``4/]T
+M)"#H_/___X/$',.#[!!J!O]T)!R+1"0<!5P6``!0Z/S___^X`0```(/$',.-
+M=@!3BUPD$(M,)`BZ#````(M$)`QF.8'4`0``=!@/MX$""```P>@'@^`!@_@!
+M&=*#XOB#P@N%VW0"B1.X`````%O#BTPD!(G*N`````!F@[D6"````'0.9H.Y
+M!@@```$9P(/@`D!F@[H8"````'0#@\@$9H.Z&@@```!T'F:!N:(!```1#G03
+M@\@(9H.Z"`@```!U!H/(((UV`,.-=@!3@^P(BUPD$&:#NPH(````=$J#[`2-
+M1"0*4&H/4_^3A`$``(/$$+H`````A<!T60^W5"0&B="#X!S!^`*)@Y09``"#
+MX@+1^HF3F!D``,>#H!D```$```#K(8UV`,>#E!D```````#'@Y@9````````
+MQX.@&0```````&:#NPH(````#Y7`#[;0B="#Q`A;PY!3@^P0BUPD&/^SE!D`
+M`%/_DY`!``"+4Q2+@@"8``"`S"")@@"8``"#Q`C_LY09``!3_Y.4`0``B8.<
+M&0``@\0,.X.8&0``#Y7`#[;`4/^SE!D``%/_DYP!``"#Q!A;PY"+1"0$BT@4
+MBX$00```)9__\?^+5"0(@^('"P25($4``(F!$$```,.05E.#[`B+7"04BW0D
+M'&H&_W0D'(V#8A8``%#H_/___XM+%`^VDV(6```/MH-C%@``P>`("<(/MH-D
+M%@``P>`0"<(/MH-E%@``P>`8"<*)D0B```"+2Q0/MH-G%@``P>`(#[:39A8`
+M``G"@>;_/P``P>80"?*)D0R```"+4Q2+@@R````E__\``(F"#(```(/$%%M>
+MPU.+1"0(BT@4BX%0@```B<*X`````(N)3(```+L`````"<@)VEO#B?:+1"0$
+MBT`4BX!,@```PXGVBTPD!(M1%(N"((````T````!B8(@@```BU$4B8(@@```
+MPXGV5E.+="0,BUPD$(N&_`<``(7`=&#V0`(@=%JP`+D`````.PMS'(UV`(I4
+M"P2$TGD,@^)_.,)R!8C0C78`03L+<N>+5A2+B@2```"$P'06T.@\`G<0B<@-
+M`````HF"!(```.L1D(M6%(G()?____V)@@2```!;7L.0BU0D!(M"%(N`9)@`
+M`(G!P>D3@>'_`0``B<C!Z`B%P'0&@?$`_O__BU(4BX)0@```BY),@```,=`Q
+MR,.04XM4)`B+0A2+@"!````E_P```(G!@^$/NP````#!Z`0Y@J0!``!U#&8Y
+MBJ@!``!U`[,!D(G86\.+3"0$BT0D"(M1%(N2D(````$0BU$4BY*,@````5`$
+MBU$4BY*4@````5`,BU$4BY*(@````5`(BU$4BY*8@````5`0P[@!````PXGV
+MBT0D!(M0%(N"5)D``(/(`8F"5)D``,.0BT0D!(M`%(N`')P``"7_````PY"+
+M1"0$BT`4BX!8@```@^`'PXUV`(M$)`2+4!2+1"0(@^`'B8)8@```PXUV`%57
+M5E.+?"04BVPD&(G[BT0D'`^W0`(EX`$``#W`````="H]P````'\+/:````!T
+M%.LBB?:^`````#U``0``="#K$HGVO@$```#K%9"^`@```.L-D+@`````Z;L`
+M``")]@^WC'-X"```#[>$<WX(``#!X`8)P0^WA'.$"```P>`,"<$/MX1SB@@`
+M`,'@$@G!#[>$<Y`(``#!X!@)P0^WE'.6"```#[>$<YP(``#!X`8)P@^WA'.B
+M"```P>`,"<(/MX1SJ`@``,'@$@G"#[>$<ZX(``#!X!@)PH/]`70/@_T!<AJ#
+M_0)T">L+C78`B<KK#(G1ZPBX`````.L>D(FK6!D``(M'%(F(8)D``(M'%(F0
+M9)D``+@!````6UY?7<.)]K@!````PXGV5U93BWPD$(MT)!2)^X/^"'86@^P(
+M:/__``!7Z/S___^#Q!`Y\',2D,>#A!D``/____^X`````.LC@^P(5E?H_/__
+M_XM7%(F"<!```(/$$(FWA!D``+@!````B?9;7E_#@^P4BU0D&(M"%(N`<!``
+M`"7__P``4%+H_/___X/$',-55U93@^P4BVPD*&C_/P``5>C\____@\00.T0D
+M)',1QX6(&0``_____[@`````ZSR+=12+GA2```"!XP#`__^#[`C_="0L5>C\
+M____)?\_```)PXF>%(```(/$$(M$)"2)A8@9``"X`0```)"#Q`Q;7E]=PX/L
+M%(M4)!B+0A2+@!2````E_S\``%!2Z/S___^#Q!S#55=64X/L%(ML)"AH_S\`
+M`%7H_/___X/$$#M$)"1S$<>%C!D``/____^X`````.M`BW44BYX4@```@>/_
+M_P#`@^P(_W0D+%7H_/___\'@$"4``/\_"<.)GA2```"#Q!"+1"0DB86,&0``
+MN`$```")]H/$#%M>7UW#@^P4BU0D&(M"%(N`%(```"4``/\_P>@04%+H_/__
+M_X/$',.0@^P4BT0D&/^PL`$``%#H_/___X/$',.0BU0D!+@`````@WPD"`9T
+M%("Z(0@```!T"X.Z=!D```%W`K`!PXUV`%.+7"0(_W0D#%/H_/___X/$"(7`
+M#X2R````BT,4QX!PF```'P```(M#%,>`=)@```T```"+0Q3'@'B8```,````
+MBT,4QX#PF0```P```(M#%,>`])D```4```"+4Q0/MX.L`0``)?````"#^#`/
+MG,`/ML"-!(44````B8+XF0``BU,4BX(<@```)7_`__\,@(F"'(```(M#%,>`
+M!($``#T```"+4Q2+@A!```"#R`*)@A!```"+4Q2+@A!````-`````XF"$$``
+M`.MGD(M#%,>`<)@``!\```"+0Q3'@'28``!_````BT,4QX!XF```#@```(M#
+M%,>`\)D```P```"+0Q3'@/29``#_````BU,4#[>#K`$``"7P````@_@P#YS`
+M#[;`C02%%````(F"^)D``%O#4XM<)`C_="0,4^C\____@\0(A<`/A+(```"+
+M4Q2+@A!````E_____(F"$$```(M3%(N"$$```(/@_8F"$$```(M#%,>`!($`
+M``$```"+4Q2+@AR````E?\#__PV`#P``B8(<@```BT,4QX!PF```'P```(M#
+M%,>`=)@``'\```"+0Q3'@'B8```.````BT,4QX#PF0``#````(M#%,>`])D`
+M`/\```"+4Q0/MX.L`0``)?````"#^#`/G,`/ML"-!(44````B8+XF0``6\.)
+M]E.#[`B+3"00BT0D%(M<)!B#^!`/A[,```#_)(5`10``@_L"=!:#^P)R(X/[
+M!'(H@_L%=AF#^W]T%.L<9H.YJ`$```09P(/@#>F.````N`````#IA````+@-
+M````ZWV#N6@9````#Y3`#[;`ZVZX`````.MG@[FH&0````^4P`^VP.M8N```
+M``"%VW1/N`P```"#^P%U18M!%(N`"*(``/;$(`^4P`^VP.LQN`````"%VW0H
+MN`````"#^P%U'H.Y;!D````/E,`/ML#K#_]T)!Q34%'H_/___X/$$(/$"%O#
+M4X/L"(M<)!"+1"04BU0D'(/X!70S@_@%=PJ#^`)T$>M_C78`@_@+=$>#^!!T
+M6^MPA=(/E<`/ML")@V@9``"X`0```.MQC78`BT,4BX@(H@``A=)T!X#-(.L%
+MB?:`Y=^+0Q2)B`BB``"X`0```.M'D(/B!HF3R`$``(M#%(F02(```+@!````
+MZRV%T@^5P`^VP(F#;!D``+@!````ZQB)]H/L#/]T)"Q2_W0D+%!3Z/S___^#
+MQ""#Q`A;PY"#[!3_="0L_W0D+/]T)"S_="0L_W0D+/]T)"SH_/___X7`#Y7`
+M#[;`@\0LPU93@^P$BW0D$(-\)!0`=&"+1A3'@`1`````````@^P,:@KH_/__
+M_[L*````@\00D(M&%(N`$$```*D```$`="*#[`QHR````.C\____BT84QX`$
+M0````````(/$$$MUT.L&A=MU"HGVN`````#K&I"+5A2+@@2````E___[_XF"
+M!(```+@!````@\0$6U[#D(M,)`2+412+@@2````-```$`(F"!(```(-\)`@`
+M=`V+013'@`1```````$`PXUV`%.+7"0(BTPD$(M3%(N"!(````T```0`B8($
+M@```@WPD#`!T$8M3%`^WP0T```(`B8($0```6\.05U93BU0D$(M<)!2+3"08
+MBT0D'(G6OP$```"#^P-T)8/[`W<(@_L"=`KK-9"#^P1T'^LM@^P(45+HR_[_
+M_XG'@\00ZR114NA-____@\0(ZQ@/M\!045+H;?___X/$#.L(N`````#K"9")
+MGE`9``")^%M>7\.+1"0$BT`4BX`$0```)0```P#!Z!##B?:+1"0$BT`4BX`0
+M0```P>@0@^`!P[@`````PXGVN`````##B?:X`````,.0D%.#[`B+1"04@_@$
+M=#N#^`1W#H/X`70I@_@"=#SK2HGV@_@@=#.#^"!W"H/X"'0@ZS>-=@`]``$`
+M`'0DZRN-=@"[`````.LID+L`````ZR&[`````.L:B?:[`````.L1NP````#K
+M"HGVN`````#K$Y"#[`A3_W0D'.C\____B=B#Q!"#Q`A;PY"+1"0$BT`4BT`,
+MPY"+1"0$BU`4BT0D"(E"#,.0BT0D!(M`%,=`"`0```##D(/L#(M4)!"+0A3'
+M0`@@````:@!J!&H(4NC\____A<`/E<`/ML"#Q!S#C78`4X/L%(M<)!R+4Q2+
+M@DB```"#X-^)@DB```!3Z/S___^)'"3H_/___X/$&%O#C78`@^P8BTPD'(M1
+M%(N"2(```(/(((F"2(```%'H_/___X/$',.0BTPD!(M1%(M$)`B)@D"```"+
+M412+1"0,B8)$@```PY!3BU0D"(M,)`RX`````(/Y/W="@_D?=B"+4A2+FD2`
+M``"#Z2"X_O___]/`(=B)@D2```#K&XUV`(M2%(N:0(```+C^____T\`AV(F"
+M0(```+@!````6\.04XM4)`B+3"0,N`````"#^3]W0H/Y'W8@BU(4BYI$@```
+M@^D@N`$```#3X`G8B8)$@```ZQN-=@"+4A2+FD"```"X`0```-/@"=B)@D"`
+M``"X`0```%O#D(M$)`2+0!2+D#R```"+@`R!``"H('0#@,X"J0```@)T`X#.
+M`8G0PY!3BUPD"(M,)`R+4Q0/ML&)@CR```"Z`````/;%`G0"LB#VQ0%T!H'*
+M```"`HM#%(F0#($``(72=`^+4Q2+0C2#R!")0C3K#9"+4Q2+0C2#X.^)0C1;
+MPXGVBU0D",=""`````"+1"0,)?\/``")0@SV1"00('0&@,P@B4(,QT(4````
+M`,="$`````"X`0```,-64X/L!(M,)!"+="04B?.+1"0<N@\```#V1A0!#X3G
+M````]D`4`745BT$4BT`,N@\````[1"08#X3,````9HM#$"7_#P``9HE&((M#
+M%"4``/]_P>@09HE&(L9&)`"+0Q2H`G50J`1T",9&)`'K1HGV]D,4$'0F@$XD
+M`@^V0Q6(1B6#N:@9````=2J#[`B-1B!04>C\____@\00ZQCV0Q0(=`:`3B0(
+MZPSV0Q0@=`:`3B00B?:+0Q`E``#P#\'H%(A&)HM#%/;$`70.)0#^``#!Z`F(
+M1B?K!9#&1B?_BT,0)0"`#P#!Z`^(1BB+0Q`E````\,'H'(A&*8M#$,'H#(/@
+M`8A&*KH`````B="#Q`1;7L.0D)!55U93@^P\BWPD4(ML)%R)?"0LO@````"+
+M5"18#[="`HG"P>H'P>@(,="Z#````*@!#X0-"```BTPD6`^W00*)PL'J!L'H
+M!3'0N@P```"H`0^$[@<``&H`:@%J`E?H_/___X/$$+H`````A<`/A.('``"#
+M[`C_="1@5^C\____B40D.(/$$+H,````A<`/A+$'``"#?"14!G0A@WPD5`9W
+M"8-\)%0!=PGK$8-\)%0(=`JZ#````.F)!P``QT0D)`````"%[70=BT<4BX!`
+M$0``B40D)(/L"/]T)#!7Z-,,``"#Q!"+1Q2+@%B```")1"0@A<!U",=$)"`!
+M````BU<4BX($@```)0````*)1"08BX(00```)6``_@")1"0<BYH40```B5PD
+M-(N2&$```(E4)#"#[`C_="1<5^C\____B3PDZ/S___^#Q`C_="1@5^C\____
+M@\00N@,```"%P`^$X`8``(M4)%@/MT(")?`!```]0`$``'14/4`!``!_)CW`
+M````='P]P````'\,/:````!T7.F-````/=````!T=.F!````/<`(``!T5CW`
+M"```?PD]4`$``'0DZVH]0`D``'0)/5`)``!T%.M:QT0D%`$```#'1"00`0``
+M`.M2QT0D%`(```#'1"00`0```.M`QT0D%`,```#'1"00`@```.LNQT0D%`0`
+M``#'1"00`@```.L<QT0D%`4```#'1"00`@```.L*N@P```#I%`8``(M'%,>`
+M`)@```<```"[`````(GVC01;BT\4BQ3%H$4``(E4)`R+5"04C01"BP2%H$4`
+M`(M4)`R)!!%&]\8_````=0V#[`QJ`>C\____@\000X/[&':^NP````"0BPS=
+M`$@``(7M=`V-@0"`__\]_P\``'8DBU<4BP3=!$@``(D$"D;WQC\```!U#H/L
+M#&H!Z/S___^#Q!"00X'[Q@```':[5O]T)!3_="0<5XM,)#S_D<P6``"#Q`C_
+M="1@5^C\____@\009H._J@$``$$/AMT```"+1Q3'@"R8```"H`(`BUPD6&:!
+M.[0)=2F+1"0L#[:((`@```^W@"H(```IP;AG9F9F]^F)T-'XP?D?B<-F*<OK
+M%HM,)"P/MI$@"```N&=F9F;WZHG3T>N+5"18#[="`B70````/<````!U+XM/
+M%(M$)"P/MI`@"```]]K!X@:!XL`/``")V,'@$O?8)0``_``)PHF13)D``.L-
+MBT<4QX!,F0```````(M7%(N"**(``(#D_8F"**(``(M7%(N"**(``"7_`_[_
+M@,P(B8(HH@``BT<4QX!@@```#P```&:#OZH!``!"=@V+1Q3'@%2B````````
+MBT<4QX!XF```#@```(/L!(U$)#Q0_W0D,%?H_/___X/$$+H#````A<`/A!X$
+M``"-1"0X4`^W1"084/]T)#!7BU0D//^2V!8``(/$$+H#````A<`/A/0#``"+
+M3"18]D$"0'0-@^P(45?H_/___X/$$(/L"/]T)#!7Z/S___^#Q!"Z`P```(7`
+M#X3``P``A>UT#8M'%(M<)"2)F$`1``"+3Q2+1"0L#[:07!8```^V@%T6``#!
+MX`@)PHM<)"P/MH->%@``P>`0"<(/MH-?%@``P>`8"<*)D0"```"+3Q0/MI-A
+M%@``P>((#[:#8!8```G0"T0D&(G"@<H``(``@[MH&0```'0(B<*!R@``@`B)
+MD02```"#[`C_="1<5^C\____BT<4QX#@@```_____X/$"(M'%,>`Y(```/__
+M__^+5Q2+@A!````+1"0DB8(00```BT<4BU0D/(F0%$```(M'%(M,)#B)B!A`
+M``"+1Q2+7"0HB9A8@```BT\4BT0D-`^VD&(6```/MH!C%@``P>`("<*+7"0T
+M#[:#9!8``,'@$`G"#[:#918``,'@&`G"B9$(@```BT\4#[:39Q8``,'B"`^V
+M@V86```)T(F!#(```(M'%,>`@````/____^+1Q3'@!B`````!P``_W0D,%?_
+MD]06``"#Q!"Z`P```(7`#X1)`@``BT<4BX`4F0``B<*!XO\_``"+1"18]D`"
+M('0/P>("N*.++KKWXL'J!.L*N,W,S,SWXL'J`XM'%,>`')@```$```"#[`R-
+M0F10Z/S___^+5Q2+@F"8``"#R`.)@F"8``"#Q!"+5"18#[="`B6@````/:``
+M``!T/XM,)"R#N5P9```"=#*+5Q2+@B"9``"`S/")@B"9``"+5Q2+@B"9```-
+M```!`(F"()D``,>!7!D```$```#K#HM<)"S'@UP9````````NP````"^`0``
+M`(TLG0````"+5Q2)\(C9T^")A"H`$```0X/["7[CBUPD+,>#+"\```````"[
+M`````&:#O[P!````=!F#[`A35^C\____@\000P^WA[P!```YV'_GBT0D+,>`
+M:!8``&4)"`"#?"14!G4*QX!H%@``91D(`(M7%(M,)"R+@6@6``")@J````"+
+M5Q2+@JP````-```'`(F"K````(/L#%?H_/___X/$$(7`=`R#[`Q7Z/S___^#
+MQ!!J`&H!:&"8``!7Z/S___^#Q`B+1Q3'@`B!``!2````_W0D7%?H_/___XM7
+M%(N"((```"7__W_^B8(@@```@\00BUPD+(.[A!D``/]T$H/L"/^SA!D``%?H
+M_/___X/$$(M$)"R#N(@9``#_=!*#[`C_L(@9``!7Z/S___^#Q!"+5"0L@[J,
+M&0``_W02@^P(_[*,&0``5^C\____@\00@[_(`0```'0/BU<4BX?(`0``B8)(
+M@```BTPD5(F/L`$``+H!````ZQ&0BUPD8(,[`'0"B1.Z`````(G0@\0\6UY?
+M7<.)]E.+7"0(BU0D#(M#%(N(!(```('A___\_X/Z`713@_H!?P:%TG0LZU&#
+M^@9T!X/Z"'0^ZT6+4Q2)R`T```$`B8($@```BU,4BT(4@^#?B4(4ZR>+4Q2)
+MR`T```(`B8($@```BU,4BT(4@\@@B4(4ZPF+0Q2)B`2```!;PY"#[!1J`O]T
+M)!SHP@,``(/$',.)]E.#[`B+7"00:@!J`6H"4^C\____@\00N@````"%P'00
+M@^P(:A-3Z)$#``")PH/$$(G0@\0(6\.055=64X/L%(M<)"B+="0L:A-3Z&T#
+M``"#Q!"Z`````(7`#X1=`0``:@!J`6H"4^C\____@\00N@````"%P`^$00$`
+M`(/L"&H`4^@V`P``@\00N@````"%P`^$)@$``(7V#X09`0``#[>#K`$``"7P
+M````@_@O?B6]"`````^W1@*H('41)=````"YZ@```#W`````=2JYZP```.LC
+MO0`````/MT8"J"!U$270````N:H````]P````'4%N:L````/MT8"J$!T%:@@
+M=0PET````#W`````=06#S03K"?9&`D!U`X/-`?9&`P%U`X/-`@^W1@+!Z`2#
+MX`&#^`$9__?7@^<#BT,4BY!\F```#[=&`J@@=0PET````#W`````=3&+0Q2)
+MN`28``"+0Q2)J`"B```YRG1*BT,4B8A\F```@^P,:"P!``#H_/___X/$$.LO
+M.<IT&8M#%(F(?)@``(/L#&@L`0``Z/S___^#Q!"+0Q2)N`28``"+0Q2)J`"B
+M``"Z`0```(G0@\0,6UY?7<.)]E575E.#["2+;"0XB6PD(/]T)#Q5Z/S___^)
+MQX/$$+@`````A?\/A+X!``"+1"08@[A<&0```0^%Z````(M%%(N`()D``*D`
+M``$`#X74````BU0D&,>"7!D```````"[`````)"+112+L!"<``"+B!2<``"+
+M@!B<``")1"04A?9T!(7)=1J+512+@B"9```-```!`(F"()D``$.#^PE^Q8GP
+MT>B)RM'J`=#!Z0:)PL'J!P^$Q0```(/Y`0^.O````(I$)!3WV`^^P(G3F??[
+MB40D#(/@/XE$)!")\)GW^8G!@^$?BUT4BT0D$,'@!8N3()D```G0"<B`S`B)
+M@R"9``"+5"08QX)<&0```@```,='#`$```"*7"00B%\0B$\1ZUN-=@"+5"0T
+M#[="`B6@````/:````!T1(M<)!B#NUP9```"=3>#?PP`=3&+512+@B"9``"`
+MS/")@B"9``"+512+@B"9```-```!`(F"()D``,>#7!D```$```"0@^P(5U7H
+M=@$``(/$$+@`````]D<"`G55BU44BX)@F```@\@"B8)@F```BT0D-`^W4`+V
+MQ@%U&0^WA:P!```E\````(/X+WX@]L)`=!N-=@"#O:0!```'=`^#[`Q5Z/H4
+M``"#Q!"-=@"X`0```(/$'%M>7UW#C78`5U93BWPD$(MT)!2)\(7V=06X____
+M_XG#BT<4BU`,B;``0```@^P,:@_H_/___X/C`X/F`U93:`!```!7Z/S___^)
+MPX/$(/?&`0```'4FBT<4QT`4`````&H`:@%J`E?H_/___X/$$(7`=`F+1Q2+
+M@,````")V%M>7\.)]HM$)`2+0!2+@&28``#!Z!,E_P$``/;$`70%-0#^__^8
+MPXUV`(M,)`R+5"0$BT0D"`^W0`(EX`$``#W`````=#`]P````'\)/:````!T
+M%NLL/4`!``!U)6:+@EH(``!FB0'K(9!FBX)<"```9HD!ZQ1FBX)>"```9HD!
+MZPBX`````,.)]K@!````PXGV5U93@^P$BW0D%(M\)!B+1A2+@&"8``"[````
+M`*@"=2A6Z/S___^)PXU$)`905U;H9/___X/$$(7`=`UF.UPD`GX&9H-/`@*0
+M9HE?$@^_PX/$!%M>7\.)]E575E.#[`R+1"0HQT0D"`````"->/_![P-(@^`'
+MB00DBW0D)+T`````A?9^9XM$)"S!X`.)1"0$BQPD`?.#^PAV!;L(````N`$`
+M``"(V=/@2+H!````B@PDT^)*,="*3"0$T^"+5"0@(P2ZT^B*#"33Z(GIT^`)
+M1"0(B=@K!"0!Q8L$)(UT!OC'!"0`````1X7V?Z2#[`C_="0L_W0D%.C\____
+MB40D&(M$)!B#Q!Q;7E]=PU575E.#[$R+;"1@B>Z+1"1D#[=X`L'O!X/G`0^W
+M0`(E\`$``#U``0``=&$]0`$``'\R/<`````/A*,````]P````'\0/:`````/
+MA(0```#IF````#W0````#X2!````Z8@````]P`@``'1U/<`(``!_"CU0`0``
+M=!/K<9`]0`D``'0)/5`)``!U8HGVQT0D/``````/MX6L`0``)?````"#^"]_
+M4X.]I`$```=T2HM-%(N11)D``(/BQXN&6!8```^_`,'@`X/@.`G"B9%$F0``
+MZR7'1"0\`0```.L;C78`QT0D/`(```#K#HGVN`````#I#0,``(GVBTT4BX$0
+MF0``)0;\__^+7"0\#[>47G((``#!X@0)T(/(`8F!$)D``(/L!/]T)&C_ME@9
+M``!5Z/S___^+510/OX1>6@@``"7_`0``@,P"B8)HF0``@\009H&^``@``/]/
+M=D*+1"1D]D`"$'0X9HN$?M0(``"*G#?<"```BI0WW@@``(A4)"!FBXQ^V`@`
+M`&:)3"009HN4?N`(``!FB10DZSJ-=@"+3"0\9HN$3C`(``"*G#%4"```BI0W
+M5P@``(A4)"!FBXQ^-@@``&:)3"009HN4?L`(``!FB10DBTT4BY%$F```@>)_
+MP/__P>`')8`_```)PHF11)@``(M-%(N!4)@``+``#[;3"=")@5"8``"+312+
+MD5"8```P]HI$)"#!X`@E`/\```G"B9%0F```BTT4BY%(F```@>+_#_S_BT0D
+M$,'@#"4`\`,`"<*)D4B8``"+712+3"0\#[>43D@(``")T,'@&,'B$`G0#[>,
+M3DX(``")RL'B"`G0"<B)@S28``"+312+D2B8```P]HM<)#P/MX1>/`@``,'@
+M"`G"B9$HF```BTT4BY%DF```@>+_#_C_#[>$7D((``#!X`PE`/`'``G"B9%D
+MF```NP(```!F@;X`"````C!W&6:!O:(!```B$'4RBT0D9/9``D!T*+,(ZR2+
+M5"1D9HL"@^`?=!B#Z`IF@_@,=@^+3"0\#[>$3K0(```!PY"+312+D229``"`
+MX@&-!!LE]P````G"B9$DF0``BUPD9(-[#`!T"@^^0Q`/OEL1ZQ`/MX1^1@D`
+M``^WG'Y*"0``BTT4BY$@F0``@>(?^/__P>`%)>`'```)PHF1()D``(M-%(N!
+M()D``(/@X(G:@^(?"=")@2"9``"+512+@B"9``"`S`B)@B"9``!F@;X`"```
+M`$!V08M4)&0/MT(")=`````]T````'4+9H&^``@``/]/=B*+312+D0RB``"!
+MXO__`_^+!"3!X!(E``#\``G"B9$,H@``9H&^``@```!0=@V+113'@."9````
+M````N`$```"#Q$Q;7E]=PY!75E.+="00BU0D%`^W0@+!Z`2#X`&#^`$9P(/@
+MV(V$@)`!``#!X!B)P]'K#[<2B=B)T;H`````]_&)P[\?````B=B)^=/HJ`%U
+M`T]U\[@F````*?B)Q[@7````B<(I^K`!B-'3X`'8NA@````I^HC1T^B+7A2+
+MDQ28``"!XO__`0#!X!$)PHF3%)@``(M>%(N3%)@``('B_Q_^_XGXP>`-)0#@
+M`0`)PHF3%)@``%M>7\.-=@"#[`R+5"00BT0D%(/X/'8%N#P```!FB8+,`0``
+M@^P$C40D#%#_LOP'``!2Z/S___^#Q!S#55=64X/L%(ML)"B+7"0LB>__M0@O
+M``#_M00O``#H_/___X/$"&H@C84,+P``4.C\____9HN5S`$``(/$$&:#^CQ^
+M!;H\````9H/Z.W\*N0````!FA=)U#HN%T`$``&:+C``X3@``@^P(C40D$E"-
+M1"044`^_PE`/O\%04U7H9@(``(/$(+H`````A<`/A$H"``"#[`S_="0T4XU$
+M)!Y0C40D(%!5_Y?<%@``@\0@N@````"%P`^$(0(``(.]I`$```=T"&:#ARHO
+M```$O@````!FBX>`&0``9@&$=PPO``!F@[QW#"\``#]V"F;'A'<,+P``/P!&
+M@_X/=MUF@[\L"````0^'I@```&:#O:H!``!!=UP/MT,")=`````]P````'5,
+M9H$[M`EU(P^VCR`(```/MX<J"```*<&X9V9F9O?IB=#1^,'Y'V8IR.L2#[:7
+M(`@``+AG9F9F]^J)T-'H@^P(#[?`4%7H4`8``(/$$+X`````C1RU`````(M-
+M%(N'!"\```^W5+`"P>(8@<H``/\`#[<$L,'@"`S_)?__```)PHF4&8"A``!&
+M@_X??L6+310/MY<2+P``@^(_P>(8#[>'$"\``(/@/\'@$`G"#[>'#B\``(/@
+M/\'@"`G"#[>'#"\``(/@/PG"B9$TF0``BTT4#[>7&B\``(/B/\'B&`^WAQ@O
+M``"#X#_!X!`)P@^WAQ8O``"#X#_!X`@)P@^WAQ0O``"#X#\)PHF1.)D``(M-
+M%`^WER`O``"#XC_!XA@/MX<>+P``@^`_P>`0"<(/MX<J+P``@^`_P>`("<(/
+MMX<<+P``@^`_"<*)D32B``"+310/MY<H+P``@^(_P>(8#[>')B\``(/@/\'@
+M$`G"#[>')"\``(/@/\'@"`G"#[>'(B\``(/@/PG"B9$XH@``BU44@[]L&0``
+M`1G`@^#`@\!\B8(\F0``9HN'#"\``&:)A<X!``"Z`0```(GVB="#Q`Q;7E]=
+MPXGV55=64X/L5(M$)'!FB40D)HM4)'1FB50D)(MT)&B-O@PO``!FQT0D(CP`
+M9L=$)"`\`/]T)&Q6Z/S____1X&:)1"0FBXPDA````&;'`<3_BX0D@````&;'
+M`#P`@\0(_W0D;%;H_/___XA$)"6[`````(/$$&:#O@0)````#X2'````#[9L
+M)!6)ZH/B^(E4)!"09H.\7@8)````=&%F#[9$)!5F.81>!@D``'01#[>$7@8)
+M``"#X`<,X#G%=4")V,'@!HV$,%`-``"#[`A0BTPD<`^W`5#H2P4``(/$$(%\
+M)!#@````=0YF.40D&G8/9HE$)!KK"&:)1"0:ZPV00P^WA@0)```YV'^(BU0D
+M9`^W0@(ET````#W`````#X6F````@&0D%0>`3"05`;L`````9H.^!`D````/
+MA),````/MFPD%8GI@^'XB4PD#)!F@[Q>!@D```!T868/MD0D%68YA%X&"0``
+M=!$/MX1>!@D``(/@!PS@.<5U0(G8P>`&C80P4`T``(/L"%"+5"1P#[<"4.B/
+M!```@\00@7PD#.````!U#F8Y1"08=@]FB40D&.L(9HE$)!CK&9!##[>&!`D`
+M`#G8?XCK"F:+3"0:9HE,)!B+1"1D]D`#`70(BH8<"```ZP:*AAT(``"#[`0/
+MOL!0_W0D;/]T)&SH_/___XC#BU0D=`^W0@*#Q!"H0`^$I@$``"70````/<``
+M``!U)H/L#(U$)#Q0#[>&&`T``%"-AAH-``!04O]T)'SH&@4``(/$(.LG@^P,
+MC40D/%`/MX;&#```4(V&R`P``%#_="1\_W0D?.CQ!```@\0@#[=4)!8/OL,I
+MP@^W1"0:.<)^`HG"B=&+1"1D]D`"$'1$9H&^``@````P=A(/MX8."```#[_2
+M.=!^`HG0B<%F@;X`"```_S]V'(M4)&3V0@*`=!(/MX80"```#[_1.=!^`HG0
+MB<$/MU0D-@^_P3G"?@*)PF:+1"0>T>")T68IP7D%N0````!F.TPD''X$BTPD
+M'&:)3PAFB4\&9HE/!&:)3P)FB0^+1"0T9CG(=@*)R&:)1PIFBT0D,F8[!W8#
+M9HL'9HE'#(M$)#!F.P=V`V:+!V:)1PYF@;X`"```_S]V20^_T8M$)&3V0`*`
+M=`T/MX84"```.<)\#>L/#[>&$@@``#G"?02)R.L:BU0D9/9"`H!T"6:+AA0(
+M``#K!V:+AA((``!FB4<>ZP=FBP=FB4<>9HM'#HM,)'!FB0%FBP>+5"1T9HD"
+M#[\"B89\&0``BTPD9`^W00*H('40)=`````]P`````^%Y0```(/L#(U$)"Q0
+M#[>&.`T``%"-ACH-``!0_W0D?/]T)'SH80,```^W3"0V#[[#*<$/MT0D.(/$
+M(#G!?@*)P0^W5"0F#[_!.<)^`HG"9HM$)![1X(G19BG!>06Y`````&8[3"0<
+M?@2+3"0<#[=$)"8/O]$YT'X"B=!FB4<0#[=$)"0/O]$YT'X"B=!FB4<29HE'
+M%`^W1"0B#[_1.=!^`HG09HE'%F:)1Q@/MUPD(`^_P3G#?@*)PV:)7QIFB5\<
+M#[?3BTPD<`^_`3G"?0-FB1D/MU<2BTPD=`^_`3G"?@EFBT<29HD!B?:+5"1T
+M#[\"B89D&0``N`$```"#Q$Q;7E]=PXGV55=64X/L0(ML)%1FBX4H"```9HE$
+M)`YJ((V%#"\``%"-1"0<4.C\____9L=$)!X(`(/$$`^W1"0.9HM4)`IF*51$
+M$+X`````9L=$)`P```^W?"0.B7PD!&:#?'P0`'D(9L=$?!```)!F@_X(=0J^
+M#P```.M0C78`BTPD!`^_5$P0#[?>#[>$70PO```YPG4T9H.\70PO````=0=F
+M_T1,$.L69H-\)`PR=@=F_T1\$.L'9O],?!")]KX`````9O]$)`SK`49F@_X/
+M=HT/MT0D#F:#?$00/WX'9L=$1!`_``^W1"0.#[><10PO```K7"14>0:[````
+M`)`/MT0D#@^_3$00BY4$+P``9HL$6F:)!$IF_T0D#F:#?"0.#@^&$____V;'
+M1"0."``/MU0D#F:+1%009HF$50PO``!F_T0D#F:#?"0.#G;A@\0\6UY?7<.0
+M5U93@^P@BUPD-(M\)#"Z`````)!F@SS3`'0/9HL$TV:)1%000H/Z!W[JB=:#
+M[`R-1"0:4(U$)!Q0#[?"4(U$)"A0#[?'4.C\____N@````"#Q"`Y\GT=BT0D
+M$&8[1"0,=!*+1"0,B?9".?)]!V8Y1%00=?2+1"0,9CM$)`YU!68Y^'0,N#P`
+M``"#?-,$`'0%9HM$TP(/M\"#Q"!;7E_#D%575E.+;"04BTPD&(M\)!R+7"0@
+MBW0D)`^WPP^WU@^OPKH`````A<!T88G89CG/=%</M\4/M\DIR(T$@(T$@,'@
+M`@^WURG*B=&9]_F)PHG89H72>#.)\&:#^F1_*P^_T@^WS@^ORKAD````*=`/
+MM],/K\(!P;@?A>M1]^F)T,'X!<'Y'V8IR)`/M]")T%M>7UW#B?955U93@^P\
+MBVPD6(M\)%RZ``````^WQXG!@_@`?A2)]HT$DF:+1$4(9HE$5"!".=%_[H/L
+M#(U$)"I0C40D+%`/M]]3C40D.%"+5"1P#[<"4.C\____O@````!FQT0D.@``
+MN@````"#Q""#^P!^*XG8BWPD'&:+3"0>C78`9CE\5"!U!6:)5"0:9CE,5"!U
+M!8G6ZP:00CG0?^,/M_:--+;1Y@^W3"X&#[=<)!J-')O1XP^W1"L&B40D#`^W
+M?"0>#[=4)!R)5"04BT0D5`^W$%'_="005_]T)"!2Z([^__^#Q!2+5"1@9HE"
+M!@^W1"X$B40D#`^W5"L$BT0D5`^W"/]T)`Q25_]T)"!1Z%[^__^#Q!2+5"1@
+M9HE"!`^W1"X"B40D#`^W5"L"BT0D5`^W"/]T)`Q25_]T)"!1Z"[^__^#Q!2+
+M5"1@9HE"`@^W!"X/MQ0KBUPD5`^W"U!25_]T)"!1Z`?^__^+5"1T9HD"@\10
+M6UY?7<-75E.+3"04BWPD'(MT)"`/MU0D$(T$DHT$@(T4A0`````/MUPD&(T<
+M60^W`8T$@(T$@(T$A?;___\YT'8+9HL!9HD&9HD'ZW0/MT/^C02`C02`C02%
+M"@```#G0<R=FBT/^9HD&9HD'ZU-FBP%FB09FB0?K2&:+`6:)!V:+00)FB0;K
+M.9`YV7,T#[<!C02`C02`P>`"*="#^/=\!8/X"7[)#[=!`HT$@(T$@(T$A?;_
+M__\YT'>_@\$".=ERS%M>7\.+3"0$C9$\%@``#[>!K`$``"7P````@_@O?C&A
+MY$\``(F!/!8``(T$P(T$A>A/``")0AS'0A@!````QT(,%````,="$%4```##
+MC78`H61.``")`HT$P(T$A6A.``")0AS'0A@!````QT(,%````,="$",```##
+MB?955U93@^P,BU0D((M\)"0/MX*L`0``)?````"#^"]^2&H`:B1J`8/L#&H'
+M4O^2T!8``(/$%%#H,>W__[T`````OFL```"Y`````+MK````@\00@_@!=7-F
+MOE,`LU/'1Q`W````ZV2)]FH`:B5J!H/L#&H'4O^2T!8``(/$%%#HZ>S__[T`
+M````@\00OC(```"#^#]T`XUP!(GI@_@_=`6Y0````(U9,HGJ@_@_=0:-512-
+M=@")5PR#^#]U"(U#\>L&C78`C4,%B4<0BU<$N``````YZG($.?)V#3G*<@0Y
+MVG8%N`$```"#Q`Q;7E]=PY"+1"0$#[^0@!D```.0?!D``(M(%,'B"8'B`'X`
+M`(#.@(F1,)D``,>`8!D```$```##C78`5U93BWPD$(G[C;<\%@``N`````"#
+M?A@`#X3@````@[]@&0```0^%S0```(M'%(N`,)D``*D`@```#X6Y````B<+!
+MZAF)5@0E``"``<'H%X/X`G4<9H._J@$``$%V#@^WAR@(```!T(E&!.L$@T8$
+M!0^WAZP!```E\````(/X+WXC@^P,5^B2`0``@\00BT8$.T84<@@K1A2)1@3K
+M!\=&!`````#'@V`9````````@^P(5E?H)/[__X/$$(7`=3F#[`A65^@[````
+M@\00A<!T*(/L"%97Z$8```"#Q!"%P'X7QX-@&0```@```,>#7!D```````"-
+M=@"+@V`9``!;7E_#B?:+3"0(N`````"+400[40QV!3M1$'(%N`$```##5E.+
+M7"00BT0D#`^W@*P!```E\````+[@3P``@_@O?P6^8$X``(L#C03`C42&"(E#
+M'(M#!#M#$')7NO____^#.P`/A*T```"+0P2)0P@[0Q!R-H,[`'0QD(L32HD3
+MC132C126BTL<BT(8*T$0T>"+2P@IP8E+"(/""(E3'#M+$'('@SL`==*)]KH!
+M````ZV60BT,$N@`````[0PQW5XL&2+K^____.0-T2XM#!(E#"#M##'<XBP9(
+M.0-S,9"+$T*)$XT4THT4EHM+'(M"&"M!$-'@BTL(*<&)2PB#P@B)4QP[2PQW
+M!XL&2#D#<M"Z`@```(UV`(G06U[#C78`5U93BUPD$(VS/!8``,=&%`````!J
+M`&HD:@&#[`QJ!U/_D]`6``"#Q!10Z/WI__^#Q!"#^`%U68M&'`^_.&H`:B!J
+M!(/L#&H'4_^3T!8``(/$%%#HU.G__X/$$(/_`70:@_\!<@R#_P)T%8/_`W09
+MZQ_'1A0`````ZQ:)1A3K$8U$`/N)1A3K"-'@B484C78`6UY?PU575E.#[!2+
+M="0PBUPD-%;_="0PZ/S___^)Q8U[_\'O`TN#XP>#Q!"%]GYRBT0D,,'@`XE$
+M)`B0C0PS@_D(?@6Y"````+H!````T^)*N`$```"(V=/@2#'"BDPD"-/BB='W
+MT8M$)"`C#+B)3"0$B>B(V=/@BDPD"-/@(=`+1"0$BU0D((D$NHUT'OBY"```
+M`"G9T^V[`````$>%]G^:@\0,6UY?7<.)]E575E.#[!2+5"0L#[="`L'H!(/@
+M`8/X`1G`)?X```"#P`)0_W0D+.C\____B<>]`````(/$$(,X`'X\D(U$;0"-
+M1(<@#[98",'C`HM4)""+<A2#[`QJ``^V0`M0:@Y74NC\____#[?`B80>`(<`
+M`(/$($4Y+W_%BT0D)/9``A`/A:L```"#[`AJ!/]T)"SH_/___XG'O0````"#
+MQ!"#.``/CHH```")]HU$;0"-=(<@#[9&"(T$A0"'``")1"0(BU0D((M:%(/L
+M#&H`#[9&"U!J#E=2Z/S___\/M\"+5"0HB003@\0@@'X)`'0X#[9&"8T$@HE$
+M)`B+1"0@BU@4@^P,:@$/MD8+4&H.5_]T)#SH_/___P^WP(M4)"B)!!.#Q""-
+M=@!%.2\/CWO___^-=@"#Q`Q;7E]=PU575E.#[!2+?"0HBX=H%@``)?___W]0
+M5^C\____B<6+1Q2+4#")TX'C\`,``,'K!(G>@\00@WPD)`!T$+@E````*=C1
+MZ(TT`^L(B?:#^P*#UO\YWG08BT\4@>(/_/__B?#!X`0E\`,```G"B5$P@^P(
+M55?H_/___SG>#Y7`#[;`@\0<6UY?7<-64X/L!(M,)!"+5"04#[>!O`$``+L`
+M````.=!^(X/L!/]T)!R-!%*-!("-A('X%@``4%'H_/___XG#@\00C78`B=B#
+MQ`1;7L-64X/L!(M,)!"+5"04#[>!O`$``+L`````.=!^(X/L!(T$4HT$@(V$
+M@?@6``!0_W0D(%'H_/___XG#@\00C78`B=B#Q`1;7L-55U93@^P,BVPD((M\
+M)"2)ZXV5M`$``(/_`G08@_\"=P>#_P%T)NM8@_\#=`^#_P1T$^M,#[=R"$[K
+M39`/MW((@^X"ZT.^`0```.L\O@`````/MT((B<&#^`!^%8T$=HT$@(.\@_P6
+M````=`5&.?%_ZP^W0@BZ_____SGP='GK"+K_____ZW"0C01VC02`C9R#^!8`
+M`+K_____@WL$`'57@^P(:CQ3Z/S___^)>P2#Q!"#?"0H`'4LQT,,"P```,=#
+M%`(```#'0QC_____QT,<_P,``&;'0R`*`&;'0R(*`.L3B?:#[`3_="0L5E7H
+M_/___X/$$(GRB="#Q`Q;7E]=PXUV`%.+3"0(BUD4BY'D%@``@>+_`P``BX'L
+M%@``P>`0)0``_P,)PHF3I````(M9%(N1Z!8``('B_P,``(N!\!8``,'@$"4`
+M`/\#"<*)DZ@```"+612+@ZP````E`/S__XN1]!8``('B_P,```G0B8.L````
+M6\.05U93BWPD$(M,)!0/MX>\`0``O@`````YR'95C01)C02`C9R'^!8``+X`
+M````@WL$`'0]QT,$`````+C^____T\`AA^06```AA^@6```AA^P6```AA_`6
+M```AA_06``!35^@F____O@$```"#Q`B)]HGP6UY?PXGV55=64XMT)!B+?"04
+MBX_\!P``#[>'O`$``+H`````.?`/AL8#``"-!':-!("-G(?X%@``N@$```"#
+M>P0`#X2J`P``@WL8_W4TA<ET%0^W00(EH````+H?````/:````!T!;H/````
+MN`$````YT',0D-'@@\@!.=!R]^L$D(M#&(TLM0````"+5"04BTH4B<*!XO\#
+M``"+0QS!X`HE`/P/``G"BT,4P>`4)0``\`\)PHF4*4`0``"+1"04BT@4#[=#
+M(L'@!"7P````#[=3((/B#PG0#0`@"`")A"F`$```BU0D%(M"%,>$*,`)````
+M"```@WLD`'1#BTH4BU,D@>+___\`BT,HP>`8"<*)E"G`"```BT0D%(M(%(N$
+M*<`)``")PH/*`8-[*`!T"(G"@<H!`0``B90IP`D``(-[,`!T(HT,M0````"+
+M;"04BU44BT,P)?___P`-`````8F$"@`)``"-#+4`````BT0D%(M0%(M#+"7_
+M_P\`@WLL`'0%#0``$`")A`K`$```@WLL`'0E]D,,0'0?C0RU`````(ML)!2+
+M512+A`K`"0``@,P"B80*P`D``/9##!!T(8T,M0````"+1"04BU`4BX0*`!$`
+M``T``"``B80*`!$``/9##(!T'XT,M0````"+;"04BU44BX0*`!$``(#,`HF$
+M"@`1``"+0P2#^`-T6H/X`W<*@_@"=!/IT0```(/X!`^$J0```.G#````C12U
+M`````(M$)!2+2!2+A!'`"0``#**)A!'`"0``BVPD%(M-%(N$$0`1```-```E
+M`(F$$0`1``#IA@```(T,M0````"+1"04BU`4BX0*P`D``(/(8HF$"L`)``"+
+M%0`````K%0````"+AW`9```IT"L%`````,'@"HML)!2+510-`````8F$"@`)
+M``"+512+A`H`$0``#0``!`")A`H`$0``ZQ^-#+4`````BT0D%(M0%(N$"L`)
+M``"#R"")A`K`"0``]D,X`70AC0RU`````(ML)!2+512+A`H`$0``#0``)`")
+MA`H`$0``]D,,`703N`$```")\=/@"8?D%@``ZQ&)]KC^____B?'3P"&'Y!8`
+M`/9##`%T$[@!````B?'3X`F'Z!8``.L1B?:X_O___XGQT\`AA^@6``#V0PP"
+M=!.X`0```(GQT^`)A^P6``#K$8GVN/[___^)\=/`(8?L%@``]D,,!'03N`$`
+M``")\=/@"8?P%@``ZQ&)]KC^____B?'3P"&'\!8``/9##`AT$[@!````B?'3
+MX`F']!8``.L1B?:X_O___XGQT\`AA_06``!3_W0D&.@S^___N@$```"#Q`B-
+M=@")T%M>7UW#D(M$)`C!X`*+5"0$BU(4BX0"``@``,.)]HM4)`C!X@*+1"0$
+MBT@4BT0D#(F$$0`(``"X`0```,.0BTPD"(M$)`2+4!2X`0```-/@B8)`"```
+MN`$```##B?964XM4)!#!X@*+1"0,BW`4BX06``H``(G#@^,#=1JX`0```(I,
+M)!#3X(N60`@``(7"=`6[`0```(G86U[#C78`5U93BWPD$(MT)!2+5Q2X`0``
+M`(GQT^")@H`(``"[Z`,``(GV5E?H_/___X/$"(7`=!"#[`QJ9.C\____@\00
+M2W7BBT<4QX"`"````````(7;#Y7`#[;`6UY?PY!55U93@^P,BUPD)(ML)"B+
+M?"0LBW0D,,=$)`@`````QT0D!`````#&1"0#`<9$)`(`@WPD-``/A.0```"#
+M[`B+5"0HBX)H%@``)?___W]04NC\____B<&#Q!"%]G07BD8<@^`!B$0D`XM7
+M$('B_W\``(E4)`B+4Q"!XO]_``"+0P@E``!`@(!\)`,`=6>%P'1CL`"$P'0(
+MBT0D.(E$)`2+1"0(`=`K1"0$.T0D-'=%B=`K1"0$`40D"(7_="*+1Q`E`(#_
+M_XM4)`B!XO]_```)T(E'$/9&'`%U!<9$)`(!@'PD`@!T#H%C"/__OW^!8Q``
+M@/__@4L(``"`((!\)`(`=`N%[70'@64(__]_WX/L"%'_="0LZ/S___^#Q!"-
+M=@`/MD0D`H/$#%M>7UW#C78`5U93BW0D,(M<)#B+?"04BU0D&('B_P\``(M$
+M)"3!X!`)PO;#('0&@<H``(``BT0D-,'@&24````>"=#VPP%T!0T````!]L,0
+M=`4-````((E'"(M$)"")PL'B%/;#`G0&@<H````!B5<,BT0D+,'@$"4```\`
+MB4<0BT0D*(E'%(/^_W06B?#!X`TE`.`/``G0B4<,@4\(````0/;##'1+N`#_
+M`'^*3"0\T_BZ`````*@!=#R)V,'H`X/@`8/X`1G`]]`E````@/;#!'0%#0``
+M0``)1PB+1"1`)?]_```)1Q"+1"0\P>`4"4<4N@$```")T%M>7\.-=@!3BT0D
+M%(M,)!R+7"0DBU0D#(7`=!7!X!0E``#P``E"$(M$)!#!X`4)0A2%R707B<C!
+MX!@E````#PE"$(M$)!C!X`H)0A2%VW02B=C!X!P)0A"+1"0@P>`/"4(4N`$`
+M``!;PXGV4XM$)!"+3"08BUPD'(M4)`R#?"04`'00"T(,A<EU`X#,$(E"#.LY
+MD(7)=!C'0@@`````B4(,BT,0B4(0BT,4B4(4ZQS'0@@`````@,P0B4(,QT(0
+M`````,="%`````"0QT(<`````,="&`````"X`0```%O#C78`BTPD"(G*N`\`
+M``#V01P!#X1$`0``BT$<)?X?``#1Z&:)02`/MT$:9HE!(L9!)`"+01BH`74>
+MJ`)T!,9!)`'V0A@(=`2`220"]D(8!'0&@$DD!(GVBT(<)0``8`#!Z!6#^`%T
+M((/X`7(/@_@"="F#^`-T-^M'C78`BD(4@^`?B$$EZSF0BT(4)>`#``#!Z`6#
+MR("(027K)8M"%"4`?```P>@*@\B`B$$EZQ*+0A0E`(`/`,'H#X/(@(A!)9"+
+M0APE`.`?`,'H#8A!)HM"&"7P````P>@$B$$GBT(8)0`/``#!Z`B(02B+0APE
+M``!@`,'H%8/X`G0B@_@"=PF#^`%T)NLRB?:#^`-U*XM"$"4````/P>@8`$$H
+MD(M"$"4``/``P>@4`$$HBT(0)0``#P#!Z!``02B+0A@E`/```,'H#(A!*0^V
+M0A^#X`&#^`$9P(/``HA!*K@`````PXGVBT0D!(M,)`B+$2.0+"\``(D1]](A
+MD"PO``##D%.#[!"+7"08C8.H%@``4%/H_/___XM#%,>`)($```````"+0Q3'
+M@"B!````````BT,4QT!``````(M#%,>`,($``````@"+0Q3'@#B!```````"
+M@\086\-3@^P0BUPD&(M#%,=`0`8```"-@Z@6``!04^C\____BT,4QX`D@0``
+M`````(M#%,>`*($```````"#Q!A;PXGV5E.+="00BUPD#+H`````D(T$DHT$
+M@F:+A(.T&0``9CL&=06)T.LTD(T$DHT$@HV,@[`9``!F@WD$`'449HL&9HE!
+M!&:+1@)FB4$&B=#K#)!"@_H_=KJX`````%M>PXGVBT0D!(N`L!D``,.0BT0D
+M!`5L%@``PXGV5E.#[`2+="00B?.X`````(.^I`$```5U#&:#OJ@!```)=0*P
+M`8F#J!D``(/L"&@`%0``C8.T&0``4.C\____N0````"#Q!"0C02)C02!C12#
+MQX+$&0``]`$``,>"R!D``,@```#'@LP9``#(````QX+0&0``9````,>"V!D`
+M`"@```#'@M09```'````C8*P&0``QD`+`,9`#`#&0`D'QD`*`(.[J!D```!T
+M%,>"]!D```S^OP#'@O@9```X_[\`08/Y/W:"@[NH&0```'0JBU84BX/T&0``
+MB8(L@0``BU84BX/X&0``B8(T@0``@^P,5NC\____@\00QX.L&0``9````,>#
+MI!D```$```"#Q`1;7L.04X/L"(M<)!"#NZ@9````=">#[`Q3Z/S___^+0Q3'
+M@"R!````````@\00BT,4QX`T@0```````)"#Q`A;PXUV`%575E.![(P```"+
+ME"2D````BYPDJ````(NL)*````"+A;`9``")1"04N`````"#^@4/AQ($``#_
+M))5P40``B=ZX`````(/[!`^'^P,``(N4)*````"+2A2+D5"8``"!XO__#_"+
+MA)VT+@``P>`4)0``\`\)PHF14)@``(N\)*````"+3Q2+D5R8``"!XG^`__^+
+MA)W<+@``P>`')8!_```)PHF17)@``(M/%(N17)@``('B_W_`_XN$G<@N``#!
+MX`\E`(`_``G"B9%<F```BT\4BY%8F```@>+__P/\BX2=\"X``,'@$B4``/P#
+M"<*)D5B8``"+5"04#[9"!#G8<PC_A6P6``#K$HM,)!0/MD$$.=AV!O^%<!8`
+M`(GPBU0D%(A"!.D<`P``QT0D2'\```"-="1(QT8$,@```,=$)$!_````QT0D
+M1"@```#'1"0X?P```,=$)#Q-````QT0D,'\```#'1"0T0````,=$)"@?````
+MQT0D+!````#'1"0@/P```,=$)"0P````A=L/E<`/ML")1"00B[PDH````(M/
+M%(N1;)@``('B_S_@_XG#P>,"BP0SP>`.)0#`'P`)PHF1;)@``(M/%(N1;)@`
+M`('B__\?\(M$'$#!X!4E``#@#PG"B9%LF```BT\4BY%HF```@>+__P'_BT0<
+M.,'@$24``/X`"<*)D6B8``"+3Q2+D6B8``"!XO___X"+1!PPP>`8)0```'\)
+MPHF1:)@``(M/%(N!:)@``(/@X(M4'"B#XA\)T(F!:)@``(M/%(N1;)@``(#F
+MP(M$'"#!X`@E`#\```G"B9%LF```@WPD$`!T%(M7%(N";)@``(/(`8F";)@`
+M`.L9BX0DH````(M0%(N";)@``(/@_HF";)@``(-\)!``#Y3`#[;`BTPD%`^V
+M40<YT`^$C`$``(-\)!``=`C_A7P6``#K!O^%@!8``(-\)!``BWPD%`^41P?I
+M90$``,=$)!@(````C50D&,="!`8```"%VP^5P`^VV(N$)*````"+2!2+@0BB
+M``"#X,"+%)J#XC\)T(F!"*(``(M4)!0/MD((.=@/A!D!``"%VW0(_X6$%@``
+MZP;_A8@6``"+3"04B%D(Z?L```#'1"1P`````,=$)'0$````QT0D>`@```")
+MWK@`````@_L"#X?8````B[PDH````(M/%(N16)@``('B_P_\_XM$G'#!X`PE
+M`/`#``G"B9%8F```BU0D%`^V0@8YV',(_X6,%@``ZQ*+3"04#[9!!CG8=@;_
+MA9`6``")\(M4)!2(0@;K>(U,)%")3"0,OE!1``#\N0@```"+?"0,\Z6X````
+M`(/[!W=:BX0DH````(M(%(N1))D``(#B`8M$G%#1X"7^````"<*)D229``"+
+M5"04#[9"!3G8<PC_A706``#K$HM,)!0/MD$%.=AV!O^%>!8``(M\)!2(7P6)
+M]K@!````@<2,````6UY?7<-64X/L!(M,)!")SHN9L!D``,=##`````"#N:@9
+M````#X2#````@7L0``#``'8*QT-``````.L,D+@``,``*T,0B4-`@7L8``#`
+M`'X,QT-$`````.L.C78`N```P``K0QB)0T2+412+0T")@BR!``"+412+0T2)
+M@C2!``"+013'@#"!``````(`BT$4QX`X@0```````H/L"(V&J!8``%!1Z/S_
+M__^#Q!#'0S@`````QT,\`````(/$!%M>PU=64XM<)!"+B_P'``"#NZ09````
+M#X0B`0``@[NP`0```0^%%0$``(NSL!D``(!^!`-W&0^V1@1`4&H!4^C\____
+M@\0,Z?,```"-=@"`?@4&=Q8/MD8%0%!J!5/H_/___X/$#.G4````B[N\%@``
+MB?B#X'^#^#]V"(U'?\'H!^L)BX.\%@``P>@'.48D?3^`?@<`=1QJ`&H"4^C\
+M____:@!J!5/H_/___X/$&.F,````@'X&`0^'@@````^V1@9`4&H$4^C\____
+M@\0,ZV\Y1B!]+(!^!P!T#6H!:@)3Z/S___^#Q`R`?@8!=U$/MD8&0%!J!%/H
+M_/___X/$#.L^@^P(45/H_/___X/H`H/$$(/X`7<I@'X'`'4-:@!J`E/H_/__
+M_X/$#(!^!@!T$&H`:@13Z/S___^#Q`R-=@!;7E_#5U93BUPD$(NS_`<``(.[
+MI!D````/A)8```"#N[`!```!#X6)````B[NP&0``@'\$`W<5#[9'!$!0:@%3
+MZ/S___^#Q`SK:HGVBXN\%@``B<B#X'^#^#]V"(U!?\'H!^L)BX.\%@``P>@'
+M.4<@?1F`?P8!=SP/MD<&0%!J!%/H_/___X/$#.LI@^P(5E/H_/___X/H`H/$
+M$(/X`7<4@'\&`'0.:@!J!%/H_/___X/$#)!;7E_#5U93BW0D$(GW_[;\!P``
+M5N@;]___C12`C120C9R6M!D``(F>L!D``(/$"(.^I!D```!T;(.^L`$```%T
+M8_^&G!8``&H`:@%6Z/S___]J`&H%5NC\____:@!J!%;H_/___X/$)&H`:@)6
+MZ/S___]J`&H#5NC\____@^P$5NC\____@\0(@,P!4%;H_/___X/$%%;HN?S_
+M_X/$$.GB````D(![!`!T$@^V0P10:@%6Z/S___^#Q`R)]H![!0!T$@^V0P50
+M:@56Z/S___^#Q`R)]H![!P!T$@^4P`^VP%!J`E;H_/___X/$#(!["`!T$@^V
+M0PA0:@-6Z/S___^#Q`R)]H![!@!T$@^V0P90:@16Z/S___^#Q`R)]H._J!D`
+M``!T/X/L#%;H_/___X/$"(#D_E!6Z/S___^)-"3H$?S__XM&%,>`,($`````
+M`@"#Q!"+1A3'@#B!```````"ZR.)]H/L#%;HY_O__XDT).C\____@\0(@,P!
+M4%;H_/___X/$$%M>7\.-=@!75E.+="00BUPD%(GWBT84QX`D@0```````(M&
+M%,>`*($```````"#[`B-AJ@6``!05NC\____BP.)AKP6``"+0P2)AL`6``"+
+M0PB)AL06``"+1A2+D"R!``"+B#2!``")T"4``,``@\00/0``P`!T#HG()0``
+MP``]``#``'5ABY^P&0``*U-`B=`K0S@!AY06``")4SB)RBM31(G0*T,\`8>8
+M%@``B5,\BT,X.T,0=@^#[`Q6Z,K[__^#Q!"-=@"+0SP[0QAV#(/L#%;H\_S_
+M_X/$$(/L#%;HZ_K__X/$$%M>7\-3@^P(BUPD$(M$)!2+D[`9``"`>`41=2C_
+M0CC_@Y06``"+0C@[0A!V0X/L#%/H;OO__XD<).BJ^O__@\00ZRV0@'@%&74F
+M_T(\_X.8%@``BT(\.T(8=A6#[`Q3Z(#\__^)'"3H?/K__X/$$)"#Q`A;PXUV
+M`%93BW0D#(N6L!D``(N.O!8``(G(@^!_@_@_=@B-07_!Z`?K"8N&O!8``,'H
+M!SE")'Q2.4(@?3&`>@<`=`]J`6H"5NC\____@\0,ZVR`>@8`=#(/MD(&2%!J
+M!%;H_/___X/$#.M3C78`@'H&`'06#[9"!DA0:@16Z/S___^#Q`SK-XUV`(!Z
+M!0!T%@^V0@5(4&H%5NC\____@\0,ZQN-=@"`>@0`=!(/MD($2%!J`5;H_/__
+M_X/$#)!;7L.055=64XM4)!2+0A2+N.R```"+J/"```"+L/B```"+FK`9``"#
+M>S0`=`4Y<S1V#KD`````_X*@%@``ZRF0B?$K2S2)Z"M#,(GZ*U,L*<$IT;@I
+M.5-?]^G!^@Z)R,'X'XG1*<&)]HES-(E[+(EK,(G(6UY?7<-55U93@^P,BWPD
+M((M4)"2)^XNWL!D``(L"B8>\%@``BT($B8?`%@``BT((B8?$%@``5^A5____
+M@\0$A<!Y&O^'I!8``(/L#%?H\_C__X/$$.FO`0``C78``48,@[^H&0````^$
+MS````(/L"(V'J!8``%!7Z/S___^+1Q2+D"R!``"+J#2!``"#Q!`Y5D!W"CEN
+M1'9Y.59`=C.#[`S_=D!2:(A1``!H`````%?H_/___XM'%(M60(F0+($``(/$
+M((M'%,>`,($``````@`Y;D0/AB\!``"#[`S_=D15:(A1``!H-````%?H_/__
+M_XM'%(M61(F0-($``(/$((M'%,>`.($```````+I]P```"M60(G0*T8X`8>4
+M%@``B58XB>HK5D2)T"M&/`&'F!8``(E6/(UV`(.[I!D````/A,,```"#O[`!
+M```!#X6V````BX.L&0``C02`.48,=D.+3@R)R`^O1A2[TTUB$/?CB=#!Z`8Y
+M1CAW&XG(#Z]&'/?CB=#!Z`8Y1CQW"5?H0OW__X/$!(/L#%?HIO?__X/$$.ME
+MBT8,.X.L&0``=EJ)P@^O5A"XTTUB$/?BB=#!Z`8Y1CAV%H/L#%?H,OC__XD\
+M).AN]___@\00ZRV+1@P/KT88NM--8A#WXHG0P>@&.48\=A6#[`Q7Z$3Y__^)
+M/"3H0/?__X/$$)"#Q`Q;7E]=PU575E.#[`R+?"0@BVPD*(M<)"R^`````(T$
+M=HM/%(L4Q:!1``")5"0(BU0D)(T$0HL$A:!1``"+5"0(B0010_;#/W40@^P,
+M:@'H_/___X/$$(UV`$:#_@UVOKX`````D(M/%(L4]0!3``"+!/4$4P``B001
+M0_;#/W4.@^P,:@'H_/___X/$$)!&@_Y%=M*^`````)"-!':+3Q2+%(7@5@``
+M`>B+!(7@5@``B0010_;#/W4-@^P,:@'H_/___X/$$$:#_C]VSH/$#%M>7UW#
+MB?955U93@^P4BVPD+`^W10)0#[=%`%#H_/___X/$$/9%`H!T;0^_\(T<=L'C
+M`HVS9%T``(/L"&H(_W8$Z/S___^)QX'G_P```,'G!8N#9%T``,'@!`G'9HM.
+M"(M$)#"+4!2+@@2B``"#Q!!F@7T`M`EU"X/($(F"!*(``.L;BUPD((M3%(/@
+M[XF"!*(``.L)B?:)P;\`````9H'YD`!_!?;!`70E@^P(:@@/O\&#Z!A0Z/S_
+M__^)PX'C_P```+@!````@\00ZRZ)]H/L"&H(#[_!@^@8B<+!ZA\!T-'X4.C\
+M____B<.!X_\```"X`````(/$$(GVP>,"T>`)PX'+`00``(M$)""+2!2)^"7_
+M````P>`(#[;3"=")@9R8``"+1"0@BT@4B?@E`/\```^VUPG0B8'0F```BUPD
+M((FK_`<``+@!````@\0,6UY?7<.-=@"+5"0(BT0D!(N`>!D``(/Z!W<A_R25
+MJ%X``(GV@\!$PX/`2,.#P$S#@\!0PP64````PXGVN`````##B?955U93@>R,
+M````B[PDH````(N$)*@```!FB40D+HG]O@````"+E"2D````#[="`B7P`0``
+M/<`````/A*0!```]P````'\0/:`````/A"H!``#I]0$``#U``0``=`L]4`$`
+M``^%XP$``(N4)*0```!FBP(MH0\``&8]Z@1W'6:+A>0(``!FB40D)&:+E>8(
+M``!FB50D(NF4````BY0DI````&:+`BV,%```9CWO`'<:9HN%Z`@``&:)1"0D
+M9HN5Z@@``&:)5"0BZV6+E"2D````9HL"+7P5``!F/>``=QIFBX7L"```9HE$
+M)"1FBY7N"```9HE4)"+K-HN$)*0```!F@3A<%G8:9HN5\`@``&:)5"0D9HN%
+M\@@``&:)1"0BZPYFQT0D(@``9L=$)"0``,=$)!@`````QT0D'`````!FBY5F
+M"```9HE4)"QFBX5L"```9HE$)"IF@[UL"`````^4P&8/ML!FB40D*&:+E;H(
+M``!FB50D)NG:````9HN']`@``&:)1"0D9HN7]@@``&:)5"0B#[>'_`@``(E$
+M)!P/MY<`"0``B50D&&:+AV@(``!FB40D+&:+EVX(``!FB50D*F:#OVX(````
+M#Y3`9@^VP&:)1"0H9HN'O`@``&:)1"0FZW)FBY?X"```9HE4)"1FBX?Z"```
+M9HE$)"(/MY?^"```B50D'`^WAP()``")1"089HN7:@@``&:)5"0L9HN'<`@`
+M`&:)1"0J9H._<`@````/E,!F#[;`9HE$)"AFBY>^"```9HE4)";K"K@`````
+MZ00#``"[``````^W5"0NN4!5``"-!%N-!$*+!(&)1)PP0X/[$';MBX0DI```
+M`/9``H!T+8/L#&H`:G=J`_]T)#2-7"1,4^C\____@\04:@!J>FH#_W0D,%/H
+M_/___X/$(+L`````B?:-!%N+3Q2+%,5`50``BT2<,(D$$4;WQC\```!U#X/L
+M#&H!Z/S___^#Q!")]D.#^Q!VSKL`````BT\4BQ3=X%D``(L$W>19``")!!%&
+M]\8_````=0V#[`QJ`>C\____@\000W33NP`````/MU0D+HE4)!2-!%N+3Q2+
+M%,7H60``B50D#(M4)!2-!$*+!(7H60``BU0D#(D$$4;WQC\```!U#8/L#&H!
+MZ/S___^#Q!!#=,&[``````^W1"0NB40D$(T$6XM/%(L4Q0!:``")5"0,BU0D
+M$(T$0HL$A0!:``"+5"0,B0011O?&/P```'4-@^P,:@'H_/___X/$$$-TP;L`
+M````#[=4)"ZY(%H``(UV`(T$6XT$0HL$@8E$G#!#@_L0=NV+E"2D````#[="
+M`B5``0``/4`!``!U-8/L#&H#:C-J`0^WA5P)``!0C5PD3%/H_/___X/$%&H#
+M:BUJ`0^WA5X)``!04^C\____@\0@@^P,:@!J7VH!#[=$)$!0C5PD3%/H_/__
+M_X/$%&H`:F!J!`^W1"1$4%/H_/___X/$%&H`:FAJ`P^W1"0\4%/H_/___X/$
+M%&H`:FMJ`P^W1"0Z4%/H_/___[L`````@\0@D(T$6XM/%(L4Q2!:``"+1)PP
+MB0011O?&/P```'4/@^P,:@'H_/___X/$$(GV0X/[$';.NP`````/MU0D+KG`
+M6P``C78`C01;C01"BP2!B42<,$.#^P=V[8/L#&H`:AUJ!@^W1"0^4(U<)$Q3
+MZ/S___^#Q!1J`&H$:@$/MT0D0E!3Z/S___^[`````(/$((UV`(T$6XM/%(L4
+MQ<!;``"+1)PPB0011O?&/P```'4/@^P,:@'H_/___X/$$(GV0X/[!W;.QX5@
+M&0```````+@!````@<2,````6UY?7<-55U93BVPD%(M,)!B+?"0<BUPD((MT
+M)"0/M\,/M]8/K\*Z`````(7`=&&)V&8YSW17#[?%#[?)*<B-!("-!(#!X`(/
+MM]<IRHG1F??YB<*)V&:%TG@SB?!F@_ID?RL/O](/M\X/K\JX9````"G0#[?3
+M#Z_"`<&X'X7K4??IB=#!^`7!^1]F*<B0#[?0B=!;7E]=PXGV55=64X'L3`$`
+M`(N$)&`!``")1"0<9L=$)!@``&;'1"06/P"+E"1L`0``#[="`B7P`0``/=``
+M```/A(,````]T````'\3/:````!T3CW`````=&[IC0```#U0`0``=!<]4`$`
+M`'\)/4`!``!T">MV/4`)``!U;XM,)!QFBX%V"0``9HE$)"2)R`5B"0``B40D
+M((U`%HE$)"CK58M<)!QFBX.`"P``9HE$)"2)V`6("P``B40D((V`H@```(E$
+M)"CK+HM4)!QFBX*`"P``9HE$)"2)T`6""P``B40D((U`#(E$)"CK"K@`````
+MZ=@"``"-="0@@^P(:`@!``"-1"0\4.C\____C:PDR````+\!````NP````"#
+MQ!"-=@!FB7Q<.$=#@_\_?O1FB5PD-F;'1"0R`0!FQT0D-#\`NP````!F@WPD
+M-@!T+(/L!%8/MT1<0%"+C"1X`0``#[<!4.AR`@``9HE$70"#Q!!##[=$)#8Y
+MV'_49HM5``^W1"0V9HM,1?Z[`````(/X`'YJ9CE470!_"F:+5%T`9HE<)!B)
+MV/?09@-$)#8/M_B%_W0@9HM$??YF.T1]`'X*9HM$?0!FB41]_D,/MT0D-CG8
+M?[^[`````&:#?"0V`'0<#[=$)#:09CE,70!^"F:+3%T`9HE<)!9#.=A_Z@^_
+MRH/!&;L?A>M1B<CWZXG0P?@$P?D?*<B-!("-!(#1X&:)1"0:9L=$)!0``+\`
+M````#[_(B<Z)R/?KB40D"(E4)`R+1"0,P?@$P?D?*<A`@_@`?CJX'X7K4??N
+MB='!^02)\)F)R"G0C4@!C78`#[=4)!2+7"0<BX,$+P``BUPD&&:)'%!F_T0D
+M%$<Y^7_?OP`````/MT0D-HG"9HM,)!IF.4Q%_@^.YP```&:#?"04/P^'"`$`
+M`&:#1"0:,HG69HM<)!IF.5Q5_GY'#[_#B<,/OU1]`(G!*=&)R@^_3'T"*<@/
+MK]"%TGXID$=FBT0D&F8Y1'7^?AL/OT1]`(G:*<*)T`^_5'T"B=DIT0^OP87`
+M?]@/MU1\.M'B#[?2#[=$?#C1X`^WP`^W3'T"#[=<?0`/MW0D&E)045-6Z#?\
+M__^#Q!1`#[=,)!2+7"0<BY,$+P``9M'H9HD$2HN#!"\``&:+5"069CD42'8$
+M9HD42&;_1"04#[=4)#9FBTPD&F8Y3%7^?@YF@WPD%#\/AB?____K+6:#?"04
+M/W<E#[=,)!2+7"0<BY,$+P``9HM$2OYFB01*9O]$)!1F@WPD%#]VVXM$)!QF
+MQX"`&0````"X`0```('$3`$``%M>7UW#B?955U93@^P<BVPD.(M<)#"+="0T
+MC40D&E!5#[?&4`^WPU#H0@$``(/$$(7`=`L/MT0D&NDI`0``D(/L#(U$)"10
+MC40D)E`/MT4$4/]U``^WVXE<)"!3Z/S___^#Q!2-1"0@4(U$)")050^W1"0N
+M4`^W]E;H=0$``(/$%(U$)!Q0C40D'E!5#[=$)#!05NA;`0``@\0@C40D#%!5
+M#[=$)!I0#[=$)")0Z+T```"-1"0:4%4/MT0D+%`/MT0D,E#HI@```(/$(`^W
+M1"0*#[=4)`P/MTPD%`^W7"024%)14U;HM?K__X/$%(G'C40D#%!5#[=$)!90
+M#[=$)"10Z&D```"-1"0:4%4/MT0D*%`/MT0D-%#H4@```(/$(`^W1"0*#[=4
+M)`P/MTPD$`^W7"0.4%)14U;H8?K__X/$%`^WP`^WWP^W5"08#[=,)!904U)1
+M_W0D%.A!^O__@\04#[?`C78`@\0<6UY?7<-55U93@^P$BVPD((M$)!AFB40D
+M`HM\)!R+30B^`````&:#?00`=$V09HM$)`)F.0%U-HU1"+L`````9H-Y!@!T
+M)XUV`&8Y.G439HM461Z+1"0D9HD0N`$```#K'8/"`D,/MT$&.=A_W(/!-$8/
+MMT4$.?!_M+@`````@\0$6UY?7<.-=@!75E.+1"08BWPD$(MT)!2+4`BY````
+M``^W0`2)PX/X`'X/B?9F.3)T"(/"-$$YRW_S@^P,_W0D+/]T)"P/MT(&4(U"
+M"%`/M\=0Z/S___^#Q"!;7E_#C78`4X/L"(M<)!"#NP0O````=!N#[`S_LP0O
+M``#H_/___\>#!"\```````"#Q!"#NW@9````=!N#[`S_LW@9``#H_/___\>#
+M>!D```````"#Q!"#Q`A;PXUV`%93@^P0BW0D((M<)!QHM````.C\____B8-X
+M&0``@\00A<!U",<&`@```.MPQX,(+P``@````(/L#&B`````Z/S___^)@P0O
+M``"#Q!"%P'4(QP8"````ZT3'@\@6``"H1@$`QX/,%@``/#@!`,>#T!8``%PZ
+M`0#'@]06```,.0$`QX/8%@``F#H!`,>#W!8``)!``0"X`0```(UV`(/$!%M>
+MPY"055=64X/L#(M\)""+;"0HBUPD++X`````C01VBT\4BQ3%X%X``(E4)`B+
+M5"0DC01"BP2%X%X``(M4)`B)!!%#]L,_=1"#[`QJ`>C\____@\00C78`1H/^
+M#W:^O@````"0BT\4BQ3U8&```(L$]61@``")!!%#]L,_=0Z#[`QJ`>C\____
+M@\00D$:#_D)VTKX`````D(T$=HM/%(L4A8!B```!Z(L$A8!B``")!!%#]L,_
+M=0V#[`QJ`>C\____@\001H/^/W;.@\0,6UY?7<.)]E575E.#[`R+;"0@BW0D
+M),=$)`@`````OP````!F@3Z_$@^'S0````^W!HE$)`0MD`@``+H%````B=.9
+M]_N%TG4CBT0D!(V<`.#N__^X9V9F9O?KP?H"B=C!^!^)TRG#ZT6-=@`/MPZ-
+M@5#W__^Z!0```(G3F??[N`````"%T@^%N`$``(V<":#N__^X9V9F9O?KP?H"
+MB=C!^!^)TRG#QT0D"`$```#!XP*!X_\```"#[`AJ"%/H_/___XG#BU44BX($
+MH@``@\009H$^M`EU$8/($(F"!*(``.D;`0``C78`BU44@^#OB8($H@``Z0<!
+M``"-=@!FBP:Y%````+H`````9O?Q9H72=4=F@3[_$W9`@^P(:@@/MPZ!Z<`2
+M``"X9V9F9O?IB=#!^`/!^1\IR,'@`E#H_/___XG#@\0(:@)J`^C\____B<>#
+MQ!#IJ````&:+!KD*````N@````!F]_%FA=)U/X/L"&H(#[<.@>G`$@``N&=F
+M9F;WZ8G0P?@"P?D?*<C1X%#H_/___XG#@\0(:@)J`NC\____B<>#Q!#K5XUV
+M`&:+!KD%````N@````!F]_&X`````&:%TG5^@^P(:@@/MPZ!Z<`2``"X9V9F
+M9O?IB=#1^,'Y'RG(4.C\____B<.#Q`AJ`FH!Z/S___^)QX/$$(UV`(G9P>$$
+MC02]``````G!BT0D"-'@"<&!R0$0``"+510/ML&)@IR8``#!Z0B+512)R(/@
+M?XF"V)@``(FU_`<``+@!````@\0,6UY?7<.+5"0(BT0D!(N`>!D``(/Z!W<=
+M_R25N&H``(GV@\`$PX/`",.#P`S#!:P```##B?:X`````,.)]E575E.#[!R+
+M;"0PBT0D.&:)1"0:B6PD%&;'1"0.``!FQT0D#```9L=$)`H``&;'1"0(``"+
+MM7@9``")ZH'"/!8``(E4)`2_`````(M4)#0/MT(")?`!```]T`````^$>`$`
+M`#W0````?QL]H`````^$)`$``#W`````#X1;`0``Z8T!```]4`$``'0>/5`!
+M``!_##U``0``=!#I<P$``#T`"```#X5H`0``BU0D-&:+`BVA#P``9CWJ!'<E
+MBT0D%&:+@.0(``!FB40D#HM4)!1FBY+F"```9HE4)`SIDP```(M4)#1FBP(M
+MC!0``&8][P!W(HM$)!1FBX#H"```9HE$)`Z+5"049HN2Z@@``&:)5"0,ZU^+
+M5"0T9HL"+7P5``!F/>``=R*+1"049HN`[`@``&:)1"0.BU0D%&:+DNX(``!F
+MB50D#.LKBT0D-&:!.%P6=B"+5"049HN2\`@``&:)5"0.BT0D%&:+@/((``!F
+MB40D#(M4)!1FBY)L"```9HE4)!*+1"049HN`N@@``&:)1"00Z8,```"+5"04
+M9HN2_`@``&:)5"0*BT0D%&:+@``)``!FB40D"(M4)!1FBY)N"```9HE4)!*+
+M1"049HN`O`@``&:)1"00ZT&+5"049HN2_@@``&:)5"0(9HE4)`J+1"049HN`
+M<`@``&:)1"02BU0D%&:+DKX(``!FB50D$.L*N`````#I;00``+H`````N81E
+M``"+!-&)!)9"=/>Z``````^W3"0:NXAE``"-!%*-!$&+!(.)1)8$0G3PN@``
+M```/MTPD&KN@90``C012C01!BP2#B426"$)T\+H`````#[=,)!J[P&4``(T$
+M4HT$08L$@XE$E@Q"@_HG=NV#[`QJ`&@N`0``:@$/MT0D*E"-7@Q3Z/S___^#
+MQ!1J`&@.`0``:@*+5"14#[<"4%/H_/___X/$%&H`:`$!``!J`HM4)%0/MT("
+M4%/H_/___X/$((M$)#3V0`)`#X2W````@^P,:@-HJ````&H!BU0D'(M"'`^_
+M0`)04^C\____@\04:@-HJ0```&H!BU0D'(M"'`^_0`104^C\____@\04:@-H
+MJ@```&H!BU0D'(M"'`^_0`904^C\____@\04:@-HK@```&H!BU0D'(M"'`^_
+M0`A04^C\____@\04:@-HKP```&H!BU0D'(M"'`^_0`I04^C\____@\04:@-H
+ML````&H!BU0D'(M"'`^_0`Q04^C\____@\0@BT0D-/9``H!T.(/L#&H`:!\!
+M``!J`P^W1"0B4(U>#%/H_/___X/$%&H`:"(!``!J`P^W1"0@4%/H_/___X/$
+M(.LV@^P,:@!H%P$``&H##[=$)"90C5X,4^C\____@\04:@!H&@$``&H##[=$
+M)"104^C\____@\0@#[>%K`$``"7P````@_@O?F%F@[VL`0``-70*9H.]K`$`
+M`$5U38/L#&H":EIJ`FH"C5X,4^C\____@\04:@)J7&H":@)3Z/S___^#Q!1J
+M`FI>:@)J`E/H_/___X/$%&H":/X```!J`6H"4^C\____@\0@9H.]J@$``$%V
+M9(/L#&H!:!D!``!J`6H!C5X,4^C\____@\04:@-J`6H":@%3Z/S___^#Q!1J
+M`VH#:@)J`5/H_/___X/$%&H#:(L```!J`6H!4^C\____@\04:@-HC````&H!
+M:@%3Z/S___^#Q""Z``````^W3"0:NX!I``")]HT$4HT$08L$@XF$EJP```!"
+M@_H,=NJ+5"0T]D("0'0C@^P,:@!J)6H"BU0D'(M"'`^_`%"-AJP```!0Z/S_
+M__^#Q""#[`QJ`&H.:@8/MT0D*%"-AJP```!0Z/S___^[`````(/$((M-%(L4
+MW8!E``"+!)Z)!!%']\<_````=0V#[`QJ`>C\____@\000W37NP````"-!%N+
+M312+%,6(90``BT2>!(D$$4?WQS\```!U#8/L#&H!Z/S___^#Q!!#=-.[````
+M`(T$6XM-%(L4Q:!E``"+1)X(B0011_?'/P```'4-@^P,:@'H_/___X/$$$-T
+MT[L`````C01;BTT4BQ3%P&4``(M$G@R)!!%']\<_````=0^#[`QJ`>C\____
+M@\00B?9#@_LG=LZ[`````)"-!%N+312+%,6`:0``BX2>K````(D$$4?WQS\`
+M``!U$(/L#&H!Z/S___^#Q!"-=@!#@_L,=LJ+1"04QX!@&0```````+@!````
+M@\0<6UY?7<.-=@!55U93@>S\`P``BX0D$`0``(E$)!@/MX"L`0``)?````"#
+M^"]^(HM4)!AF@[JL`0``-70*9H.ZK`$``$5U"L=$)!0"````ZPC'1"04`0``
+M`(N,)!P$```/MT$")?`!```]T````'1I/=````!_$#V@````=$$]P````'14
+MZVP]4`$``'07/5`!``!_"3U``0``=`GK53T`"```=4Z+1"08!5`1``")1"0,
+MBTPD&`^WD68(``#K/HM$)!@%7!$``(E$)`R+3"08#[>1:`@``.LDBT0D&`5H
+M$0``B40D#(M,)!@/MY%J"```ZPJY`````.GV!0``BTPD#`^W00:Y`````(7"
+M#X3A!0``BY0D&`0```^_`M'@9HE$)`2+C"04!```#[\!T>!FB40D!F;'1"0H
+MK=YFQT0D*JW>QT0D"`````"^`````(M$)`P/MU`&C5PD*(GVB=")\=/XJ`%T
+M&(-\)`@!#X?1!```BT0D"&:)-$-`B40D"$:#_@-VV(/L#(U$)#!0C40D,%"+
+M5"0@#[="!%#_,HN,)#@$```/MP%0Z)P%``#'1"0H`````(ML)$"#Q"`[;"0D
+M#X?U`0``C78`C42M`(U$A0"+3"0,BU$(C02"B40D$&:!?"0JK=X/A9<````/
+MMW0D*(T<MHT<F(/L!`^W>P:--#]6C4,(4(V$)-P"``!0Z/S___^#Q`Q6@\,0
+M4XV4)+P"``!2Z/S___^#Q`2-3"0\48M4)"`/OT("4(V,),0"``!1C80DZ`(`
+M`%!7Z(H%``"#Q""%P`^$\P,``(/L!&B`````C50D.%*+1"04P>`'C80$O`$`
+M`%#H_/___X/$$.DI`0``#[=T)"B-'+:+3"00C1R9@^P$#[=[!HTT/U:-0PA0
+MC80DW`(``%#H_/___X/$#%:#PQ!3C90DO`(``%+H_/___X/$!(U,)#Q1BU0D
+M(`^_0@)0C8PDQ`(``%&-A"3H`@``4%?H[P0``(/$((7`#X1B`P``@^P$:(``
+M``"-5"0X4HM$)!3!X`>-A`2\`0``4.C\____#[=T)#J-'+:+3"0@C1R9@\0,
+M#[=[!HTT/U:-0PA0C80DW`(``%#H_/___X/$#%:#PQ!3C90DO`(``%+H_/__
+M_X/$!(U,)#Q1BU0D(`^_0@)0C8PDQ`(``%&-A"3H`@``4%?H7`0``(/$((7`
+M#X39`@``@^P$:(````"-5"0X4HM$)!3!X`>-A`2\````4.C\____@\00_T0D
+M"$4[;"0D#X8._O__BTPD((M$)`R+$&:+'$J+1"0D9HL\0BG(B40D"&:!?"0J
+MK=X/A;@```"^`````(/L#(M$)!3!X`8!\`^_A$2\`0``4`^_A'3``0``4`^W
+MQU`/M\-0BY0D.`0```^W`E#HX@(``&:)A'20`P``@\0@1H/^/W:Y@^P(BTPD
+M(/^Q!"\``(V$)'P#``!0Z&<$``")PF;!Z`^-!`)FT?B+E"0D!```9HD"9HN$
+M)/X#``")PF;!Z@\!T&;1^&:)1"0^BXPD*`0``&:)`8M$)#B+E"0P!```9HD"
+M9HE"`H/$$.DX`@``O@`````/M^\/M_N)]H/L#(M<)!3!XP8!\P^_A%R\`0``
+M4`^_A'3``0``4%57BXPD.`0```^W`5#H*`(``&:)A'20`P``@\04#[^$7+P`
+M``!0#[^$=,````!055>+E"0X!```#[<"4.CY`0``9HF$=!`#``"#Q"!&@_X_
+M=I"#?"04`@^%BP```(U$)!Y0BTPD'/^Q!"\``(V$)/@"``!0C80D?`,``%#H
+M-00``(G"9L'H#XT$`F;1^(N4)"0$``!FB0)FBT0D+HG"9L'J#P'09M'X9HE$
+M)#YFBX0D_@,``(G"9L'J#P'09M'XBXPD*`0``&:)`8M$)#B+E"0P!```9HD"
+M9HM$)#IFB4("@\00Z24!``!FBTPD!F8YC"1N`P``#XRI````BT0D!&8YA"1N
+M`P``#XR7````@^P(BU0D(/^R!"\``(V$)/P"``!0Z,,"``")PF:+1"0ZBXPD
+M,`0``&:)`6:)00*)T&;!Z`^-!`)FT?B+E"0D!```9HD"9HN$)'X#``")PF;!
+MZ@\!T&;1^&:)1"0^BXPD*`0``&:)`8/$$.F1````N0````#II@```+D`````
+MZ9P```"Y`````.F2````N0````#IB````(/L"(M$)"#_L`0O``"-A"1\`P``
+M4.@L`@``B<*+1"0XBXPD,`0``&:)`6:)00*)T&;!Z`^-!`)FT?B+E"0D!```
+M9HD"9HN$)/X#``")PF;!Z@\!T&;1^&:)1"0^BXPD*`0``&:)`8/$$+@_````
+MBY0D&`0``&8K`HM,)!AFB8&`&0``N0$```")R('$_`,``%M>7UW#D%=64XM<
+M)!"+="04BTPD&(M\)!R+5"0@B?AF.?%T)`^WVP^W]HG8*?`/O](/K\(/M\F)
+MRBG:#[_?#Z_3`=`I\9GW^9A;7E_#D%575E.+="08BVPD((M\)"2+5"0<#[=<
+M)!0/M\J-#$X/MP8YV'82QP<`````QT4``````.M3C78`#[=!_CG8=R@/M\)(
+MB0>)10#K/8G0*?#1^(D'B44`ZS")T"GPT?B)10!`B0?K(HGVB?(YSG,:B?8/
+MMP(YV'34#[="`CG8=]F#P@(YRG+JB?9;7E]=PXUV`%575E.#[`R+;"0PBU0D
+M((M$)"QFB40D"F;'1"0(``!FQT0D!@$`N`````!F@_H!#X:;````OP`````/
+MM\)(B00DC78`#[=$)`:+5"0D9CD\0G,1.P0D?0QF_T0D"&;_1"0&B?8/MU0D
+M!HM<)"@/OS13#[=$)`@/OPQ#BUPD)`^W%%,/MP1##[??5E%24%/HE?[__X/$
+M%&:)1%T`9HM4)`IF.=!\&V:#_S]W%9`/M\=FBUPD"F:)7$4`1V:#_S]V[$=F
+M@_\_#X9Y____N`$```"#Q`Q;7E]=PU575E.#[`2+?"08BVPD'`^_1WX/OQ<I
+MT(/X?GX.9HM'?H/H?F:)1"0"ZPAFBP=FB40D`F:+=WZY/P````^_5WZ)T$@Y
+MPGX6B<*-=@!)#[_!#[\$1SG0?@5FA<EY[XG*B?.^/P```(GVC4+_B<%F@_@^
+M=QT/O\)F.1Q'?!2)RHU*_V:#^3YW"0^_PF8Y'$=][&:%TG4;9H7V>"6)]@^_
+MUF:+1%4"9HE$50!F3GGOZQ"0#[_&9HE410"#ZP)F3GFI#[]$)`*#Q`1;7E]=
+MPU575E.#[!"+="0D9L=$)`)```^_1GZ+3"0H#[\1*="#^'Y^#F:+;GZ#[7YF
+MB6PD#NL,BT0D*&:+`&:)1"0.9HM6?F:)5"0,N3\````/OU9^#[]$)`Q(.<)^
+M$XG"20^_P0^_!$8YT'X%9H7)>>^+;"0H9HM%?HM4)#!FB0*_/P```(M<)`R-
+M=@"+;"0P9CE=`'T.9H7)=1EF@WPD`D!U$9!FQT0D`@``BW0D*+D_````9H7)
+M?AH/O\%F.1Q&?!&)]DEFA<E^"0^_P68Y'$9]\6:%R74D9H-\)`(`=1QFA?]X
+M-`^_UXM,)"QFBT11`F:)!%%F3WGLZQZ0#[_O9HM$)`()R(M4)"QFB01J@^L"
+M9D\/B7/___\/OT0D#H/$$%M>7UW#B?93@^P(BUPD$(.[!"\```!T&X/L#/^S
+M!"\``.C\____QX,$+P```````(/$$(.[>!D```!T&X/L#/^S>!D``.C\____
+MQX-X&0```````(/$$(/$"%O#C78`5E.#[!"+="0@BUPD'&C@````Z/S___^)
+M@W@9``"#Q!"%P'4(QP8"````ZWC'@P@O``"`````@^P,:(````#H_/___XF#
+M!"\``(/$$(7`=0C'!@(```#K3,>#""\``$````#'@\@6```<7`$`QX/,%@``
+MI$<!`,>#T!8``+A*`0#'@]06``!T2`$`QX/8%@``\$H!`,>#W!8``(11`0"X
+M`0```)"#Q`1;7L.0D%575E.#[`R+?"0@BVPD*(MT)"R[`````(T$6XM/%(L4
+MQ>!J``")5"0(BU0D)(T$0HL$A>!J``"+5"0(B0011O?&/P```'4-@^P,:@'H
+M_/___X/$$$.#^P]VOKL`````D(M/%(L4W6!L``"+!-UD;```B0011O?&/P``
+M`'4/@^P,:@'H_/___X/$$(GV0X'[B````';+NP````")]HT$6XM/%(L4A<!P
+M```!Z(L$A<!P``")!!%&]\8_````=0Z#[`QJ`>C\____@\00D$.#^S]VRH/$
+M#%M>7UW#B?955U93@^P,BVPD((MT)"3'1"0(`````+\`````9H$^OQ(/A\T`
+M```/MP:)1"0$+9`(``"Z!0```(G3F??[A=)U(XM$)`2-G`#@[O__N&=F9F;W
+MZ\'Z`HG8P?@?B=,IP^M%C78`#[<.C8%0]___N@4```")TYGW^[@`````A=(/
+MA;@!``"-G`F@[O__N&=F9F;WZ\'Z`HG8P?@?B=,IP\=$)`@!````P>,"@>/_
+M````@^P(:@A3Z/S___^)PXM5%(N"!*(``(/$$&:!/K0)=1&#R!")@@2B``#I
+M&P$``(UV`(M5%(/@[XF"!*(``.D'`0``C78`9HL&N10```"Z`````&;W\6:%
+MTG5'9H$^_Q-V0(/L"&H(#[<.@>G`$@``N&=F9F;WZ8G0P?@#P?D?*<C!X`)0
+MZ/S___^)PX/$"&H":@/H_/___XG'@\00Z:@```!FBP:Y"@```+H`````9O?Q
+M9H72=3^#[`AJ"`^W#H'IP!(``+AG9F9F]^F)T,'X`L'Y'RG(T>!0Z/S___^)
+MPX/$"&H":@+H_/___XG'@\00ZU>-=@!FBP:Y!0```+H`````9O?QN`````!F
+MA=)U?H/L"&H(#[<.@>G`$@``N&=F9F;WZ8G0T?C!^1\IR%#H_/___XG#@\0(
+M:@)J`>C\____B<>#Q!"-=@")V<'A!(T$O0`````)P8M$)`C1X`G!@<D!$```
+MBU44#[;!B8*<F```P>D(BU44B<B#X'^)@MB8``")M?P'``"X`0```(/$#%M>
+M7UW#55=64X/L#(ML)""+1"0H9HE$)`J);"0$OP````"+M7@9``"+1"0D#[=`
+M`B7P`0``/<````!T.CW`````?PD]H````'0+ZTL]T````'0CZT*+1"0$9HN`
+M]`@``&:)1"0"BT0D!&:+@/8(``!FB00DZRN+1"0$9HN`^`@``&:)1"0"BT0D
+M!&:+@/H(``!FB00DZPJX`````.GA`0``N@````"YQ',``(L$T8D$ED)T][H`
+M````#[=,)`J[R',``(T$4HT$08L$@XE$E@1"=/"Z``````^W3"0*N^!S``"-
+M!%*-!$&+!(.)1)8(0G3PN@`````/MTPD"KL`=```C012C01!BP2#B426#$*#
+M^AIV[8/L#&H`:*@```!J`P^W1"0:4(U>#%/H_/___X/$%&H`:*4```!J`P^W
+M1"084%/H_/___[H`````@\0@#[=,)`J[H'8``(T$4HT$08L$@XE$EGA"@_H"
+M=NV[`````(M-%(L4W<!S``"+!)Z)!!%']\<_````=0V#[`QJ`>C\____@\00
+M0W37NP````"-!%N+312+%,7(<P``BT2>!(D$$4?WQS\```!U#8/L#&H!Z/S_
+M__^#Q!!#=-.[`````(T$6XM-%(L4Q>!S``"+1)X(B0011_?'/P```'4-@^P,
+M:@'H_/___X/$$$-TT[L`````B?:-!%N+312+%,4`=```BT2>#(D$$4?WQS\`
+M``!U#X/L#&H!Z/S___^#Q!")]D.#^QIVSKL`````C01;BTT4BQ3%H'8``(M$
+MGGB)!!%']\<_````=1"#[`QJ`>C\____@\00C78`0X/[`G;-BT0D!,>`8!D`
+M``````"X`0```(/$#%M>7UW#C78`BU0D"(M$)`2+@'@9``"#^@=W&?\DE>AV
+M``")]H/`!,.#P`C#@\`,PX/`>,.X`````,.)]E575E.+?"08BVPD)(MT)!R+
+M7"04#[?.C0Q/#[_3#[<'.<)]%,=%``````"+1"0@QP``````ZU&09CE9_G\N
+M#[?&2(E%`(M4)"")`NL[*?C1^(E%`(M4)"")`NLL*?C1^(M4)"")`D")10#K
+M'(GX.<]S%HGV9CD8=-1F.5@"?]V#P`(YR'+NB?9;7E]=PXUV`%575E.#[!B+
+M1"0P9HE$)`Z+3"0T9HE,)`R+7"1`9HE<)`J)Q='E9L=$)`@``+@`````9H/[
+M`0^&!@$``(M$)`QF*T0D#F8[1"0(#X+M````#[=$)`J)1"0$C78`C40D%%"-
+M1"044`^W1"024/]T)$0/O\50Z/?^__^#Q!2#?"04`'4(QT0D%`$```"+5"0$
+MC4+_.T0D$'4(C4+^B40D$)"+3"00BUPD.&:+%$N+1"049CL40W4*BT0D/&:+
+M#$CK2P^_S8M<)!"+1"0X#[\T6(G/*?>+5"04BT0D/`^_!%`/K_B+1"0X#[\4
+M4(G0*<B)!"2+1"0\#[\,6(L$)`^OP8T$!RGRB=&9]_F)P0^W1"0(BU0D+,'B
+M!@'"BUPD1&:)#%-F_T0D"(/%`HM$)`QF*T0D#F8[1"0(#X,?____N`$```"#
+MQ!A;7E]=PXGV5U93BUPD$(MT)!2+3"08BWPD'(M4)"")^&8Y\70D#[?;#[?V
+MB=@I\`^_T@^OP@^WR8G**=H/O]\/K],!T"GQF??YF%M>7\.055=64X'L7`8`
+M`(N$)'0&``!FB40D-HN4)'P&``!FB50D-,=$)"@`````C40D3%"-1"1,4(N,
+M)(`&```/MT$(4%$/OT0D1E#HD/W__\=$)$0`````@\04D+@#````*T0D,(E$
+M)"R+5"1(C01`C1S%`````(T$DHT$@(T$0HT$0XNT)'@&``"-%#!FBWH49H7_
+M#X3_`0``9HM"$HM,)"B+M"2(!@``9HD$3HG-T>6-="1`9HM*(&:)3#4`BU0D
+M3(T$DHT$@(T$0HT$0P.$)'@&``!F.T@@?@EFBT`@9HE$-0"+;"0HT>5FBT0L
+M0(G"9L'J#P'09M'X9HE$+$"-1"0XB40D((M4)$@/M_>+7"0LC0Q;P>$"C022
+MC02`C01"C00!`?"+E"1X!@``9HM<0AZ+1"0@9HE<!0"+5"1,C022C02`C01"
+M`<&-!#&+E"1X!@``9CM<0AY^#F:+1$(>BTPD(&:)1`T`BUPD*-'C9HM$'#B)
+MPF;!Z@\!T&;1^&:)1!PXC80D4`0``%`/M_]7BU0D4(T$DHT$@(T$0HM4)#2-
+M-%+!Y@.-!$8#A"2`!@``C5`64H/`(%`/OT0<2%`/OT0<5%#_="1`Z*+\__^-
+MA"1L`@``4%>+5"1PC022C02`C01"C01&`X0DG`8``(U0%E*#P"!0#[]$'&10
+M#[]$''!0_W0D7.AE_/__OP````"#Q#AFBT0<.&8[1!Q`='8/MTPD-HE,)!R+
+M;"0HT>6)]HM<)"C!XP8!^P^_C%Q0`@``#[^T7%`$``"+5"1,BX0D>`8```^W
+M%%")5"0(BT0D2(N4)'@&```/MP1"45;_="004/]T)"SH0?W__X/$%&:)1%Q0
+M1V:+1"PX9BM$+$`/M\`Y^'>;_T0D*/]$)#"#?"0P`P^&M/W__XM4)$"+A"2`
+M!@``9HD0OP````#'1"0P`````#M\)"@/@\T!``"-=@"+1"0H2#M$)#!U&8M,
+M)#!FBT1,.(/`!(N<)(0&``!FB01+ZRJ+5"0PT>(/OT04.`^_5!1"`=")PL'J
+M'P'0T?B+="0PBY0DA`8``&:)!'*Y`````(-\)#``=!Z+7"0PB[0DA`8```^W
+M3%[^#[]$7$`IP0^W1"0T*<&+5"0PP>('9HM$%%*)PV8K7!10B=AFA=MU!;@!
+M````B<.%R7DSBT0D,,'@!P^WTV:+;`10B=`/K\&)^T>^`````&8!Z'@"B<:+
+MA"2,!@``9HDT6$%XWHGVBT0D,-'@#[]4!#B)5"0,#[]4!$`I5"0,BUPD,(NT
+M)(0&```/MRQ>#[=$)#0!Q2G5BT0D#(E$)"0YZ'8$B6PD)`^_1"0DB<,YR'XB
+MBU0D,,'B!HGVC00*06:+1$10B[0DC`8``&:)!'Y'.<M_YXM$)##!X`8#1"0,
+M9HM41$Z)TV8K7$1,B=AFA=MU!;@!````B<,[;"0D=E`/O\4YR'Y)BT0D,,'@
+M!@-$)`QFBT1$3F:)1"0:B<@K1"0D#[?3#Z_"9@-$)!J)_D>)PF:#^']^!;I_
+M````BX0DC`8``&:)%'!!#[_%.<A_S/]$)#"+5"0H.50D,`^"-O[__X-\)#`#
+M=R&-=@"+3"0PBYPDA`8``&:+1$O^9HD$2T&)3"0P@_D#=N*#_W]W%Y"+M"2,
+M!@``9HM$?OYFB01^1X/_?W;J@<1<!@``6UY?7<.-=@!55U93@^PLBWPD0(M,
+M)$R)_8NW!"\```^W00(ET````#W`````=`<]T````'4(C9V8%```ZQ\/MT$"
+M):````"Z`````#V@````#X4'`0``C9_T$@``BT<4BX!LH@``@^`/9HD$)%;_
+M="14C40D(%"-1"0B4`^W1"004%,/MP%05^B3^O__BT\4BY%8H@``@.8_#[=#
+M$$C!X`XE`,````G"B9%8H@``@\0@9H-\)!8`=!!FBT0D%O?89HF%@!D``.L)
+M9L>%@!D`````NX"B``"Y``````^V%,X/MD3.`L'@"`G"#[9$S@3!X!`)P@^V
+M1,X&P>`8"<*+1Q2)%!B#PP1!@_D?=L^+7Q2+%"2#X@\/MT0D&,'@!"7P`P``
+M"<*-3"08#[=!`L'@"B4`_```"<(/MT$$P>`0)0``/P`)P@^W00;!X!8E``#`
+M#PG"B9-LH@``N@$```")T(/$+%M>7UW#4X/L"(M<)!"#NP0O````=!N#[`S_
+MLP0O``#H_/___\>#!"\```````"#Q!"#NW@9````=!N#[`S_LW@9``#H_/__
+M_\>#>!D```````"#Q!"#Q`A;PXUV`%93@^P0BW0D((M<)!QHA````.C\____
+MB8-X&0``@\00A<!U",<&`@```.MPQX,(+P````$``(/L#&@``0``Z/S___^)
+M@P0O``"#Q!"%P'4(QP8"````ZT3'@\@6``!H:P$`QX/,%@``(%T!`,>#T!8`
+M`,AB`0#'@]06``#\70$`QX/8%@``0&`!`,>#W!8```AJ`0"X`0```(UV`(/$
+M!%M>PP`````````````X!P``2P<``$L'``!5!P``4`@``%\'``!I!P``>0<`
+M`%`(``")!P``G0<``.X'``"U!P``R@<``-P'``#]!P`````%``H`%``>`#(`
+M1@!5`%H`7P!D````"@`4`!X`*``R`#P`1@!0`%H`9`#"````Q````,4```#0
+M````V@```.0```#"````PP```-0```#R````#0$``"@!````````3D].10``
+M`````/\!1D-#```````0`$@#34M+``````!``(@!151320`````W`#H#````
+M`````````````````/\!``"?````H@````$````!`````0``````$`"H````
+MJP````$````!`````0````@``P"Z````O0````$``````````0````P``P#%
+M````R`````$``````````0```"``1P#0````TP```````````````````#,`
+M,`#=````X`````$``````````0```"0`(0#H````ZP````$````!`````0``
+M`"@`.0#U````^`````$``````````0```!\`,````0```P$```$````!````
+M`0```#```P`.`0``$0$```$``````````0```'```P`9`0``'`$```$`````
+M`````0```#@`,``D`0``)P$```$``````````0```%0`50`O`0``,@$```$`
+M```!`````0```$0`50`Y`0``/`$```$````!`````0```$P`"`!#`0``1@$`
+M`````````````````&``4@!-`0``4`$```$````!`````0```&0`-`!B`0``
+M90$```$``````````0```'P`(`!N`0``<0$```$````!`````0```)@`6`!X
+M`0``>P$````````!`````````)P`4@"!`0``A`$```$````!`````0```*H`
+M$`"*`0``C0$```$``````````0```+P``P"6`0``F0$```$``````````0``
+M`+\`-@"D`0``IP$```$``````````0```,0`-P"O`0``L@$```$````!````
+M`0```,L`-@"Y`0``O`$``````````````````-``-P#+`0``S@$```$`````
+M`````0```-8`$`#6`0``V0$```$````!`````0```-H``P#L`0``[P$`````
+M`````````````#(#`P#W`0``^@$```$``````````0```-X``P```@```P(`
+M``$``````````0```.D`-P`/`@``$@(```$``````````0```/8`-P`:`@``
+M'0(```$``````````0```/H`-@`E`@``*`(```$``````````0```/\`-@`O
+M`@``,@(```$``````````0````P!,``]`@``0`(```$````!`````0```!0!
+M-P!(`@``2P(```$``````````0```"P!`P!3`@``5@(```$``````````0``
+M`$`!$`!=`@``8`(```$````!`````0```%0!`P!J`@``;0(```$`````````
+M`0```%@!(0!V`@``>0(```$````!`````0```%P!-0"#`@``A@(```$`````
+M`````0```&`!-P".`@``D0(```$``````````0```&0!`P"9`@``G`(```$`
+M`````````0```&@!`P"B`@``I0(```$``````````0```&P!4@"O`@``L@(`
+M``$````!`````0```'0!-P"W`@``N@(```$``````````0```'@!`P#"`@``
+MQ0(```$``````````0```'P!-P#,`@``SP(```$``````````0```(@!0`#5
+M`@``V`(```$``````````````(D!00#>`@``X0(```$``````````````(H!
+M2`#H`@``ZP(```$``````````````(L!0P#R`@``]0(```$`````````````
+M`(P!2@#\`@``_P(```$``````````````(T!2P`&`P``"0,```$`````````
+M`````)`!`P`0`P``$P,```$``````````0```(X!`P`:`P``'0,```$`````
+M`````0```)@!10`H`P``*P,```$````!`````0```)H!10`W`P``.@,```$`
+M`````````````)L!20!)`P``3`,```$``````````````)X!`P!<`P``7P,`
+M``$``````````0```*P!`P!F`P``:0,```$``````````0```*8!`P!P`P``
+M<P,```$``````````0```+8!-0![`P``?@,```$``````````0```+@!-P",
+M`P``CP,```$``````````0```+H!-P"9`P``G`,```$``````````0```+X!
+M(0"G`P``J@,```$````!`````0```"<#`P"P`P``LP,```$``````````0``
+M`,H!`P"]`P``P`,``````````````````.0!$`#)`P``S`,```$````!````
+M`0```.P!,`#3`P``U@,```$````!`````0```/@!`P#=`P``X`,```$`````
+M`````0```!`"-P#H`P``ZP,```$``````````0```"H"(@#W`P``^@,```$`
+M`````````0```$("-P`&!```"00```$``````````0`````"`P`0!```$P0`
+M``$``````````0```$H"`P`8!```&P0```$``````````0```$\"$``D!```
+M)P0```$````!`````0```%P"`P`N!```,00```$``````````0```&`"$0`V
+M!```.00```$````!`````0```&@"-P!%!```2`0```$``````````0```&P"
+M-P!/!```4@0```$``````````0```'8"$`!;!```7@0```$````!`````0``
+M`'H"`P!J!```;00```$``````````0```(("`P!S!```=@0```$`````````
+M`0```(,"`P!^!```@00```$``````````0```*H"`P"(!```BP0```$`````
+M`````0```+X"0@"8!```FP0```$````!`````0```+\"-@"E!```J`0```$`
+M`````````0```,$"-P"X!```NP0```$``````````0```,8"-P#$!```QP0`
+M``$````!`````0```-0"-P#4!```UP0```$``````````0```/`"-P#=!```
+MX`0```$``````````0```/0"-0#G!```Z@0```$``````````0```/@"`P#V
+M!```^00```$``````````0```)X`1P#_!````@4```$````!`````0```/P"
+M10`)!0``#`4```$````!`````0````P#,``5!0``&`4```$``````````0``
+M`!0#-@`J!0``+04```$``````````0```!@#-@`U!0``.`4```$`````````
+M`0```"0#`P`_!0``0@4```$``````````0```!`#`P!*!0``304```$`````
+M`````0```#H#-P!B!0``904```$``````````0```$@#$`!T!0``=P4```$`
+M```!`````0```%H#10"%!0``B`4```$``````````0```%P#.@"0!0``DP4`
+M``$````!`````0```%X#5@">!0``H04```$``````````0```,`"`P"K!0``
+MK@4```$``````````0```'<#`P"W!0``N@4```$``````````0```,P"`P#`
+M!0``PP4```$``````````0````````````````#_`?\!`P"8`9D!!P"8`3`+
+M"`"8`3`,(``@`1`*(0`@`9D!(@`@`3`,.@!@`1`*-P`P`9D!-0`P`ID!-@`P
+M`YD!,``P!)D!.0`P!9D!-``P!ID!,@`P`YD!,0`P`YD!$0`0`9D!$``0`1`*
+M4@!0`9D!10!0`ID!1P!0`YD!0@!0!)D!6`!0!9D!50!0`3`,5@!0`C`,20!0
+M`E`-0`!``4`*00!``4`*0P!``D`*2`!``1`*2@!``4`*2P!``4`*8`!@`&``
+M80!A`&$`8@!B`&(`8P!C`&,`9`!D`&0`90!E`&4`9@!F`&8`9P!G`&<`:`!H
+M`&@`:0!I`&D`:@!J`&H`````````````````````````````````````````
+M_P$"`!```!1$%@4&<1;!%@4&````````````````4`$!`!``<1;!%AX`````
+M````````````````````4`(!`!``<1:M%A<`````````````````````````
+M4`,"`!``H!3(%!$&<1:M%AX&````````````````4`0"`!``/!1X%!0`<1;!
+M%A0`````````````````4`4"`!``<1;!%A$`````````````````````````
+M,`$"`#``/!3(%!0`?!5$%AL`````````````````,`(!`#``/!1X%!(`````
+M````````````````````,`,!`#``/!3(%!0`````````````````````````
+M,`0!`#``/!3(%!(`````````````````````````,`4!`#``/!1X%`\`````
+M````````````````````,`8"`#``/!2@%!<`?!5$%AX`````````````````
+M$`$#`!``C!3(%!<&/!1X%!$&<1;!%AX&````````(`$"`!``/!3(%!<&<1;!
+M%AX&````````````````8`$$`!``/!1X%!$&C!3(%!0&?!5$%A0&<1;!%AX&
+M0`$!`$``,A1N%!<`````````````````````````0`(#`$``,A1N%!<`L!/8
+M$Q<`.!-T$Q<```````````#_`0(`$P`*%"86!08>%!(6!08`````````````
+M```0`0,`$P""%*H4%P9:%%H4$0:`%J@6'@8```````!@`0,`$P""%*H4%P9:
+M%%H4$0:`%J@6'@8```````!@`00`$P!X%*`4%P90%%`4$0:%%JT6'@:D%1P6
+M'@80"@$`$0``````````````````````````````````````````````_P$#
+M`/\`"`E$"04&A0F%"04&T`FL"@4&````````$`H!`!0`A0F%"10&````````
+M````````````````,`H!`#0`A0F%"10&````````````````````````,`L!
+M`#0`A0F%"10&````````````````````````,`P!`#0`A0F%"10&````````
+M````````````````0`H!`$0`A0F%"10&````````````````````````F0$!
+M`#0`A0F%"10&``````````````````````````````````````````#_`00`
+M_P`("40)!09L":@)!0:T";0)!0;0":P*!090#0(`_P!L":@)%``("40)%```
+M```````````````P"@$`_P"9":@)%``````````````````````````P"P$`
+M,0"`"8H)%``````````````````````````P#`$`,0!L":@)'@``````````
+M```````````````0"@$`$0!L"9X)&P8```````````````````````!`"@(`
+M00!L":@)%`"T";0)%`````````````````"9`0$`,0!L":@)%```````````
+M````````````````````_P``````````````````````````````````````
+M``````````````````!@`````0`````````*````.`$``$`!``!(`0``:`$`
+M`'`!``!X`0``@`$``(@!``"H`0``L`$``&8````!``````````D````X`0``
+M0`$``%`!``!H`0``<`$``'@!``"``0``D`$``+`!````````9P````$`````
+M````"0```#@!``!``0``2`$``&@!``!P`0``>`$``(`!``"(`0``L`$`````
+M``!H`````0`````````)````.`$``$`!``!(`0``:`$``'`!``!X`0``@`$`
+M`(@!``"P`0```````&$```````````````@````X`0``0`$``$@!``!H`0``
+M@`$``(@!``"H`0``L`$`````````````8@````(````L`0``"@```#@!``!`
+M`0``2`$``&@!``!P`0``>`$``(`!``"(`0``J`$``+`!``!C`````0``````
+M```(````.`$``$`!``!(`0``:`$``'`!``!X`0``B`$``+`!````````````
+M`&0```````````````<````X`0``6`$``&@!``!P`0``>`$``)@!``"P`0``
+M````````````````90``````````````!0```#@!``!(`0``:`$``(@!``"P
+M`0````````````````````````````!I```````````````(````.`$``%@!
+M``!H`0``<`$``'@!``"``0``F`$``+`!`````````````&H`````````````
+M``8````X`0``2`$``&@!``"``0``B`$``+`!````````````````````````
+M````````````````````````````````8`````$`````````"0```#@!``!`
+M`0``4`$``&@!``!P`0``>`$``(`!``"0`0``L`$```````!F`````0``````
+M```)````.`$``$`!``!0`0``:`$``'`!``!X`0``@`$``)`!``"P`0``````
+M`&<````!``````````D````X`0``0`$``$@!``!H`0``<`$``'@!``"``0``
+MD`$``+`!````````:`````$`````````"0```#@!``!``0``2`$``&@!``!P
+M`0``>`$``(`!``"0`0``L`$```````!A```````````````'````.`$``$`!
+M``!0`0``:`$``(`!``"0`0``L`$``````````````````&(````"````+`$`
+M``D````X`0``0`$``%`!``!H`0``<`$``'@!``"``0``D`$``+`!````````
+M8P````$`````````"````#@!``!``0``4`$``&@!``!P`0``>`$``)`!``"P
+M`0````````````!D```````````````'````.`$``&`!``!H`0``<`$``'@!
+M``"@`0``L`$``````````````````&4```````````````4````X`0``8`$`
+M`&@!``"@`0``L`$`````````````````````````````:0``````````````
+M"````#@!``!@`0``:`$``'`!``!X`0``@`$``*`!``"P`0````````````!J
+M```````````````&````.`$``&`!``!H`0``@`$``*`!``"P`0``````````
+M`````````````````````````````````````````````$`!B`%``0``N`$`
+M`!`!2`-0`0``P@$``#`!$`)``0``S@$```(`4`$!`$`!!`"@``@`P``@`-``
+MN#P``)@\``"J/```N#P``)X\``"X/```N#P``+@\``"D/```N#P``+@\``"X
+M/```N#P``+@\``"X/```N#P``+@\``"X/```N#P``+@\``"X/```N#P``+@\
+M``"X/```N#P``+@\``"X/```N#P``+@\``"X/```N#P``+@\``"P/```BCT`
+M`)$]``"\/0``F#T``+P]``"\/0``O#T``+P]``"?/0``O#T``*8]``"M/0``
+MC!2@%+04R!0``'P5D!6D%;@5S!7@%?05"!8<%C`61!8`````0`$"`,P6``#6
+M%@``````````````````````````````````````````````````8`$Z`$`!
+M``#P%@``,`$``$`!````````,`(``$`!````````,`,``$`!````````,`0`
+M`$`!````````,`4``$`!````````,`8``$`!````````,`H``$`!````````
+M,`L``$`!````````,`P``$`!````````:`!H`$`!````````0`)#`$`!````
+M````0`I#`*``````````0`I#`,``````````0`%!`$`!````````0`I!`*``
+M````````0`I!`,``````````0`!#`$$`2`!*`$L````````````D`9@9`"D1
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````X%4`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````"8``!'````")@````````,F```IHZ$"1"8````
+MX#(]%)@``&L'```<F````````""8`````@("))@```X.```HF````0(""BR8
+M``#\;P,`,)@````````TF```#@X``#B8```'````/)@````!`@!`F`````!C
+MB428``"<%G(32)@``#.V&`!,F```/&&$$E"8``#@N.@-5)@``%E(!P!8F```
+MNKZ`?ER8``!>9CHQ8)@```@=``!DF````,X!`&B8``"009I`<)@```\```!T
+MF```@````'B8```$`````)D````````$F0````````B9````````#)D`````
+M@``0F0```P````";````````!)L``"`````(FP``$`````R;```P````$)L`
+M``@````4FP``*````!B;```H````')L```0````@FP``)````"2;```4````
+M*)L``#0````LFP``#````#";```L````-)L```(````XFP``(@```#R;```2
+M````0)L``#(```!$FP``"@```$B;```J````3)L```$```!0FP``(0```%2;
+M```1````6)L``#$```!<FP``"0```&";```I````9)L```4```!HFP``)0``
+M`&R;```5````<)L``#4```!TFP``#0```'B;```M````?)L```,```"`FP``
+M(P```(2;```3````B)L``#,```",FP``"P```)";```K````E)L```<```"8
+MFP``)P```)R;```7````H)L``#<```"DFP``#P```*B;```O````K)L``"\`
+M``"PFP``+P```+2;```O````N)L``"\```"\FP``+P```,";```O````Q)L`
+M`"\```#(FP``+P```,R;```O````T)L``"\```#4FP``+P```-B;```O````
+MW)L``"\```#@FP``+P```.2;```O````Z)L``"\```#LFP``+P```/";```O
+M````])L``"\```#XFP``+P```/R;```O`````)H``!T````$F@``70````B:
+M``"=````#)H``-T````0F@``'0$``!2:```A````&)H``&$````<F@``H0``
+M`"":``#A````))H``#$````HF@``<0```"R:``"Q````,)H``!P````TF@``
+M7````#B:```I````/)H``&D```!`F@``J0```$2:```@````2)H``!D```!,
+MF@``60```%":``"9````5)H``#````!8F@``!0```%R:```E````8)H``&4`
+M``!DF@``I0```&B:```H````;)H``&@```!PF@``'P```'2:```>````>)H`
+M`!@```!\F@``6````(":``"8````A)H```,```"(F@``!````(R:``!$````
+MD)H``(0```"4F@``$P```)B:```2````G)H``%(```"@F@``D@```*2:``#2
+M````J)H``"L```"LF@``*@```+":``!J````M)H``*H```"XF@``&P```+R:
+M```:````P)H``%H```#$F@``F@```,B:``#:````S)H```8```#0F@``!@``
+M`-2:```&````V)H```8```#<F@``!@```.":```&````Y)H```8```#HF@``
+M!@```.R:```&````\)H```8```#TF@``!@```/B:```&````_)H```8```#4
+MF```(````,R8```$````R)@```8!!@"<F```;0```,"8````````T)@``!0`
+M```)"0```````@(&!@8&!@8"`@````,`!@`)`#P`````````````````````
+M``````````````````````````#P````S`````````````````````KB````
+M(```"@(```$8```!````0!@$````````````````````````````````````
+M````!017&0`I$00`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````-R(````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````!L"8\)M`D`````````````````
+M```````````````````````@````(````$````!````````&````!@````8`
+M,````!4````5````'0```!4```!`$```#_PO``_\+P`?_"\`#_PO`$00```/
+M_"\`#_PO`!_\+P`/_"\`2!````_\+P`/_"\`'_PO``_\+P!,$```#_PO``_\
+M+P`?_"\`#_PO`%`0```/_"\`#_PO`!_\+P`/_"\`5!````_\+P`/_"\`'_PO
+M``_\+P!8$```#_PO``_\+P`?_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`
+M8!````_\+P`/_"\`'_PO``_\+P!D$```#_PO``_\+P`?_"\`#_PO`'`0``!H
+M`0``X`$``+@!``!H`0``,!```#`"``#@`0``L````#`"``"P$```F`T``(`1
+M``!('P``F`T``/`0``#@H```:$`!`(!8``#@H```%(`````$``0`"``(`#``
+M(``$``0<@```IX^-#L^/C0Z5CV`!IX^-#@28`````````P``````````````
+M()@````"`@(``@("``(!`@`"`@(DF```#@X```X.```'!P``#@X``"B8```!
+M``(*`0`""@```04!``(*-)@```X.```.#@``#@X```X.```XF```!P````<`
+M```+````"P```$28``"<%G(3I19R$Z@6<A.<%G(32)@``&>Z&`!GNA@`:;H8
+M`&FZ&`!0F```X+0H#."T*`S@M"@,X+0H#%B8```N#8!^+@V`?BX-P'XN#8!^
+M7)@``%Y=-S%>73<Q7ETZ,5Y=-S%@F```$+T``!"]```XO0``$+T``&28````
+MS@$``,X!``#.`0``S@$`%)D``!`G```0)P``?!4``!`G```8F0``D`$``)`!
+M``"$````D`$``$29```@$.!O(!#@;R`)X&\@$.!O@*$``/\4_P7_%/\%_Q3_
+M!?\9_P74F```$````!0````0````$``````````,`````````"@```"<G(2$
+M+````'Q\?'PT````!0```$``````````1`````@```!(````"````$P````0
+M````4`````````!4````'P`````(````````!`@````````("`````````P(
+M````````$`@````````4"````````!@(````````'`@````````@"```````
+M`"0(````````,!(````````$@`````````B`````````#(`````````8@```
+M`````"2`````````*(```#`````L@```__\'`#"```#___\!-(```#$````X
+M@````````#R`````````0(````````!$@````@```$B`````````5(``````
+M``!8@`````````B8````````#)@``).0A"T0F````.`R?128``!K#P``')@`
+M```````LF```_F\"`#"8````````/)@````!`@!`F```>@%J($R8```\8802
+M5)@``%D(``!HF```D$&:0&R8``"!L`P%<)@```\```!TF```@````'B8```,
+M`````)D````````$F0````````B9````````#)D`````@``0F0```0```!R9
+M```J"0``()D````````DF0``!8H%`"B9```!````+)D````````PF0``````
+M`#29````````.)D````````\F0``/P```$"9```$````2)D```````!,F0``
+M`````%"9````````5)D``$SQ4%U8F0``&````%R9``".:DL`A*$``/\%_P:(
+MH0``_P?_!XRA``#_"/\(D*$``/\)_PF4H0``_PK_"IBA``#_"_\+G*$``/\,
+M_PR@H0``_PW_#:2A``#_#O\/J*$``/\2_Q*LH0``_Q/_%+"A``#_%?\6M*$`
+M`/\7_QFXH0``_QK_&[RA``#_'?\>P*$``/\@_R/$H0``_R7_)\BA``#_*?\L
+MS*$``/\O_S'0H0``_S3_-]2A``#_.O\ZV*$``/\Z_SK<H0``_SK_.N"A``#_
+M.O\ZY*$``/\Z_SKHH0``_SK_.NRA``#_.O\Z\*$``/\Z_SKTH0``_SK_.OBA
+M``#_.O\Z_*$``/\Z_SH`FP````````2;```@````")L``!`````,FP``,```
+M`!";```(````%)L``"@````8FP``!````!R;```D````()L``!0````DFP``
+M-````"B;```,````+)L``"P````PFP```@```#2;```B````.)L``!(````\
+MFP``,@```$";```*````1)L``"H```!(FP``!@```$R;```F````4)L``!8`
+M``!4FP``-@```%B;```.````7)L``"X```!@FP```0```&2;```A````:)L`
+M`!$```!LFP``,0```'";```)````=)L``"D```!XFP``!0```'R;```E````
+M@)L``!4```"$FP``-0```(B;```-````C)L``"T```"0FP```P```)2;```C
+M````F)L``!,```"<FP``,P```*";```+````I)L``"L```"HFP``*P```*R;
+M```K````L)L``"L```"TFP``*P```+B;```K````O)L``"L```#`FP``*P``
+M`,2;```K````R)L``"L```#,FP``*P```-";```K````U)L``"L```#8FP``
+M*P```-R;```K````X)L``"L```#DFP``*P```.B;```K````[)L``"L```#P
+MFP``*P```/2;```K````^)L```(```#\FP``%@```-28```@````V)@``&@0
+M8`````````````":``"I`0````````2:``#I`0``0`````B:```I````@```
+M``R:``!I````4`$``!":``"9`0``D`$``!2:``#9`0``T`$``!B:```9````
+M$````!R:``!9````1````"":``"9````A````"2:``"E`0``2`$``"B:``#E
+M`0``B`$``"R:```E````R`$``#":``#(`0``%````#2:```(````0@```#B:
+M``!(````@@```#R:``"(````>`$``$":``"8`0``N`$``$2:``#8`0``^`$`
+M`$B:```8````$@```$R:``!8````4@```%":``"8````D@```%2:``"D`0``
+M?`$``%B:``#D`0``O`$``%R:```D````_`$``&":``!D````"@```&2:``"D
+M````2@```&B:``#D````B@```&R:```*`0``6@$``'":``!*`0``F@$``'2:
+M``"*`0``V@$``'B:``#*`0``#@```'R:```*````3@```(":``!*````C@``
+M`(2:``"*````7@$``(B:``"Z`0``G@$``(R:``#Z`0``W@$``)":```Z````
+M"0```)2:``!Z````20```)B:``"&`0``B0```)R:``#&`0``>0$``*":```&
+M````N0$``*2:``!&````^0$``*B:``"&````.0```*R:``#&````>0```+":
+M``#&````N0```+2:``#&````O0$``+B:``#&````_0$``+R:``#&````/0``
+M`,":``#&````?0```,2:``#&````O0```,B:``#&````_0```,R:``#&````
+M_0```-":``#&````_0```-2:``#&````_0```-B:``#&````_0```-R:``#&
+M````_0```.":``#&````_0```.2:``#&````_0```.B:``#&````_0```.R:
+M``#&````_0```/":``#&````_0```/2:``#&````_0```/B:``#&````_0``
+M`/R:``#&````_0````$```!&````8`````$```!&````80````$```!&````
+M8@````$```!&````8P````$```!&````9`````$```!&````90````$```!&
+M````9@````$```!&````9P````$```!&````:`````$```!&````:0````$`
+M``!&````:@````$```!&````:P````$```!&````;`````$```!&````=```
+M``$```!&````=`````$```!&````=`````$```!&````=`````$```!&````
+M=`````$```!&````=`````$```!&````=`````$```!&````=`````$```!&
+M````=0````$```!&````=@````$```!&````=P````$```!&````>`````$`
+M``!&````>0````$```!&````>@````$```!&````>P````$```!&````?```
+M``$```!&````?0````$```!&````?@````$```!&````?P````$```!&````
+M@`````$```!$````?`````$```!&````B`````$```!&````C`````$```!&
+M````D`````$```!&````E`````$```!&````F`````$```!&````G`````$`
+M``!&````H`````$```!&````I`````$```!&````J`````$```!&````K```
+M``$```!&````L`````$```!&````M``````"!P````,`!@`)`#P```!CNP``
+M8[L``(V[``"-NP``M[L``+>[``#ANP``X;L`````````````"0````0````$
+M``$``0`!``8```!&1S@`````````````````!`````$``0`$````1D<W````
+M``````````````,``0`!``$``P```$9'-@`````````````````$```````!
+M``$```!&1S4`````````````````!``!``$`````````1D<T````````````
+M``````0````!````_O___T9',P`````````````````#``$``0```/W___]&
+M1S(`````````````````!`````````#\____1D<Q``````````````````(`
+M`0`!````^O___T9',```````````````````````````````````````````
+M````````````%!!4&0`I$00`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!L"8\)M`D("6P)M`G)
+M____R?___\G____)____PO____+____R____\O____+____T____P/___\#_
+M___`____P/___[K___^R____LO___[+___^R____L/___RWB``#FX0``\^$`
+M`&SB```,X@``7^(````````````````````````@````(````$````!`````
+M```&````!@````8`?.\``-#N```.[P``'>\``"3O```S[P``?.\``'SO``!\
+M[P``?.\``'SO``!\[P``?.\``'SO``!\[P``?.\``%KO````````````````
+M````````````````````````0!````_\+P`/_"\`'_PO``_\+P`/_"\`1!``
+M``_\+P`/_"\`'_PO``_\+P`/_"\`2!````_\+P`/_"\`'_PO``_\+P`/_"\`
+M3!````_\+P`/_"\`'_PO``_\+P`/_"\`4!````_\+P`/_"\`'_PO``_\+P`/
+M_"\`5!````_\+P`/_"\`'_PO``_\+P`/_"\`6!````_\+P`/_"\`'_PO``_\
+M+P`/_"\`7!````_\+P`/_"\`'_PO``_\+P`/_"\`8!````_\+P`/_"\`'_PO
+M``_\+P`/_"\`9!````_\+P`/_"\`'_PO``_\+P`/_"\`,!```#`"``#@`0``
+ML````&`!``#@`0``<!```&@!``#@`0``N`$``(P!``#@`0``L!```&`.``"`
+M$0``'!\``#@^``"`$0``\!```."@``!H0`$`@%@``."P``!H0`$`%(```.@#
+MZ`/@!N`&(`0@!$`(0`C@!N`&!)@````````#```````````````#````()@`
+M```"`@(``@("``(!`@`"`@(``@("))@```X.```.#@``!P<```X.```.#@``
+M1)@``!P6<A,E''(3*!=R$Z(6<A,E''(38)@``!"=```0G0``&)T``!B=```0
+MG0``9)@```#.`0``S@$``,X!``#.`0``S@$`:)@``)!!FD"009I`D$&:0)!!
+MFD"009I`&)D``+@!``"X`0``A`````@!``"X`0``))D```6*!1`%B@40!8H%
+M$`6*!1`%B@40,*(```````````````````@!```````````````````,````
+M`````#0````%````0`````````!$````"````$@````(````3````!````!0
+M`````````%0````?``````@````````$"`````````@(````````#`@`````
+M```0"````````!0(````````&`@````````<"````````"`(````````)`@`
+M``````!P$@```````#@0````````>!````````"X$````````/@0````````
+M.!$```````!X$0```````+@1````````^!$````````X$@```````'@2````
+M````N!(```````#X$@```````#@3````````>!,```````"X$P```````/@3
+M````````.!0```````!X%````````+@4````````^!0````````X%0``````
+M`'@5````````N!4```````#X%0```````#@6````````>!8```````"X%@``
+M`````/@6````````.!<```````!X%P```````+@7````````^!<````````\
+M$````````'P0````````O!````````#\$````````#P1````````?!$`````
+M``"\$0```````/P1````````/!(```````!\$@```````+P2````````_!(`
+M```````\$P```````'P3````````O!,```````#\$P```````#P4````````
+M?!0````````$@`````````B`````````#(`````````8@````````""`````
+M````)(`````````H@```,````"R```#__P<`,(```/___P$T@```,0```#B`
+M````````/(````````!(@````````%2`````````6(````````!<@```_\?_
+M_\"````:,((JQ(```.`!W`7(@```$"=`'\R``````/0!T(```!P>``#4@```
+MJJH"`-B```!550`"W(````````#@@```_____^2```#__P``Z(````````#L
+M@````````/"`````````](````````#X@````````/R```"(`````(<`````
+M```$AP``C`````B'``#D````#(<``-4"```0AP```````!2'````````&(<`
+M`*`````<AP``R0$``""'```L````)(<``"P````HAP``,````"R'```\````
+M,(<``"P````TAP``+````#B'```P````/(<``#P```!`AP```````$2'````
+M````2(<```````!,AP```````%"'````````5(<```````!8AP```````%R'
+M````````8(<``-4```!DAP``WP```&B'```"`0``;(<``#H!``!PAP``=0``
+M`'2'``!_````>(<``*(```!\AP````````"!```"``$`!($```$````(@0``
+MP`````R!````````$($``&@!```4@0```````,"'`````0(#Q(<```0%!@?(
+MAP``"`D*"\R'```,#0X/T(<``!`1$A/4AP``%!46%]B'```8&1H;W(<``!P=
+M'A_@AP````$"`^2'```$!08'Z(<```@)"@OLAP``#`T.#_"'```0$1(3](<`
+M`!05%A?XAP``&!D:&_R'```<'1X?")@````````,F```&8Z$K1"8````X"A]
+M%)@``&N?"IP<F````````$"8``!Z`6H@5)@``%D(````F0````````29````
+M````")D````````,F0````"``!"9```!````')D``(`,```@F0`````0!2B9
+M```!````+)D```0````TF0``(B`?'CB9```-#`L*/)D``#\```!(F0``$K*`
+MDE29``"(X5!=6)D``/\```!<F0``CFI+`&B9``#.`P``<)D``!6U+QEXF0``
+M`0```'R9````````$*(``#-C@``4H@``$&P0`!BB``!@0)P`(*(``,8PB`$D
+MH@````0``"RB````````-*(``"`@("`XH@``("`@($"B```@"DDX1*(``+9[
+M``!(H@``_#__#P";````````*)L```P````XFP``$@```&2;```A````C)L`
+M`"T```"<FP``,P```````P`&``D`/```````````````````````````````
+M```````````)````!`````0``0`!``$````````````&````1D<X````````
+M``````````0````!``$````````````$````1D<W``````````````````,`
+M`0`!``$````````````#````1D<V``````````````````0```````$`````
+M```````!````1D<U``````````````````0``0`!````````````````````
+M1D<T``````````````````0````!``````````````#^____1D<S````````
+M``````````,``0`!``````````````#]____1D<R``````````````````0`
+M``````````````````#\____1D<Q``````````````````(``0`!````````
+M``````#Z____1D<P````````````````````````````````````````````
+M```````````````````````````````````````````(`````0````,`````
+M```````````````&````1D<W``````````````````(`````````````````
+M````````1D<V``````````````````$```````````````````#]____1D<U
+M``````````````````````````````````````#Z____1D<T````````````
+M`````````0`!``````````````#X____1D<S`````````````````````0`!
+M`````0`!``````#V____1D<R`````````````````````0````$``0`!````
+M``#S____1D<Q`````````````````````0````$``0````$```#P____1D<P
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````(````$
+M````!@````@````*````#`````X````0````8"\!`%HK`0!$+`$`^RT!`&4N
+M`0#H+@$`87(U,C$R06YI4&]L;```````````````,````!6````5@```%8``
+M`!6````5@```'(```*>/C1+/#X@)E0_@!*L/X!+/#X@)*)@```$``@H!``(*
+M``$!!0$``@H!``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'
+M````"P````L````+````2)@``%K:&`!:VA@`:<H8`&G*&`!IRA@`4)@``."T
+MZ`W@M.@-X+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+DWH?BY-Z'XN#8!^7)@`
+M`%YF-S%>9C<Q7F8W,5YF-S%>83<Q;)@``(&P#`6!L`P%@;`,!8"P#`6`L`P%
+M%)D``!`G```0)P``?!4``/@J```0)P``1)D``"`0N/<@$+CW(`VX]R`0N/<@
+M$+CW#*(``&I!+&1J02QD:D%`9&I!0&1J04!D'*(```J`@Q@*@(,8"H!S&`J`
+M@Q@*@(,8`````````````````````#`2````````+)@``/XO`@`\F`````$"
+M`$R8```\8802,)D``(-(``!`F0``!````'29````````^)D``!@````$H@``
+M``````BB``"(9S[0**(``+4!```\H@``KXG($P2;```@````")L``!`````,
+MFP``,````!";```(````%)L``"@````8FP``!````!R;```D````()L``!0`
+M```DFP``-````"R;```L````,)L```(````TFP``(@```#R;```R````0)L`
+M``H```!$FP``*@```$B;```&````3)L``"8```!0FP``%@```%2;```V````
+M6)L```X```!<FP``+@```&";```!````:)L``!$```!LFP``,0```'";```)
+M````=)L``"D```!XFP``!0```'R;```E````@)L``!4```"$FP``-0```(B;
+M```-````D)L```,```"4FP``(P```)B;```3````H)L```L```"DFP``*P``
+M`*B;```K````K)L``"L```"PFP``*P```+2;```K````N)L``"L```"\FP``
+M*P```,";```K````Q)L``"L```#(FP``*P```,R;```K````T)L``"L```#4
+MFP``*P```-B;```K````W)L``"L```#@FP``*P```.2;```K````Z)L``"L`
+M``#LFP``*P```/";```K````])L``"L```#XFP```@```/R;```6````````
+M`````````````````)R8`````````````````````````````)R8````````
+M`````````````````````)R8`````````````````````````````)R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8`````````````````````````````)R8````````````````````````
+M`````)R8`````````````````````````````)R8````````````````````
+M`````````)R8`````#@````X````.````#@````X`)R8````````````````
+M`````````````)R8`````````````````````````````)R8````````````
+M`,````"`````@````)R8``#Y``0`^0`$`/\`!`#]``0`_0`$`-28````````
+M``````0````$````!````````````````)H``*D!````````!)H``.D!``!`
+M````")H``"D```"`````#)H``&D```!0`0``$)H``)D!``"0`0``%)H``-D!
+M``#0`0``&)H``!D````0````')H``%D```!$````()H``)D```"$````))H`
+M`*4!``!(`0``*)H``.4!``"(`0``+)H``"4```#(`0``,)H``,@!```4````
+M-)H```@```!"````.)H``$@```""````/)H``(@```!X`0``0)H``)@!``"X
+M`0``1)H``-@!``#X`0``2)H``!@````2````3)H``%@```!2````4)H``)@`
+M``"2````5)H``*0!``!\`0``6)H``.0!``"\`0``7)H``"0```#\`0``8)H`
+M`&0````*````9)H``*0```!*````:)H``.0```"*````;)H```H!``!:`0``
+M<)H``$H!``":`0``=)H``(H!``#:`0``>)H``,H!```.````?)H```H```!.
+M````@)H``$H```".````A)H``(H```!>`0``B)H``+H!``">`0``C)H``/H!
+M``#>`0``D)H``#H````)````E)H``'H```!)````F)H``(8!``")````G)H`
+M`,8!``!Y`0``H)H```8```"Y`0``I)H``$8```#Y`0``J)H``(8````Y````
+MK)H``,8```!Y````L)H``,8```"Y````M)H``,8```"]`0``N)H``,8```#]
+M`0``O)H``,8````]````P)H``,8```!]````Q)H``,8```"]````R)H``,8`
+M``#]````S)H``,8```#]````T)H``,8```#]````U)H``,8```#]````V)H`
+M`,8```#]````W)H``,8```#]````X)H``,8```#]````Y)H``,8```#]````
+MZ)H``,8```#]````[)H``,8```#]````\)H``,8```#]````])H``,8```#]
+M````^)H``,8```#]````_)H``,8```#]````U)@``"````#4F```$````!0`
+M```0````$````!0```#8F```:!!@`&@08`!H$&``:!!@`&@08```````````
+M`)R8`````````````````````````````)R8````````````````````````
+M`````)R8`````````````````````````````)R8````````````````````
+M`````````)R8`````````````````````````````)R8```````0````$```
+M`!`````0````$)R8```````$````!`````0````$````!)R8````````````
+M`````````````````)R8`````````````````````````````)R8````````
+M`````````````````````)R8``````````````````H``````````)R8``#`
+M`#@`@``X`,``.`+``#@`P``X`)R8```&``(`!@`"``8````&``(`!@`"`)R8
+M``")````B0```(D```")````B0```)R8``"@````H````*````"@````H```
+M`)R8```'``0`!P`$``<`!``'``0`!P`$`-28```:````&@```!H````:````
+M&@``````````````G)@``$````!(````0````$````!`````G)@``!`````0
+M````$````!`````0````G)@```@````(````"`````@````(````G)@``$\`
+M``!/````3P```$\```!/````G)@``/$```#Q````80```/$```#Q````G)@`
+M`$^0``!/D```3)```$^0``!/D```G)@``%H2``!:$@``FA(``%H2``!:$@``
+MS)@```X````.````#P````X````.`````0```$8```!@`````0```$8```!A
+M`````0```$8```!B`````0```$8```!C`````0```$8```!D`````0```$8`
+M``!E`````0```$8```!F`````0```$8```!G`````0```$8```!H`````0``
+M`$8```!I`````0```$8```!J`````0```$8```!K`````0```$8```!L````
+M`0```$8```!T`````0```$8```!T`````0```$8```!T`````0```$8```!T
+M`````0```$8```!T`````0```$8```!T`````0```$8```!T`````0```$8`
+M``!T`````0```$8```!U`````0```$8```!V`````0```$8```!W`````0``
+M`$8```!X`````0```$8```!Y`````0```$8```!Z`````0```$8```![````
+M`0```$8```!\`````0```$8```!]`````0```$8```!^`````0```$8```!_
+M`````0```$8```"``````0```$0```!\`````0```$8```"(`````0```$8`
+M``",`````0```$8```"0`````0```$8```"4`````0```$8```"8`````0``
+M`$8```"<`````0```$8```"@`````0```$8```"D`````0```$8```"H````
+M`0```$8```"L`````0```$8```"P`````0```$8```"T````E3H!`'@Z`0!\
+M.@$`@#H!`)`Z`0"0.@$`A#H!`(@Z`0``````````````````````````````
+M```P````%8```!6````5@```%8```!6````<@```IY.-$L\3B`F5$^`$JQ/@
+M$L\3B`DHF````0`""@$``@H``0(%`0`""@$``@HTF```#@X```X.```.#@``
+M#@X```X.```XF```!P````<````+````"P````L```!(F```;=H8`&W:&`!U
+MRA@`=<H8`'7*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"TZ`U8F```+@V`?BX-
+M@'XN#>A^+@WH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W,5YF-S%LF```@;`,
+M!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```F`@``-`'``!$F0``
+M(!"X]R`0N/<0#;CW$!"X]Q`0N/<$H@`````````````(````"`````@````(
+MH@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L9$`!+&1@P4)D8,%"9&#!
+M0F0<H@``"H"#&`J`@Q@*@',8"H"#&`J`@Q@P$@```````"R8``#^+P(`/)@`
+M```!`@!,F```/&&$$C"9``""2```0)D```0```!TF0```````"BB``"U`0``
+M/*(``*^)R!,$FP```0````B;```"````#)L```,````0FP``!````!2;```%
+M````&)L```@````<FP``"0```"";```*````))L```L````LFP``#0```#";
+M```0````-)L``!$````\FP``$P```$";```4````1)L``!4```!(FP``&```
+M`$R;```9````4)L``!H```!4FP``&P```%B;```<````7)L``!T```!@FP``
+M(````&B;```B````;)L``",```!PFP``)````'2;```E````>)L``"@```!\
+MFP``*0```(";```J````A)L``"L```"(FP``+````)";```P````E)L``#$`
+M``"8FP``,@```*";```T````I)L``#4```"HFP``-0```*R;```U````L)L`
+M`#4```"TFP``-0```+B;```U````O)L``#4```#`FP``-0```,2;```U````
+MR)L``#4```#,FP``-0```-";```U````U)L``#4```#8FP``-0```-R;```U
+M````X)L``#4```#DFP``-0```.B;```U````[)L``#4```#PFP``-0```/2;
+M```U````^)L``!````#\FP``&@```````````````)H```<````'````!)H`
+M`$<```!'````")H``(<```"'````#)H``*`!``"@`0``$)H``.`!``#@`0``
+M%)H``"`````@````&)H``&````!@````')H``*$!``"A`0``()H``.$!``#A
+M`0``))H``"$````A````*)H``&$```!A````+)H``&(!``!B`0``,)H``*(!
+M``"B`0``-)H``.(!``#B`0``.)H``"(````B````/)H``&(```!B````0)H`
+M`&,!``!C`0``1)H``*,!``"C`0``2)H``.,!``#C`0``3)H``",````C````
+M4)H``&,```!C````5)H``(0!``"$`0``6)H``,0!``#$`0``7)H```0````$
+M````8)H``.H!```+````9)H``"H```!+````:)H``&H```"+````;)H``*H`
+M``"L`0``<)H``*L!``#L`0``=)H``.L!```L````>)H``"L````2````?)H`
+M`&L```!2````@)H``*L```"2````A)H``*P!``"3`0``B)H``.P!``#3`0``
+MC)H``"P````3````D)H``#H```!3````E)H``'H```"3````F)H``+H```"4
+M`0``G)H``+L!``#4`0``H)H``/L!```4````I)H``#L````Z````J)H``'L`
+M``!Z````K)H``+L```"Z````L)H``+P!``"[`0``M)H``/P!``#[`0``N)H`
+M`#P````[````O)H``'P```![````P)H``+P```"[````Q)H``/P```"\`0``
+MR)H``/P```#\`0``S)H``/P````\````T)H``/P```!\````U)H``/P```"\
+M````V)H``/P```#\````W)H``/P```#\````X)H``/P```#\````Y)H``/P`
+M``#\````Z)H``/P```#\````[)H``/P```#\````\)H``/P```#\````])H`
+M`/P```#\````^)H``/P```#\````_)H``/P```#\````U)@``"````#0F```
+M"`0&`P@$!P,(!`8#"`0&`P@$!P/<F```P,"@`,#`H`#`P.``P,#@`,#`X```
+M`````````)R8```````/````#P````\````/````#YR8````````````````
+M`````````````)R8`````(````"`````@````(````"``)R8`````"H````J
+M````*@```"H````J`)R8``````$````!`````0````$````!`)R8````````
+M`````````````````````)R8`````!@````8````&````!@````8`)R8````
+M`&````!@````;@```&X```!N`)R8`````,<```#'````QP```,<```#'`)R8
+M`````$L```!+````2P```$L```!+`)R8`````$@$``!(!```2`0``$@$``!(
+M!)R8`````$P```!,````3````$P```!,`)R8`````.0```#D````Y````.0`
+M``#D`)R8`````````````````````````````)R8`````/P```#\````_```
+M`/P```#\`)R8`````/\```#_````_P```/\```#_`)R8`````#\$```_!```
+M/P0``#\$```_!)R8``````P````,````#`````P````,`)R8`````!D"```9
+M`@``&0(``!D"```9`IR8`````"0````D````)````"0````D`)R8`````+0`
+M``"T````M````+0```"T`)R8`````)D```"9````F0```)D```"9`)R8````
+M`%````!0````4````%````!0`)R8`````"H````J````*@```"H````J`)R8
+M`````!(````2````$@```!(````2`)R8`````#+````RP```,L```#+````R
+MP)R8`````'0!``!T`0``=`$``'0!``!T`9R8`````!$````1````$0```!$`
+M```1`)R8`````"B&```HA@``*(8``"B&```HAIR8`````(0Q``"$,0``A#$`
+M`(0Q``"$,9R8``"``/(`@`#R`(``\@"``/(`@`#R`)R8```9`"<`&0`G`!D`
+M)P`9`"<`&0`G`)R8```#`````P````,````#`````P```)R8````````````
+M`````````````````)R8``"R````L@```+(```"R````L@```)R8``"$(+``
+MA""P`(0@L`"$(+``A""P`)R8``"D)4$`I"5!`*0E00"D)4$`I"5!`)R8```@
+MDA$`()(1`""2$0`@DA$`()(1`)R8````2!H``$@:``!(&@``2!H``$@:`-B8
+M```P`@L`,`(+`#`""P`P`@L`,`(+`)R8``"4````E````)0```"4````E```
+M`)R8``"1````D0```)$```"1````D0```)R8```2````$@```!(````2````
+M$@```)R8``"`````@````(````"`````@````)R8``#9````V0```-D```#9
+M````V0```)R8``!@````8````&````!@````8````)R8``#P````\````/``
+M``#P````\````)R8``"B````H@```*(```"B````H@```)R8``!2````4@``
+M`%(```!2````4@```)R8``#4````U````-0```#4````U````)R8``#,%```
+MS!0``,P4``#,%```S!0``)R8``",!```C`0``(P$``",!```C`0``,28```#
+M`````P````,````#`````P```.A*`0#M2@$`U$H!`-A*`0#H2@$`Z$H!`-Q*
+M`0#@2@$````````````P````%0```!4````5````%0```!4````<@```IY.-
+M$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H```(%`0`""@$``@HTF```
+M``X````.````#@````X````.```XF````@````(````*````"@````H```!(
+MF```;=H8`&W:&`!D:AH`9&H:`&1J&@!0F```X+3H#>"TZ`W:L.@-VK"8#-JP
+MZ`U8F```+@V`?BX-@'XN#>A^+@W(?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F`Y
+M,5YF-S%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```
+MF`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$H@``````````````
+M```````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L`$`!
+M+`!`P4(`0,%"`$#!0@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@P$@``X`,`
+M`&"````/````&($````````<@0```````""!````````)($````````H@0``
+M`````"R!````````,($````````T@0```````#B!````````/($```````!`
+M@0``J```@$2!````````+)@```"@```\F`````0@`$R8```\(X02<)@``!\`
+M``!TF```@````'B8```.````@)D```````"$F0````"``J"9````````X)D`
+M``````#DF0``JJJJJNB9``!X9$8\[)D``*H```#PF0``#````/29``#_````
+M^)D``!0````HH@``M0D``#RB``"OB<B33*(```$```!0H@```*```%2B````
+M````6*(``(!3QPQ<H@```0\/#V"B```!#VE?9*(``!&*00!HH@```````&RB
+M``!JP3`,<*(``"`(@@!TH@``JGP;`'BB``#..><<?*(``,X!%P4`HP`````!
+M&`2C```")@,P"*,```8^!T@,HP``"DP+5A"C```/8!ID%*,``!MN3W@8HP``
+M6GR/AARC``!;AL^.(*,```^73YTDHP``CZ'/I2BC```?KU^U+*,``)^YW[TP
+MHP``/\=_S32C``"_T?_5.*,````````\HP```````$"C````````1*,`````
+M``!(HP``____/TRC``#___\_4*,``/___S]4HP``__\#`%BC```?JJAY7*,`
+M``]";`9@HP``!R(H#V2C``"%%F`7:*,```01@!]LHP```PR@-W"C``"#",0_
+M=*,```,(P%=XHP``@@;87WRC``""!.!_@*,``+I[/'^$HP``\'\P\P2;```!
+M````")L```(````,FP```P```!";```$````%)L```4````8FP``"````!R;
+M```)````()L```H````DFP``"P```"R;```-````,)L``!`````TFP``$0``
+M`#R;```3````0)L``!0```!$FP``%0```$B;```8````3)L``!D```!0FP``
+M&@```%2;```;````6)L``!P```!<FP``'0```&";```@````:)L``"(```!L
+MFP``(P```'";```D````=)L``"4```!XFP``*````'R;```I````@)L``"H`
+M``"$FP``*P```(B;```L````D)L``#````"4FP``,0```)B;```R````H)L`
+M`#0```"DFP``-0```*B;```U````K)L``#4```"PFP``-0```+2;```U````
+MN)L``#4```"\FP``-0```,";```U````Q)L``#4```#(FP``-0```,R;```U
+M````T)L``#4```#4FP``-0```-B;```U````W)L``#4```#@FP``-0```.2;
+M```U````Z)L``#4```#LFP``-0```/";```U````])L``#4```#XFP``$```
+M`/R;```:`````````````````````````````````````)H`````````````
+M!)H```````!`````")H```````"`````#)H```````"!`0``$)H```````#!
+M`0``%)H````````!````&)H```````!!````')H```````"!````()H`````
+M``!H`0``))H```````"H`0``*)H```````#H`0``+)H````````H````,)H`
+M``````!H````-)H```````")`0``.)H```````#)`0``/)H````````)````
+M0)H```````!)````1)H```````")````2)H```````"0`0``3)H```````#0
+M`0``4)H````````0````5)H```````!0````6)H```````"0````7)H`````
+M``"1`0``8)H```````#1`0``9)H````````1````:)H```````!1````;)H`
+M``````"1````<)H```````!X`0``=)H```````"X`0``>)H```````#X`0``
+M?)H````````X````@)H```````!X````A)H```````"9`0``B)H```````#9
+M`0``C)H````````9````D)H```````!9````E)H```````"9````F)H`````
+M``#9````G)H```````#Y````H)H```````#Y````I)H```````#Y````J)H`
+M``````#Y````K)H```````#Y````L)H```````#Y````M)H```````#Y````
+MN)H```````#Y````O)H```````#Y````P)H```````#Y````Q)H```````#Y
+M````R)H```````#Y````S)H```````#Y````T)H```````#Y````U)H`````
+M``#Y````V)H```````#Y````W)H```````#Y````X)H```````#Y````Y)H`
+M``````#Y````Z)H```````#Y````[)H```````#Y````\)H```````#Y````
+M])H```````#Y````^)H```````#Y````_)H```````#Y````U)@``"````#0
+MF```"!0``@@4`0((%``""!0``@@4`0+<F```P""@`,`@H`#`(.``P"#@`,`@
+MX````````````)R8``````#P````\````/````#P````\)R8````````````
+M`````````````````)R8```````#`````P````,````#`````YR8````````
+M`````````````````````)R8`````````````````````````````)R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````````````````````````````)R8`````$!```!`0```0$```$!```!`
+M0)R8``````5E```%90``!64```5E```%99R8````````````````````````
+M`````)R8`````````````````````````````)R8`````$(```!"````0@``
+M`$(```!"`)R8`````+4```"U````M0```+4```"U`)R8``````,````#````
+M`P````,````#`)R8`````/<```#W````]P```/<```#W`)R8`````)T```"=
+M````G0```)T```"=`)R8`````"(````B````(@```"(````B`)R8`````"($
+M```B!```(@0``"($```B!)R8```8`",`&``C`!@`(P`8`",`&``C`)R8````
+M`"@````H`&``*`!@`"@`8``H`)R8``#``%``P`!0`,,`4`##`%``PP!0`)R8
+M``!_``0`?P`$`'\`!`!_``0`?P`$`)R8``!8!```6`0``%@$``!8!```6`0`
+M`)R8`````````````````````````````)R8````P````,````#`````P```
+M`,```-B8```P`D``,`)``#`"0``P`D``,`)`````````````````````````
+M`````````)R8````9````&0```!D````9````&0``)R8````"`````@````(
+M````"`````@``,R8```.````#@````X````.````#@```/1B`0#Y8@$`Y&(!
+M`.AB`0#T8@$`]&(!`.QB`0#P8@$`05(U,C$P`$%2-3(Q,0!!4C4R,3(`4D8U
+M,3$Q`%)&-3$Q,@!21C(T,3,`071H97)O<R`R,S$S(%=I4V]#`$%T:&5R;W,@
+M-3(Q,B`H1E!'02D`071H97)O<R`U,C$Q("A&4$=!*0!!=&AE<F]S(#4R,3``
+M071H97)O<R`U,C$Q`$%T:&5R;W,@-3,Q,B!7:5-O0P!!=&AE<F]S(#4R,3(`
+M1$(`1$5"54<`3D$`3D]?0T]53E1265]3150`04P`04Q"04Y)00!$6@!!3$=%
+M4DE!`$%2`$%21T5.5$E.00!!30!!4DU%3DE!`$%5`$%54U1204Q)00!!5`!!
+M55-44DE!`$%:`$%:15)"04E*04X`0D@`0D%(4D%)3@!"60!"14Q!4E53`$)%
+M`$)%3$=)54T`0EH`0D5,25I%`$)/`$)/3%9)00!"4@!"4D%:24P`0DX`0E)5
+M3D5)($1!4E534T%,04T`0D<`0E5,1T%224$`0T$`0T%.041!`$-,`$-(24Q%
+M`$-.`$-(24Y!`$-/`$-/3$]-0DE!`$-2`$-/4U1!(%))0T$`2%(`0U)/051)
+M00!#60!#65!255,`0UH`0UI%0T@@4D5054),24,`1$L`1$5.34%22P!$3P!$
+M3TU)3DE#04X@4D5054),24,`14,`14-5041/4@!%1P!%1UE05`!35@!%3"!3
+M04Q6041/4@!%10!%4U1/3DE!`$9)`$9)3DQ!3D0`1E(`1E)!3D-%`$8R`$92
+M04Y#15]215,`1T4`1T5/4D=)00!$10!'15)-04Y9`$=2`$=2145#10!'5`!'
+M54%414U!3$$`2$X`2$].1%5205,`2$L`2$].1R!+3TY'`$A5`$A53D=!4ED`
+M25,`24-%3$%.1`!)3@!)3D1)00!)1`!)3D1/3D5324$`25(`25)!3@!)10!)
+M4D5,04Y$`$E,`$E34D%%3`!)5`!)5$%,60!*4`!*05!!3@!*,0!*05!!3C$`
+M2C(`2D%004XR`$HS`$I!4$%.,P!*-`!*05!!3C0`2C4`2D%004XU`$I/`$I/
+M4D1!3@!+6@!+05I!2TA35$%.`$M0`$Y/4E1(($M/4D5!`$M2`$M/4D5!(%)%
+M4%5"3$E#`$LR`$M/4D5!(%)%4%5"3$E#,@!+5P!+55=!250`3%8`3$%45DE!
+M`$Q"`$Q%0D%.3TX`3$D`3$E%0TA414Y35$5)3@!,5`!,251(54%.24$`3%4`
+M3%5814U"3U521P!-3P!-04-!50!-2P!-04-%1$].24$`35D`34%,05E324$`
+M35@`345824-/`$U#`$U/3D%#3P!-00!-3U)/0T-/`$Y,`$Y%5$A%4DQ!3D13
+M`$Y:`$Y%5R!:14%,04Y$`$Y/`$Y/4E=!60!/30!/34%.`%!+`%!!2TE35$%.
+M`%!!`%!!3D%-00!010!015)5`%!(`%!(24Q)4%!)3D53`%!,`%!/3$%.1`!0
+M5`!03U)454=!3`!04@!054525$\@4DE#3P!100!1051!4@!23P!23TU!3DE!
+M`%)5`%)54U-)00!300!3055$22!!4D%"24$`4T<`4TE.1T%03U)%`%-+`%-,
+M3U9!2R!215!50DQ)0P!320!33$]614Y)00!:00!33U542"!!1E))0T$`15,`
+M4U!!24X`4T4`4U=%1$5.`$-(`%-7251:15),04Y$`%-9`%-94DE!`%17`%1!
+M25=!3@!42`!42$%)3$%.1`!45`!44DE.241!1"`F(%1/0D%'3P!43@!454Y)
+M4TE!`%12`%154DM%60!500!52U)!24Y%`$%%`%5.251%1"!!4D%"($5-25)!
+M5$53`$="`%5.251%1"!+24Y'1$]-`%53`%5.251%1"!35$%415,`55D`55)5
+M1U5!60!56@!56D)%2TE35$%.`%9%`%9%3D5:545,00!63@!62454($Y!30!9
+M10!914U%3@!:5P!:24U"04)710`E<SH@<&AY0VYT,2`P>"5X+"!R97-E='1I
+M;F<@8V]U;G1E<B!V86QU92!T;R`P>"5X"@``)7,Z('!H>4-N=#(@,'@E>"P@
+M<F5S971T:6YG(&-O=6YT97(@=F%L=64@=&\@,'@E>`H````````P+CDN,30N
+M.0``````````!P````X````5````'````",`````````````````````````
+M````````````````)!.($Q$`B!/L$Q$`'A2"%`\`@A3F%!(`7A5=%A0`71;!
+M%A0`P1;:%A<`C!2@%+04R!0\%%`49!1X%```,A1&%%H4;A0``&P)A0F>"8H)
+MJ`D``&P)A0F>"8H)``!L"84)G@F*"0``;`F%"9X)B@D``'$6A1:9%JT6P18`
+M`%H4@A2J%```@!:H%@``?!60%:05N!7,%>`5]!4(%AP6,!9$%@``<0EV"7L)
+M@`F/"90)F0FC"0``<0EV"7L)@`F/"90)F0D``'$)=@E["8`)CPF4"9D)``!Q
+M"78)>PF`"8\)E`F9"0``M`D``(4)```\%%`49!1X%``````!````:@````$`
+M``!\````!````(8````$````D@````0```"<````!````*8````!````L```
+M``(```"\`````@```,0````!````R@````0```#B````!````/0````$````
+M!`$```0````4`0``!````"0!```@````*`$``#(41A1:%&X4``!:%((4JA2`
+M%J@6``!\%9`5I!6X%<P5X!7T%0@6'!8P%D06````````````````````````
+M`````````````&````"H"0```0```*,)```!````M`D```$```!G````J`D`
+M``$```"C"0```0```+0)```!````80```*@)```!````HPD```$```"T"0``
+M`0```&4```"H"0```0```*,)```!````M`D```$```!*````J`D```````"C
+M"0```````+0)```!````2P```*@)```!````HPD```$```"T"0```0```&H`
+M``"H"0```0```*,)```!````M`D```$`````````````````````````````
+M````````````"```````````````````````````````````````````````
+M`0)P%PL`C````````0(H(P\`$@```````0+@+@H`F`(``````0)01@X`)`(`
+M`````0+`70D`L`0``````0*@C`T`2`0``````0*`NP@`8`0``````0+PT@P`
+M;`0`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````@```````````````````````````````````````````````$#
+M<!<+`(P```````$#*",/`!(```````$#X"X*`)@"``````$#4$8.`"0"````
+M``$#P%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$``````$#\-(,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````(```````````````````````````````````````````````!`G`7
+M"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!
+M`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"````````````````````````````````````````````````0-P%PL`
+MC````````0,H(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`
+M70D`L`0``````0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``0```````````````````````````````````````````````$`Z`,+`((`
+M``````$`T`<*!(0!``````$`?!4)!(L!``````$`^"H(!)8!````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````$
+MH@`````````````(H@``1D8^4$9&/E`,H@``;$&`9&Q!@&00H@```Z"9`0.@
+MF0$4H@``$-9,!!#63`08H@``0`"`$T``@!,<H@``8`#@&V``X!L@H@``"H!3
+M#`J`4PPDH@``.]\4`#O?%``HH@``M0$``+4!```LH@``(````"````"<F```
+M``````````"<F`````````````"<F`````````````"<F`````````````"<
+MF`````````````"<F`````````````"<F`````````````"<F```````````
+M``"<F`````````````"<F`````````````"<F`````````````"<F``````X
+M````.`"<F`````````````"<F`````````````"<F`````````````"<F```
+M^0`$`/D`!`#4F`````````0`````````````````````````G)@`````````
+M````G)@`````````````G)@`````````````G)@`````````````G)@`````
+M````````G)@``````!`````0G)@```````0````$G)@`````````````G)@`
+M````````````G)@`````````````G)@````````````*G)@``(``.`"``#@"
+MG)@```8``@`&````G)@``)(```"2````G)@``*````"@````G)@```<`!``'
+M``0`U)@``!H````:````G)@``$@```!(````G)@``!`````0````G)@```@`
+M```(````G)@```\````/````G)@``/(```!B````G)@``$^0``!,D```G)@`
+M`%H2``":$@``S)@```X````/```````````````````````````````(````
+M```````````````````````````````````````````!`G`7"P",```````!
+M`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!`L!="0"P!```
+M```!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M`````````````````````````````````````````0-P%PL`C````````0,H
+M(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`70D`L`0`````
+M`0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````0`````````
+M``````````````````````````````````````$`Z`,;`((```````$`T`<:
+M!(0!``````$`?!49!(L!``````$`^"H8!)8!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````,````````````
+M```````````````````````````````````!`.@#&P`"```````!`-`'&@0$
+M`0`````!`'P5&00+`@`````!`/@J&`06`P```````G`7"P`,!````````B@C
+M#P`2!``````!`N`N"@`8!@`````!`E!&#@`D!@`````!`L!="0`P"``````!
+M`J",#0!("``````!`H"["`!@"``````!`O#2#`!L"```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````#```````````````
+M`````````````````````````````````03T`0<`@0```````03H`P(`BP$`
+M`````030!P8`E@(``````02X"P$`E@,``````0)P%PL`C`0``````0(H(P\`
+M$@0``````0+@+@H`F`8``````0)01@X`)`8``````0+`70D`L`@``````0*@
+MC`T`2`@``````0*`NP@`8`@``````0+PT@P`;`@`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!'0T,Z("A'3E4I(#,N
+M-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E
+M94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P
+M,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```
+M1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.
+M52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR
+M(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)3
+M1%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P
+M-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#
+M.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@
+M,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&
+M<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@
+M,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X
+M``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H
+M1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT
+M+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E
+M0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P
+M-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'
+M0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5
+M*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@
+M6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$
+M72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W
+M,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z
+M("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S
+M+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R
+M965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R
+M,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@`
+M`$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'
+M3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N
+M,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"
+M4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T
+M,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#
+M0SH@*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I
+M(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;
+M1G)E94)31%T@,C`P-#`W,C@``$=#0SH@*$=.52D@,RXT+C(@6T9R965"4T1=
+M(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N-"XR(%M&<F5E0E-$72`R,#`T,#<R
+M.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E94)31%T@,C`P-#`W,C@``$=#0SH@
+M*$=.52D@,RXT+C(@6T9R965"4T1=(#(P,#0P-S(X``!'0T,Z("A'3E4I(#,N
+M-"XR(%M&<F5E0E-$72`R,#`T,#<R.```1T-#.B`H1TY5*2`S+C0N,B!;1G)E
+M94)31%T@,C`P-#`W,C@``"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E
+M;"YT97AT`"YR96PN<F]D871A`"YR;V1A=&$N<W1R,2XQ`"YR;V1A=&$N<W1R
+M,2XT`"YR96PN9&%T80`N8G-S`"YC;VUM96YT````````````````````````
+M`````````````````````````````````!\````!````!@`````````T````
+M8FP!````````````!``````````;````"0``````````````9#("`/`6```,
+M`````0````0````(````*0````$````"`````````*!L`0`(=P``````````
+M```@`````````"4````)``````````````!420(`$!D```P````#````!```
+M``@````Q`````0```#(`````````J.,!`,P%``````````````$````!````
+M0`````$````R`````````'3I`0!G```````````````$`````0```%,````!
+M`````P````````#@Z0$`Y!8`````````````(`````````!/````"0``````
+M````````9&("`+`````,````!P````0````(````60````@````#````````
+M`.```@"P`0`````````````@`````````%X````!``````````````#@``(`
+MRP8``````````````0`````````1`````P``````````````JP<"`&<`````
+M``````````$``````````0````(``````````````$0*`@"@%P``#0````@`
+M```$````$`````D````#``````````````#D(0(`@!```````````````0``
+M`````````````````````````````````````````````P`!````````````
+M``````,``P`````````````````#``4``````````````````P`&````````
+M``````````,`!P`````````````````#``D``````````````````P`*``$`
+M``#0B0``J````!(``0`,````1'L```8````2``$`%P```)#O``"[````$@`!
+M`"(```!P80``=````!(``0`M````_.4``(\````2``$`.````'17``#;````
+M$@`!`$,```"H,P$`Y````!(``0!.````X`(``*0!```1``<`60```#CS```C
+M````$@`!`&0```!H60``,0```!(``0!O````E$X``#P````2``$`>@```(3L
+M```E````$@`!`(4```!4Z0``$P```!(``0"0````V-\```P````2``$`FP``
+M`/C-``"Z````$@`!`*8```!\U@``Y0```!(``0"Q````7`@``#P````2``$`
+MO````(3"``"6````$@`!`,<````TK0``BP```!(``0#2````')L```L````2
+M``$`W0```!A_```E````$@`!`.@````@\@``!@```!(``0#S````C,T```8`
+M```2``$`_@```$C>```7````$@`!``D!``!8_@``>P```!(``0`4`0``#`8`
+M`'4````2``$`'P$```R-```&````$@`!`"H!``#()@$`=0```!(``0`U`0``
+M"((```8````2``$`0`$``"B;```/````$@`!`$L!``!`#@``I`$``!$`!P!6
+M`0``/.L``'0````2``$`80$```R```!N````$@`!`&P!``"\`@``+````!(`
+M`0!W`0``N"@!`%@````2``$`@@$``*BK```A````$@`!`(T!````````````
+M`!````"N`0``B%X``$$````2``$`N0$``/3$``"6````$@`!`,0!``!88```
+M)````!(``0#/`0``Z)(``$@````2``$`V@$``!R6``!X````$@`!`.4!``#(
+MQ0``.0```!(``0#P`0``$((``&$````2``$`^P$``,A=```S````$@`!``8"
+M``"(>P``.0```!(``0`1`@``9)@``$H````2``$`'`(``+#K```@````$@`!
+M`"<"``"\Z@``8````!(``0`R`@``Z/X``#<````2``$`/0(``+C.``!7````
+M$@`!`$@"``!@60``!@```!(``0!3`@``T.L``'@````2``$`7@(```A0``#(
+M!0``$@`!`&D"```(EP``'@$``!(``0!T`@``J.<``"8````2``$`?P(``&@"
+M``!3````$@`!`(H"```<ZP``(````!(``0"5`@``O!<!``(!```2``$`H`(`
+M`!CR```&````$@`!`*L"``!@W0``+````!(``0"V`@``G,\``/$````2``$`
+MP0(```!@```9````$@`!`,P"``!(C0``FP```!(``0#7`@``O)$``'L````2
+M``$`X@(``*1Z```A````$@`!`.T"``!,'`$`B````!(``0#X`@``A'```/(!
+M```2``$``P,``*AB```!````$@`!``X#``#4'`$`2````!(``0`9`P``X'P`
+M`#4"```2``$`)`,``!@!``!0`0``$@`!`#,#``"L"0$`Y@(``!(``0`^`P``
+M*/(``(<````2``$`20,``-R6```1````$@`!`%0#```4&P$`.`$``!(``0!?
+M`P``X.T``,X````2``$`:@,``+SR```/````$@`!`'4#````E```#@```!(`
+M`0"``P``!,8``-\````2``$`BP,``(S%```Y````$@`!`)8#```(IP``4P``
+M`!(``0"A`P``T%4``!`````2``$`K`,``!Q@```[````$@`!`+<#``#H`@``
+M*`$``!(``0#-`P``(`,!`"$````2``$`V`,``'2"``"6````$@`!`.,#``!0
+M80``(````!(``0#N`P``Y(L``!8````2``$`^0,``-3^```2````$@`!``0$
+M``"@LP``*@```!(``0`/!```G.$``((#```2``$`&@0``"C?```+````$@`!
+M`"4$```X6@``B````!(``0`P!```Q(H``#@````2``$`.P0``-PJ`0`]````
+M$@`!`$8$```8X```^````!(``0!1!```P)8```$````2``$`7`0``"!>``!E
+M````$@`!`&<$```PD0``BP```!(``0!R!```E,0``%\````2``$`?00``)#0
+M``"G!0``$@`!`(@$``!L&@$`I@```!(``0"3!```-.D```8````2``$`G@0`
+M`$"0```A````$@`!`*D$``#4\P``5P```!(``0"T!```;"4!`/4````2``$`
+MOP0``)B<``!%````$@`!`,H$```X70``*0```!(``0#5!```2.P``",````2
+M``$`X`0``#C6``!!````$@`!`.L$```,S```'P```!(``0#V!```$"D!`#X`
+M```2``$``04``!#R```&````$@`!``P%`````````````!`````9!0``@'P`
+M`&`````2``$`)`4``!AG``!%````$@`!`"\%``"P*0$`"P```!(``0`Z!0``
+M!.@``'<````2``$`104``&P$``#%````$@`!`%8%``!4'P$`\P,``!(``0!A
+M!0``?&```$0````2``$`;`4``+"```"/````$@`!`'<%``!HZ0``$0```!(`
+M`0""!0``C#0!`'$````2``$`C04``)!F``!7````$@`!`)@%```4C0``,0``
+M`!(``0"C!0``%*D``"`!```2``$`K@4``,AZ``!Y````$@`!`+D%````$```
+MI`$``!$`!P#$!0``K/0``#@````2``$`SP4``$SP```L````$@`!`-H%``!X
+MB@``2@```!(``0#E!0``X)P``.4````2``$`\`4``*SL```T`0``$@`!`/L%
+M```,E0``7````!(``0`&!@``R)8``!,````2``$`$08``+#N``#@````$@`!
+M`!P&``!D'0$``0$``!(``0`G!@``'"L!`%0$```2``$`,@8``"B8```Z````
+M$@`!`#T&``#$6```"P```!(``0!(!@``_(H``.@````2``$`4P8``!S;``!*
+M````$@`!`%X&``#LY@``)P```!(``0!I!@``,&,``"0````2``$`=`8``,!K
+M`0"B````$@`!`'\&``"XZ```.````!(``0"*!@``P!$``*0!```1``<`E08`
+M`(S,``!E````$@`!`*`&```XFP``#P```!(``0"K!@``8&<``"T!```2``$`
+MM@8``#SE```A````$@`!`,$&```4YP``E````!(``0#,!@``U%8``&@````2
+M``$`UP8``,@I`0`3`0``$@`!`.(&```P;P``%````!(``0#M!@``>&4```\`
+M```2``$`^`8``!Q?``"J````$@`!``,'``#X9@``'0```!(``0`.!P``C.8`
+M`%\````2``$`&0<``+```0#Q`0``$@`!`"0'``#TS```!@```!(``0`O!P``
+MX",!`%L````2``$`.@<```1E```C````$@`!`$4'``!@!@``I`$``!$`!P!0
+M!P``P%H``(P!```2``$`6P<``$Q[```Y````$@`!`&8'``#H9@``#@```!(`
+M`0!Q!P`````````````0````D0<``)!H```P!@``$@`!`)P'````````"0``
+M`!$`!P"L!P``-`4``'4````2``$`O0<``#B2```J````$@`!`,@'``!DUP``
+M4@```!(``0#3!P``X.<``"(````2``$`W@<``*QB```!````$@`!`.D'``"X
+ME@``!@```!(``0#T!P``G)H```L````2``$`_P<``.2-``"(````$@`!``H(
+M``"4Z0``'@$``!(``0`5"```W&0```8````2``$`(`@`````````````$```
+M`"\(``"0D@``,P```!(``0`Z"```_/$``!0````2``$`10@``.3Q```6````
+M$@`!`%`(``!HVP``.````!(``0!;"```P&X``&X````2``$`9@@``(B5``!T
+M````$@`!`'$(```\Z0``%P```!(``0!\"```--\``*(````2``$`AP@``&SL
+M```7````$@`!`)((``#8DP``)@```!(``0"="```5/0``%8````2``$`J`@`
+M`"`R`0"%`0``$@`!`+,(``!LC@``N`$``!(``0"^"````&8``!<````2``$`
+MR0@``,"0``!`````$@`!`-0(``"L=```'P```!(``0#?"```?/,``%<````2
+M``$`Z@@``&22```L````$@`!`/4(``!8DP``@````!(``0``"0``R%\``"8`
+M```2``$`"PD``&`C`0`?````$@`!`!8)`````````````!`````E"0``:%P`
+M`"$````2``$`,`D``*#E``!9````$@`!`#L)```@"```I`$``!$`!P!&"0``
+M=)P```X````2``$`40D``/R+``!@````$@`!`%P)``#D````,P```!(``0!J
+M"0``)%T``!(````2``$`=0D``*`$``"D`0``$0`'`(`)```<G```5P```!(`
+M`0"+"0``7(P```L````2``$`E@D```P````<````$0`'`*@)``#,7@``'```
+M`!(``0"S"0``Y-\``#0````2``$`O@D``%AD``!X````$@`!`,D)```P-@$`
+M#`(``!(``0#4"0``T&0```L````2``$`WPD```CS```M````$@`!`.H)``"8
+M20``F0```!(``0#U"0``2",!`!8````2``$```H``,2;``!7````$@`!``L*
+M``"4E@``(P```!(``0`6"@``W/(``"D````2``$`(0H``"S,```>````$@`!
+M`"P*```<'0$`2````!(``0`W"@``_)4``"`````2``$`0@H``$"!```&````
+M$@`!`$T*``#$"`$`L0```!(``0!8"@``:(P``*(````2``$`8PH``)3-``!A
+M````$@`!`&X*``#@"0``I`$``!$`!P!Y"@``Z&4``!<````2``$`A`H``+PI
+M`0`*````$@`!`(\*``!H6```7````!(``0":"@``*&4``$,````2``$`I0H`
+M`,3'```M!```$@`!`+`*``#D8@``2@```!(``0"["@``L)H```8````2``$`
+MQ@H``*#;```X`0``$@`!`-$*``"$G```$@```!(``0#<"@``L$L``#<````2
+M``$`YPH``.3=``!B````$@`!`/(*``"8"@``;P```!(``0#]"@``J)H```8`
+M```2``$`"`L``!`'``!+`0``$@`!`!,+```TW0``*@```!(``0`>"P``!&(`
+M`'@````2``$`*0L``&QE```+````$@`!`#0+``#DE```*````!(``0`_"P``
+M(!8!`'8````2``$`2@L``)Q=```L````$@`!`%4+``!X"0$`-````!(``0!@
+M"P``$`0``%L````2``$`:PL``&#E``!`````$@`!`'8+`````````````!``
+M``"&"P``S+,``(0!```2``$`D0L``%!8```6````$@`!`)P+``!D)@$`8@``
+M`!(``0"G"P``_%T``"0````2``$`L@L``!#A``",````$@`!`+T+``"@E```
+M1````!(``0#("P``_,P``(X````2``$`TPL`````````````$````/,+``"$
+M!@``B@```!(``0#^"P``C%P``$T````2``$`"0P``-Q<``!`````$@`!`!0,
+M````D0``+P```!(``0`?#```G%D``)L````2``$`*@P``#"3```G````$@`!
+M`#4,``"XUP``H0(``!(``0!`#```\)8``!4````2``$`2PP``.3T```1`0``
+M$@`!`%8,``!,7```'````!(``0!A#``````````````0````;PP``"20```<
+M````$@`!`'H,``#\"```4P```!(``0"%#```L&(``#(````2``$`D`P``*2;
+M```?````$@`!`)L,``"PF```+````!(``0"F#```O&\``,@````2``$`L0P`
+M`!AF```?````$@`!`+P,``#H7@``-````!(``0#'#```(.4``!P````2``$`
+MT@P``,SR```/````$@`!`-T,``#$D@``)````!(``0#H#```P-T``"0````2
+M``$`\PP``+@$`0`+!```$@`!`/X,``#`8```+@```!(``0`)#0``\%\```X`
+M```2``$`%`T``,":``!;````$@`!`!\-```\)`$`+0$``!(``0`J#0``$)0`
+M`!D````2``$`-0T``$B!``#`````$@`!`$`-``!DD```60```!(``0!+#0``
+MQ)8```$````2``$`5@T``,1[``"[````$@`!`&$-``"`$P``I`$``!$`!P!L
+M#0``/%<``#@````2``$`=PT``-!8``".````$@`!`((-``",W0``,P```!(`
+M`0"-#0``G"@!`!L````2``$`F`T``+3J```&````$@`!`*,-``!HE```.```
+M`!(``0"N#0``N)H```8````2``$`N0T``&`5`0#`````$@`!`,0-```0F@``
+MC````!(``0#/#0``R)T``"L)```2``$`V@T``$`5``"D`0``$0`'`.4-``!D
+M70``-0```!(``0#P#0``K`4``%T````2``$`^PT``$`G`0!:`0``$@`!``8.
+M``#<'@$`=@```!(``0`1#@``Y&0``!X````2``$`'`X``(AE```/````$@`!
+M`"<.``!HE0``(````!(``0`R#@``L/(```L````2``$`/0X``)AE``!-````
+M$@`!`$@.``#D80``(````!(``0!3#@``Y(<``!`````2``$`7@X``%`)``!'
+M`0``$@`!`&D.``"TS@```0```!(``0!T#@``0'\``$H````2``$`?PX``'2;
+M```7````$@`!`(H.``"@8@``!@```!(``0"5#@``6,<``&L````2``$`H`X`
+M`%SS```?````$@`!`*L.````1P$`H@```!(``0"V#@``?&(``",````2``$`
+MP0X``%A/``!`````$@`!`,P.``"T10``X@,``!(``0#B#@``+/0``"<````2
+M``$`[0X``#AF``!7````$@`!`/@.``#X]0``7@@``!(``0`##P``8-X``,8`
+M```2``$`#@\``$S,```]````$@`!`!D/``",FP``%P```!(``0`D#P``C'\`
+M`'T````2``$`+P\``&@X``!\````$@`!`#H/``!$;P``=P```!(``0!%#P``
+M2)L``"D````2``$`4`\``/2F```2````$@`!`%L/```\5@``E@```!(``0!F
+M#P``#(,```$````2``$`<0\``/!@``!@````$@`!`'P/``"8P0``/P```!(`
+M`0"'#P``</$``'0````2``$`D@\``/#H``!$````$@`!`)T/```LE```.P``
+M`!(``0"H#P``:(,``'H$```2``$`LP\``'!W``"Y`@``$@`!`+X/``!\Z0``
+M%0```!(``0#)#P``],L``!8````2``$`U`\``'1<`0"J````$@`!`-\/``"P
+M3```D````!(``0#J#P``?.@``#L````2``$`]0\``-C<``!9````$@`!```0
+M```@_P``C@$``!(``0`+$```@",!`!X````2``$`%A```%S:``"^````$@`!
+M`"$0`````````````!`````P$```'%T```8````2``$`.Q```'R````S````
+M$@`!`$80``#0YP``#@```!(``0!1$```7*<``+@!```2``$`7!```-!.``"&
+M````$@`!`'40``"@(P$`/0```!(``0``>GHP,#5B-3@T-@!Z>C`P,F1B,3%C
+M`'IZ,#)D8F8X-S4`>GHP,F1B8C%B,@!Z>C`P,F1B-#8P`'IZ,&(W8C@S-C@`
+M>GHP-6(X8S8U80!Z>C`P-6(T,&%D`'IZ,#5B.30R960`>GHP9#DT8V0P-`!Z
+M>C`P,3EF-#<P`'IZ,#)D8F4W,V0`>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ
+M,#`U8C@U,V0`>GHP,#$V9#DR90!Z>C!C9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP
+M,F1A8F)A8P!Z>C`P,&(V8S8X`'IZ,#`P8C9B9C@`>GHP,F1B-6)F,`!Z>C`Q
+M-F4Q9&9D`'IZ,&(W,&4Y.&,`>GHP-F4P9C9C,@!Z>C`P-C=D,F(Q`'IZ,&(V
+M8V$S,C4`>GHP,#5B-F-F9`!Z>C`Q-F4P9&9D`'IZ,#`P8C9F-C@`>GHP,#5B
+M-#AA9`!Z>C`R9&)F,6(R`'IZ,#`U8C@X8V(`>GHP,S-E8SAB9@!Z>C!D8C1C
+M.31D`'IZ,#)D8C-B86,`871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I
+M;64`>GHP,&(V9C$V,0!Z>C!D8S4X-S$X`'IZ,&1B,#DQ,&4`>GHP,&(V93(W
+M80!Z>C`R9&)B86(R`'IZ,&(V9#%E9F8`>GHP,#5B-C1F9`!Z>C`P,&(V9#4R
+M`'IZ,&(V8SEE9F8`>GHP,F1B9#@W-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`
+M>GHP,#!B-F0Q9`!Z>C`P8C9D-#4P`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z
+M>C`P,#5B-C,R`'IZ,#9D9C)F-3<`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ
+M,#!B-F0Y,C,`>GHP,#)D8C4Q8P!Z>C`Q-F1A-V8P`'IZ,#$V9&-B9F4`>GHP
+M,#$V9&5C,0!Z>C`P,39D9C)C`'IZ,&(X,30V,3(`>GHP,39D.3DR,`!Z>C`R
+M9&(Q8F%C`'IZ,&1C-S@W,3@`>GHP-6(W,#%E,`!Z>C`P,&(V8C$P`'IZ,&(W
+M,#EE9F8`>GHP,39D9C@Y8@!A=&A?:&%L7V%T=&%C:`!Z>C`V93$T9&0Q`'IZ
+M,#$V9&%B,F0`>GHP,F1B,3,U9`!Z>C!E,&(V9C(S`'IZ,#$V93(Y,60`>GHP
+M,#!B-F9E.`!Z>C`P,39D.30X`'IZ,#$V93(P.6(`>GHP8C<P,65F9@!Z>C`P
+M,&(V8SED`'IZ,#`P-6(U83(`>GHP,F1B,3<P80!A=&A?:&%L7V-O;7!U=&5T
+M>'1I;64`>GHP,F1B-6)A8P!Z>C`P-6(X,3-D`'IZ,#!B-F,Y,C,`>GHP8C9C
+M93DX8P!Z>C`P-6(W9CED`'IZ,&(W,#%D,#(`>GHP-F4P-#8P90!Z>C`R9&(U
+M-S8S`'IZ,#9F,C,R8V,`>GHP93`W.#,W.0!Z>C`P,F1A9C8R`'IZ,&(X-30V